diff options
Diffstat (limited to '2025/captions')
53 files changed, 52934 insertions, 0 deletions
diff --git a/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--answers.vtt b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--answers.vtt new file mode 100644 index 00000000..df891f67 --- /dev/null +++ b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--answers.vtt @@ -0,0 +1,1024 @@ +WEBVTT + +00:00:00.000 --> 00:00:05.199 +Greetings. Salaam again. I'm delighted to be here + +00:00:05.200 --> 00:00:11.199 +and happy to answer your questions. + +00:00:11.200 --> 00:00:12.839 +I'm not seeing anything yet, + +00:00:12.840 --> 00:00:17.679 +but let me take advantage of this time + +00:00:17.680 --> 00:00:20.120 +to speak about one question that I saw + +00:00:20.080 --> 00:00:22.879 +come in earlier on the pad, + +NOTE Q: Where do we find all the inputs and outputs you mentioned? + +00:00:22.880 --> 00:00:25.540 +which was all the outputs + +00:00:25.541 --> 00:00:29.399 +and the inputs that you mentioned, where are they? + +00:00:29.400 --> 00:00:35.439 +So they are on GitHub, and this is in one of my slides. + +00:00:35.440 --> 00:00:41.939 +I mentioned the URL for it. I'll show you that as well. + +00:00:41.940 --> 00:00:50.391 +So the URL for it is https://github.com/bxplpc/180068, + +00:00:50.392 --> 00:00:58.679 +which is the handle for this talk. + +00:00:58.680 --> 00:01:06.039 +In there, you have all the PDFs and the HTMLs, + +00:01:06.040 --> 00:01:12.119 +a citation, a bib input, and also the sources. + +00:01:12.120 --> 00:01:19.439 +So if you were to go to the PDF, you will see + +00:01:19.440 --> 00:01:24.319 +um, both the article presentation and the beamer, + +00:01:24.320 --> 00:01:27.279 +let's take a quick look at the beamer, + +00:01:27.280 --> 00:01:34.159 +which is what you have seen. So. + +00:01:34.160 --> 00:01:40.279 +And as far as the sources are, there are two primary files. + +00:01:40.280 --> 00:01:44.120 +This presentation, left to right, + +00:01:44.121 --> 00:01:50.919 +is the one that includes all the LaTeX packages. + +00:01:50.920 --> 00:01:52.641 +We might as well take a quick look. + +00:01:52.642 --> 00:01:57.600 +So what's in there is primarily the use packages. + +00:01:57.601 --> 00:02:06.999 +And then it dispatches to bodyPresArt, + +00:02:07.000 --> 00:02:11.519 +and this is where the code is. + +00:02:11.520 --> 00:02:14.559 +And I walked through this briefly. + +00:02:14.560 --> 00:02:26.839 +So, notice here again that this is a mixture of LaTeX and Org. + +00:02:26.840 --> 00:02:31.039 +Each of the presentation slides are here. + +00:02:31.040 --> 00:02:34.519 +For example, my introduction + +00:02:34.520 --> 00:02:37.239 +is just a video that gets included. + +00:02:37.240 --> 00:02:41.119 +And then the notes that I use, the voiceover, + +00:02:41.120 --> 00:02:47.319 +is also included in the LaTeX file. + +00:02:47.320 --> 00:02:50.079 +Let me... It'll probably be easy + +00:02:50.080 --> 00:02:52.399 +to take those voiceover notes + +00:02:52.400 --> 00:02:54.959 +and then align them with a tool like Aeneas + +00:02:54.960 --> 00:02:58.399 +to make subtitles for your videos. + +00:02:58.400 --> 00:03:01.199 +Exactly, and that is what I do. + +00:03:01.200 --> 00:03:08.519 +So there is a way to gather them all as P-notes. + +00:03:08.520 --> 00:03:13.839 +And so all the P-notes get together in a single file, + +00:03:13.840 --> 00:03:20.599 +and then you feed that to Aeneas, and it will align them. + +00:03:20.600 --> 00:03:23.319 +And then there is the work of using your subed + +00:03:23.320 --> 00:03:30.279 +to just get the right sort of line length on them. + +00:03:30.280 --> 00:03:33.039 +But you did all of that for me this year, Sacha. + +00:03:33.040 --> 00:03:34.519 +Thank you very much. + +00:03:34.520 --> 00:03:37.559 +It was just a matter of not having time. + +00:03:37.560 --> 00:03:43.559 +Otherwise, I planned to do it myself. It's all right. + +00:03:43.560 --> 00:03:46.639 +It was very easy since he provided the full narration. + +00:03:46.640 --> 00:03:50.399 +I still need to tweak it sometimes, + +00:03:50.400 --> 00:03:52.919 +so I often use the waveforms in subed + +00:03:52.920 --> 00:03:58.559 +to find the right starting time and ending time for things. + +00:03:58.560 --> 00:04:01.519 +But it is so nice to have a presentation + +00:04:01.520 --> 00:04:03.879 +where you can experience it in different forms, + +00:04:03.880 --> 00:04:10.159 +as an article, as a video, as a post with links and everything. + +00:04:10.160 --> 00:04:11.479 +Very handy. + +00:04:11.480 --> 00:04:20.919 +Right, and in case a teacher uses this for class lectures, + +00:04:20.920 --> 00:04:26.079 +then the student profits from all sorts. + +00:04:26.080 --> 00:04:28.999 +The article presentation format is very useful + +00:04:29.000 --> 00:04:33.239 +for a student to add their own notes to it and the rest. + +00:04:33.240 --> 00:04:37.519 +Exactly as you said, having multiple forms is great. + +00:04:37.520 --> 00:04:40.479 +Video has its place, reveal has its place, + +00:04:40.480 --> 00:04:44.039 +PDF has its place, article has its place. + +00:04:44.040 --> 00:04:48.399 +All of them work together. + +NOTE Making presentations easier to distribute + +00:04:48.400 --> 00:04:50.479 +I've been having a hard time figuring out + +00:04:50.480 --> 00:04:54.719 +how to make the reveal.js version of a presentation + +00:04:54.720 --> 00:04:56.999 +more easily distributable, though. + +00:04:57.000 --> 00:04:58.839 +This is something we've had a hard time + +00:04:58.840 --> 00:05:00.199 +with in the past, too. + +00:05:00.200 --> 00:05:02.759 +You have these lovely EmacsConf presentations + +00:05:02.760 --> 00:05:04.839 +that could be reveal presentations, + +00:05:04.840 --> 00:05:07.759 +but hosting them doesn't quite fit + +00:05:07.760 --> 00:05:13.639 +in the usual assumptions people have. Exactly, exactly. + +00:05:13.640 --> 00:05:16.559 +So if we were to have a reveal server, + +00:05:16.560 --> 00:05:20.479 +then we could upload our reveal inputs to it. + +00:05:20.480 --> 00:05:24.999 +But you're right, we should look + +00:05:25.000 --> 00:05:26.679 +for some sort of a packaging + +00:05:26.680 --> 00:05:34.079 +that is more plug and distribute. Yeah, so I'd be all game + +00:05:34.080 --> 00:05:36.919 +if we wanted to do it for next year, + +00:05:36.920 --> 00:05:42.039 +I'd be happy to provide all the reveal outputs. + +NOTE Reveal output + +00:05:42.040 --> 00:05:45.919 +In fact, they are here, let me touch on that quickly. + +00:05:45.920 --> 00:05:53.639 +Good point you brought up. So, this is the Reveal output. + +00:05:53.640 --> 00:05:57.519 +So all of these, you see the images and the audio + +00:05:57.520 --> 00:06:02.359 +in my own environment are SIM links to where I keep them. + +00:06:02.360 --> 00:06:06.239 +So those need to come in, + +00:06:06.240 --> 00:06:10.599 +but the reveal output really comes right here. + +00:06:10.600 --> 00:06:13.679 +And this is how it looks. + +00:06:13.680 --> 00:06:15.679 +If that's a link you can add to the pad, + +00:06:15.680 --> 00:06:19.799 +then I can add you to the top page afterwards. + +00:06:19.800 --> 00:06:21.839 +I think as a, as a speaker, + +00:06:21.840 --> 00:06:24.119 +I tend to just self host the thing. + +00:06:24.120 --> 00:06:28.319 +And that way also, if I find a bug, which often happens, + +00:06:28.320 --> 00:06:30.679 +I can go and quietly update it. + +00:06:30.680 --> 00:06:36.439 +Exactly. Exactly. Sure. Sure. Yeah. + +00:06:36.440 --> 00:06:44.239 +This right now, what we are looking at is from GitHub. + +00:06:44.240 --> 00:06:48.599 +And the audio and the images, of course, are large, + +00:06:48.600 --> 00:06:55.759 +and I did not upload them. But I can send them, sure. + +00:06:55.760 --> 00:07:01.999 +So, a few other things maybe I can elaborate on. + +00:07:02.000 --> 00:07:08.639 +This is the bootstrapping page for BISOS, also on there. + +00:07:08.640 --> 00:07:11.079 +And if somebody wanted to actually + +00:07:11.080 --> 00:07:12.919 +dig deeper and go through this, + +00:07:12.920 --> 00:07:18.959 +a good starting point would be my GitHub page. + +00:07:18.960 --> 00:07:24.639 +But my GitHub page is not done and organized the usual way. + +00:07:24.640 --> 00:07:26.999 +So I only have three repositories + +00:07:27.000 --> 00:07:30.359 +and the repositories basically say, + +00:07:30.360 --> 00:07:32.266 +here is where you need to go. + +00:07:32.267 --> 00:07:39.159 +So all of my work is organized as organizations. + +00:07:39.160 --> 00:07:48.039 +So, for example, for Emacs, if you were to go to BxBlee, + +00:07:48.040 --> 00:07:56.359 +you will see all the relevant repos for that purpose. + +00:07:56.360 --> 00:07:58.975 +So, for example, if you wanted to + +00:07:58.976 --> 00:08:03.319 +come and take a look at mail template, + +00:08:03.320 --> 00:08:08.719 +templating, distribution, and tracking, + +00:08:08.720 --> 00:08:14.999 +you would get a Emacs package ready to go over here. + +NOTE GitHub organizations + +00:08:15.000 --> 00:08:23.479 +But again, all of this is through the use of GitHub organizations. + +00:08:23.480 --> 00:08:26.399 +So my repos are by subject + +00:08:26.400 --> 00:08:33.239 +and the BISOS itself has 69 repositories + +00:08:33.240 --> 00:08:38.719 +where different sections of it are packaged as PIP packages. + +00:08:38.720 --> 00:08:42.359 +So, for example, for LCNT, we can go there. + +00:08:42.360 --> 00:08:46.439 +So, these are the packages that let you, + +00:08:46.440 --> 00:08:53.159 +let me go there, that let you dissect. + +00:08:53.160 --> 00:08:55.199 +Sorry, you have your slides shared at the moment, + +00:08:55.200 --> 00:08:59.599 +so I don't know if you're in a different tab. + +00:08:59.600 --> 00:09:03.079 +Oh, am I in a different tab? + +00:09:03.080 --> 00:09:06.399 +I thought that that would follow me. + +00:09:06.400 --> 00:09:16.119 +Yes, I am in a different tab. Let me see. + +00:09:16.120 --> 00:09:19.879 +This is the one that you are seeing, + +00:09:19.880 --> 00:09:28.839 +so let me go over here. Perfect. Now you're seeing it. + +00:09:28.840 --> 00:09:31.279 +So literally on the same page. Awesome. Right. + +00:09:31.280 --> 00:09:33.679 +So you were not actually seeing what I was saying. + +00:09:33.680 --> 00:09:36.159 +So, so what I was saying that is that + +00:09:36.160 --> 00:09:42.159 +if you go to my primary website, GitHub page, + +00:09:42.160 --> 00:09:45.439 +you will see that there are only three repos there. + +00:09:45.440 --> 00:09:49.759 +And those repos just give information + +00:09:49.760 --> 00:09:52.959 +about where the real repos are. + +00:09:52.960 --> 00:09:57.399 +And the real repos are organized in various organizations. + +00:09:57.400 --> 00:10:06.719 +So, for example, for Emacs packages, I use the bxblee + +00:10:06.720 --> 00:10:11.999 +And in there, there are 40 repositories. + +00:10:12.000 --> 00:10:15.399 +And as an example, you can choose, for example, + +00:10:15.400 --> 00:10:26.519 +AI plus is just a few additional libraries for menus, for Aidermacs. + +00:10:26.520 --> 00:10:31.719 +And the rest of BLEE is done that way as well. + +00:10:31.720 --> 00:10:36.919 +So if you were to let me also show + +00:10:36.920 --> 00:10:43.759 +more relevant stuff to the content generation. + +00:10:43.760 --> 00:10:48.839 +And everything related to BISOS in Python is in BISOS-PIP. + +00:10:48.840 --> 00:10:52.879 +These are packages that are ready + +00:10:52.880 --> 00:10:57.959 +to be exported to pypi and + +00:10:57.960 --> 00:11:02.749 +For example, for LCNT, if you go here, + +00:11:02.750 --> 00:11:04.558 +let's go to the bin directory. + +00:11:04.559 --> 00:11:15.808 +These are the utilities that dissect the PDF output of Beamer + +00:11:15.809 --> 00:11:23.839 +convert it to images so that you can insert them in Reveal. + +00:11:23.840 --> 00:11:29.159 +And then again, if you were to just wanted to dig deeper + +00:11:29.160 --> 00:11:34.759 +in any of these as components, + +00:11:34.760 --> 00:11:40.559 +you would simply start from this top level page + +00:11:40.560 --> 00:11:44.719 +and explore the organizations. + +00:11:44.720 --> 00:11:48.719 +So in total, maybe there is 300 repos, + +00:11:48.720 --> 00:11:54.279 +but they are organized by subject matter + +00:11:54.280 --> 00:12:03.399 +within GitHub organizations. + +00:12:03.400 --> 00:12:10.799 +Yeah. One additional general comment. + +00:12:10.800 --> 00:12:13.039 +If you were to look at my presentation, + +00:12:13.040 --> 00:12:17.519 +I'd say I touched on five different topics. + +00:12:17.520 --> 00:12:24.039 +So, one topic was this content generation in general. + +NOTE Challenge of DIY model and recipes + +00:12:24.040 --> 00:12:35.279 +The second one was this challenge of DIY model and recipes + +00:12:35.280 --> 00:12:38.319 +versus building something large + +00:12:38.320 --> 00:12:40.919 +and including everything in it. + +00:12:40.920 --> 00:12:43.519 +And that is, that has been the motivation + +00:12:43.520 --> 00:12:46.919 +for BISOS and BLEE. + +00:12:46.920 --> 00:12:50.279 +And I'm interested in getting feedback on it. + +00:12:50.280 --> 00:12:54.519 +In general, the open source culture + +00:12:54.520 --> 00:13:00.719 +has been focusing on components + +00:13:00.720 --> 00:13:03.439 +and large American corporations + +00:13:03.440 --> 00:13:07.719 +have focused in integration of these components. + +00:13:07.720 --> 00:13:11.679 +So my short message here is that + +00:13:11.680 --> 00:13:17.959 +we should start thinking as providing solutions + +00:13:17.960 --> 00:13:23.519 +as opposed to minor pieces and packages + +00:13:23.520 --> 00:13:30.599 +and put them all together and claim them as our own digital ecosystem. + +00:13:30.600 --> 00:13:38.319 +And this is the concept behind ByStar, BISOS and BLEE. + +00:13:38.320 --> 00:13:40.999 +The third point I was making throughout + +00:13:41.000 --> 00:13:45.479 +is this concept of dynamic blocks everywhere, + +00:13:45.480 --> 00:13:51.599 +and Comeega, which is the inverse of Babel. + +00:13:51.600 --> 00:13:57.479 +And I'd also be interested in feedback on those. + +NOTE Dblocks everywhere + +00:13:57.480 --> 00:14:03.239 +I think the dblocks everywhere concept, + +00:14:03.240 --> 00:14:13.079 +I can very quickly show that. + +00:14:13.080 --> 00:14:18.039 +it would be in the LaTeX file, as an example. + +00:14:18.040 --> 00:14:23.319 +I didn't really do a good job in digging deeper into that. + +00:14:23.320 --> 00:14:25.479 +So if you go to the sources + +00:14:25.480 --> 00:14:31.319 +and you look at any of the slides, + +00:14:31.320 --> 00:14:39.719 +All the slides are in here inside of a dynamic block. + +00:14:39.720 --> 00:14:41.919 +This is an org dblock, + +00:14:41.920 --> 00:14:46.919 +but you would invoke it in LaTeX mode. + +00:14:46.920 --> 00:14:51.199 +And then from this begin to this end, + +00:14:51.200 --> 00:14:54.559 +everything is auto-generated + +00:14:54.560 --> 00:15:00.039 +through the Elisp function, body:mm/video. + +00:15:00.040 --> 00:15:06.879 +And the parameters that it takes are the video path. + +00:15:06.880 --> 00:15:12.239 +So all of this code is repeated all over the place. + +00:15:12.240 --> 00:15:15.799 +And all you need in it is the video path. + +00:15:15.800 --> 00:15:21.959 +So it's very easy to think of this as a macro capability, + +00:15:21.960 --> 00:15:25.079 +except that the macro is visible. + +00:15:25.080 --> 00:15:29.479 +And it has one additional benefit + +00:15:29.480 --> 00:15:34.799 +on top of general macro capabilities, + +00:15:34.800 --> 00:15:36.759 +and that is that it's open. + +00:15:36.760 --> 00:15:41.679 +In this particular case, it closes, + +00:15:41.680 --> 00:15:46.439 +but let me show you another one where it is open. + +00:15:46.440 --> 00:15:54.879 +So if you look at, this is latex section, this one is good. + +00:15:54.880 --> 00:16:00.439 +This is a derived image. And by saying that it's open + +00:16:00.440 --> 00:16:06.679 +is that you see my begin verbatim and my begin frame. + +00:16:06.680 --> 00:16:11.439 +They end and there is no closing for them. + +00:16:11.440 --> 00:16:14.999 +So the extra text that is outside + +00:16:15.000 --> 00:16:21.319 +of the D block and closes it is down here. + +00:16:21.320 --> 00:16:24.959 +And none of the existing macro capabilities + +00:16:24.960 --> 00:16:30.799 +gives you this feature. This even comes handy in Lisp. + +00:16:30.800 --> 00:16:40.039 +So that is a proposal saying + +00:16:40.040 --> 00:16:47.719 +that let's make D blocks, dynamic blocks, + +00:16:47.720 --> 00:16:52.959 +generalized to all of Emacs, as opposed to just org mode. + +00:16:52.960 --> 00:16:54.759 +And that's relatively simple. + +00:16:54.760 --> 00:17:01.359 +And the Emacs source team could easily decide + +00:17:01.360 --> 00:17:02.959 +that this is worthwhile doing. + +00:17:02.960 --> 00:17:07.759 +And then COMEEGA, of course, I've gone + +00:17:07.760 --> 00:17:09.959 +over it through the presentation. + +NOTE Q: What changes have you seen in the culture while developing all these things like libre-halal system and now blee-lcnt? + +00:17:09.960 --> 00:17:20.399 +So, I see 1 question coming in. What changes have you seen? + +00:17:20.400 --> 00:17:24.719 +the culture while developing all these things + +00:17:24.720 --> 00:17:36.279 +like Libre-halaal system and now Blee-LCNT? + +00:17:36.280 --> 00:17:40.079 +Well, it's a work in progress, I would say. + +00:17:40.080 --> 00:17:43.039 +We learn from one another. + +00:17:43.040 --> 00:17:47.719 +And what I'm doing may be considered + +00:17:47.720 --> 00:17:52.199 +just a stepwise increment, + +00:17:52.200 --> 00:18:01.799 +but the cultural input is that we really should start + +00:18:01.800 --> 00:18:09.399 +thinking about providing solutions as opposed to packages. + +00:18:09.400 --> 00:18:19.319 +The FOSS culture is really limited in its scope to packages + +00:18:19.320 --> 00:18:24.799 +or even if when you think something very large like Debian, + +00:18:24.800 --> 00:18:28.159 +which is a collection of packages. + +00:18:28.160 --> 00:18:31.479 +And it is still choice oriented, + +00:18:31.480 --> 00:18:55.399 +as opposed to solution oriented. + +00:18:55.400 --> 00:19:03.599 +Yeah. Are there any additional topics or questions? + +00:19:03.600 --> 00:19:11.159 +Otherwise, I'll just add a few additional concepts. + +NOTE Intellectual property rights + +00:19:11.160 --> 00:19:18.079 +So the two other points made throughout the presentations + +00:19:18.080 --> 00:19:28.759 +are that this statement about clear invalidity + +00:19:28.760 --> 00:19:30.719 +of the Western IPR regime. + +00:19:30.720 --> 00:19:34.399 +So throughout the FOSS movement, + +00:19:34.400 --> 00:19:42.719 +we have been focusing on providing alternative licenses + +00:19:42.720 --> 00:19:49.319 +which coexist with the IPR system. + +00:19:49.320 --> 00:19:52.199 +And that is the practical thing to do. + +00:19:52.200 --> 00:19:55.879 +We are doing a jujitsu on IPR. + +00:19:55.880 --> 00:20:00.919 +We are saying that this is our license to it. + +00:20:00.920 --> 00:20:07.399 +But conceptually, there has been little discussion + +00:20:07.400 --> 00:20:14.319 +and also positioning on this basic question + +00:20:14.320 --> 00:20:17.479 +as to whether or not copyright + +00:20:17.480 --> 00:20:21.119 +and patents are valid or invalid. + +00:20:21.120 --> 00:20:26.639 +And what I am saying is that it is clear that they are invalid, + +00:20:26.640 --> 00:20:30.439 +particularly once you start looking at them + +00:20:30.440 --> 00:20:33.759 +with the lens of polyexistentials. + +00:20:33.760 --> 00:20:39.239 +And that the FOSS movement + +00:20:39.240 --> 00:20:42.199 +really needs to combine these two, + +00:20:42.200 --> 00:20:47.359 +this notion of free software and open source licenses, + +00:20:47.360 --> 00:20:51.679 +and combined with the belief system + +00:20:51.680 --> 00:20:55.839 +that we are completely and utterly against + +00:20:55.840 --> 00:21:00.679 +the validity of the Western intellectual property rights regime. + +00:21:00.680 --> 00:21:05.399 +And I use the Western and the American occasionally, + +00:21:05.400 --> 00:21:12.479 +and the reason behind that is that in fact it is, they are Western. + +00:21:12.480 --> 00:21:16.479 +If you go to any other language, if you go to Farsi, + +00:21:16.480 --> 00:21:19.079 +if you go to Arabic, if you go to Chinese, + +00:21:19.080 --> 00:21:24.159 +if you go to Japanese, which are non-Western cultures, + +00:21:24.160 --> 00:21:28.639 +the concept of intellectual property, + +00:21:28.640 --> 00:21:33.159 +the words, the vocabulary of those + +00:21:33.160 --> 00:21:36.639 +combination of intellectual and property, + +00:21:36.640 --> 00:21:40.559 +did not exist anywhere in those cultures. + +00:21:40.560 --> 00:21:44.559 +It's only in the past, maybe 60, 70 years + +00:21:44.560 --> 00:21:52.279 +that they have been translated from the Western world and brought into it. + +00:21:52.280 --> 00:21:54.639 +So there is an inherent root + +00:21:54.640 --> 00:21:58.959 +into the intellectual property rights system, + +00:21:58.960 --> 00:22:02.679 +which goes to the Western culture. + +00:22:02.680 --> 00:22:08.439 +The second point that I have brought into + +00:22:08.440 --> 00:22:10.999 +this presentation and the previous ones + +00:22:11.000 --> 00:22:16.239 +is this question of, if we go with free software, + +00:22:16.240 --> 00:22:18.119 +if we go with open software, + +00:22:18.120 --> 00:22:22.159 +are we really creating the right labels? + +00:22:22.160 --> 00:22:25.679 +And my point is that no, neither of them, + +00:22:25.680 --> 00:22:29.479 +neither free software, nor open source + +00:22:29.480 --> 00:22:33.159 +are capturing really the essence + +00:22:33.160 --> 00:22:36.399 +of what we are trying to do. + +00:22:36.400 --> 00:22:41.439 +And I claim that that is in fact ethics and morality. + +00:22:41.440 --> 00:22:48.879 +And it is societal belief that if we reject + +00:22:48.880 --> 00:22:51.879 +intellectual property rights regime, + +00:22:51.880 --> 00:22:53.279 +what do we replace it with? + +00:22:53.280 --> 00:22:58.799 +And in my thinking is that a software developer + +00:22:58.800 --> 00:23:00.919 +does not get to choose + +00:23:00.920 --> 00:23:04.919 +what license goes with his or her software, + +00:23:04.920 --> 00:23:09.319 +and that the equivalent of a Affero GPL + +00:23:09.320 --> 00:23:13.839 +is the default correct license + +00:23:13.840 --> 00:23:16.319 +to use for all of your software + +00:23:16.320 --> 00:23:21.039 +because it is the one that reflects the belief system + +00:23:21.040 --> 00:23:24.719 +that all software should be ethical software. + +00:23:24.720 --> 00:23:43.559 +Yeah, I'm looking at the Etherpad again and + +NOTE Q: Given that large AI companies are openly stealing IP and copyright, thereby eroding the authority of such law (and eroding truth itself as well), can you see a future where IP & copyright flaw become untenable and what sort of onwards effect might that have? + +00:23:43.560 --> 00:23:48.679 +The question is about IP and AI. + +00:23:48.680 --> 00:23:54.359 +So yeah, over the past two years, + +00:23:54.360 --> 00:23:56.599 +something huge has happened. + +00:23:56.600 --> 00:24:04.919 +And what I am seeing in there as a solution + +00:24:04.920 --> 00:24:12.319 +is essentially comes down to a talk + +00:24:12.320 --> 00:24:16.839 +that was given maybe two years ago by someone at EmacsConf, + +00:24:16.840 --> 00:24:22.359 +and its label was attribution-based economics. + +00:24:22.360 --> 00:24:28.319 +In my thinking, intellectual property + +00:24:28.320 --> 00:24:29.839 +as a whole is invalid. + +00:24:29.840 --> 00:24:36.119 +But that means that through something like a Affero GPL, + +00:24:36.120 --> 00:24:41.719 +you focus on attribution basing, proper attribution basing. + +00:24:41.720 --> 00:24:43.839 +If somebody has done some work, + +00:24:43.840 --> 00:24:48.599 +it should be clear, no matter what, that that work is his. + +00:24:48.600 --> 00:24:54.879 +And that we already, even prior to AI, we were seeing this. + +00:24:54.880 --> 00:24:59.399 +We were seeing large GitHub repos with hundreds of authors. + +00:24:59.400 --> 00:25:09.879 +And it was utterly unclear as to who would own this whole thing. + +00:25:09.880 --> 00:25:14.119 +And any piece of it is not of significance. + +00:25:14.120 --> 00:25:16.879 +What is of significance is the whole thing. + +00:25:16.880 --> 00:25:25.039 +So moving towards that attribution based economics is key. + +00:25:25.040 --> 00:25:27.599 +And then once we do that, + +00:25:27.600 --> 00:25:31.919 +and then we accept AI as a reality. + +00:25:31.920 --> 00:25:38.199 +AI should still take very seriously + +00:25:38.200 --> 00:25:43.999 +and conform to attribution-based economics. + +00:25:44.000 --> 00:25:47.879 +In other words, what is generated by the machine + +00:25:47.880 --> 00:25:51.279 +should not be claimed to be no one's + +00:25:51.280 --> 00:25:54.239 +or the machine owners, the AI owners. + +00:25:54.240 --> 00:25:56.879 +It should still clearly be attributed + +00:25:56.880 --> 00:26:03.039 +to the people who contributed in its creation. + +00:26:03.040 --> 00:26:06.959 +This all becomes very muddy, very clear, + +00:26:06.960 --> 00:26:11.919 +and I don't have a simple or clear answer to it. + +00:26:11.920 --> 00:26:16.079 +But the perimeters of the solution lie in + +00:26:16.080 --> 00:26:21.479 +rejection of intellectual property, + +00:26:21.480 --> 00:26:25.039 +replacement of the intellectual property + +00:26:25.040 --> 00:26:27.399 +with attribution-based economics, + +00:26:27.400 --> 00:26:31.199 +and restrictions on AI use + +00:26:31.200 --> 00:26:38.199 +of not properly attributed content. + +00:26:38.200 --> 00:26:50.239 +Yeah, I'd say that would be, it's a complicated topic + +00:26:50.240 --> 00:26:56.119 +and I would simply say I haven't figured it out at all. + +00:26:56.120 --> 00:27:03.759 +I just have a perimeter set of concepts + +00:27:03.760 --> 00:27:06.479 +that can be used to drive it. + +00:27:06.480 --> 00:27:20.679 +Are there any other questions? If there aren't any, + +00:27:20.680 --> 00:27:23.159 +I thank everybody again, + +00:27:23.160 --> 00:27:27.799 +and particularly the EmacsConf organizers and Sacha. + +00:27:27.800 --> 00:27:32.639 +And I look forward to continuing all of this next year. + +00:27:32.640 --> 00:27:39.079 +Unless there is any objection, + +00:27:39.080 --> 00:27:45.360 +I'll leave the session and close it. Thank you. diff --git a/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt new file mode 100644 index 00000000..a32fdf09 --- /dev/null +++ b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main--chapters.vtt @@ -0,0 +1,77 @@ +WEBVTT + + +00:00:05.760 --> 00:01:20.079 +Introduction + +00:01:20.080 --> 00:02:10.319 +Scope: A complete multi-media content processing framework + +00:02:10.320 --> 00:03:02.419 +Prior art and similar art + +00:03:02.420 --> 00:03:57.159 +LaTeX-Beamer + Reveal.js with Blee and BISOS + +00:03:57.160 --> 00:05:12.519 +Blee-LCNT novel concepts + +00:05:12.520 --> 00:06:32.559 +Part of a bigger picture - part of a series + +00:06:32.560 --> 00:12:52.639 +Nature of polyexistentials + +00:12:52.640 --> 00:14:23.119 +Content processing - a ByStar/BISOS/Blee Capability Bundle (BCB) + +00:14:23.120 --> 00:14:31.279 +ByStar containment hierarchy and ByStar capability bundles + +00:14:31.280 --> 00:15:21.999 +Aggregated conviviality of ByStar capabilities + +00:15:22.000 --> 00:15:47.867 +Parts list: integrated components + +00:15:47.868 --> 00:18:45.719 +Resulting contents - output forms and formats + +00:18:45.720 --> 00:20:31.979 +reveal.js + +00:20:31.980 --> 00:21:33.479 +Generating the video + +00:21:33.480 --> 00:22:39.179 +A unified single input -- a sequencef of frames + +00:22:39.180 --> 00:23:16.199 +Abstractions to keep in mind + +00:23:16.200 --> 00:24:24.359 +Frame control types + +00:24:24.360 --> 00:26:25.199 +How outputs are generate from the inputs + +00:26:25.200 --> 00:27:46.479 +Context for unified source walkthrough + +00:27:46.480 --> 00:29:24.079 +One slide + +00:29:24.080 --> 00:31:05.799 +Dynamic blocks + +00:31:05.800 --> 00:33:42.279 +Internationalization - a non-Americanist perspective + +00:33:42.280 --> 00:35:07.719 +Autonomous self-publication and federated re-publications + +00:35:07.720 --> 00:36:02.559 +Ingredients of BISOS platforms and their progression + +00:36:02.560 --> 00:36:41.640 +Moving forward diff --git a/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt new file mode 100644 index 00000000..90f7b470 --- /dev/null +++ b/2025/captions/emacsconf-2025-blee-lcnt--bleelcnt-an-emacscentered-content-production-and-selfpublication-framework--mohsen-banan--main.vtt @@ -0,0 +1,2058 @@ +WEBVTT captioned by mohsen + +NOTE Introduction + +00:00:05.760 --> 00:00:08.159 +Greetings. Salaam. + +00:00:08.160 --> 00:00:10.159 +This is Mohsen Banan. + +00:00:10.160 --> 00:00:12.839 +I am a software and internet engineer. + +00:00:12.840 --> 00:00:14.679 +The title of this presentation + +00:00:14.680 --> 00:00:18.839 +is "Blee-LCNT: An Emacs Centered + +00:00:18.840 --> 00:00:23.659 +Content Production and Self-Publication Framework". + +00:00:23.660 --> 00:00:25.559 +Blee stands for + +00:00:25.560 --> 00:00:29.279 +ByStar Libre-Halaal Emacs Environment. + +00:00:29.280 --> 00:00:31.799 +In last year's EmacsConf, + +00:00:31.800 --> 00:00:36.079 +I introduced Blee, BISOS and ByStar + +00:00:36.080 --> 00:00:39.439 +as concepts and as foundations. + +00:00:39.440 --> 00:00:41.079 +This year I want to focus + +00:00:41.080 --> 00:00:43.879 +on one concrete capability. + +00:00:43.880 --> 00:00:47.959 +Content Production and Self-Publication + +00:00:47.960 --> 00:00:54.119 +is a foundational Blee and BISOS Capability Bundle. + +00:00:54.120 --> 00:00:55.759 +Both this presentation + +00:00:55.760 --> 00:00:59.079 +and the Nature of Polyexistentials book + +00:00:59.080 --> 00:01:02.879 +were developed with Blee-LCNT. + +00:01:02.880 --> 00:01:06.759 +In this presentation I want to look at Emacs + +00:01:06.760 --> 00:01:08.519 +as a central ingredient + +00:01:08.520 --> 00:01:10.959 +for a usage environment + +00:01:10.960 --> 00:01:14.919 +that we can use to orchestrate production of + +00:01:14.920 --> 00:01:20.079 +quite fancy multi-media presentations. + +NOTE Scope: A complete multi-media content processing framework + +00:01:20.080 --> 00:01:23.079 +Let's consider two different scopes. + +00:01:23.080 --> 00:01:27.919 +First, the scope of Blee-LCNT Capabilities Bundle, + +00:01:27.920 --> 00:01:29.919 +which is that of a complete + +00:01:29.920 --> 00:01:32.599 +multi-media content authorship, + +00:01:32.600 --> 00:01:34.799 +generation, publication + +00:01:34.800 --> 00:01:37.639 +and distribution framework. + +00:01:37.640 --> 00:01:40.999 +That complete scope is presented in this slide + +00:01:41.000 --> 00:01:44.239 +and it spans both black ink + +00:01:44.240 --> 00:01:46.639 +and violet ink. + +00:01:46.640 --> 00:01:49.799 +Second, the scope of this presentation, + +00:01:49.800 --> 00:01:52.119 +which is more limited. + +00:01:52.120 --> 00:01:54.919 +In this presentation I confine myself + +00:01:54.920 --> 00:01:58.519 +to the bullets is violet ink. + +00:01:58.520 --> 00:02:01.159 +Here, I focus on presentation + +00:02:01.160 --> 00:02:03.599 +and video as content types + +00:02:03.600 --> 00:02:05.999 +and their authorship and generation + +00:02:06.000 --> 00:02:10.319 +and their federated re-publication. + +NOTE Prior art and similar art + +00:02:10.320 --> 00:02:12.559 +This is a common topic. + +00:02:12.560 --> 00:02:14.839 +It makes good sense for us to start with + +00:02:14.840 --> 00:02:19.079 +a review of prior art and similar art. + +00:02:19.080 --> 00:02:21.959 +I went through the past EmacsConf talks + +00:02:21.960 --> 00:02:23.919 +and found a good number of them + +00:02:23.920 --> 00:02:25.999 +that also deal with the topic + +00:02:26.000 --> 00:02:28.839 +of content generation. + +00:02:28.840 --> 00:02:30.319 +A few of these are included + +00:02:30.320 --> 00:02:33.359 +in black ink in this slide. + +00:02:33.360 --> 00:02:35.599 +Many of these have chosen the Babel, + +00:02:35.600 --> 00:02:40.719 +in other words Org-Mode+LaTeX as primary input. + +00:02:40.720 --> 00:02:43.599 +I prefer the inverse of that. + +00:02:43.600 --> 00:02:45.839 +I also looked for past talks + +00:02:45.840 --> 00:02:49.999 +which have used Reveal.js and LaTeX-Beamer. + +00:02:50.000 --> 00:02:53.399 +For example, Sacha's use of Reveal.js + +00:02:53.400 --> 00:02:56.959 +is shown in violet inK. + +00:02:56.960 --> 00:03:02.419 +And Ihor's use of Beamer is in teal ink. + +NOTE LaTeX-Beamer + Reveal.js with Blee and BISOS + +00:03:02.420 --> 00:03:05.399 +This presentation is about a combination + +00:03:05.400 --> 00:03:08.639 +of Reveal.js and LaTeX-Beamer. + +00:03:08.640 --> 00:03:10.599 +For those who may not be familiar + +00:03:10.600 --> 00:03:12.619 +with Beamer and Reveal, + +00:03:12.620 --> 00:03:14.799 +here is a quick intro. + +00:03:14.800 --> 00:03:19.039 +Among academics, LaTeX-Beamer is the go-to tool + +00:03:19.040 --> 00:03:22.159 +for producing presentations. + +00:03:22.160 --> 00:03:24.239 +Reveal.js is recognized + +00:03:24.240 --> 00:03:25.919 +as the best of breed + +00:03:25.920 --> 00:03:29.919 +for dispensing HTML slide decks. + +00:03:29.920 --> 00:03:32.439 +For many, Reveal and Beamer + +00:03:32.440 --> 00:03:35.959 +live in different universes. + +00:03:35.960 --> 00:03:38.679 +Beamer is pdf oriented + +00:03:38.680 --> 00:03:42.019 +and Reveal is html oriented. + +00:03:42.020 --> 00:03:44.519 +Combining two powerful tools + +00:03:44.520 --> 00:03:48.359 +makes for an even more powerful tool. + +00:03:48.360 --> 00:03:51.879 +This Blee-LCNT Presentations combines + +00:03:51.880 --> 00:03:57.159 +the best of LaTeX-Beamer with Reveal.js. + +NOTE Blee-LCNT novel concepts + +00:03:57.160 --> 00:04:00.679 +Beamer primarily functions as producer + +00:04:00.680 --> 00:04:03.099 +and Reveal functions as dispenser + +00:04:03.100 --> 00:04:05.579 +and multi-media enhancer. + +00:04:05.580 --> 00:04:08.299 +Here is how the combination works. + +00:04:08.300 --> 00:04:10.439 +LaTeX Beamer pdf result + +00:04:10.440 --> 00:04:13.839 +is dissected into named frame images + +00:04:13.840 --> 00:04:18.799 +which can then be inserted in Reveal.js. + +00:04:18.800 --> 00:04:21.239 +LaTeX Beamer frames can also be + +00:04:21.240 --> 00:04:24.799 +translated into html with HeVeA + +00:04:24.800 --> 00:04:28.999 +which can also be inserted in Reveal.js. + +00:04:29.000 --> 00:04:31.119 +Voice-overs for Beamer frames + +00:04:31.120 --> 00:04:34.039 +can be correlated to frame names + +00:04:34.040 --> 00:04:37.119 +and applied to image or html frames. + +00:04:37.120 --> 00:04:42.079 +Screen captures and image narrations as videos + +00:04:42.080 --> 00:04:44.359 +can be directly dispensed + +00:04:44.360 --> 00:04:46.379 +through Reveal. + +00:04:46.380 --> 00:04:49.439 +There are various additional novel concepts + +00:04:49.440 --> 00:04:50.599 +with regard to the way + +00:04:50.600 --> 00:04:54.559 +that we have integrated all of this together. + +00:04:54.560 --> 00:04:57.599 +Instead of Org-Mode+LaTeX, + +00:04:57.600 --> 00:05:00.999 +we do LaTeX+Org-Mode. + +00:05:01.000 --> 00:05:03.999 +Instead of Babel, we do COMEEGA, + +00:05:04.000 --> 00:05:05.999 +instead of the Literate model + +00:05:06.000 --> 00:05:08.839 +we introduce the Surrounded model. + +00:05:08.840 --> 00:05:10.839 +You shall see various examples + +00:05:10.840 --> 00:05:12.519 +of these shortly. + +NOTE Part of a bigger picture - part of a series + +00:05:12.520 --> 00:05:15.639 +All of this is part of a bigger picture. + +00:05:15.640 --> 00:05:17.619 +A much bigger picture. + +00:05:17.620 --> 00:05:23.599 +My talks at EmacsConf 2021, 2022 + +00:05:23.600 --> 00:05:26.519 +and 2024 are related. + +00:05:26.520 --> 00:05:31.399 +This 2025 talk builds on those. + +00:05:31.400 --> 00:05:34.719 +Last year's talk "About Blee: + +00:05:34.720 --> 00:05:36.839 +enveloping our own autonomy + +00:05:36.840 --> 00:05:38.999 +directed digital ecosystem + +00:05:39.000 --> 00:05:42.199 +with Emacs" in particular, + +00:05:42.200 --> 00:05:44.979 +lays the foundations for this talk. + +00:05:44.980 --> 00:05:47.119 +If you have not seen that, + +00:05:47.120 --> 00:05:51.159 +it would make good sense to review it. + +00:05:51.160 --> 00:05:54.279 +In my previous talks I have been criticized + +00:05:54.280 --> 00:05:58.359 +of having a "prophetic" style. + +00:05:58.360 --> 00:06:02.059 +The scope of ByStar is lofty and immense. + +00:06:02.060 --> 00:06:04.879 +In many ways it is unbelievable. + +00:06:04.880 --> 00:06:09.139 +And EmacsConf talks are meant to be short. + +00:06:09.140 --> 00:06:11.839 +So, as a result, sometimes + +00:06:11.840 --> 00:06:13.959 +I end up being cryptic. + +00:06:13.960 --> 00:06:17.499 +Having accepted the "prophetic" criticism + +00:06:17.500 --> 00:06:19.399 +as legitimate, + +00:06:19.400 --> 00:06:23.599 +I now need to put a book on the table. + +00:06:23.600 --> 00:06:26.839 +With that book in place, moving forward, + +00:06:26.840 --> 00:06:29.339 +when needing to be cryptic, + +00:06:29.340 --> 00:06:32.559 +I shall cite Chapter and Verse. + +NOTE Nature of polyexistentials + +00:06:32.560 --> 00:06:34.879 +I am delighted to announce + +00:06:34.880 --> 00:06:37.559 +the availability of my recent book, + +00:06:37.560 --> 00:06:40.199 +"Nature of Polyexistentials". + +00:06:40.200 --> 00:06:42.959 +The full title of my book is: + +00:06:42.960 --> 00:06:45.039 +Nature Of Polyexistentials--- + +00:06:45.040 --> 00:06:48.239 +Basis For Abolishment Of The Western + +00:06:48.240 --> 00:06:51.219 +Intellectual Property Rights Regime--- + +00:06:51.220 --> 00:06:53.899 +And Introduction Of The Libre-Halaal + +00:06:53.900 --> 00:06:56.999 +ByStar Digital Ecosystem. + +00:06:57.000 --> 00:06:59.199 +Knowledge, know-how, uses of know-how, + +00:06:59.200 --> 00:07:02.879 +ideas, formulas, software and information + +00:07:02.880 --> 00:07:05.519 +are inherently non-scarce. + +00:07:05.520 --> 00:07:08.439 +They are *polyexistentials*. + +00:07:08.440 --> 00:07:10.239 +Unlike monoexistentials + +00:07:10.240 --> 00:07:12.259 +which exist in singular, + +00:07:12.260 --> 00:07:17.539 +polyexistentials naturally exist in multiples. + +00:07:17.540 --> 00:07:19.559 +What is abundant in nature + +00:07:19.560 --> 00:07:22.599 +is being made artificially scarce + +00:07:22.600 --> 00:07:25.399 +through man-made ownership rules + +00:07:25.400 --> 00:07:28.599 +called copyright and patents. + +00:07:28.600 --> 00:07:31.239 +These mistaken ownership rules, + +00:07:31.240 --> 00:07:34.959 +the so called Western IPR regime, + +00:07:34.960 --> 00:07:37.319 +has immense ramifications + +00:07:37.320 --> 00:07:38.839 +on the shape and the direction + +00:07:38.840 --> 00:07:42.619 +of the American Digital Ecosystem. + +00:07:42.620 --> 00:07:45.119 +It would be an understatement to say + +00:07:45.120 --> 00:07:47.779 +that the American Digital Ecosystem + +00:07:47.780 --> 00:07:50.599 +has put humanity in danger. + +00:07:50.600 --> 00:07:53.099 +Two parts of the book, in particular + +00:07:53.100 --> 00:07:55.679 +are of immediate relevance. + +00:07:55.680 --> 00:07:58.219 +Part III, the ethics layer, + +00:07:58.220 --> 00:08:01.119 +focuses on contours of cures. + +00:08:01.120 --> 00:08:02.839 +Having dismissed the Western + +00:08:02.840 --> 00:08:06.119 +intellectual property rights (IPR) regime + +00:08:06.120 --> 00:08:11.739 +as an erroneous governance model for polyexistentials, + +00:08:11.740 --> 00:08:14.319 +I propose the Libre-Halaal model + +00:08:14.320 --> 00:08:17.199 +of governance of polyexistentials + +00:08:17.200 --> 00:08:22.779 +towards facilitating conviviality of tools. + +00:08:22.780 --> 00:08:25.359 +Part IV, the engineering layer, + +00:08:25.360 --> 00:08:29.599 +introduces the Libre-Halaal ByStar Digital Ecosystem. + +00:08:29.600 --> 00:08:32.399 +as an ethical alternative + +00:08:32.400 --> 00:08:34.239 +to the prevailing proprietary + +00:08:34.240 --> 00:08:37.499 +American digital ecosystem. + +00:08:37.500 --> 00:08:40.479 +The book also provides additional details + +00:08:40.480 --> 00:08:42.919 +about the content generation + +00:08:42.920 --> 00:08:44.919 +and publication facilities + +00:08:44.920 --> 00:08:46.839 +that I am presenting here. + +00:08:46.840 --> 00:08:50.079 +And the book itself, as content, + +00:08:50.080 --> 00:08:53.439 +was generated and published + +00:08:53.440 --> 00:08:55.319 +using the facilities + +00:08:55.320 --> 00:08:57.239 +that I am presenting here. + +00:08:57.240 --> 00:08:59.199 +You can think of this book + +00:08:59.200 --> 00:09:01.159 +as being in two volumes. + +00:09:01.160 --> 00:09:05.919 +Our focus are Blee and BISOS in Volume II. + +00:09:05.920 --> 00:09:10.239 +Volume I deals with the general concept + +00:09:10.240 --> 00:09:13.879 +of polyexistence and invalidity + +00:09:13.880 --> 00:09:18.679 +of IPR and our terminoloy of Libre-Halaal--- + +00:09:18.680 --> 00:09:23.519 +instead of the common but ill directed vocabulary + +00:09:23.520 --> 00:09:28.239 +of Free Software and Open-Source and FOSS. + +00:09:28.240 --> 00:09:31.239 +In Chapter 11, I introduce + +00:09:31.240 --> 00:09:34.759 +the very sensitive and potent vocabulary + +00:09:34.760 --> 00:09:37.719 +of Halaal and Libre-Halaal. + +00:09:37.720 --> 00:09:39.079 +The contents of this book + +00:09:39.080 --> 00:09:41.659 +belong to all of humanity + +00:09:41.660 --> 00:09:45.519 +and verbatim copying of it is unrestricted. + +00:09:45.520 --> 00:09:49.479 +If you want to read it, this book is yours. + +00:09:49.480 --> 00:09:51.839 +The "Nature of Polyexistentials" book + +00:09:51.840 --> 00:09:56.659 +is available both online and in print. + +00:09:56.660 --> 00:09:59.439 +This book is available as two editions. + +00:09:59.440 --> 00:10:03.819 +The US Edition and the International edition. + +00:10:03.820 --> 00:10:05.959 +The US Edition is written + +00:10:05.960 --> 00:10:10.079 +with a slightly milder Western unfriendly tone, + +00:10:10.080 --> 00:10:12.399 +while the International Edition + +00:10:12.400 --> 00:10:17.619 +includes additional original content in Farsi. + +00:10:17.620 --> 00:10:20.399 +I consider the International Edition + +00:10:20.400 --> 00:10:22.979 +to be the authoritative version. + +00:10:22.980 --> 00:10:25.319 +However, many readers in + +00:10:25.320 --> 00:10:27.319 +the US and Western countries + +00:10:27.320 --> 00:10:31.199 +may prefer the US Edition. + +00:10:31.200 --> 00:10:33.999 +I maintain separate Git repositories + +00:10:34.000 --> 00:10:36.039 +for each edition on GitHub: + +00:10:36.040 --> 00:10:42.839 +US Edition is at bxplpc/120033 + +00:10:42.840 --> 00:10:51.419 +and International Edition: bxplpc/120074 + +00:10:51.420 --> 00:10:53.679 +Cloning these repositories + +00:10:53.680 --> 00:10:56.399 +will give you access to the book + +00:10:56.400 --> 00:11:00.039 +in PDF format (suitable for both + +00:11:00.040 --> 00:11:04.039 +A4 and US Letter printing) + +00:11:04.040 --> 00:11:06.379 +and in EPUB format. + +00:11:06.380 --> 00:11:08.559 +Alternatively, the content + +00:11:08.560 --> 00:11:12.039 +can be downloaded directly from your browser + +00:11:12.040 --> 00:11:17.259 +without needing to clone the repositories. + +00:11:17.260 --> 00:11:19.079 +To ensure broader online + +00:11:19.080 --> 00:11:21.899 +availability and stability, + +00:11:21.900 --> 00:11:26.159 +I have also published the book on Zenodo, + +00:11:26.160 --> 00:11:31.779 +complete with a DOI (Digital Object Identifier). + +00:11:31.780 --> 00:11:34.439 +You can download both the A4 + +00:11:34.440 --> 00:11:39.639 +and 8.5 x 11 PDFs from there as well. + +00:11:39.640 --> 00:11:44.119 +The book is also available in print on Amazon + +00:11:44.120 --> 00:11:46.239 +and at most major bookstores + +00:11:46.240 --> 00:11:49.379 +in the US and Western regions. + +00:11:49.380 --> 00:11:51.519 +The ISBNs for both editions + +00:11:51.520 --> 00:11:54.139 +are included in this slide. + +00:11:54.140 --> 00:11:56.319 +Additionally, I have published + +00:11:56.320 --> 00:12:00.719 +this book in Iran through Jangal Publishers. + +00:12:00.720 --> 00:12:03.079 +I did not write this book for profit. + +00:12:03.080 --> 00:12:05.359 +My aim is to share my thoughts + +00:12:05.360 --> 00:12:10.599 +and encourage readers to engage with my views and ideas. + +00:12:10.600 --> 00:12:12.499 +Your feedback is welcome, + +00:12:12.500 --> 00:12:14.119 +and I am genuinely interested + +00:12:14.120 --> 00:12:17.199 +in hearing your perspectives. + +00:12:17.200 --> 00:12:20.879 +In Western markets, I have priced the print edition + +00:12:20.880 --> 00:12:24.339 +somewhat above production costs. + +00:12:24.340 --> 00:12:26.639 +If you find value in the book + +00:12:26.640 --> 00:12:28.599 +and the ByStar project, + +00:12:28.600 --> 00:12:32.759 +purchasing a copy will help support my work. + +00:12:32.760 --> 00:12:37.459 +Thanks in advance for your support. + +00:12:37.460 --> 00:12:39.479 +And here are the same links + +00:12:39.480 --> 00:12:42.179 +as a native Reveal slide. + +00:12:42.180 --> 00:12:43.839 +If instead of a video, + +00:12:43.840 --> 00:12:47.759 +you are viewing this presentation as a Reveal web page, + +00:12:47.760 --> 00:12:52.639 +you can just click on the pointers and URLs. + +NOTE Content processing - a ByStar/BISOS/Blee Capability Bundle (BCB) + +00:12:52.640 --> 00:12:55.079 +Instead of the traditional model + +00:12:55.080 --> 00:12:59.559 +of giving you recipes in a DIY context + +00:12:59.560 --> 00:13:01.479 +towards the goal of creating + +00:13:01.480 --> 00:13:04.559 +content processing capabilities + +00:13:04.560 --> 00:13:07.659 +on top of what you may already have, + +00:13:07.660 --> 00:13:09.959 +I am doing the opposite. + +00:13:09.960 --> 00:13:15.159 +I am saying: take this whole BISOS and Blee thing, + +00:13:15.160 --> 00:13:17.559 +and in there you will also have + +00:13:17.560 --> 00:13:20.239 +the content processing capabilities + +00:13:20.240 --> 00:13:22.579 +that I am speaking of here. + +00:13:22.580 --> 00:13:24.919 +So, at the top level we have + +00:13:24.920 --> 00:13:27.519 +our own autonomy and privacy + +00:13:27.520 --> 00:13:30.199 +directed digital ecosystem, + +00:13:30.200 --> 00:13:32.839 +which in contrast to the center oriented + +00:13:32.840 --> 00:13:35.659 +American digital ecosystem, + +00:13:35.660 --> 00:13:38.479 +is edge oriented. + +00:13:38.480 --> 00:13:40.919 +We call it: "The Libre-Halaal + +00:13:40.920 --> 00:13:43.919 +ByStar Digital Ecosystem". + +00:13:43.920 --> 00:13:45.799 +All the systems in ByStar, + +00:13:45.800 --> 00:13:50.699 +run BISOS (By* Internet Services OS), + +00:13:50.700 --> 00:13:53.759 +which is a layer on top of Debian. + +00:13:53.760 --> 00:13:58.199 +The usage environment of ByStar and BISOS is Blee + +00:13:58.200 --> 00:14:01.579 +which is a layer on top of Emacs. + +00:14:01.580 --> 00:14:04.919 +With those in place, we then create + +00:14:04.920 --> 00:14:10.139 +a capability bundle called Blee-LCNT. + +00:14:10.140 --> 00:14:13.039 +So, when you buy into Blee and BISOS, + +00:14:13.040 --> 00:14:15.199 +you will naturally also get + +00:14:15.200 --> 00:14:18.719 +these content processing capabilities--- + +00:14:18.720 --> 00:14:23.119 +without a need for any recipies or DIY effort. + +NOTE ByStar containment hierarchy and ByStar capability bundles + +00:14:23.120 --> 00:14:24.879 +If you were to look at the model + +00:14:24.880 --> 00:14:29.119 +that I introduced as containment hierarchies, + +00:14:29.120 --> 00:14:31.279 +it would look like this. + +NOTE Aggregated conviviality of ByStar capabilities + +00:14:31.280 --> 00:14:33.779 +We love Emacs and we love Unix + +00:14:33.780 --> 00:14:36.759 +because their design is convivial. + +00:14:36.760 --> 00:14:39.199 +By convivial, I am referring + +00:14:39.200 --> 00:14:40.759 +to Ivan Illich's concept + +00:14:40.760 --> 00:14:45.319 +and terminology of "Tools for Conviviality". + +00:14:45.320 --> 00:14:48.679 +It was first published in 1973. + +00:14:48.680 --> 00:14:50.959 +It's a must read. + +00:14:50.960 --> 00:14:52.639 +A goal of the design + +00:14:52.640 --> 00:14:54.799 +of the ByStar Digital Ecosystem + +00:14:54.800 --> 00:14:57.479 +is to enlarge the aggregated + +00:14:57.480 --> 00:15:01.719 +conviviality of its capabilities. + +00:15:01.720 --> 00:15:04.719 +What distinguishes Blee-LCNT + +00:15:04.720 --> 00:15:08.959 +from other content processing tools and frameworks, + +00:15:08.960 --> 00:15:12.439 +is our emphasis on enhancing + +00:15:12.440 --> 00:15:15.659 +the aggregated conviviality. + +00:15:15.660 --> 00:15:19.259 +These tools let you express yourself. + +00:15:19.260 --> 00:15:21.999 +They let you be in charge. + +NOTE Parts list: integrated components + +00:15:22.000 --> 00:15:24.499 +Here is our parts list. + +00:15:24.500 --> 00:15:25.839 +These are the components + +00:15:25.840 --> 00:15:27.959 +that we have chosen to bring together + +00:15:27.960 --> 00:15:32.779 +towards our goal of creating convivial tools. + +00:15:32.780 --> 00:15:36.039 +In this slide, we are using black ink + +00:15:36.040 --> 00:15:38.519 +to denote exisiting tools + +00:15:38.520 --> 00:15:41.339 +and we use violet ink + +00:15:41.340 --> 00:15:44.419 +to denote pieces that we have developed + +00:15:44.420 --> 00:15:47.100 +towards cohesive integration. + +00:15:46.560 --> 00:15:47.867 +[This] video, + +NOTE Resulting contents - output forms and formats + +00:15:47.868 --> 00:15:51.479 +the video is just one of the outputs. + +00:15:51.480 --> 00:15:54.499 +There are other outputs as well. + +00:15:54.500 --> 00:15:56.359 +In this figure, the outputs + +00:15:56.360 --> 00:15:58.859 +are shown in the top layer. + +00:15:58.860 --> 00:16:02.279 +Using this video as an example, + +00:16:02.280 --> 00:16:05.599 +this presentation's output also include + +00:16:05.600 --> 00:16:07.599 +the "Presentation Form" + +00:16:07.600 --> 00:16:10.999 +and the "Article-Presentation Form". + +00:16:11.000 --> 00:16:13.719 +Let's look at these more closely. + +00:16:13.720 --> 00:16:17.259 +For Presentations, there are 3 different forms. + +00:16:17.260 --> 00:16:19.559 +The Video Form, the Presentation From + +00:16:19.560 --> 00:16:22.819 +and the Article-Presentation Form. + +00:16:22.820 --> 00:16:27.439 +The Presentation Form produces both a pdf output + +00:16:27.440 --> 00:16:29.079 +and Reveal output. + +00:16:29.080 --> 00:16:32.879 +Next we will walkthrough some of the benefits + +00:16:32.880 --> 00:16:35.519 +that availability of these forms + +00:16:35.520 --> 00:16:38.099 +and formats provide. + +00:16:38.100 --> 00:16:41.959 +The video presentation that you are watching + +00:16:41.960 --> 00:16:44.599 +is just one of the outputs + +00:16:44.600 --> 00:16:48.479 +of the Blee-LCNT machinery. + +00:16:48.480 --> 00:16:52.679 +There are two PDF format outputs + +00:16:52.680 --> 00:16:56.439 +and two HTML outputs + +00:16:56.440 --> 00:16:58.859 +that are also quite useful. + +00:16:58.860 --> 00:17:02.119 +The primary output of Beamer + +00:17:02.120 --> 00:17:04.239 +is a set of slides + +00:17:04.240 --> 00:17:10.439 +that people use to give their talks with. + +00:17:10.440 --> 00:17:12.479 +Typically that's done live. + +00:17:12.480 --> 00:17:19.179 +In my case I dissect the images of each frame + +00:17:19.180 --> 00:17:21.639 +and do a voiceover on it + +00:17:21.640 --> 00:17:28.839 +and then dispense it through reveal. + +00:17:28.840 --> 00:17:33.379 +In a second, you will see that as well. + +00:17:33.380 --> 00:17:36.959 +This PDF output is very useful. + +00:17:36.960 --> 00:17:39.279 +You get the table of contents, of course, + +00:17:39.280 --> 00:17:42.207 +and in addition to that, + +00:17:42.208 --> 00:17:46.319 +Beamer generates navigations for you + +00:17:46.320 --> 00:17:49.599 +where on any part you get + +00:17:49.600 --> 00:17:51.839 +a small table of content as well. + +00:17:51.840 --> 00:17:57.119 +This is heavily used amongst academics, + +00:17:57.120 --> 00:18:00.959 +and it's a good output on its own, + +00:18:00.960 --> 00:18:03.319 +and I'm augmenting it + +00:18:03.320 --> 00:18:05.399 +in a variety of ways. + +00:18:05.400 --> 00:18:09.719 +In addition to the presentation PDF format, + +00:18:09.720 --> 00:18:15.359 +there is also an article-presentation PDF format + +00:18:15.360 --> 00:18:18.799 +which gives you the same content, + +00:18:18.800 --> 00:18:25.159 +but it gives it to you in a textual form + +00:18:25.160 --> 00:18:30.939 +with the table of content and the rest. + +00:18:30.940 --> 00:18:34.759 +This is a good form to use + +00:18:34.760 --> 00:18:39.919 +when you are giving, for example, class lectures, + +00:18:39.920 --> 00:18:45.719 +and the students often prefer this format. + +NOTE reveal.js + +00:18:45.720 --> 00:18:51.839 +Now for the HTML format output, the most relevant, + +00:18:51.840 --> 00:18:55.599 +of course, is the reveal itself. + +00:18:55.600 --> 00:19:05.679 +If you have not used reveal before, + +00:19:05.680 --> 00:19:10.559 +in my view, it's a HTML slide dispenser. + +00:19:10.560 --> 00:19:15.479 +I don't look at it as a presentation framework. + +00:19:15.480 --> 00:19:22.599 +I use, as you are seeing, we use Beamer to feed into it + +00:19:22.600 --> 00:19:25.759 +and we use it to dispense the information. + +00:19:25.760 --> 00:19:33.439 +It has all the typical navigation + +00:19:33.440 --> 00:19:39.959 +capabilities that you would expect, + +00:19:39.960 --> 00:19:44.319 +and most of what I have as slides are images, + +00:19:44.320 --> 00:19:48.239 +but occasionally, particularly when there is a need + +00:19:48.240 --> 00:19:52.999 +to provide pointers, HTML pointers, + +00:19:53.000 --> 00:20:01.439 +I then also include a textual output. + +00:20:01.440 --> 00:20:05.559 +This is also produced + +00:20:05.560 --> 00:20:09.839 +from the Beamer LaTeX source, + +00:20:09.840 --> 00:20:14.959 +but it's HTML through textual HTML, + +00:20:14.960 --> 00:20:19.019 +through HeVeA, not the image. + +00:20:19.020 --> 00:20:22.499 +You can... you get a table of contents. + +00:20:22.500 --> 00:20:24.574 +You can navigate + +00:20:24.575 --> 00:20:28.079 +and there are a whole lot of other features + +00:20:28.080 --> 00:20:31.979 +that reveal also provides. + +NOTE Generating the video + +00:20:31.980 --> 00:20:35.879 +So to generate the video, + +00:20:35.880 --> 00:20:40.980 +what I do is I come to + +00:20:40.981 --> 00:20:49.459 +the very beginning of the presentation. + +00:20:49.460 --> 00:20:51.519 +I turn on the screen capture recorder, + +00:20:51.520 --> 00:20:54.159 +and then I start playing + +00:20:54.160 --> 00:20:58.239 +the voiceover for each slide + +00:20:58.240 --> 00:21:02.519 +and at the very end, you get a video, + +00:21:02.520 --> 00:21:08.759 +but what you just did is you dispensed every frame, + +00:21:08.760 --> 00:21:11.279 +one at a time, through reveal. + +00:21:11.280 --> 00:21:15.319 +In addition to this HTML form, + +00:21:15.320 --> 00:21:22.239 +you also get an article presentation form of it, + +00:21:22.240 --> 00:21:24.159 +with a full table of contents + +00:21:24.160 --> 00:21:27.759 +and the videos are there, and the notes are there, + +00:21:27.760 --> 00:21:33.479 +and this is also quite useful. + +NOTE A unified single input -- a sequencef of frames + +00:21:33.480 --> 00:21:36.519 +Now, let's look at the one single input file + +00:21:36.520 --> 00:21:38.879 +that produced all of the outputs + +00:21:38.880 --> 00:21:39.879 +that we just saw. + +00:21:39.880 --> 00:21:43.079 +I have put both the input file + +00:21:43.080 --> 00:21:45.119 +and some of the output files + +00:21:45.120 --> 00:21:48.299 +for this presentation on Github. + +00:21:48.300 --> 00:21:49.839 +Here are some links + +00:21:49.840 --> 00:21:51.679 +to these repos and files. + +00:21:51.680 --> 00:21:54.679 +And here are the same links + +00:21:54.680 --> 00:21:57.119 +as a native Reveal slide. + +00:21:57.120 --> 00:21:59.879 +This figure gives us an overview + +00:21:59.880 --> 00:22:02.759 +of how one set of inputs + +00:22:02.760 --> 00:22:04.959 +encapsulted in a single file + +00:22:04.960 --> 00:22:08.759 +can produce all of the outputs that we saw. + +00:22:08.760 --> 00:22:11.439 +The main TeX file shown at the bottom + +00:22:11.440 --> 00:22:15.659 +is processed by both XeLaTeX and by HeVeA. + +00:22:15.660 --> 00:22:18.279 +That main TeX file, in addition + +00:22:18.280 --> 00:22:19.679 +to LaTeX syntax, + +00:22:19.680 --> 00:22:22.999 +also include org-mode constructs + +00:22:23.000 --> 00:22:27.039 +that facilitate addition of audio and video files. + +00:22:27.040 --> 00:22:34.879 +Later, I'll walkthrough the bodyPresArtEnFa.tex file + +00:22:34.880 --> 00:22:39.179 +that generated this very presentation with you. + +NOTE Abstractions to keep in mind + +00:22:39.180 --> 00:22:42.679 +When you construct that primary TeX file, + +00:22:42.680 --> 00:22:44.679 +there are several abstractions + +00:22:44.680 --> 00:22:46.899 +that you need to keep in mind. + +00:22:46.900 --> 00:22:49.119 +Is my presentation going to go + +00:22:49.120 --> 00:22:52.739 +from Left-To-Right or from Right-To-Left? + +00:22:52.740 --> 00:22:57.039 +Perso-Arabic presentations go from Right-To-Left. + +00:22:57.040 --> 00:22:59.679 +Another consideration is the types + +00:22:59.680 --> 00:23:03.119 +of forms of results that you want. + +00:23:03.120 --> 00:23:05.019 +Just the presentation + +00:23:05.020 --> 00:23:08.999 +or Article-Presentation as well? + +00:23:09.000 --> 00:23:10.879 +With those choices in place + +00:23:10.880 --> 00:23:13.399 +you can produce condition based text + +00:23:13.400 --> 00:23:16.199 +for each of your desired outputs. + +NOTE Frame control types + +00:23:16.200 --> 00:23:18.919 +Think of this video presentation + +00:23:18.920 --> 00:23:20.879 +as a sequence of frames. + +00:23:20.880 --> 00:23:26.119 +Each frame is controlled by an org-mode dynamic block. + +00:23:26.120 --> 00:23:29.039 +This table lists available dblocks + +00:23:29.040 --> 00:23:31.559 +from which you can choose. + +00:23:31.560 --> 00:23:34.039 +For example, this particular frame + +00:23:34.040 --> 00:23:34.839 +that we are watching + +00:23:34.840 --> 00:23:41.979 +is controlled by b:lcnt:pres:frame/derivedImage. + +00:23:41.980 --> 00:23:44.639 +Beamer creates a pdf file + +00:23:44.640 --> 00:23:47.879 +that includes the image of this slide. + +00:23:47.880 --> 00:23:51.459 +That image is then injected into Reveal. + +00:23:51.460 --> 00:23:55.359 +And in the end, a video of that image is produced + +00:23:55.360 --> 00:23:57.239 +with the narrations + +00:23:57.240 --> 00:23:59.259 +that I am uttering right now. + +00:23:59.260 --> 00:24:02.199 +All of this has similarly been applied + +00:24:02.200 --> 00:24:03.599 +to each and every frame + +00:24:03.600 --> 00:24:05.919 +that you have been watching. + +00:24:05.920 --> 00:24:08.399 +Similar to Frame Controls, + +00:24:08.400 --> 00:24:10.719 +there are org-mode dynamic blocks + +00:24:10.720 --> 00:24:13.519 +for "Frame Body Types". + +00:24:13.520 --> 00:24:15.839 +You can easily insert an image + +00:24:15.840 --> 00:24:19.639 +which is typically created by OpenOffice Draw + +00:24:19.640 --> 00:24:21.619 +into a frame. + +00:24:21.620 --> 00:24:24.359 +Same with say a screen capture video. + +NOTE How outputs are generate from the inputs + +00:24:24.360 --> 00:24:29.319 +Now that we have looked at the "Outputs" and the "Inputs", + +00:24:29.320 --> 00:24:31.679 +let's look at how the Outputs + +00:24:31.680 --> 00:24:35.919 +are generated from the Inputs. + +00:24:35.920 --> 00:24:39.399 +Let's bootstrap Raw-BISOS and Raw-Blee. + +00:24:39.400 --> 00:24:41.719 +Starting from scratch, + +00:24:41.720 --> 00:24:45.799 +get yourself a fresh copy of Debian 12. + +00:24:45.800 --> 00:24:52.719 +Then go to https://github.com/bxGenesis/start . + +00:24:52.720 --> 00:24:55.079 +The README.org file + +00:24:55.080 --> 00:24:57.119 +of that github repo + +00:24:57.120 --> 00:24:58.639 +is same as Chapter 18, + +00:24:58.640 --> 00:25:01.959 +"Engineering Adoption of BISOS and ByStar" of the book. + +00:25:01.960 --> 00:25:05.359 +We will next run "raw-bisos.sh", + +00:25:05.360 --> 00:25:09.959 +but prior to that, let's take a quick look. + +00:25:09.960 --> 00:25:14.759 +This bootstrap scripts will do a lot as root + +00:25:14.760 --> 00:25:16.479 +on your Fresh-Debian. + +00:25:16.480 --> 00:25:18.599 +It is best to first try it + +00:25:18.600 --> 00:25:21.179 +on a disposable VM. + +00:25:21.180 --> 00:25:27.159 +raw-bisos.sh adds the current debian user to sudoers. + +00:25:27.160 --> 00:25:30.399 +Then it installs pipx. + +00:25:30.400 --> 00:25:34.199 +And then with pipx it installs + +00:25:34.200 --> 00:25:37.999 +from PyPI bisos.provision. + +00:25:38.000 --> 00:25:43.279 +bisos.provision includes additional bash scripts + +00:25:43.280 --> 00:25:45.359 +that are then executed. + +00:25:45.360 --> 00:25:48.159 +Full installation involves + +00:25:48.160 --> 00:25:51.039 +setting up various accounts, groups, + +00:25:51.040 --> 00:25:53.279 +various directory hierarchies, + +00:25:53.280 --> 00:25:55.439 +lots of apt packages + +00:25:55.440 --> 00:25:57.979 +and lots of python packages + +00:25:57.980 --> 00:26:01.499 +from the bisos namespace. + +00:26:01.500 --> 00:26:03.879 +If you are ready, copy and paste + +00:26:03.880 --> 00:26:06.599 +this line and run it. + +00:26:06.600 --> 00:26:08.039 +You will be prompted + +00:26:08.040 --> 00:26:09.619 +for the root password. + +00:26:09.620 --> 00:26:11.279 +Then be patient. + +00:26:11.280 --> 00:26:12.559 +Full installation + +00:26:12.560 --> 00:26:14.519 +can take 15 minutes or so. + +00:26:14.520 --> 00:26:17.079 +The logs of this script + +00:26:17.080 --> 00:26:18.519 +are also captured + +00:26:18.520 --> 00:26:25.199 +in ~/raw-bisos-${dateTag}-log.org + +NOTE Context for unified source walkthrough + +00:26:25.200 --> 00:26:28.959 +Now that we have Raw-BISOS and Raw-Blee installed, + +00:26:28.960 --> 00:26:31.039 +we are ready to walk through + +00:26:31.040 --> 00:26:32.319 +the unified source + +00:26:32.320 --> 00:26:34.439 +of the very presentation + +00:26:34.440 --> 00:26:36.259 +that you are watching. + +00:26:36.260 --> 00:26:40.959 +The "bodyPresArtEnFa.tex" file + +00:26:40.960 --> 00:26:42.439 +that we will visit + +00:26:42.440 --> 00:26:45.059 +is in COMEEGA-LaTeX syntax + +00:26:45.060 --> 00:26:47.699 +with lots of org-mode dblocks + +00:26:47.700 --> 00:26:50.479 +which generate Beamer-LaTeX frames + +00:26:50.480 --> 00:26:54.139 +and conditioned LaTeX bodies. + +00:26:54.140 --> 00:26:55.599 +After the walkthrough, + +00:26:55.600 --> 00:27:00.359 +I'll describe dblocks and COMEEGA in more detail. + +00:27:00.360 --> 00:27:02.239 +At the tail end of the walkthrough, + +00:27:02.240 --> 00:27:05.319 +we will also go through the generation process + +00:27:05.320 --> 00:27:10.859 +which runs XeLaTeX and HeVeA and a lot more. + +00:27:10.860 --> 00:27:13.619 +Let's look at our input file. + +00:27:13.620 --> 00:27:17.019 +It's a LaTeX file in LaTeX mode, + +00:27:17.020 --> 00:27:24.279 +and it has org syntax org-mode included in it, + +00:27:24.280 --> 00:27:29.559 +and I can toggle between LaTeX and org-mode. + +00:27:29.560 --> 00:27:33.599 +So, now I'm gonna be in org-mode, + +00:27:33.600 --> 00:27:37.839 +and org-mode gives me everything + +00:27:37.840 --> 00:27:39.399 +that org has to offer, + +00:27:39.400 --> 00:27:46.479 +including a very convenient navigation framework. + +NOTE One slide + +00:27:46.480 --> 00:27:54.279 +Let's take one slide and take a look at how it was done. + +00:27:54.280 --> 00:27:58.679 +So I would come to this scope slide + +00:27:58.680 --> 00:28:03.999 +and while I am there, I'm going to click on N. + +00:28:04.000 --> 00:28:09.759 +N takes me to the native LaTeX form back, + +00:28:09.760 --> 00:28:16.359 +so that I'll be looking at it not in org, but in LaTeX. + +00:28:16.360 --> 00:28:22.906 +So we're back in LaTeX, and as you can see + +00:28:22.907 --> 00:28:25.999 +it uses a dynamic block + +00:28:26.000 --> 00:28:30.799 +starting with the comments and the BEGIN, + +00:28:30.800 --> 00:28:34.839 +and it uses a dynamic block + +00:28:34.840 --> 00:28:38.079 +named a framedDrive image, + +00:28:38.080 --> 00:28:45.399 +which means the content of this frame + +00:28:45.400 --> 00:28:50.439 +will be dispensed as an image, not as text, + +00:28:50.440 --> 00:28:56.899 +and it also automatically creates for me + +00:28:56.900 --> 00:29:00.439 +a name, a label, that can be used + +00:29:00.440 --> 00:29:05.119 +for voiceover augmentation. + +00:29:05.120 --> 00:29:08.119 +So a file in the audio directory + +00:29:08.120 --> 00:29:13.039 +called ScopeOfBleeLcnt.mp3 + +00:29:13.040 --> 00:29:19.319 +is this audio that will come on top of this slide + +00:29:19.320 --> 00:29:24.079 +and then the rest is the LaTeX itself. + +NOTE Dynamic blocks + +00:29:24.080 --> 00:29:29.679 +The concept of "Org Dynamic Blocks" + +00:29:29.680 --> 00:29:31.519 +is very powerful. + +00:29:31.520 --> 00:29:33.599 +I think of them as universal + +00:29:33.600 --> 00:29:35.179 +visible macros. + +00:29:35.180 --> 00:29:41.359 +But, why should they be primarily used in just Org-Mode? + +00:29:41.360 --> 00:29:43.639 +I say, let's generalize them + +00:29:43.640 --> 00:29:46.059 +to "Emacs Dynamic Blocks". + +00:29:46.060 --> 00:29:49.959 +Have defaults for org-dblock-start-re + +00:29:49.960 --> 00:29:52.159 +in every relevant mode + +00:29:52.160 --> 00:29:55.099 +and use them everywhere. + +00:29:55.100 --> 00:29:56.319 +Blee does that. + +00:29:56.320 --> 00:30:01.719 +In COMEEGA-LaTeX, Dynamic Blocks create Frame Controls + +00:30:01.720 --> 00:30:05.519 +and insert Image and Video contents. + +00:30:05.520 --> 00:30:07.519 +Much of Blee and BISOS + +00:30:07.520 --> 00:30:09.959 +are implemented in COMEEGA. + +00:30:09.960 --> 00:30:13.599 +Almost all of our Elisp, Python, Bash + +00:30:13.600 --> 00:30:17.199 +and LaTeX work uses COMEEGA. + +00:30:17.200 --> 00:30:19.299 +COMEEGA stands for Collaborative + +00:30:19.300 --> 00:30:21.679 +Org-Mode + +00:30:21.680 --> 00:30:24.759 +Enhanced Emacs Generalized Authorship. + +00:30:24.760 --> 00:30:27.879 +It is the inverse of org-babel. + +00:30:27.880 --> 00:30:29.999 +COMEEGA adds org-mode + +00:30:30.000 --> 00:30:33.099 +to your programming mode. + +00:30:33.100 --> 00:30:35.079 +Full and proper use of COMEEGA, + +00:30:35.080 --> 00:30:38.299 +requires Polymode. + +00:30:38.300 --> 00:30:41.359 +Let's call that Poly-COMEEGA. + +00:30:41.360 --> 00:30:43.319 +But Emacs's Polymode + +00:30:43.320 --> 00:30:45.679 +is work-in-progress, + +00:30:45.680 --> 00:30:49.199 +particularly now with the new tree-sitter. + +00:30:49.200 --> 00:30:53.199 +So, in the interim, my usage of COMEEGA + +00:30:53.200 --> 00:30:55.919 +has been in the form of Toggle-COMEEGA. + +00:30:55.920 --> 00:30:59.479 +Where I manually switch between + +00:30:59.480 --> 00:31:02.359 +the programming-mode and org-mode. + +00:31:02.360 --> 00:31:04.199 +For me this has proved to be + +00:31:04.200 --> 00:31:05.799 +a fine interim solution. + +NOTE Internationalization - a non-Americanist perspective + +00:31:05.800 --> 00:31:09.679 +Naturally, content processing + +00:31:09.680 --> 00:31:11.239 +should be multi-lingual + +00:31:11.240 --> 00:31:14.159 +and internationalized. + +00:31:14.160 --> 00:31:15.839 +Let's look at that dimension. + +00:31:15.840 --> 00:31:21.019 +I am Iranian and much of what I write is in Farsi. + +00:31:21.020 --> 00:31:23.519 +Getting Perso-Arabic text right + +00:31:23.520 --> 00:31:25.519 +is often a challenge, + +00:31:25.520 --> 00:31:30.059 +as it involves Bi-Directional text (BIDI) + +00:31:30.060 --> 00:31:32.999 +and shaping of characters. + +00:31:33.000 --> 00:31:36.039 +In the context of our content generation + +00:31:36.040 --> 00:31:39.819 +these need to span all relevant tools, + +00:31:39.820 --> 00:31:41.759 +not just emacs. + +00:31:41.760 --> 00:31:43.759 +For emacs, I have created + +00:31:43.760 --> 00:31:46.239 +my own input method + +00:31:46.240 --> 00:31:49.419 +called farsi-transliterate-banan. + +00:31:49.420 --> 00:31:54.139 +My EmacsConf 2021 talk was about that. + +00:31:54.140 --> 00:31:57.199 +Now let's look at some examples + +00:31:57.200 --> 00:32:01.699 +and spice it up a bit with semantics. + +00:32:01.700 --> 00:32:05.279 +As an example of proper BIDI text, + +00:32:05.280 --> 00:32:07.899 +here is the orignal Farsi text + +00:32:07.900 --> 00:32:10.359 +along with English translation + +00:32:10.360 --> 00:32:12.519 +of Imam Khomeini's text + +00:32:12.520 --> 00:32:15.479 +with respect to invalidity + +00:32:15.480 --> 00:32:20.399 +of Western Intellectual Proprty Rights regime. + +00:32:20.400 --> 00:32:23.039 +And as another example + +00:32:23.040 --> 00:32:24.479 +of proper BIDI text, + +00:32:24.480 --> 00:32:29.919 +here is Ayatollah Mothari's take on Western IPR + +00:32:29.920 --> 00:32:35.159 +not being private property. Note that these predate + +00:32:35.160 --> 00:32:36.919 +by more than half a century + +00:32:36.920 --> 00:32:43.239 +Jack Dorsey and Elon Musk's tweets of April 11, 2025 + +00:32:43.240 --> 00:32:47.199 +saying "Delete all IP law". + +00:32:47.200 --> 00:32:49.159 +This topic is too important + +00:32:49.160 --> 00:32:50.399 +and too sensitive + +00:32:50.400 --> 00:32:53.639 +to be left to American billionaires + +00:32:53.640 --> 00:32:55.639 +and their tweets. + +00:32:55.640 --> 00:32:58.199 +Let me again refer you to the logic + +00:32:58.200 --> 00:33:00.599 +of polyexistentials in my book. + +00:33:00.600 --> 00:33:06.359 +Chapter 14 of the book is dedicated to + +00:33:06.360 --> 00:33:08.579 +Ethics and ownership in Religions. + +00:33:08.580 --> 00:33:10.919 +With respect to my preference + +00:33:10.920 --> 00:33:12.719 +for Ethics over Freedom, + +00:33:12.720 --> 00:33:16.519 +let me refer you to Section 12.4 + +00:33:16.520 --> 00:33:19.079 +"A Cynical Perspective + +00:33:19.080 --> 00:33:22.859 +on Freedom Orientation of Americans" + +00:33:22.860 --> 00:33:25.999 +in which I describe where the FOSS labels + +00:33:26.000 --> 00:33:29.039 +and the likes of Stallman, Raymond, + +00:33:29.040 --> 00:33:31.599 +Moglen and Lessig have gone wrong. + +00:33:31.600 --> 00:33:34.239 +If you are one of their followers, + +00:33:34.240 --> 00:33:36.599 +perhaps Chapter 12 is for you. + +00:33:36.600 --> 00:33:42.279 +My emphasis thus far has been on content generation. + +NOTE Autonomous self-publication and federated re-publications + +00:33:42.280 --> 00:33:44.999 +Let's very briefly also look at + +00:33:45.000 --> 00:33:47.159 +Autonomous Self-Publication + +00:33:47.160 --> 00:33:52.279 +and Federated Re-Publications of our content. + +00:33:52.280 --> 00:33:55.759 +From the very beginning the Debian folks + +00:33:55.760 --> 00:33:59.039 +understood the importance of "Universality" + +00:33:59.040 --> 00:34:03.359 +and coined the "Universal Debian" label. + +00:34:03.360 --> 00:34:05.919 +This means that we can base + +00:34:05.920 --> 00:34:08.619 +our entire digital ecosystem + +00:34:08.620 --> 00:34:13.499 +on just the Libre-Halaal Debian distro. + +00:34:13.500 --> 00:34:17.299 +And that is what we have done with ByStar. + +00:34:17.300 --> 00:34:20.039 +In ByStar, everything is based on + +00:34:20.040 --> 00:34:24.119 +just the Universal Debian everywhere. + +00:34:24.120 --> 00:34:26.999 +This has made our Usage Environment + +00:34:27.000 --> 00:34:31.319 +totally harmonious with our Service Environment + +00:34:31.320 --> 00:34:38.059 +allowing for very powerful software-service continuums. + +00:34:38.060 --> 00:34:41.479 +Of course, all of this is immediately applicable + +00:34:41.480 --> 00:34:46.019 +to our ByStar Content Bundle as well. + +00:34:46.020 --> 00:34:50.519 +Some have asked, why don't you also include Ubuntu? + +00:34:50.520 --> 00:34:53.679 +I think the opposite makes more sense. + +00:34:53.680 --> 00:34:56.699 +Ubuntu should converge with Debian. + +00:34:56.700 --> 00:34:59.639 +I tried to explain this to Mark Shuttleworth + +00:34:59.640 --> 00:35:02.479 +in an email a while back. + +00:35:02.480 --> 00:35:04.119 +I have included that email + +00:35:04.120 --> 00:35:07.719 +in Section 12.1.5. + +NOTE Ingredients of BISOS platforms and their progression + +00:35:07.720 --> 00:35:10.439 +In this presentation, we have stopped + +00:35:10.440 --> 00:35:13.159 +at the "Raw-BISOS" stage. + +00:35:13.160 --> 00:35:15.759 +We can further evolve Raw-BISOS + +00:35:15.760 --> 00:35:17.959 +and make it be "Sited" + +00:35:17.960 --> 00:35:22.239 +and provide autonomous publication services. + +00:35:22.240 --> 00:35:25.679 +But here by going through EmacsConf and youtube + +00:35:25.680 --> 00:35:30.959 +we are using the "Federated Re-Publications" model. + +00:35:30.960 --> 00:35:32.479 +Something this large, + +00:35:32.480 --> 00:35:35.479 +should be well documented. + +00:35:35.480 --> 00:35:37.079 +In Emacs, the way that + +00:35:37.080 --> 00:35:39.319 +we have been dealing with documentation + +00:35:39.320 --> 00:35:43.439 +and information retrieval is archaic. + +00:35:43.440 --> 00:35:46.079 +Man-pages, TeXInfo, Helpful-Mode + +00:35:46.080 --> 00:35:51.599 +and convention based Doc-Strings are old and limited. + +00:35:51.600 --> 00:35:55.279 +In BISOS and Blee, we use Blee-Panels + +00:35:55.280 --> 00:35:57.739 +for all kinds of documentation. + +00:35:57.740 --> 00:36:02.559 +Let me show you some examples. + +NOTE Moving forward + +00:36:02.560 --> 00:36:05.199 +So, what next? + +00:36:05.200 --> 00:36:10.599 +If Blee, BISOS, ByStar, Libre-Halaal, Polyexistentials + +00:36:10.600 --> 00:36:14.159 +and these Content Processing capabilities + +00:36:14.160 --> 00:36:16.639 +have piqued your interest, + +00:36:16.640 --> 00:36:19.379 +please feel welcome to contact me. + +00:36:19.380 --> 00:36:22.239 +These Emacs Conferences have proven + +00:36:22.240 --> 00:36:25.379 +to be very useful and productive. + +00:36:25.380 --> 00:36:27.199 +I look forward to your thoughts, + +00:36:27.200 --> 00:36:29.599 +feedback and questions. + +00:36:29.600 --> 00:36:35.359 +I want to thank all the EmacsConf 2025 Organizers + +00:36:35.360 --> 00:36:37.199 +for their great work, + +00:36:37.200 --> 00:36:41.640 +and Sacha in particular. diff --git a/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--answers.vtt b/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--answers.vtt new file mode 100644 index 00000000..feeab999 --- /dev/null +++ b/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--answers.vtt @@ -0,0 +1,2107 @@ +WEBVTT + +00:00.000 --> 00:07.879 +All right, take it away. Okay, am I, are we live? + +00:07.880 --> 00:12.759 +Yes, we're live. Oh man, holy moly. + +00:12.760 --> 00:19.359 +Oh, that's surreal. Hi everyone. Oh man. + +00:19.360 --> 00:26.319 +Ah, so excited to be here. So good to see all of you. Okay. + +00:26.320 --> 00:29.479 +So, should we just go ahead and get right into it? + +00:29.480 --> 00:38.479 +Yeah, let me, let me see here. So I have. + +00:38.480 --> 00:41.559 +Yeah, I see, I see some, I see some questions coming in. + +00:41.560 --> 00:47.079 +Perfect. I am going to show my share my screen real quick. + +00:47.080 --> 00:54.399 +We have currently currently we have + +00:54.400 --> 00:59.079 +a sort of a dross thing going. + +00:59.080 --> 01:04.519 +And so I just wanted to, while we're waiting + +01:04.520 --> 01:05.559 +for some more stuff to come in, + +01:05.560 --> 01:11.919 +I just wanted to sort of idle on this buffer here. + +01:11.920 --> 01:13.559 +If you increase your font size slightly, + +01:13.560 --> 01:15.959 +that might be even nicer. + +01:15.960 --> 01:38.159 +Yes, absolutely, gladly. Whoa, okay. There we go. + +01:38.160 --> 01:41.559 +All right, the first question + +01:41.560 --> 01:45.839 +was looking for examples of files in book club style. + +01:45.840 --> 01:48.799 +The person says, that seems to be related + +01:48.800 --> 01:49.679 +to what I've been doing, + +01:49.680 --> 01:54.239 +but coming from different influences. Yes, yes. + +01:54.240 --> 02:03.559 +So I included a, included a, + +02:03.560 --> 02:07.879 +Let me see, I'm just looking at the IRC here + +02:07.880 --> 02:16.719 +and smiling at all the people. So, yes, I provided a link. + +02:16.720 --> 02:19.039 +So I think that an excellent. + +02:19.040 --> 02:24.159 +So I have gone ahead and provided + +02:24.160 --> 02:26.959 +the get the link to the repo + +02:26.960 --> 02:30.479 +and I'm going to go ahead and post that again. + +02:30.480 --> 02:34.039 +So this should serve as a full example + +02:34.040 --> 02:39.519 +of what a just sort of standard book club file looks like. + +02:39.520 --> 02:41.559 +And if anyone has like specific questions + +02:41.560 --> 02:42.839 +about anything in particular, + +02:42.840 --> 02:47.799 +they would love to see my sort of like walkthrough + +02:47.800 --> 02:52.239 +and narrate like specifically, you know, any place in this file + +02:52.240 --> 02:55.319 +that they would like to see me sort of like go over live, + +02:55.320 --> 02:58.719 +I would be super happy to do that. + +02:58.720 --> 03:03.439 +So I have the whole, you know, more or less complete + +03:03.440 --> 03:10.799 +book club file for Squint pulled up here. + +03:10.800 --> 03:14.599 +Yeah, I have my vision laid out, + +03:14.600 --> 03:18.639 +which has my initial sort of goal. + +03:18.640 --> 03:22.879 +you know, the background and the vision sort of combined + +03:22.880 --> 03:28.559 +to lay out what my general sort of goal is. + +03:28.560 --> 03:31.319 +I just realized, let me kill my stream there. + +03:31.320 --> 03:39.079 +There we go. All right. There's another question. + +03:39.080 --> 03:41.439 +The product of a tapa like squint.org + +03:41.440 --> 03:44.359 +would be pure gold for an agent like Cloud Code. + +03:44.360 --> 03:47.519 +Have you experimented with providing an agent with a final output + +03:47.520 --> 03:50.919 +and letting it chew through to-dos? + +03:50.920 --> 03:53.319 +That would be a really excellent question. + +03:53.320 --> 03:54.919 +I actually just kind of recently + +03:54.920 --> 03:58.159 +got into Clawed in particular. + +03:58.160 --> 04:01.679 +I played quite a bit with GPT and + +04:01.680 --> 04:07.239 +and a lot of 8 billion parameter local models. + +04:07.240 --> 04:09.879 +And I was never super impressed. + +04:09.880 --> 04:12.999 +It always felt like I was just sort of wrangling + +04:13.000 --> 04:14.639 +to get it on the same page, + +04:14.640 --> 04:16.799 +whether as a result of sycophantism + +04:16.800 --> 04:19.399 +or really just not having enough parameters + +04:19.400 --> 04:21.919 +in order to understand the context of what's going on. + +04:21.920 --> 04:25.759 +Cloud has completely changed my perception + +04:25.760 --> 04:27.359 +of what an LLM can do or not. + +04:27.360 --> 04:31.119 +It makes autonomy not seem like a total fever train. + +04:31.120 --> 04:36.439 +I have definitely been curious about + +04:36.440 --> 04:39.639 +how an LLM would react to book club files. + +04:39.640 --> 04:41.719 +I think that, yeah, especially like, + +04:41.720 --> 04:43.799 +I've been daydreaming a little bit about, + +04:43.800 --> 04:49.919 +you know, having it generate scratch artifacts + +04:49.920 --> 04:54.799 +or suggesting, you know, changes to the format. + +04:54.800 --> 04:58.959 +It's like, yeah, the fact that + +04:58.960 --> 05:01.959 +this is all like, you know, like super, + +05:01.960 --> 05:05.239 +The goal and the hope for all of this + +05:05.240 --> 05:08.359 +is that we're being verbose about our thinking anyway. + +05:08.360 --> 05:12.199 +This is sort of how, by default, + +05:12.200 --> 05:14.159 +deep reasoning kind of works. + +05:14.160 --> 05:15.799 +I actually think that I totally agree. + +05:15.800 --> 05:17.559 +It would be a great fit. + +05:17.560 --> 05:19.599 +I have yet to personally do it, + +05:19.600 --> 05:21.279 +because I've always been just + +05:21.280 --> 05:23.319 +a little bit wary about, like, you know... + +05:23.320 --> 05:24.999 +Well, if I'm writing a program, + +05:25.000 --> 05:26.879 +I want to write it, you know? + +05:26.880 --> 05:29.239 +People often talk about, like, you know, + +05:29.240 --> 05:31.919 +oh, I just want to hand off + +05:31.920 --> 05:34.159 +the boring parts to Claude. + +05:34.160 --> 05:36.519 +But the thing is, if I'm writing an e-list, + +05:36.520 --> 05:39.479 +I find the whole thing to be kind of fun. + +05:39.480 --> 05:46.079 +be super, um, it would be super interested in, you know, + +05:46.080 --> 05:48.159 +just sort of as a point of exercise, + +05:48.160 --> 05:49.479 +like seeing what it's capable of. + +05:49.480 --> 05:51.479 +Because I think, I really do think + +05:51.480 --> 05:54.119 +that this would be kind of an ideal environment. + +05:54.120 --> 05:55.879 +It is kind of close to, you know, + +05:55.880 --> 05:59.039 +native-ish, how LLMs think. + +05:59.040 --> 06:01.399 +There's also, like, you know, of course, + +06:01.400 --> 06:03.479 +the, um, the privacy angle. + +06:03.480 --> 06:05.119 +I don't necessarily want to provide + +06:05.120 --> 06:09.319 +a whole bunch of code verbatim that I intend to GPL3. + +06:09.320 --> 06:15.719 +But I believe that Claude kind of has a better policy + +06:15.720 --> 06:20.639 +in terms of what does and does not become training data. + +06:20.640 --> 06:22.439 +I'll have to look into Claude in particular + +06:22.440 --> 06:24.599 +because I feel like that would be my target for it. + +06:24.600 --> 06:29.679 +But yeah, I think that's definitely onto something. + +06:29.680 --> 06:31.439 +I've definitely thought about this. + +06:31.440 --> 06:33.759 +I've definitely been really curious about this. + +06:33.760 --> 06:40.279 +Next question, do you think every Tapa + +06:40.280 --> 06:42.479 +should have its own book club file as well? + +06:42.480 --> 06:45.559 +Or would you rather keep just one book club file + +06:45.560 --> 06:46.559 +in the top of the project? + +06:46.560 --> 06:51.559 +So I think that I definitely would advise + +06:51.560 --> 06:54.879 +that each Tapa have its own book club file. + +06:54.880 --> 06:59.479 +The reason being is because I find that for me personally, + +06:59.480 --> 07:00.799 +the way that my brain kind of works + +07:00.800 --> 07:06.239 +is that out of sight, out of mind is very literal for me. + +07:06.240 --> 07:13.519 +I find that I find that. What am I thinking of? + +07:13.520 --> 07:19.959 +Sorry, I just saw that I got an email + +07:19.960 --> 07:22.799 +and I'm like, yeah, okay, cool. + +07:22.800 --> 07:27.319 +Case in point, right? We are at case in point, you know, + +07:27.320 --> 07:30.519 +out of sight, out of mind. Yes, no, absolutely. + +07:30.520 --> 07:35.799 +Yeah, no, exactly. I, um, I'm definitely quite ADHD + +07:35.800 --> 07:36.879 +and it works for my advantage + +07:36.880 --> 07:38.959 +because it provides all sorts of versatility. + +07:38.960 --> 07:42.439 +This is another great advantage of book club. + +07:42.440 --> 07:46.399 +If you have an ADHD mind like I do where, you know, + +07:46.400 --> 07:48.319 +You love jumping around and working on + +07:48.320 --> 07:51.519 +all sorts of different pieces simultaneously. + +07:51.520 --> 07:52.999 +You don't like sitting down + +07:53.000 --> 07:54.519 +and doing the same thing all day + +07:54.520 --> 07:57.239 +unless it really latches onto you. + +07:57.240 --> 07:59.759 +You know, you can pivot and you don't do anything. + +07:59.760 --> 08:02.559 +It really rewards the fact that you can pivot. + +08:02.560 --> 08:06.039 +So I find that to be really excellent. + +08:06.040 --> 08:08.359 +But to go back to the original a question, + +08:08.360 --> 08:11.519 +I would definitely recommend, + +08:11.520 --> 08:13.759 +at least in my circumstance, + +08:13.760 --> 08:15.679 +I find it to be incredibly useful + +08:15.680 --> 08:19.199 +to have each tapa be its own book club file + +08:19.200 --> 08:21.839 +rather than to have a unified file + +08:21.840 --> 08:26.599 +that holds all of your tapas. You can definitely do this, + +08:26.600 --> 08:28.959 +especially if you're using org + +08:28.960 --> 08:31.279 +to organize it hierarchically. + +08:31.280 --> 08:33.759 +It's just sort of a matter of preference + +08:33.760 --> 08:34.719 +and style at that point. + +08:34.720 --> 08:39.319 +So long as you're making a clear distinction between your tapas, + +08:39.320 --> 08:40.359 +that's the main thing + +08:40.360 --> 08:42.399 +that I would recommend no matter what, + +08:42.400 --> 08:44.919 +because the whole hope that I have is that + +08:44.920 --> 08:47.879 +you have a sort of separation of focus + +08:47.880 --> 08:49.599 +between the different you know, + +08:49.600 --> 08:54.719 +the different focuses of your different tapas, + +08:54.720 --> 08:57.959 +they really should ideally feel like different programs + +08:57.960 --> 09:00.119 +so that you're not, you know, + +09:00.120 --> 09:02.079 +getting over yourself, getting ahead of yourself. + +09:02.080 --> 09:05.079 +I think that, you know, on that basis, + +09:05.080 --> 09:07.479 +I would probably default to recommending + +09:07.480 --> 09:12.919 +that tapas have their own separate book club files, + +09:12.920 --> 09:15.679 +because ideally they should kind of be different + +09:15.680 --> 09:19.239 +sort of independent but related thoughts. + +09:19.240 --> 09:21.719 +But at the same time, I mean, like, you know, + +09:21.720 --> 09:23.559 +this is coming from someone + +09:23.560 --> 09:26.679 +who like has a billion small, like, you know, + +09:26.680 --> 09:28.679 +I had one giant org file for a long time + +09:28.680 --> 09:31.759 +and then realized that really didn't work for me. + +09:31.760 --> 09:34.239 +So now I have a billion tiny ones. + +09:34.240 --> 09:38.439 +So depending upon how you feel about, you know, + +09:38.440 --> 09:40.759 +should I have one really big org file + +09:40.760 --> 09:42.479 +or a bunch of really little org files? + +09:42.480 --> 09:44.639 +I feel like that more or less gives your answer. + +09:44.640 --> 09:48.359 +I think it's whatever works best for you. + +09:48.360 --> 09:51.439 +I know that far and away what works best for me + +09:51.440 --> 09:55.239 +is having separate files. No matter what, you should have + +09:55.240 --> 09:57.999 +separation of concept though. + +09:58.000 --> 10:00.639 +But however you do that is, you know, + +10:00.640 --> 10:01.919 +is best your judgment call. + +10:01.920 --> 10:11.399 +Next question, how do you build habits + +10:11.400 --> 10:13.119 +when it comes to documentation? + +10:13.120 --> 10:16.039 +I tend to produce lots of documentation in one go, + +10:16.040 --> 10:19.319 +then effectively forget to do it for long periods of time + +10:19.320 --> 10:20.599 +and end up playing catch up, + +10:20.600 --> 10:22.479 +which results in a loss of precision, + +10:22.480 --> 10:24.319 +as you alluded to in your talk. + +10:24.320 --> 10:26.519 +In a work setting, when something goes on fire + +10:26.520 --> 10:28.919 +or priorities change, it can be hard to keep discipline. + +10:28.920 --> 10:32.559 +Would love your thoughts. Thanks. Yes, absolutely. + +10:32.560 --> 10:35.719 +So what I tend to do is I don't + +10:35.720 --> 10:39.239 +So really, so far, what I've been doing + +10:39.240 --> 10:42.159 +is that I haven't been making a conscious priority + +10:42.160 --> 10:45.359 +of writing documentation at all. + +10:45.360 --> 10:48.039 +And if that sounds contradictory + +10:48.040 --> 10:51.759 +to the talk, that is correct. + +10:51.760 --> 10:54.999 +What I mean by this is that I go about + +10:55.000 --> 11:00.039 +is that when I'm writing code, + +11:00.040 --> 11:03.959 +when I'm writing, you know, drafts of my functions, + +11:03.960 --> 11:05.439 +the way that I tend to approach this, + +11:05.440 --> 11:07.279 +the way that I really emphasize the approach for it, + +11:07.280 --> 11:12.999 +is that I want to focus first and foremost + +11:13.000 --> 11:15.559 +on sort of like just writing down + +11:15.560 --> 11:17.519 +what my internal monologue is + +11:17.520 --> 11:23.519 +for what I'm doing for that pass working on the file. + +11:23.520 --> 11:25.919 +So my document takes ultimate + +11:25.920 --> 11:29.519 +Distance of dark is ultimately a property + +11:29.520 --> 11:32.359 +from the fact that I am writing + +11:32.360 --> 11:35.119 +what I'm doing as I'm doing it. + +11:35.120 --> 11:37.759 +And it's more or less just I'm just + +11:37.760 --> 11:39.759 +mashing out the stream of consciousness + +11:39.760 --> 11:43.359 +of what's going on inside my head as it's happening. + +11:43.360 --> 11:47.679 +So if we go down and we take a look at, + +11:47.680 --> 11:53.319 +yeah, so let's go ahead and take a look back at the macro. + +11:53.320 --> 11:56.359 +Yeah, really, this is kind of cheating, + +11:56.360 --> 12:01.119 +because mostly I would consider this to be self-documenting, + +12:01.120 --> 12:07.919 +but we all kind of know that + +12:07.920 --> 12:11.759 +that in and of itself is a slippery slope. + +12:11.760 --> 12:14.799 +That's not great. Because it's like, I could believe + +12:14.800 --> 12:17.719 +that this would be self-documenting + +12:17.720 --> 12:19.959 +if this was a three-liner. + +12:19.960 --> 12:24.719 +It is not. which, you know, also goes to show me + +12:24.720 --> 12:27.759 +that this needs to be splitting into its own topos. + +12:27.760 --> 12:32.239 +I intend to, you know, write a Tapa that's a sort of, + +12:32.240 --> 12:37.079 +that's a sort of like macro builder + +12:37.080 --> 12:40.559 +that automatically, you know, does the gensims for you. + +12:40.560 --> 12:41.959 +Something along the lines of + +12:41.960 --> 12:46.679 +what's the common Lisp macro for that called? + +12:46.680 --> 12:51.879 +It's like, There's some common list faculty + +12:51.880 --> 12:53.919 +that does automatic Jensen binding. + +12:53.920 --> 12:55.479 +I can't quite remember what it's called. + +12:55.480 --> 13:01.559 +A prior version of this talk had my live coding that, + +13:01.560 --> 13:04.319 +but that ended up sort of distracting + +13:04.320 --> 13:07.399 +from what I kind of wanted to nail out and focus on. + +13:07.400 --> 13:12.279 +But really kind of what I do is that, + +13:12.280 --> 13:19.159 +let me see here if I can find some sort of, + +13:19.160 --> 13:26.159 +Yeah, so I have in my research section + +13:26.160 --> 13:36.039 +sort of layout like what the quirks of all this sort of are. + +13:36.040 --> 13:39.839 +I think my development focuses contain + +13:39.840 --> 13:41.479 +a little bit of what could be ultimately + +13:41.480 --> 13:42.959 +considered to be documentation. + +13:42.960 --> 13:46.999 +Yeah, as I'm looking through all of this, + +13:47.000 --> 13:48.279 +I'm kind of realizing that like, + +13:48.280 --> 13:49.319 +you know, yeah, there's stuff + +13:49.320 --> 13:51.319 +that I'm into documentation here, + +13:51.320 --> 13:53.119 +but it's all a little ad hoc. + +13:53.120 --> 13:55.719 +You know, I would, in part, + +13:55.720 --> 13:57.319 +the design of this particular tapa + +13:57.320 --> 13:59.639 +is arguably not currently, + +13:59.640 --> 14:02.319 +but is going to be simple enough such that + +14:02.320 --> 14:04.679 +a doc string is sufficient for documentation. + +14:04.680 --> 14:06.999 +That is not the case currently. + +14:07.000 --> 14:12.279 +All right, next question is, + +14:12.280 --> 14:18.559 +how do you write examples and tests? + +14:18.560 --> 14:24.679 +I think that you mentioned that during the talk, + +14:24.680 --> 14:27.359 +but I couldn't find them on a very quick look + +14:27.360 --> 14:35.239 +at your org file in the Squint repo. + +14:35.240 --> 14:40.519 +My use of the word test was a little bit creative. + +14:40.520 --> 14:42.759 +It's my validation of the code that I've written. + +14:42.760 --> 14:45.479 +I more or less tend to do a, + +14:45.480 --> 14:50.079 +I tend to try and write really small functions + +14:50.080 --> 14:52.039 +and have really aggressive validation + +14:52.040 --> 14:55.799 +by just making sure that, like, you know, + +14:55.800 --> 14:59.919 +when I chain functions in the REPL, + +14:59.920 --> 15:03.199 +each step of them produces results + +15:03.200 --> 15:07.799 +that are really quite immediately and self-verifiably seen. + +15:07.800 --> 15:11.719 +Now, this isn't a great excuse to not use a test suite, + +15:11.720 --> 15:12.879 +but it's gotten me pretty far. + +15:12.880 --> 15:19.199 +What I mean by tests is that in the research sections, + +15:19.200 --> 15:26.279 +what I've done is, so I've created a sort of tested + +15:26.280 --> 15:29.399 +in the sense that I have created + +15:29.400 --> 15:33.759 +a really highly representative case + +15:33.760 --> 15:38.279 +of the way that the program ultimately ought to behave. + +15:38.280 --> 15:43.399 +In doing so, I created a sort of embedded domain language + +15:43.400 --> 15:46.359 +that I have termed animal houses. + +15:46.360 --> 15:50.999 +And Animal Houses is a sort of markup language + +15:51.000 --> 15:54.879 +that has rather simple rules. + +15:54.880 --> 16:00.879 +This here is the entirety of the spec for Animal Houses. + +16:00.880 --> 16:06.559 +Grammar or anything, but like, it is more or less. + +16:06.560 --> 16:08.839 +Breadth of everything that needs to be known + +16:08.840 --> 16:10.519 +about how animal houses works. + +16:10.520 --> 16:14.279 +And I've created animal houses because it is an ideal + +16:14.280 --> 16:18.479 +and incredibly simple circumstance. + +16:18.480 --> 16:22.679 +For how to go about as needed tests. + +16:22.680 --> 16:28.119 +For how squint ultimately ought to work in practice. + +16:28.120 --> 16:30.239 +So when I'm doing research, + +16:30.240 --> 16:34.759 +what I do is I take the text of animal houses, + +16:34.760 --> 16:39.879 +and I will go ahead and insert it into a buffer. + +16:39.880 --> 16:46.599 +And I'll just create an analog buffer. + +16:46.600 --> 16:48.639 +I just called it a woo. + +16:48.640 --> 16:55.959 +And then what I'll do is in my research sections, I will write + +16:55.960 --> 17:01.199 +Like I'll write like step-by-step + +17:01.200 --> 17:07.919 +like instructions on how to go about with a REPL-driven detection + +17:07.920 --> 17:15.119 +using animal houses. So it does squint pass label + +17:15.120 --> 17:16.799 +to width restriction correctly. + +17:16.800 --> 17:20.479 +The tests conducted here indicate that it does not. + +17:20.480 --> 17:25.839 +And then I link to a development focus. + +17:25.840 --> 17:29.959 +that um effectively acts as my bug report + +17:29.960 --> 17:33.999 +or sorry my uh you know my bug for um + +17:34.000 --> 17:37.599 +my bug listing for this particular problem + +17:37.600 --> 17:38.479 +that I've identified + +17:38.480 --> 17:41.439 +I lay out some criteria of how to + +17:41.440 --> 17:44.959 +go about using the REPL to um + +17:44.960 --> 17:47.079 +you know I identify what I believe + +17:47.080 --> 17:49.479 +is sort of like the quarantined area + +17:49.480 --> 17:50.639 +that I found for the bug + +17:50.640 --> 17:56.799 +and then test is that I will go about + +17:56.800 --> 17:59.279 +engaging with narration + +17:59.280 --> 18:03.479 +the step-by-step of how I produce + +18:03.480 --> 18:07.039 +the circumstances around the bug + +18:07.040 --> 18:10.559 +until I ultimately narrow all the way in + +18:10.560 --> 18:14.199 +and arrive at a conclusion. + +18:14.200 --> 18:16.879 +Something's going on with the screen share. + +18:16.880 --> 18:18.799 +I can see your screen but + +18:18.800 --> 18:23.239 +the server cannot see your screen updating. + +18:23.240 --> 18:28.439 +Sorry. Oh, no. Maybe you stop switching. + +18:28.440 --> 18:33.399 +Yeah, and then we just redo it again. Thank you. + +18:33.400 --> 18:36.039 +Yes, absolutely. + +18:36.040 --> 18:39.039 +Thanks to someone who noticed the buffer time, + +18:39.040 --> 18:42.919 +the time in the load line was not updating. + +18:42.920 --> 18:50.079 +Okay, let's try that again. Now it's updating. Gotcha. + +18:50.080 --> 18:54.999 +I hope that wasn't going on for too, too long. + +18:55.000 --> 18:57.279 +Hopefully what I was saying + +18:57.280 --> 19:02.559 +wasn't completely indecipherable. Let me see here. + +19:02.560 --> 19:06.959 +Yeah, this is the sample text for animal houses. + +19:06.960 --> 19:10.839 +This is the spec, not a formal grammar, + +19:10.840 --> 19:12.719 +but it is more or less the whole of the spec + +19:12.720 --> 19:16.399 +that you need to write a parser for animal houses. + +19:16.400 --> 19:19.359 +Most of the tests around Squint involve + +19:19.360 --> 19:23.999 +writing sort of ad hoc parsers for animal houses. + +19:24.000 --> 19:27.199 +Just when I have it in its own buffer, you know, + +19:27.200 --> 19:29.719 +I find more or less it's an excellent way + +19:29.720 --> 19:31.199 +of going about testing + +19:31.200 --> 19:36.359 +in an ad hoc sort of REPL driven manner. + +19:36.360 --> 19:39.879 +that I just sort of write regular + +19:39.880 --> 19:43.799 +that pull out the pieces of the sections of buffer + +19:43.800 --> 19:49.439 +that represent the different fields and data types + +19:49.440 --> 19:51.599 +in association with the animals + +19:51.600 --> 19:54.879 +and the houses to which they belong. + +19:54.880 --> 20:00.319 +And then when I am engaging in research, + +20:00.320 --> 20:03.559 +Um, you know, what, what my research section is, + +20:03.560 --> 20:05.079 +is I'm ultimately just sort of like + +20:05.080 --> 20:06.399 +laying out, like, you know, + +20:06.400 --> 20:10.239 +I'm sort of thinking to myself, is this working right? + +20:10.240 --> 20:11.319 +I feel like, like, I feel like + +20:11.320 --> 20:14.639 +there's something here, something in this area. + +20:14.640 --> 20:16.919 +And I'll, you know, ask myself, well, + +20:16.920 --> 20:20.199 +kind of like, what is it, you know, what am I looking for? + +20:20.200 --> 20:22.519 +And then nail down, how am I going + +20:22.520 --> 20:24.439 +to go about looking for it? + +20:24.440 --> 20:30.559 +The process of working with the REPL + +20:30.560 --> 20:34.319 +to sort of pin down like what exactly is going on + +20:34.320 --> 20:36.119 +and come to a conclusion + +20:36.120 --> 20:44.519 +on completely jumping out of order. + +20:44.520 --> 20:47.799 +Have you experimented in like whisper.el + +20:47.800 --> 20:49.759 +for doing speech to text + +20:49.760 --> 20:51.999 +as you think out loud into your book club? + +20:52.000 --> 20:56.799 +Now I am. I love that idea. That is awesome. + +20:56.800 --> 21:00.039 +Yeah, no, I love that. + +21:00.040 --> 21:04.839 +Even with, I only have a CPU, no GPU on mine, + +21:04.840 --> 21:08.039 +it does capture things a lot faster. + +21:08.040 --> 21:12.199 +And because it actually saves the recording to a WAV, + +21:12.200 --> 21:14.239 +or I guess you can configure it, + +21:14.240 --> 21:16.959 +in case it doesn't recognize something well, + +21:16.960 --> 21:20.799 +you can go back and check it. That's nice. + +21:20.800 --> 21:24.319 +I like that more than a straight speech-text thing. + +21:24.320 --> 21:27.439 +I've been mulling over the idea + +21:27.440 --> 21:30.959 +of having a keystroke save into a background buffer + +21:30.960 --> 21:33.399 +so that even when I'm looking at something else, + +21:33.400 --> 21:37.919 +I can dictate into my equivalent of the book club file. + +21:37.920 --> 21:41.759 +Yes, yes, yes, absolutely. + +21:41.760 --> 21:44.719 +So you can be scrolling through documentation on, like, + +21:44.720 --> 21:48.079 +you can be scrolling through documentation on one screen + +21:48.080 --> 21:49.799 +and you can be musing to yourself about, + +21:49.800 --> 21:52.479 +like, you know, is this supposed to work this way? + +21:52.480 --> 21:57.319 +Like, you know, like, what in terms of, like, + +21:57.320 --> 21:59.799 +you know, like, I see this function. + +21:59.800 --> 22:01.279 +It sounds like it's what I'm looking for. + +22:01.280 --> 22:03.399 +I don't know if the types are quite right. + +22:03.400 --> 22:05.679 +I don't understand. It's named what I'm looking for, + +22:05.680 --> 22:07.319 +but I don't know what it's taking in. + +22:07.320 --> 22:09.439 +You can reason through all of this. + +22:09.440 --> 22:10.599 +You're not even writing into the buffer + +22:10.600 --> 22:14.119 +that you're working with. That's actually so cool. + +22:14.120 --> 22:17.279 +Or you can type into the org capture process + +22:17.280 --> 22:21.039 +so that it can pick up an annotation automatically. + +22:21.040 --> 22:24.719 +Sorry, annotation is the link to the thing, + +22:24.720 --> 22:26.159 +whatever you're looking at. + +22:26.160 --> 22:32.999 +Oh, that's super cool. Yes. No, I actually really love it. + +22:33.000 --> 22:36.119 +I haven't, you know, hooking this all up to Org Capture at all. + +22:36.120 --> 22:58.639 +I actually really love that idea in of itself. Yeah. + +22:58.640 --> 23:01.119 +Or a capture will give you a lot of capture options. + +23:01.120 --> 23:03.159 +Like you can capture to your currently + +23:03.160 --> 23:11.039 +clocked in, uh, heading. So then it just files your note + +23:11.040 --> 23:12.919 +in the right place automatically. + +23:12.920 --> 23:19.199 +Absolutely. I love that. Let me see. + +23:19.200 --> 23:22.279 +I'm actually like writing a note to try that out. + +23:22.280 --> 23:25.159 +I'm definitely going to have to do that. + +23:25.160 --> 23:36.039 +Like the flexibility of that in particular sounds just perfect. + +23:36.040 --> 23:38.239 +I'd like to finish typing noises + +23:38.240 --> 23:39.679 +and then we can ask the next question + +23:39.680 --> 23:41.239 +for which there is one. + +23:41.240 --> 23:45.839 +The question is, what is the largest project + +23:45.840 --> 23:48.479 +in terms of team size you had the chance to consult + +23:48.480 --> 23:51.079 +and introduce the book club tapas concept? + +23:51.080 --> 23:53.199 +And what has been your experiences with these setups, + +23:53.200 --> 23:56.279 +implying larger applications or solutions + +23:56.280 --> 23:57.319 +that company is working on? + +23:57.320 --> 24:01.959 +So yeah, probably the largest application. + +24:01.960 --> 24:05.879 +So I have, It's been interesting. + +24:05.880 --> 24:08.879 +So in regards to this, the largest, + +24:08.880 --> 24:10.119 +I would say two people + +24:10.120 --> 24:12.719 +in a couple of different circumstance. + +24:12.720 --> 24:20.079 +So it's the pair of us working in a startup context. + +24:20.080 --> 24:24.439 +And then, you know, we both have + +24:24.440 --> 24:25.799 +like rather technical backgrounds. + +24:25.800 --> 24:27.479 +We can both more or less, you know, + +24:27.480 --> 24:33.639 +You know, sort of reason about particularly excite, + +24:33.640 --> 24:37.199 +especially as we've been building up top us is that, + +24:37.200 --> 24:39.559 +you know, well, we're both rather technical. + +24:39.560 --> 24:42.679 +You know, I'm definitely software engineering sort of end. + +24:42.680 --> 24:47.359 +And, you know, this partner is more. + +24:47.360 --> 24:50.999 +I mean, he's done all sorts of different engineering, + +24:51.000 --> 24:54.039 +but none of it in a, like, especially software context. + +24:54.040 --> 24:56.559 +So like, you know, but what's been + +24:56.560 --> 24:58.119 +really cool about that is that + +24:58.120 --> 24:59.599 +especially as we've built up top us + +24:59.600 --> 25:00.799 +and made clear distinctions + +25:00.800 --> 25:02.879 +about what they ought to do, you know, + +25:02.880 --> 25:04.599 +he doesn't have a ton of like really, + +25:04.600 --> 25:10.839 +he doesn't like experience like + +25:10.840 --> 25:12.479 +specifically in software engineering, + +25:12.480 --> 25:15.559 +but because we have it all laid out + +25:15.560 --> 25:17.399 +in this really flexible way, + +25:17.400 --> 25:20.199 +he's able to pick up the ball and like, + +25:20.200 --> 25:21.879 +you know, like he's able to + +25:21.880 --> 25:23.119 +take the ball and run with it. + +25:23.120 --> 25:25.279 +because it's all laid out + +25:25.280 --> 25:26.559 +in a way that's so intuitive. + +25:26.560 --> 25:28.719 +Like, you know, he's able to like + +25:28.720 --> 25:31.199 +collaborate with me and like, + +25:31.200 --> 25:33.279 +you know, like, you know, run off these ideas + +25:33.280 --> 25:34.919 +and like really go for it. + +25:34.920 --> 25:37.399 +Like, you know, almost as quickly as I can, + +25:37.400 --> 25:39.319 +just because we've set up a structure + +25:39.320 --> 25:42.159 +where like all of the different pieces + +25:42.160 --> 25:43.719 +have these really intuitive + +25:43.720 --> 25:46.399 +and intrinsic and straightforward roles. + +25:46.400 --> 25:47.839 +And that's, that's something + +25:47.840 --> 25:49.044 +that's really exciting in of itself + +25:49.045 --> 25:50.669 +that I didn't really go over in the talk. + +25:50.670 --> 25:54.359 +Like a managerial perspective, + +25:54.360 --> 25:56.919 +this is actually a really excellent way + +25:56.920 --> 26:01.199 +of understanding the whole context + +26:01.200 --> 26:04.799 +of like what the software stack looks like. + +26:04.800 --> 26:06.439 +Because it's like, you know, + +26:06.440 --> 26:09.119 +it makes it more intuitive for developers for sure, + +26:09.120 --> 26:10.719 +but it makes it more intuitive for everyone. + +26:10.720 --> 26:12.759 +You know, it's on that basis + +26:12.760 --> 26:14.839 +that I can't imagine clients + +26:14.840 --> 26:18.239 +like just a better way at this point. + +26:18.240 --> 26:22.239 +Um, that was that was the other circumstance + +26:22.240 --> 26:25.239 +where I have been working with a partner. + +26:25.240 --> 26:29.399 +This has been with, um, you know, I would be, uh. + +26:29.400 --> 26:31.919 +You know, sort of going back and forth + +26:31.920 --> 26:34.199 +with someone who had hired me. + +26:34.200 --> 26:40.159 +Um, to, uh, like, you know, to work on contract. + +26:40.160 --> 26:42.839 +And I would use this to sort of go + +26:42.840 --> 26:45.199 +over with them about, um. + +26:45.200 --> 26:51.239 +Sort of get a solid idea of scope and function, + +26:51.240 --> 26:57.199 +do pre-planning as we're going into more specifics + +26:57.200 --> 27:01.359 +on what the overall look for the project + +27:01.360 --> 27:03.479 +and how it ought to look + +27:03.480 --> 27:05.679 +and how it all ought to be laid out. + +27:05.680 --> 27:11.519 +So there's a lot of really exciting flexibility there + +27:11.520 --> 27:13.199 +that I think is really cool. + +27:13.200 --> 27:23.679 +People will, of course, be curious + +27:23.680 --> 27:25.919 +about the mechanics of that collaboration. + +27:25.920 --> 27:28.719 +Did you get other people using Emacs in org? + +27:28.720 --> 27:32.359 +Were you using version control? Did you try out CRDT? + +27:32.360 --> 27:33.239 +How did it work? + +27:33.240 --> 27:39.639 +So all of this so far has been over screen share, + +27:39.640 --> 27:43.679 +where I would be stepping through the buffer by hand. + +27:43.680 --> 27:47.839 +I would love to set up some sort of an environment + +27:47.840 --> 27:52.359 +where I could get you know, clients and partners, + +27:52.360 --> 27:53.359 +like, you know, really excited + +27:53.360 --> 27:54.799 +about using Emacs on org. + +27:54.800 --> 27:58.559 +But, you know, it's, it can be a little bit to ask, + +27:58.560 --> 28:00.119 +I would love to see if I can, like, + +28:00.120 --> 28:01.879 +put together some sort of a config that, + +28:01.880 --> 28:04.519 +like, sands off all of this and, you know, + +28:04.520 --> 28:08.079 +makes this this really, you know, you know, + +28:08.080 --> 28:13.759 +like safety-proof sort of intuitive environment + +28:13.760 --> 28:16.599 +just for CRDT in particular. + +28:16.600 --> 28:18.879 +I love the idea of like, you know, + +28:18.880 --> 28:21.479 +sort of like spawning CRDT + +28:21.480 --> 28:24.159 +so that like, you know, the two of us can, + +28:24.160 --> 28:27.559 +you know, type SPAC and ideas + +28:27.560 --> 28:31.239 +and sort of like draft together on, you know, + +28:31.240 --> 28:33.559 +especially like the glue code tapa + +28:33.560 --> 28:35.639 +for a larger software stack. + +28:35.640 --> 28:38.399 +like collaborating on that over CRDT + +28:38.400 --> 28:43.399 +or having folks step through Tapas and, + +28:43.400 --> 28:45.599 +you know, unfold them and like, you know, + +28:45.600 --> 28:46.719 +point to a particular thing. + +28:46.720 --> 28:49.159 +And it's like, you know, like, what's, what's this? + +28:49.160 --> 28:50.119 +What's the clock here? + +28:50.120 --> 28:52.239 +It looks like we're spending a lot of time + +28:52.240 --> 28:54.519 +and I would like to get a little bit clearer + +28:54.520 --> 28:56.319 +of an idea of like what exactly we're doing here. + +28:56.320 --> 29:01.319 +back up a little bit because the stream just disconnected + +29:01.320 --> 29:02.759 +and reconnected from the audio. + +29:02.760 --> 29:06.599 +So, please repeat just the last sentence. + +29:06.600 --> 29:11.959 +Yeah, yeah, for sure. Yeah, so I would like, you know, + +29:11.960 --> 29:18.239 +I love the idea of, yeah, like, you know, collaborating on, + +29:18.240 --> 29:20.519 +especially like on the glue code. + +29:20.520 --> 29:23.839 +tapa for a particular software stack, you know, + +29:23.840 --> 29:26.159 +having the both of us use CRDT + +29:26.160 --> 29:27.719 +to type into it simultaneously, + +29:27.720 --> 29:30.159 +I think that would be super cool. + +29:30.160 --> 29:33.679 +I also really love the idea of, you know, + +29:33.680 --> 29:38.159 +having a client or partner, you know, + +29:38.160 --> 29:41.479 +thumb through individual tapas in the stack. + +29:41.480 --> 29:45.639 +And then like, you know, like, look at and be like, + +29:45.640 --> 29:47.879 +well, we seem to have time on this recently, + +29:47.880 --> 29:51.759 +can you give me like, some clarification on like, + +29:51.760 --> 29:55.519 +you know, what, what this part is and how it's, you know, + +29:55.520 --> 29:57.559 +what it means for the whole + +29:57.560 --> 30:00.799 +and sort of like what, you know, what it represents + +30:00.800 --> 30:02.599 +in terms of how all of this is going to come together. + +30:02.600 --> 30:06.439 +I think that would be super cool. I love the idea of that. + +30:06.440 --> 30:11.679 +I would even consider like, you know, if not Emacs proper, + +30:11.680 --> 30:17.119 +I would love like, you know, maybe a, a web-based org parser. + +30:17.120 --> 30:21.399 +for, you know, even on just a read-only version + +30:21.400 --> 30:25.399 +of the document where, you know, clients and partners, yeah, + +30:25.400 --> 30:26.879 +just sort of thumb through with it + +30:26.880 --> 30:28.199 +and then chat with questions. + +30:28.200 --> 30:34.159 +Make the, you know, screen sharing for, you know, + +30:34.160 --> 30:36.519 +peer programming process + +30:36.520 --> 30:41.599 +just a little bit cleaner, you know, more intuitive on their end. + +30:41.600 --> 30:50.399 +I think that'd be super cool. I love these ideas. + +30:50.400 --> 30:55.002 +All right, theoretically, the big blue button is open. + +30:55.003 --> 30:57.002 +I think we've gotten to the end + +30:57.003 --> 31:00.294 +of the questions on the etherpad. + +31:00.295 --> 31:03.085 +If anyone else would like to join or ask, + +31:03.086 --> 31:04.840 +I'm gonna need a couple of minutes + +31:04.841 --> 31:06.359 +and then I can do closing remarks + +31:06.360 --> 31:07.999 +whenever people are ready. + +31:08.000 --> 31:14.479 +So I will meet now when people figure things out. + +31:14.480 --> 31:22.039 +I would also be super down if, you know, + +31:22.040 --> 31:25.319 +anyone was curious about hearing more + +31:25.320 --> 31:28.999 +about some of the projects + +31:29.000 --> 31:30.799 +that I was kind of rambling + +31:30.800 --> 31:34.679 +at the close of the talk, + +31:34.680 --> 31:36.479 +if people wanted to, you know, + +31:36.480 --> 31:39.359 +hear more about, um, some of my ideas + +31:39.360 --> 31:42.799 +in regards to, um, uh, + +31:42.800 --> 31:45.719 +what am I thinking at home with the, uh, + +31:45.720 --> 31:49.759 +What's it called? + +31:49.760 --> 31:53.479 +Yeah, yeah, just sort of the, you know, + +31:53.480 --> 31:55.439 +some of the funding for passion projects, + +31:55.440 --> 31:58.319 +I would be interested in laying out some of the ideas + +31:58.320 --> 31:59.959 +about how that could work mechanically. + +31:59.960 --> 32:02.559 +And I think that that would be, you know, + +32:02.560 --> 32:04.719 +really cool for the whole ecosystem, + +32:04.720 --> 32:06.719 +because I think that there are definitely, + +32:06.720 --> 32:09.639 +you know, things that we could bang out, you know, + +32:09.640 --> 32:12.919 +for getting kind of all sorts of people on that model. + +32:12.920 --> 32:14.519 +I think that it would be really cool + +32:14.520 --> 32:18.399 +to to having a, you know, funding model + +32:18.400 --> 32:20.239 +for things that are really worth using. + +32:20.240 --> 32:26.519 +um and developing um the other thing is like + +32:26.520 --> 32:28.199 +you know just sort of um yeah + +32:28.200 --> 32:31.559 +just rattling off specifics on things + +32:31.560 --> 32:34.960 +that people could potentially vote for uh on that + +32:34.961 --> 32:53.759 +and in terms of specific might want to work on + +32:53.760 --> 32:56.877 +All right, there's a question from IRC. + +32:56.878 --> 33:01.880 +Sorry, I just got that. Did you address that one already? + +33:01.881 --> 33:07.127 +Let's see. Where is it? + +33:07.128 --> 33:12.359 +I will copy it from IRC. Thank you. + +33:12.360 --> 33:14.319 +Gotcha. Into the past. + +33:14.320 --> 33:27.759 +Perfect, perfect, perfect. + +33:27.760 --> 33:30.679 +Let me read the question out loud so it's in the recording. + +33:30.680 --> 33:33.719 +I guess a major pro is it has less friction + +33:33.720 --> 33:35.759 +as people can do a lot, + +33:35.760 --> 33:39.039 +maybe not everything in book lab tapas files + +33:39.040 --> 33:42.639 +versus having to log into gazillions of different systems, + +33:42.640 --> 33:45.199 +each one of them keeping a portion of the information. + +33:45.200 --> 33:47.359 +Did I get that viewing point right + +33:47.360 --> 33:49.479 +from your elaboration of the collaboration + +33:49.480 --> 33:52.159 +between you and your teammates? + +33:52.160 --> 33:55.439 +Yes. No, that's absolutely right. + +33:55.440 --> 33:57.999 +um because yeah like really + +33:58.000 --> 34:00.519 +my hope is that we can you know + +34:00.520 --> 34:03.239 +there's there's a lot of conflict into that + +34:03.240 --> 34:13.359 +we assume that a lot of um pieces of tooling + +34:13.360 --> 34:14.559 +and the separation between them + +34:14.560 --> 34:16.439 +is really sort of a necessary evil + +34:16.440 --> 34:19.239 +i think that you know having a system + +34:19.240 --> 34:21.519 +where really the complexity + +34:21.520 --> 34:25.719 +of engaging in all of the information + +34:25.720 --> 34:29.119 +relevant to the program. + +34:29.120 --> 34:30.319 +If it's in a format + +34:30.320 --> 34:31.799 +where you can just email it back and forth, + +34:31.800 --> 34:33.199 +break off pieces of it, + +34:33.200 --> 34:35.119 +work with those individually, + +34:35.120 --> 34:38.759 +I think that that's something + +34:38.760 --> 34:40.279 +that's incredibly rewarding. + +34:40.280 --> 34:42.639 +Something that just dawned on me + +34:42.640 --> 34:44.439 +that I wanted to mention + +34:44.440 --> 34:46.959 +that I've been daydreaming about + +34:46.960 --> 34:49.399 +is that in a circumstance + +34:49.400 --> 34:52.079 +where you have multiple developers, + +34:52.080 --> 34:53.879 +like, you know, across a larger team, + +34:53.880 --> 34:57.359 +working on a book club tapas driven project, + +34:57.360 --> 35:02.559 +what you can do is have, you know, + +35:02.560 --> 35:04.559 +a clear, you can lay out your goal, + +35:04.560 --> 35:08.439 +and then start splitting it to tapas from that point, + +35:08.440 --> 35:11.839 +and then assign each teammate their own tapa, + +35:11.840 --> 35:13.279 +which becomes their baby. + +35:13.280 --> 35:15.639 +And I really love the idea + +35:15.640 --> 35:17.479 +of people being able to, you know, + +35:17.480 --> 35:20.319 +have an idea of an interface + +35:20.320 --> 35:21.599 +about how all of these are + +35:21.600 --> 35:22.719 +ultimately come back together, + +35:22.720 --> 35:26.639 +but people have their own like agency + +35:26.640 --> 35:27.919 +over their own code base, + +35:27.920 --> 35:29.119 +despite the fact that they're + +35:29.120 --> 35:30.479 +working in collaboration. + +35:30.480 --> 35:32.719 +I think that it can be incredibly motivating + +35:32.720 --> 35:36.079 +for a team to, you know, have each person + +35:36.080 --> 35:38.039 +in charge of their own project, + +35:38.040 --> 35:39.839 +but of course it's all ultimately + +35:39.840 --> 35:41.319 +going to the same code base. + +35:41.320 --> 35:43.199 +So, you know, I think that, + +35:43.200 --> 35:45.479 +that a pursuit of beauty + +35:45.480 --> 35:48.519 +is this really solid motivator + +35:48.520 --> 35:50.839 +in terms of how people perceive + +35:50.840 --> 35:53.959 +the merits of their efforts + +35:53.960 --> 35:56.479 +and how that lights a fire under them + +35:56.480 --> 35:58.999 +to continue and keep going and dig deep + +35:59.000 --> 36:00.559 +when things get frustrating. + +36:00.560 --> 36:02.799 +When you have a personal stake + +36:02.800 --> 36:03.399 +in your project, + +36:03.400 --> 36:06.479 +I think that that's a really excellent time + +36:06.480 --> 36:08.599 +to really push and move forward on it. + +36:08.600 --> 36:10.559 +And people having ownership + +36:10.560 --> 36:12.719 +over this idea of their specific tapa + +36:12.720 --> 36:14.999 +could be a really cool way to do that + +36:15.000 --> 36:15.759 +in a team setting. + +36:15.760 --> 36:19.999 +But I pivoted off a little bit. + +36:20.000 --> 36:24.559 +So yes, but I absolutely did that. + +36:24.560 --> 36:28.599 +You know, that having a simplistic format + +36:28.600 --> 36:29.999 +for your information + +36:30.000 --> 36:33.319 +is a really solid way to have + +36:33.320 --> 36:36.319 +collaboration be frictionless. + +36:36.320 --> 36:38.719 +You have one source of information + +36:38.720 --> 36:40.799 +and you don't have to drown in your tooling. + +36:40.800 --> 36:51.839 +All right, I think you've addressed + +36:51.840 --> 36:54.919 +all the questions on the etherpad. + +36:54.920 --> 36:56.799 +And as you said, people can email you, + +36:56.800 --> 36:58.439 +even though the website looks like + +36:58.440 --> 37:00.479 +it's still not quite there yet, + +37:00.480 --> 37:03.719 +people can email you or ask questions + +37:03.720 --> 37:05.039 +to the etherpad afterwards. + +37:05.040 --> 37:07.439 +Is there anything else that + +37:07.440 --> 37:11.039 +you'd like to share or shall I wrap up, + +37:11.040 --> 37:13.279 +introduce myself doing the closing remarks + +37:13.280 --> 37:16.959 +and then try to do the closing remarks? + +37:16.960 --> 37:18.839 +Yes, so I have two last thoughts. + +37:18.840 --> 37:21.439 +Yes, no, I did just want to confirm + +37:21.440 --> 37:24.319 +that my email is completely working. + +37:24.320 --> 37:27.199 +If you want to keep up to date + +37:27.200 --> 37:29.399 +with the stuff that I'm working on, + +37:29.400 --> 37:35.239 +please shoot and I will, you know, at your request, + +37:35.240 --> 37:38.119 +I will add you to a mailing list. + +37:38.120 --> 37:40.479 +which will have intermittent updates. + +37:40.480 --> 37:42.919 +I'm not going to send you spam, + +37:42.920 --> 37:47.279 +but it will have updates for what I'm working on, + +37:47.280 --> 37:48.599 +what this all looks like, + +37:48.600 --> 37:52.359 +and just context for the different things + +37:52.360 --> 37:53.119 +that I'm working on. + +37:53.120 --> 37:56.999 +My website will be going up soon enough. + +37:57.000 --> 38:01.119 +I just got a little distracted because I'm like, + +38:01.120 --> 38:05.239 +oh, I'm just gonna spin up a Gux server + +38:05.240 --> 38:06.999 +and I'm gonna make it super cool + +38:07.000 --> 38:09.119 +when really I just need just + +38:09.120 --> 38:12.439 +Debian and Apache real quick, just something. + +38:12.440 --> 38:16.679 +So the website will be going up. It's just not up yet. + +38:16.680 --> 38:19.959 +And the very last thing is that + +38:19.960 --> 38:22.959 +I would really like to thank everyone + +38:22.960 --> 38:27.199 +that helped me to get here. I would like to thank you know, + +38:27.200 --> 38:32.319 +all of my, you know, I would like to thank my fiance. + +38:32.320 --> 38:34.519 +I would like to thank all of my friends. + +38:34.520 --> 38:39.359 +I would like to thank my, you know, + +38:39.360 --> 38:42.119 +my mentor and business partner, Sharon. + +38:42.120 --> 38:45.119 +I would like to thank Tracy, my therapist. + +38:45.120 --> 38:48.279 +I would like to thank my parents. + +38:48.280 --> 38:53.279 +I invited people to come watch this thing, + +38:53.280 --> 38:55.279 +and I would like to thank all of them. + +38:55.280 --> 38:57.919 +I would like to thank everyone + +38:57.920 --> 39:02.439 +who was planning on coming to this event anyway. + +39:02.440 --> 39:06.359 +The Emacs community is incredible, incredibly encouraging, + +39:06.360 --> 39:09.399 +incredibly kind, incredibly smart and talented. + +39:09.400 --> 39:13.719 +Y'all make Emacs what it is, and it is so cool. + +39:13.720 --> 39:15.919 +I would like to thank you, Satya. + +39:15.920 --> 39:19.559 +I would like to thank all of the organizers + +39:19.560 --> 39:20.879 +that made this possible. + +39:20.880 --> 39:25.719 +This thing is the coolest and it was, this was so cool. diff --git a/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--main--chapters.vtt b/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--main--chapters.vtt new file mode 100644 index 00000000..0975552c --- /dev/null +++ b/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--main--chapters.vtt @@ -0,0 +1,68 @@ +WEBVTT + + +00:00:00.620 --> 00:00:29.679 +Introduction + +00:00:29.680 --> 00:01:03.839 +Hi, I'm Maddie! + +00:01:03.840 --> 00:02:00.519 +Bookclub Tapas + +00:02:00.520 --> 00:02:40.299 +Bookclub + +00:02:40.300 --> 00:03:55.799 +Too many hats, too many roles + +00:03:55.800 --> 00:05:24.779 +Narrativiation + +00:05:24.780 --> 00:05:47.659 +My starter kit - My stock, off the shelf suggestions + +00:05:47.660 --> 00:05:58.979 +Now what? + +00:05:58.980 --> 00:06:23.459 +Our overarching goal + +00:06:23.460 --> 00:07:05.119 +Our development focuses + +00:07:05.120 --> 00:08:37.979 +The rest of the headings + +00:08:37.980 --> 00:10:55.479 +Conversationality + +00:10:55.480 --> 00:13:01.919 +Ad-hoc means lesricsf tion + +00:13:01.920 --> 00:14:48.439 +Gratis documentation + +00:14:48.440 --> 00:16:21.499 +Keeping the thread of your intention + +00:16:21.500 --> 00:17:25.239 +Bookclub is becoming too much + +00:17:25.240 --> 00:18:22.839 +Introducing Tapas + +00:18:22.840 --> 00:22:25.179 +What are Tapas, what are Tapas not? + +00:22:25.180 --> 00:25:52.339 +Tapas are maybe best illustrated by example + +00:25:52.340 --> 00:28:36.099 +Introducing Squint + +00:28:36.100 --> 00:29:08.159 +What else does Bookclub Tapas do? + +00:29:08.160 --> 00:31:25.800 +Let's work together diff --git a/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--main.vtt b/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--main.vtt new file mode 100644 index 00000000..8e06a734 --- /dev/null +++ b/2025/captions/emacsconf-2025-bookclub-tapas--bookclub-tapas--maddie-sullivan--main.vtt @@ -0,0 +1,2400 @@ +WEBVTT captioned by sachac + +NOTE Introduction + +00:00:00.620 --> 00:00:04.159 +Alright! Hi everyone! Happy EmacsConf! + +00:00:04.160 --> 00:00:07.079 +I´m so excited to be here. + +00:00:07.080 --> 00:00:07.959 +It's surreal to be part + +00:00:07.960 --> 00:00:09.439 +of the conference itself, + +00:00:09.440 --> 00:00:11.239 +in addition to being a viewer. + +00:00:11.240 --> 00:00:13.879 +EmacsConf is like Christmas to me, + +00:00:13.880 --> 00:00:18.159 +and I'm so excited when it comes around every year. + +00:00:18.160 --> 00:00:21.119 +Today, my talk is on a programming methodology + +00:00:21.120 --> 00:00:23.999 +that I've created, discovered, stumbled upon. + +00:00:24.000 --> 00:00:26.439 +I call it "Bookclub Tapas." + +00:00:26.440 --> 00:00:27.759 +Before we get into that, + +00:00:27.760 --> 00:00:29.679 +let me introduce myself. + +NOTE Hi, I'm Maddie! + +00:00:29.680 --> 00:00:32.119 +My name is Maddie Sullivan, + +00:00:32.120 --> 00:00:34.239 +and my pronouns are she/her. + +00:00:34.240 --> 00:00:36.719 +I go by the handle ElephantErgonomics, + +00:00:36.720 --> 00:00:41.119 +which is shortened down to ElephantErgo in the IRC. + +00:00:41.120 --> 00:00:43.079 +You can reach out to me after the talk + +00:00:43.080 --> 00:00:44.959 +for questions, comments, + +00:00:44.960 --> 00:00:47.759 +or just to say hello by reaching out + +00:00:47.760 --> 00:00:56.959 +to hello@ElephantErgonomics.com. + +00:00:56.960 --> 00:01:00.039 +So this software development strategy I found, + +00:01:00.040 --> 00:01:03.839 +it's inspired by literate programming and Agile. + +NOTE Bookclub Tapas + +00:01:03.840 --> 00:01:07.439 +So what exactly is Bookclub Tapas? + +00:01:07.440 --> 00:01:09.439 +Bookclub Tapas is a conversation + +00:01:09.440 --> 00:01:11.719 +that you have with yourself. + +00:01:11.720 --> 00:01:13.479 +It's a log and a ledger, + +00:01:13.480 --> 00:01:16.519 +of your intentions, hopes, dreams, + +00:01:16.520 --> 00:01:17.119 +and what you've learned + +00:01:17.120 --> 00:01:19.719 +over the course of development. + +00:01:19.720 --> 00:01:22.799 +Bookclub Tapas is an oracle + +00:01:22.800 --> 00:01:24.199 +you can consult + +00:01:24.200 --> 00:01:26.933 +about the state of, and the strategies behind, + +00:01:26.934 --> 00:01:29.559 +your development process. + +00:01:29.560 --> 00:01:33.479 +Bookclub Tapas is also a peer programming partner + +00:01:33.480 --> 00:01:37.119 +that helps you decide how to best put forward your efforts + +00:01:37.120 --> 00:01:38.439 +and how to best pull together + +00:01:38.440 --> 00:01:40.399 +what you're working on. + +00:01:40.400 --> 00:01:42.719 +Bookclub Tapas will also help you to understand + +00:01:42.720 --> 00:01:45.239 +how to tailor scope to your needs, + +00:01:45.240 --> 00:01:46.759 +and how to have the best parts + +00:01:46.760 --> 00:01:49.399 +of your program shine through clearly. + +00:01:49.400 --> 00:01:52.159 +Bookclub Tapas consists of two parts: + +00:01:52.160 --> 00:01:54.159 +Bookclub and Tapas, + +00:01:54.160 --> 00:02:00.519 +but what does that mean exactly, though? + +NOTE Bookclub + +00:02:00.520 --> 00:02:04.719 +Bookclub is a reverse literate development strategy. + +00:02:04.720 --> 00:02:07.479 +Bookclub is a time for you to write, + +00:02:07.480 --> 00:02:08.959 +and then read and reflect. + +00:02:08.960 --> 00:02:10.719 +It's like a Bookclub, + +00:02:10.720 --> 00:02:12.559 +but it's for your program. + +00:02:12.560 --> 00:02:15.239 +Instead of inserting narration into your code + +00:02:15.240 --> 00:02:17.799 +to narrativize what you are accomplishing, + +00:02:17.800 --> 00:02:20.759 +you are instead inserting snippets of code + +00:02:20.760 --> 00:02:23.799 +into your narrative to make it come alive. + +00:02:23.800 --> 00:02:27.999 +So, what are we narrativizing, exactly? + +00:02:28.000 --> 00:02:30.439 +What sort of story are we telling? + +00:02:30.440 --> 00:02:34.319 +Bookclub is the story of you, your program, + +00:02:34.320 --> 00:02:36.559 +and how your efforts are allowing your program + +00:02:36.560 --> 00:02:40.299 +to come into the world. + +NOTE Too many hats, too many roles + +00:02:40.300 --> 00:02:42.479 +Software developers naturally have to wear + +00:02:42.480 --> 00:02:43.679 +a lot of different hats, + +00:02:43.680 --> 00:02:46.479 +and take on a lot of different roles. + +00:02:46.480 --> 00:02:48.159 +We apply ourselves into a lot + +00:02:48.160 --> 00:02:50.079 +of different contexts. + +00:02:50.080 --> 00:02:53.067 +We do research, interface architecture design, + +00:02:53.068 --> 00:02:55.519 +mathematics, philosophy. + +00:02:55.520 --> 00:02:57.679 +We take in the world around us + +00:02:57.680 --> 00:03:00.359 +and then build abstractions to model it. + +00:03:00.360 --> 00:03:01.799 +We translate the abstract + +00:03:01.800 --> 00:03:03.079 +into the concrete, + +00:03:03.080 --> 00:03:04.667 +and then when we're trying to teach software + +00:03:04.668 --> 00:03:05.999 +how to be "smart," + +00:03:06.000 --> 00:03:07.239 +we translate the concrete + +00:03:07.240 --> 00:03:09.639 +back into the abstract. + +00:03:09.640 --> 00:03:11.500 +I can't help but feel like so much of + +00:03:11.501 --> 00:03:13.759 +what makes software development difficult + +00:03:13.760 --> 00:03:14.919 +is just trying to remember + +00:03:14.920 --> 00:03:16.679 +and keep track of everything. + +00:03:16.680 --> 00:03:17.959 +We have to try and remember + +00:03:17.960 --> 00:03:21.259 +so many different implementation details. + +00:03:21.260 --> 00:03:24.159 +We have to remember how our own code works, + +00:03:24.160 --> 00:03:26.679 +how the API of our dependencies work, + +00:03:26.680 --> 00:03:29.479 +how relevant real-world constraints behave, + +00:03:29.480 --> 00:03:31.319 +what the standards lay out, + +00:03:31.320 --> 00:03:34.159 +and how our data structures are laid out. + +00:03:34.160 --> 00:03:35.079 +When we're debugging, + +00:03:35.080 --> 00:03:37.519 +we simultaneously have to remember + +00:03:37.520 --> 00:03:40.239 +how our program is currently behaving, + +00:03:40.240 --> 00:03:42.679 +as well as how the program ought to behave + +00:03:42.680 --> 00:03:43.719 +in order to get a chance + +00:03:43.720 --> 00:03:46.039 +to reconcile that gap. + +00:03:46.040 --> 00:03:47.999 +It's honestly all way too much. + +00:03:48.000 --> 00:03:50.239 +We need a ledger of what we're actually doing + +00:03:50.240 --> 00:03:55.799 +in order to stay sane. + +NOTE Narrativiation + +00:03:55.800 --> 00:03:57.333 +I think a really effective way to + +00:03:57.334 --> 00:03:59.599 +make sense of things that are complex and important + +00:03:59.600 --> 00:04:01.039 +is to narrativize them, + +00:04:01.040 --> 00:04:02.839 +to turn them into stories. + +00:04:02.840 --> 00:04:06.039 +This is a strategy that humans have been using for a long time. + +00:04:06.040 --> 00:04:08.559 +Mnemonic devices, metaphors, + +00:04:08.560 --> 00:04:09.759 +and drawing parallels + +00:04:09.760 --> 00:04:12.199 +are all different ways of doing just this. + +00:04:12.200 --> 00:04:14.799 +Telling stories helps us to understand + +00:04:14.800 --> 00:04:16.359 +things that are big and complex + +00:04:16.360 --> 00:04:19.119 +by grounding them in our own experience + +00:04:19.120 --> 00:04:23.979 +and making it fit into our scale. + +00:04:23.980 --> 00:04:25.799 +So because the way that everyone + +00:04:25.800 --> 00:04:26.919 +naturally tells stories + +00:04:26.920 --> 00:04:28.239 +is going to be a little different, + +00:04:28.240 --> 00:04:30.067 +because the details that strike us + +00:04:30.068 --> 00:04:32.119 +as important and worth focusing on + +00:04:32.120 --> 00:04:34.239 +are going to be different for different people, + +00:04:34.240 --> 00:04:35.639 +I'm not going to say + +00:04:35.640 --> 00:04:36.799 +that there are hard and fast rules + +00:04:36.800 --> 00:04:39.359 +about how Bookclub "should work," + +00:04:39.360 --> 00:04:41.133 +because how it "should work" + +00:04:41.134 --> 00:04:43.919 +is however it best fits your needs. + +00:04:43.920 --> 00:04:45.879 +Different people and different projects + +00:04:45.880 --> 00:04:47.559 +have different backgrounds and mindsets. + +00:04:47.560 --> 00:04:49.633 +And I don't think it's my place to say + +00:04:49.634 --> 00:04:51.879 +what strategy is correct as a universal law. + +00:04:51.880 --> 00:04:54.719 +You know, because Bookclub Tapas is, after all, + +00:04:54.720 --> 00:04:57.099 +just something I've sort of stumbled into. + +00:04:57.100 --> 00:05:00.039 +Bookclub is intrinsically ad-hoc. + +00:05:00.040 --> 00:05:02.159 +My providing a prescription of strategy + +00:05:02.160 --> 00:05:04.839 +is basically going to begin and end with the idea + +00:05:04.840 --> 00:05:07.519 +that you write a reverse-literate document + +00:05:07.520 --> 00:05:08.799 +that illustrates how you've gone + +00:05:08.800 --> 00:05:11.919 +about writing your program. + +00:05:11.920 --> 00:05:14.519 +All of that being said, + +00:05:14.520 --> 00:05:16.319 +I'm going to talk about + +00:05:16.320 --> 00:05:18.439 +how I've laid out my book club files + +00:05:18.440 --> 00:05:20.399 +and why I think this is a solid place + +00:05:20.400 --> 00:05:24.779 +from which to get started. + +NOTE My starter kit - My stock, off the shelf suggestions + +00:05:24.780 --> 00:05:27.839 +So my stock off-the-shelf suggestions + +00:05:27.840 --> 00:05:29.079 +for just getting started + +00:05:29.080 --> 00:05:32.960 +is to have sections for: our overarching goal, + +00:05:32.961 --> 00:05:35.059 +our development goals, + +00:05:35.060 --> 00:05:40.699 +a place for scratch work, a test suite, research, + +00:05:40.700 --> 00:05:42.467 +and then finally sections for variables, + +00:05:42.468 --> 00:05:47.659 +functions, and macros. + +NOTE Now what? + +00:05:47.660 --> 00:05:49.999 +So we have our starter kit sections. + +00:05:50.000 --> 00:05:51.959 +How do we go about using them? + +00:05:51.960 --> 00:05:53.639 +How do we get started? + +00:05:53.640 --> 00:05:55.319 +Well, we write them, you know, + +00:05:55.320 --> 00:05:56.439 +out in our org document, + +00:05:56.440 --> 00:05:58.979 +but then what do we do? + +NOTE Our overarching goal + +00:05:58.980 --> 00:06:01.599 +We start by writing what we know. + +00:06:01.600 --> 00:06:04.219 +We have a spark, a vision. + +00:06:04.220 --> 00:06:05.839 +We had the beginning of an idea + +00:06:05.840 --> 00:06:08.079 +of what we wanted our program to do. + +00:06:08.080 --> 00:06:09.839 +Alternatively, maybe we had + +00:06:09.840 --> 00:06:10.879 +a client lay our goals out. + +00:06:10.880 --> 00:06:13.299 +Either way, we have some idea + +00:06:13.300 --> 00:06:15.439 +of how we want our program to be shaped. + +00:06:15.440 --> 00:06:18.339 +Let's start by writing that down. + +00:06:18.340 --> 00:06:19.439 +What are we trying to do? + +00:06:19.440 --> 00:06:23.459 +What is our goal? + +NOTE Our development focuses + +00:06:23.460 --> 00:06:26.279 +After that, we're probably wondering to ourselves, + +00:06:26.280 --> 00:06:27.759 +"Okay, we have our goal, + +00:06:27.760 --> 00:06:30.079 +but how do we get there?" + +00:06:30.080 --> 00:06:31.359 +That's when we start writing + +00:06:31.360 --> 00:06:33.359 +our development focuses. + +00:06:33.360 --> 00:06:35.159 +If we have bursts of intuition + +00:06:35.160 --> 00:06:36.919 +about what functions to write, + +00:06:36.920 --> 00:06:39.799 +questions that we want to answer through research, + +00:06:39.800 --> 00:06:43.339 +we start enumerating those every time they hit us. + +00:06:43.340 --> 00:06:44.559 +Our goal is to write them + +00:06:44.560 --> 00:06:46.199 +all down in a checklist + +00:06:46.200 --> 00:06:48.159 +in order to turn them from daydreams + +00:06:48.160 --> 00:06:50.479 +into courses of action. + +00:06:50.480 --> 00:06:52.439 +If we aren't having development focuses + +00:06:52.440 --> 00:06:54.799 +hit us right away, that's okay. + +00:06:54.800 --> 00:06:57.279 +If we just stare at the goal for long enough, + +00:06:57.280 --> 00:06:58.319 +I think it's inevitable + +00:06:58.320 --> 00:06:59.559 +that the muse will speak, + +00:06:59.560 --> 00:07:00.879 +and we'll get a clear lead + +00:07:00.880 --> 00:07:05.119 +on a path forward. + +NOTE The rest of the headings + +00:07:05.120 --> 00:07:07.219 +So now what? + +00:07:07.220 --> 00:07:09.899 +Now that we have our development focuses, + +00:07:09.900 --> 00:07:11.759 +we want to go ahead and create + +00:07:11.760 --> 00:07:13.439 +the rest of the headings for ourselves + +00:07:13.440 --> 00:07:15.539 +so we can act upon them. + +00:07:15.540 --> 00:07:17.239 +We go ahead and write the rest + +00:07:17.240 --> 00:07:19.419 +of the file's structure ad-hoc + +00:07:19.420 --> 00:07:22.339 +in a way that will serve our needs for now. + +00:07:22.340 --> 00:07:24.079 +If it's not fitting us well later on, + +00:07:24.080 --> 00:07:25.279 +we can just go ahead and change it. + +00:07:25.280 --> 00:07:26.239 +There's no pressure. + +00:07:26.240 --> 00:07:27.719 +That's the beauty of having this + +00:07:27.720 --> 00:07:30.099 +all be in a plain Org document. + +00:07:30.100 --> 00:07:32.079 +If we're doing something consistently, + +00:07:32.080 --> 00:07:35.059 +we probably want to have a heading for it. + +00:07:35.060 --> 00:07:36.439 +We'll go ahead and create homes + +00:07:36.440 --> 00:07:38.919 +for our variables, our functions, our macros. + +00:07:38.920 --> 00:07:41.479 +We'll want to create a spot for scratch work + +00:07:41.480 --> 00:07:43.319 +to sort of like stretch our legs + +00:07:43.320 --> 00:07:45.399 +and lament in a stream-of-consciousness + +00:07:45.400 --> 00:07:47.079 +sort of format about how + +00:07:47.080 --> 00:07:50.159 +a particular piece of design ought to work. + +00:07:50.160 --> 00:07:52.359 +Basically, any time we wear a different "hat" + +00:07:52.360 --> 00:07:55.079 +or we take on a different "role" as a developer, + +00:07:55.080 --> 00:07:58.839 +it's worth considering creating a category for it. + +00:07:58.840 --> 00:08:00.719 +The best way for us to figure out + +00:08:00.720 --> 00:08:01.839 +what headings to fill in, + +00:08:01.840 --> 00:08:03.359 +and how to fill them in, + +00:08:03.360 --> 00:08:07.919 +is to just go ahead and act upon our development goals. + +00:08:07.920 --> 00:08:09.959 +If we have a question we want to answer, + +00:08:09.960 --> 00:08:12.519 +we'll want to create a Research heading + +00:08:12.520 --> 00:08:14.759 +so we can go ahead and have a spot + +00:08:14.760 --> 00:08:17.419 +for scratch-work for reasoning things out. + +00:08:17.420 --> 00:08:18.919 +If we want to write the first draft + +00:08:18.920 --> 00:08:20.679 +of a function we want, + +00:08:20.680 --> 00:08:22.799 +We'll want to create a heading for functions + +00:08:22.800 --> 00:08:37.979 +and then a sub-heading for that function in particular. + +NOTE Conversationality + +00:08:37.980 --> 00:08:40.419 +So now that we've filled in our sections, + +00:08:40.420 --> 00:08:42.379 +what do we do now? + +00:08:42.380 --> 00:08:43.679 +Our idea for a program + +00:08:43.680 --> 00:08:44.879 +has been turned into a story, + +00:08:44.880 --> 00:08:47.619 +but what does that actually get us? + +00:08:47.620 --> 00:08:50.839 +To me, a lot of what's exciting about Bookclub + +00:08:50.840 --> 00:08:52.919 +is that novelization goes in + +00:08:52.920 --> 00:08:56.059 +and a peer programming partner comes out. + +00:08:56.060 --> 00:08:58.359 +As we loop through reviewing our document, + +00:08:58.360 --> 00:08:59.799 +as we scan it up and down, + +00:08:59.800 --> 00:09:02.000 +we're able to engage in conversationality + +00:09:02.001 --> 00:09:04.999 +with our past self because of how verbose + +00:09:05.000 --> 00:09:06.499 +we've been in our notes. + +00:09:06.500 --> 00:09:08.439 +We can ask our past self questions, + +00:09:08.440 --> 00:09:09.879 +and get back answers. + +00:09:09.880 --> 00:09:11.979 +We've turned our past self + +00:09:11.980 --> 00:09:14.579 +into a peer programming partner. + +00:09:14.580 --> 00:09:16.359 +If we're wondering what to do next, + +00:09:16.360 --> 00:09:18.319 +we can check our Development Focuses. + +00:09:18.320 --> 00:09:20.759 +If we're wondering how something works, + +00:09:20.760 --> 00:09:22.199 +we can read documentation + +00:09:22.200 --> 00:09:24.719 +embedded in our function drafts, + +00:09:24.720 --> 00:09:26.919 +or we can read the outcomes of tests + +00:09:26.920 --> 00:09:28.659 +that we've performed in our research. + +00:09:28.660 --> 00:09:33.019 +We can ask ourselves questions and get answers. + +00:09:33.020 --> 00:09:34.439 +Some of what's most exciting + +00:09:34.440 --> 00:09:35.919 +about peer programming to me + +00:09:35.920 --> 00:09:38.079 +is having fresh perspective + +00:09:38.080 --> 00:09:41.079 +and alternate context. + +00:09:41.080 --> 00:09:42.679 +We have a fresh set of eyes + +00:09:42.680 --> 00:09:44.439 +on the program that aren't our own, + +00:09:44.440 --> 00:09:47.479 +and with that set of eyes + +00:09:47.480 --> 00:09:50.199 +comes someone else to share the burden + +00:09:50.200 --> 00:09:52.539 +of trying to remember everything. + +00:09:52.540 --> 00:09:54.839 +With Bookclub, instead of having + +00:09:54.840 --> 00:09:57.559 +a peer programmer that exists in physical space, + +00:09:57.560 --> 00:10:00.719 +we have one that's, to get all sci-fi for a moment, + +00:10:00.720 --> 00:10:03.039 +reaching forward towards us + +00:10:03.040 --> 00:10:04.999 +from backward in time. + +00:10:05.000 --> 00:10:06.799 +We're asynchronously working + +00:10:06.800 --> 00:10:08.119 +with our past selves + +00:10:08.120 --> 00:10:10.439 +as an equal-role collaborative + +00:10:10.440 --> 00:10:12.879 +partner in development. + +00:10:12.880 --> 00:10:15.039 +We have their perspective, + +00:10:15.040 --> 00:10:17.799 +their fresh memories of the code as it was written, + +00:10:17.800 --> 00:10:20.959 +and their focus on what was worth worrying about + +00:10:20.960 --> 00:10:22.319 +at a different point in time. + +00:10:22.320 --> 00:10:24.959 +We can ask them questions and get answers. + +00:10:24.960 --> 00:10:26.319 +We can ask them questions like, + +00:10:26.320 --> 00:10:28.199 +well, "What do I do now?" + +00:10:28.200 --> 00:10:30.419 +"How does this data structure work?" + +00:10:30.420 --> 00:10:33.679 +"What types does this third-party library take?" + +00:10:33.680 --> 00:10:35.119 +By asking these questions, + +00:10:35.120 --> 00:10:36.319 +I can even stay fresh + +00:10:36.320 --> 00:10:37.479 +on development progress + +00:10:37.480 --> 00:10:40.099 +that I last touched months ago. + +00:10:40.100 --> 00:10:42.799 +It's really easy to duplicate work, + +00:10:42.800 --> 00:10:44.719 +forget how things work, + +00:10:44.720 --> 00:10:46.159 +lose track of priorities. + +00:10:46.160 --> 00:10:48.279 +Bookclub helps keep us focused, + +00:10:48.280 --> 00:10:49.839 +it keeps us accountable, + +00:10:49.840 --> 00:10:55.479 +it even keeps us company. + +NOTE Ad-hoc means lesricsf tion + +00:10:55.480 --> 00:10:58.359 +One of the most immediately useful things about Bookclub, + +00:10:58.360 --> 00:11:00.867 +in my opinion, is that we immediately have + +00:11:00.868 --> 00:11:02.359 +a list of actionable items. + +00:11:02.360 --> 00:11:04.319 +Every time I have a little pain point, + +00:11:04.320 --> 00:11:06.639 +I go ahead and write it down, + +00:11:06.640 --> 00:11:09.079 +and I write down all of the things + +00:11:09.080 --> 00:11:11.579 +that would be nice to have done someday. + +00:11:11.580 --> 00:11:13.199 +So you might be wondering, + +00:11:13.200 --> 00:11:14.679 +and it's fair to wonder this, + +00:11:14.680 --> 00:11:17.479 +isn't this effectively just the GitHub issue model? + +00:11:17.480 --> 00:11:19.279 +We're listing out bug requests, + +00:11:19.280 --> 00:11:21.239 +issue requests, feature requests. + +00:11:21.240 --> 00:11:22.519 +It's not exactly a new idea, + +00:11:22.520 --> 00:11:24.559 +and it's pretty intuitive. + +00:11:24.560 --> 00:11:26.719 +I think the important consideration here + +00:11:26.720 --> 00:11:29.999 +is that having really formalized apparatus + +00:11:30.000 --> 00:11:31.639 +for entering in our thoughts + +00:11:31.640 --> 00:11:34.419 +can be an unnecessary source of friction. + +00:11:34.420 --> 00:11:36.359 +Bug listings don't tend to be + +00:11:36.360 --> 00:11:37.839 +a great fit for daydreaming + +00:11:37.840 --> 00:11:40.939 +or verbose considerations of philosophy. + +00:11:40.940 --> 00:11:42.919 +Bug listings tend to be reserved + +00:11:42.920 --> 00:11:45.119 +for catastrophes. + +00:11:45.120 --> 00:11:47.279 +I feel like a lot of the tooling + +00:11:47.280 --> 00:11:48.199 +that we currently use + +00:11:48.200 --> 00:11:51.279 +really struggles with creating ergonomics + +00:11:51.280 --> 00:11:54.879 +that make taking frictionless notes difficult. + +00:11:54.880 --> 00:11:57.159 +We have systems where all the disparate + +00:11:57.160 --> 00:11:59.079 +parts of what we're working on + +00:11:59.080 --> 00:12:02.499 +feel really far away from each other. + +00:12:02.500 --> 00:12:04.039 +We're pushed away from engaging + +00:12:04.040 --> 00:12:05.959 +in conversations with ourselves + +00:12:05.960 --> 00:12:07.919 +as a result of how disparate + +00:12:07.920 --> 00:12:09.159 +all of our tooling feels, + +00:12:09.160 --> 00:12:10.959 +how the process of working with it + +00:12:10.960 --> 00:12:12.899 +is incongruent. + +00:12:12.900 --> 00:12:15.599 +My hope is that we can instead + +00:12:15.600 --> 00:12:16.999 +engage with a process + +00:12:17.000 --> 00:12:18.359 +that makes it really trivial + +00:12:18.360 --> 00:12:20.199 +to write impulsive journaling + +00:12:20.200 --> 00:12:21.979 +about what we're doing. + +00:12:21.980 --> 00:12:23.839 +So much of design is ultimately + +00:12:23.840 --> 00:12:25.559 +just daydreaming. + +00:12:25.560 --> 00:12:27.279 +Good ideas tend to strike us hard, + +00:12:27.280 --> 00:12:29.779 +in a momentary flash of inspiration, + +00:12:29.780 --> 00:12:32.599 +and then they fade just as quickly. + +00:12:32.600 --> 00:12:35.239 +Anyone who's had an idea all at once + +00:12:35.240 --> 00:12:36.579 +in the middle of the night + +00:12:36.580 --> 00:12:38.159 +knows that they're going to have to choose + +00:12:38.160 --> 00:12:40.619 +between either committing to writing it down + +00:12:40.620 --> 00:12:41.959 +or accept that by morning + +00:12:41.960 --> 00:12:44.259 +they'll have lost it. + +00:12:44.260 --> 00:12:45.359 +If we're not writing + +00:12:45.360 --> 00:12:46.759 +what strikes us as important + +00:12:46.760 --> 00:12:48.639 +at the same moment that it's happening, + +00:12:48.640 --> 00:12:50.379 +we're going to lose it. + +00:12:50.380 --> 00:12:52.639 +It's not realistic to expect ourselves + +00:12:52.640 --> 00:12:54.519 +to hold onto our ideas forever + +00:12:54.520 --> 00:12:56.359 +with the same precision + +00:12:56.360 --> 00:13:01.919 +as when we were first inspired. + +NOTE Gratis documentation + +00:13:01.920 --> 00:13:11.319 +Okay. I'm gonna call you out real quick. + +00:13:11.320 --> 00:13:13.759 +If I ask all of you "Who wants to read + +00:13:13.760 --> 00:13:15.959 +really excellent documentation?" + +00:13:15.960 --> 00:13:17.079 +I imagine that everyone here + +00:13:17.080 --> 00:13:18.379 +is raising their hand. + +00:13:18.380 --> 00:13:20.759 +We want code to make sense + +00:13:20.760 --> 00:13:21.959 +and we want to know what + +00:13:21.960 --> 00:13:24.239 +the original developer had in mind. + +00:13:24.240 --> 00:13:26.399 +Even the original developer themselves + +00:13:26.400 --> 00:13:28.579 +would want this just for their own sake. + +00:13:28.580 --> 00:13:30.999 +I know that for me, I can even feel + +00:13:31.000 --> 00:13:32.319 +things becoming less fresh + +00:13:32.320 --> 00:13:33.759 +just after a couple months away + +00:13:33.760 --> 00:13:35.539 +from my codebase. + +00:13:35.540 --> 00:13:38.619 +And that was me from a couple months ago. + +00:13:38.620 --> 00:13:42.359 +They're not around anymore. + +00:13:42.360 --> 00:13:45.359 +Now, here's the rough part. + +00:13:45.360 --> 00:13:48.579 +Here's what I'm really gonna call you all out. + +00:13:48.580 --> 00:13:51.599 +"Who wants to write really excellent documentation?" + +00:13:51.600 --> 00:13:53.719 +Now, I don't know what's happening on your end, + +00:13:53.720 --> 00:13:55.559 +but I'm imagining crickets, + +00:13:55.560 --> 00:13:57.039 +silence, tumbleweeds + +00:13:57.040 --> 00:13:59.139 +blowing through to the horizon. + +00:13:59.140 --> 00:14:00.999 +It's a tough ask. + +00:14:01.000 --> 00:14:03.559 +It's not generally all that rewarding. + +00:14:03.560 --> 00:14:06.299 +If you're writing docs from scratch, + +00:14:06.300 --> 00:14:07.999 +a lot of it involves relearning + +00:14:08.000 --> 00:14:10.679 +the intentions behind crusty old code. + +00:14:10.680 --> 00:14:13.359 +For me, it hurts to not spend that same time + +00:14:13.360 --> 00:14:16.119 +implementing bug fixes and new features. + +00:14:16.120 --> 00:14:17.599 +It just doesn't feel like + +00:14:17.600 --> 00:14:19.619 +a great use of my time. + +00:14:19.620 --> 00:14:22.279 +Even if it's strictly for my own codebase + +00:14:22.280 --> 00:14:25.039 +for my own use, it's hard to sit down and do it + +00:14:25.040 --> 00:14:28.779 +even when I know how much I would benefit from it. + +00:14:28.780 --> 00:14:31.359 +My thinking is that when you write rough, + +00:14:31.360 --> 00:14:34.039 +piecewise daydreaming as you go, + +00:14:34.040 --> 00:14:36.039 +it's so much easier to not only + +00:14:36.040 --> 00:14:38.759 +begin writing documentation early in your process, + +00:14:38.760 --> 00:14:42.839 +but also to stay consistent about not slouching into + +00:14:42.840 --> 00:14:48.439 +an accumulation of a backlog. + +NOTE Keeping the thread of your intention + +00:14:48.440 --> 00:14:51.319 +So not only does writing documentation early + +00:14:51.320 --> 00:14:54.599 +make us more likely to keep that habit going, + +00:14:54.600 --> 00:14:56.399 +but it also makes the documentation + +00:14:56.400 --> 00:14:59.499 +we do write way more robust. + +00:14:59.500 --> 00:15:01.239 +When fiction meets reality + +00:15:01.240 --> 00:15:04.119 +and we start writing out code + +00:15:04.120 --> 00:15:06.119 +that is constrained by the real world + +00:15:06.120 --> 00:15:08.859 +and not just our imagination, + +00:15:08.860 --> 00:15:11.759 +we learn that things we assumed about our design + +00:15:11.760 --> 00:15:14.839 +aren't going to work out in practice. + +00:15:14.840 --> 00:15:16.879 +Because of this, we can enter + +00:15:16.880 --> 00:15:18.559 +into a sort of situation + +00:15:18.560 --> 00:15:21.139 +akin to boiling a frog in a pot of water. + +00:15:21.140 --> 00:15:23.079 +Frogs don't notice that they're being boiled + +00:15:23.080 --> 00:15:26.919 +if the water is only heated gradually enough. + +00:15:26.920 --> 00:15:31.099 +We decide to adjust our design only a little bit + +00:15:31.100 --> 00:15:33.919 +without changing the documentation right away. + +00:15:33.920 --> 00:15:34.999 +Doing that once is fine, + +00:15:35.000 --> 00:15:36.559 +but I don't believe for a second + +00:15:36.560 --> 00:15:38.559 +that we're only going to do it once. + +00:15:38.560 --> 00:15:39.919 +We can find ourselves surprised + +00:15:39.920 --> 00:15:41.659 +that as time goes on, + +00:15:41.660 --> 00:15:43.919 +our code looks nothing like our spec, + +00:15:43.920 --> 00:15:45.879 +and we lose the thread of what our code + +00:15:45.880 --> 00:15:48.699 +was supposed to do in the first place. + +00:15:48.700 --> 00:15:52.979 +When we stake our intentions clearly and early, + +00:15:52.980 --> 00:15:54.979 +you ground yourself in them. + +00:15:54.980 --> 00:15:58.439 +You reduce the risk of straying from them. + +00:15:58.440 --> 00:15:59.879 +You have clear reference + +00:15:59.880 --> 00:16:01.919 +for what you want your code to do, + +00:16:01.920 --> 00:16:03.319 +and you reduce the risk + +00:16:03.320 --> 00:16:05.919 +of having its purpose shift over time. + +00:16:05.920 --> 00:16:07.399 +When we take turns alternating + +00:16:07.400 --> 00:16:09.239 +between writing code and documentation + +00:16:09.240 --> 00:16:11.199 +rather than acting, you know, + +00:16:11.200 --> 00:16:14.319 +as having it all as one step, + +00:16:14.320 --> 00:16:16.479 +we risk taking turns just moving + +00:16:16.480 --> 00:16:21.499 +our goalpost back and forth. + +NOTE Bookclub is becoming too much + +00:16:21.500 --> 00:16:24.239 +So we've seen how our Bookclub files get us + +00:16:24.240 --> 00:16:25.839 +all sorts of amazing features + +00:16:25.840 --> 00:16:27.619 +and practical benefits. + +00:16:27.620 --> 00:16:29.599 +But we might be starting to notice a pattern + +00:16:29.600 --> 00:16:31.839 +as we continue to engage in conversation + +00:16:31.840 --> 00:16:33.839 +and work with our document + +00:16:33.840 --> 00:16:35.919 +and watch it grow in size. + +00:16:35.920 --> 00:16:38.819 +We originally created our Bookclub file + +00:16:38.820 --> 00:16:40.700 +with the hope to reduce + +00:16:40.701 --> 00:16:42.119 +what we would need to keep track of + +00:16:42.120 --> 00:16:44.879 +and to reduce our level of overwhelm. + +00:16:44.880 --> 00:16:48.919 +We might find that as our Bookclub file grows, + +00:16:48.920 --> 00:16:51.159 +we're encountering more detail + +00:16:51.160 --> 00:16:53.319 +than we can practically parse, manage, + +00:16:53.320 --> 00:16:55.759 +and decipher intention from. + +00:16:55.760 --> 00:16:57.719 +It can be easy to enter into a situation + +00:16:57.720 --> 00:16:59.839 +where we're drowning in the breadth of our notes, + +00:16:59.840 --> 00:17:03.399 +and in doing so we've recreated the same problem + +00:17:03.400 --> 00:17:05.419 +we originally set out to solve. + +00:17:05.420 --> 00:17:08.759 +Writing out every single detail helps us a lot + +00:17:08.760 --> 00:17:11.079 +to make sense of things at first, + +00:17:11.080 --> 00:17:13.519 +but then after a while, we can encounter + +00:17:13.520 --> 00:17:15.879 +a signal-to-noise problem + +00:17:15.880 --> 00:17:19.399 +when we try to make meaning from too many details. + +00:17:19.400 --> 00:17:25.239 +This is where tapas come in. + +NOTE Introducing Tapas + +00:17:25.240 --> 00:17:29.199 +So tapas in Spanish cuisine are appetizers. + +00:17:29.200 --> 00:17:31.559 +What's notable about tapas + +00:17:31.560 --> 00:17:33.839 +is that you can bring a bunch of them together + +00:17:33.840 --> 00:17:35.299 +to make a full meal. + +00:17:35.300 --> 00:17:38.379 +In the context of Bookclub Tapas, + +00:17:38.380 --> 00:17:40.339 +they serve a similar role. + +00:17:40.340 --> 00:17:42.719 +The idea is that we write flavorful libraries + +00:17:42.720 --> 00:17:45.419 +that together form a full program. + +00:17:45.420 --> 00:17:47.059 +We have a full program, + +00:17:47.060 --> 00:17:49.839 +but it's made from discrete modules. + +00:17:49.840 --> 00:17:52.719 +The idea behind tapas is that instead of creating + +00:17:52.720 --> 00:17:55.859 +one perfect, "solves everything" codebase, + +00:17:55.860 --> 00:17:57.319 +we want to create a whole bunch + +00:17:57.320 --> 00:17:59.079 +of separate libraries + +00:17:59.080 --> 00:18:02.919 +that themselves nail a specific subdomain. + +00:18:02.920 --> 00:18:04.119 +And once these libraries + +00:18:04.120 --> 00:18:05.179 +are all brought together, + +00:18:05.180 --> 00:18:08.019 +they form the whole that we're seeking. + +00:18:08.020 --> 00:18:10.079 +Once our Bookclub file becomes big enough + +00:18:10.080 --> 00:18:12.239 +such that we feel like our scope can be split + +00:18:12.240 --> 00:18:14.239 +into multiple libraries, + +00:18:14.240 --> 00:18:16.079 +that's when we want to take the opportunity + +00:18:16.080 --> 00:18:22.839 +to split our program up into parts, into Tapas. + +NOTE What are Tapas, what are Tapas not? + +00:18:22.840 --> 00:18:25.159 +So, maybe one of the best ways + +00:18:25.160 --> 00:18:27.039 +to understand what makes a good Tapa + +00:18:27.040 --> 00:18:30.599 +is to first examine what does not make a good Tapa. + +00:18:30.600 --> 00:18:32.159 +The single most important thing + +00:18:32.160 --> 00:18:33.559 +to understand about Tapas + +00:18:33.560 --> 00:18:37.139 +is that they themselves are substantial. + +00:18:37.140 --> 00:18:38.879 +There's a lot of back and forth + +00:18:38.880 --> 00:18:40.679 +on the idea of micro-libraries, + +00:18:40.680 --> 00:18:42.879 +their merits, their dangers, + +00:18:42.880 --> 00:18:45.419 +and when and where they kind of work best. + +00:18:45.420 --> 00:18:46.359 +I think the distinction + +00:18:46.360 --> 00:18:47.599 +that I would like to draw + +00:18:47.600 --> 00:18:50.719 +is that I think that tapas belong in the larger end + +00:18:50.720 --> 00:18:53.759 +of scale and complexity for microlibraries + +00:18:53.760 --> 00:18:56.159 +rather than the smaller end. + +00:18:56.160 --> 00:18:58.079 +I think particularly small helpers + +00:18:58.080 --> 00:19:00.299 +like NPM's is-odd + +00:19:00.300 --> 00:19:01.919 +are a good example of something + +00:19:01.920 --> 00:19:05.479 +I think does not constitute a good Tapa. + +00:19:05.480 --> 00:19:08.799 +Meanwhile, I think Python's Requests library + +00:19:08.800 --> 00:19:11.799 +is a really good example of a Tapa. + +00:19:11.800 --> 00:19:15.319 +I believe Requests only does HTTP connections, + +00:19:15.320 --> 00:19:18.319 +but I feel like that's not so simple and straightforward + +00:19:18.320 --> 00:19:20.239 +that you can just go ahead and implement it + +00:19:20.240 --> 00:19:23.199 +on your own real quick. + +00:19:23.200 --> 00:19:24.639 +A real danger of creating + +00:19:24.640 --> 00:19:27.219 +helper libraries that are too small + +00:19:27.220 --> 00:19:31.159 +is that we don't remove abstraction + +00:19:31.160 --> 00:19:33.319 +nearly as much as we postpone it. + +00:19:33.320 --> 00:19:35.819 +If our libraries are small, + +00:19:35.820 --> 00:19:38.899 +but the glue code that binds them is large, + +00:19:38.900 --> 00:19:40.079 +we haven't done anything + +00:19:40.080 --> 00:19:41.519 +to reduce complexity + +00:19:41.520 --> 00:19:44.179 +or employ abstraction in a meaningful way. + +00:19:44.180 --> 00:19:47.479 +If all of the complexity exists in our glue code, + +00:19:47.480 --> 00:19:49.799 +we've simply replaced our functions + +00:19:49.800 --> 00:19:52.519 +with libraries of the same size and purpose. + +00:19:52.520 --> 00:19:54.559 +Our codebase is still monolithic + +00:19:54.560 --> 00:19:58.039 +instead of having meaningfully divided scope. + +00:19:58.040 --> 00:19:59.559 +I think that a good Tapa + +00:19:59.560 --> 00:20:01.479 +ought to feel like augmentations + +00:20:01.480 --> 00:20:03.979 +or extensions to the standard library. + +00:20:03.980 --> 00:20:05.199 +You know, maybe something kind of + +00:20:05.200 --> 00:20:08.379 +akin to Scheme's SRFI system. + +00:20:08.380 --> 00:20:10.599 +I think that the goal of good Tapas + +00:20:10.600 --> 00:20:13.919 +is not to solve a particular problem, + +00:20:13.920 --> 00:20:18.519 +but instead to solve a particular class of problem. + +00:20:18.520 --> 00:20:20.159 +The goal of a well-written Tapa + +00:20:20.160 --> 00:20:22.999 +is to solve needing to do hard work in general + +00:20:23.000 --> 00:20:25.559 +rather than solving what can only really be + +00:20:25.560 --> 00:20:26.679 +an individual need + +00:20:26.680 --> 00:20:28.439 +of an individual program. + +00:20:28.440 --> 00:20:30.359 +I feel like Tapas are most helpful + +00:20:30.360 --> 00:20:32.119 +when we instead seek to solve + +00:20:32.120 --> 00:20:35.319 +a larger overarching problem + +00:20:35.320 --> 00:20:39.439 +that intersects with the problem space of our code base. + +00:20:39.440 --> 00:20:42.239 +When we have a handful of Tapas + +00:20:42.240 --> 00:20:46.179 +that are roughly the same size and scale, + +00:20:46.180 --> 00:20:48.119 +the glue code that marries them + +00:20:48.120 --> 00:20:52.179 +is also roughly the same size and scale. + +00:20:52.180 --> 00:20:55.639 +As a heuristic, I try to aim for any function + +00:20:55.640 --> 00:20:57.839 +being approximately 3 calls in length, + +00:20:57.840 --> 00:21:00.839 +and then any Tapa being between 6 + +00:21:00.840 --> 00:21:06.399 +and 12 functions in length. + +00:21:06.400 --> 00:21:08.039 +The number of Tapas themselves + +00:21:08.040 --> 00:21:09.639 +can be as many or as few as you need, + +00:21:09.640 --> 00:21:12.879 +but then your Tapas can split into + +00:21:12.880 --> 00:21:16.459 +their own separate Tapas as needed. + +00:21:16.460 --> 00:21:18.799 +My hope is that the collection of our Tapas, + +00:21:18.800 --> 00:21:20.599 +especially as we create + +00:21:20.600 --> 00:21:22.319 +dependency chains among them, + +00:21:22.320 --> 00:21:25.039 +is that each next Tapa is a trivial case + +00:21:25.040 --> 00:21:27.099 +of the one prerequisite to it. + +00:21:27.100 --> 00:21:28.879 +Every Tapa is a meaningful, + +00:21:28.880 --> 00:21:31.059 +human-readable abstraction + +00:21:31.060 --> 00:21:33.439 +that enables us to feel confident about our tooling + +00:21:33.440 --> 00:21:35.639 +without drowning in detail. + +00:21:35.640 --> 00:21:38.499 +The whole stack can be understood by humans, + +00:21:38.500 --> 00:21:40.159 +but we only have to focus on + +00:21:40.160 --> 00:21:41.879 +any one piece of it at a time, + +00:21:41.880 --> 00:21:47.419 +rather than focusing on the entire stack all at once. + +00:21:47.420 --> 00:21:48.879 +We can practically achieve + +00:21:48.880 --> 00:21:51.259 +a huge final product, + +00:21:51.260 --> 00:21:52.759 +but each individual step + +00:21:52.760 --> 00:21:54.279 +in working towards that goal + +00:21:54.280 --> 00:21:56.039 +is still at a human scale. + +00:21:56.040 --> 00:22:02.179 +One thing I want to make sure to point out, + +00:22:02.180 --> 00:22:03.279 +one thing I want to make sure + +00:22:03.280 --> 00:22:05.179 +to point out explicitly, real quick, + +00:22:05.180 --> 00:22:06.279 +is that having access + +00:22:06.280 --> 00:22:07.839 +to a hygienic macro system, + +00:22:07.840 --> 00:22:10.259 +like the ones that we have in Lisps, + +00:22:10.260 --> 00:22:11.999 +makes for an amazing experience + +00:22:12.000 --> 00:22:13.319 +for creating Tapas. + +00:22:13.320 --> 00:22:15.279 +The types of abstractions that we can do + +00:22:15.280 --> 00:22:17.039 +by modifying syntax at compile time + +00:22:17.040 --> 00:22:18.439 +makes for incredibly intuitive + +00:22:18.440 --> 00:22:25.179 +and ergonomic tooling. + +NOTE Tapas are maybe best illustrated by example + +00:22:25.180 --> 00:22:27.279 +So we've talked quite a bit about + +00:22:27.280 --> 00:22:28.919 +what I think makes a Tapa good, + +00:22:28.920 --> 00:22:30.759 +but I think maybe the best way + +00:22:30.760 --> 00:22:32.679 +to understand the concept + +00:22:32.680 --> 00:22:35.599 +is to have a look at the whole workflow in practice. + +00:22:35.600 --> 00:22:37.479 +I've been working on this, currently + +00:22:37.480 --> 00:22:40.219 +unnamed, Elisp program recently. + +00:22:40.220 --> 00:22:42.959 +It's a validator for the filetags lines + +00:22:42.960 --> 00:22:45.819 +of my Org Mode files. + +00:22:45.820 --> 00:22:49.299 +So I have Org Mode files + +00:22:49.300 --> 00:22:50.999 +under my Documents directory, + +00:22:51.000 --> 00:22:53.633 +organized in this hierarchical way, + +00:22:53.634 --> 00:22:57.039 +and the nested directories have meaningful names. + +00:22:57.040 --> 00:23:00.300 +I want the headers of my Org files to be tagged + +00:23:00.301 --> 00:23:01.800 +in accordance with the sequence + +00:23:01.801 --> 00:23:04.199 +of the names of the directories. + +00:23:04.200 --> 00:23:06.167 +I do this by having the file-tags line + +00:23:06.168 --> 00:23:06.999 +at the top of the file + +00:23:07.000 --> 00:23:09.519 +just list the path segments in order. + +00:23:09.520 --> 00:23:12.199 +If I have an Org file in the directory + +00:23:12.200 --> 00:23:16.559 +"~/Documents/foo/bar", + +00:23:16.560 --> 00:23:20.799 +the file-tags line has the tags "foo" and "bar". + +00:23:20.800 --> 00:23:23.139 +This is totally fine to do by hand, + +00:23:23.140 --> 00:23:24.919 +but I want a program + +00:23:24.920 --> 00:23:27.119 +that recursively searches through my directories + +00:23:27.120 --> 00:23:29.799 +to validate that the tags are correct + +00:23:29.800 --> 00:23:33.459 +because it's easy to drop something. + +00:23:33.460 --> 00:23:36.039 +This scale of problem is actually kind of perfect + +00:23:36.040 --> 00:23:39.959 +for demonstrating how Bookclub Tapas work in action. + +00:23:39.960 --> 00:23:40.759 +We have a problem + +00:23:40.760 --> 00:23:42.639 +that's mostly rather simple, + +00:23:42.640 --> 00:23:44.359 +but it has a lot of moving pieces. + +00:23:44.360 --> 00:23:47.799 +We want to iterate over directories recursively, + +00:23:47.800 --> 00:23:49.559 +we want to do string manipulation, + +00:23:49.560 --> 00:23:50.879 +we want to parse buffers, + +00:23:50.880 --> 00:23:52.899 +and we want to edit buffers. + +00:23:52.900 --> 00:23:55.359 +All of these tasks are simple enough on their own, + +00:23:55.360 --> 00:23:56.679 +but it's deceptively easy + +00:23:56.680 --> 00:23:58.399 +to start tripping over ourselves + +00:23:58.400 --> 00:23:59.959 +when we feel like it's necessary + +00:23:59.960 --> 00:24:03.019 +to do all of these different things in one step. + +00:24:03.020 --> 00:24:05.399 +So there are a ton of great string + +00:24:05.400 --> 00:24:06.959 +manipulation tools for Emacs, + +00:24:06.960 --> 00:24:08.079 +so that's checked off, + +00:24:08.080 --> 00:24:10.939 +that's done, taken care of. + +00:24:10.940 --> 00:24:12.119 +I'm still kind of daydreaming + +00:24:12.120 --> 00:24:14.399 +about writing a wrapper around + +00:24:14.400 --> 00:24:16.039 +some of the Emacs standard libraries + +00:24:16.040 --> 00:24:16.999 +for directory traversal, + +00:24:17.000 --> 00:24:20.179 +just to make it a little bit nicer to work with. + +00:24:20.180 --> 00:24:20.799 +But the big thing + +00:24:20.800 --> 00:24:22.519 +that really struck me as odd + +00:24:22.520 --> 00:24:25.479 +is that there doesn't seem to be a great tooling + +00:24:25.480 --> 00:24:28.239 +for destructuring Emacs buffers + +00:24:28.240 --> 00:24:29.399 +beyond just chaining together + +00:24:29.400 --> 00:24:31.379 +a bunch of editor commands. + +00:24:31.380 --> 00:24:33.959 +Emacs is so buffer-oriented, + +00:24:33.960 --> 00:24:36.439 +I feel like it really deserves a good library + +00:24:36.440 --> 00:24:38.719 +for programmatic buffer destructuring. + +00:24:38.720 --> 00:24:40.559 +I looked around for a bit, + +00:24:40.560 --> 00:24:42.799 +but I couldn't really find anything. + +00:24:42.800 --> 00:24:44.759 +So at the end of the day, + +00:24:44.760 --> 00:24:47.279 +I could definitely just grit my teeth + +00:24:47.280 --> 00:24:50.919 +and put my head down and just use tools + +00:24:50.920 --> 00:24:54.359 +that feel cumbersome to work with if I wanted to. + +00:24:54.360 --> 00:24:55.199 +I could write something + +00:24:55.200 --> 00:24:56.039 +that's "good enough" + +00:24:56.040 --> 00:24:57.759 +just for the purpose of my package + +00:24:57.760 --> 00:25:00.279 +and then hide it deep inside the code base. + +00:25:00.280 --> 00:25:03.819 +I could absolutely do that. + +00:25:03.820 --> 00:25:07.919 +But I can't help but think about how + +00:25:07.920 --> 00:25:11.099 +after I properly write the tooling I'm missing, + +00:25:11.100 --> 00:25:13.159 +I'm really going to be thanking myself + +00:25:13.160 --> 00:25:15.879 +in terms of reduced implementational complexity, + +00:25:15.880 --> 00:25:19.039 +reduced bug hunting, real reusability, + +00:25:19.040 --> 00:25:22.199 +and ultimately really just a deep sense of pride + +00:25:22.200 --> 00:25:23.719 +in knowing that I took the time + +00:25:23.720 --> 00:25:27.319 +to do something in a way that feels "right." + +00:25:27.320 --> 00:25:28.799 +This right here is the perfect time + +00:25:28.800 --> 00:25:30.239 +to split off Tapas. + +00:25:30.240 --> 00:25:32.119 +Any time that we find ourselves + +00:25:32.120 --> 00:25:34.319 +reaching for a fictional dependency, + +00:25:34.320 --> 00:25:35.439 +wishing that someone had written + +00:25:35.440 --> 00:25:37.679 +a library like this... + +00:25:37.680 --> 00:25:39.119 +We can take that opportunity + +00:25:39.120 --> 00:25:42.019 +to remember that we are "someone." + +00:25:42.020 --> 00:25:44.319 +We can write that library ourselves, + +00:25:44.320 --> 00:25:46.679 +and we deserve to write that library + +00:25:46.680 --> 00:25:52.339 +because we deserve to get to use it. + +NOTE Introducing Squint + +00:25:52.340 --> 00:25:55.279 +So I'm going to briefly show + +00:25:55.280 --> 00:25:56.899 +a Bookclub buffer + +00:25:56.900 --> 00:25:59.259 +for a program called Squint. + +00:25:59.260 --> 00:26:00.879 +It's the buffer destructure + +00:26:00.880 --> 00:26:03.199 +that I've been talking about, and it's real. + +00:26:03.200 --> 00:26:04.519 +It's a wrapper around + +00:26:04.520 --> 00:26:05.999 +Emacs's narrowing functionality + +00:26:06.000 --> 00:26:08.739 +and regular expression search. + +00:26:08.740 --> 00:26:11.799 +It's not totally done, + +00:26:11.800 --> 00:26:15.279 +and will likely see some breaking changes, + +00:26:15.280 --> 00:26:16.759 +but I really like where it is. + +00:26:16.760 --> 00:26:18.679 +I'll be posting it in its current state + +00:26:18.680 --> 00:26:22.399 +on some of the big source repository sites + +00:26:22.400 --> 00:26:23.279 +relatively soon. + +00:26:23.280 --> 00:26:24.719 +I think it has a good feature, + +00:26:24.720 --> 00:26:26.519 +which is really quite exciting. + +00:26:26.520 --> 00:26:28.999 +And it'll likely probably get split off + +00:26:29.000 --> 00:26:29.799 +into its own Tapas. + +00:26:29.800 --> 00:26:32.239 +We'll see. No matter what, + +00:26:32.240 --> 00:26:34.319 +I do recommend being on the lookout for it, + +00:26:34.320 --> 00:26:35.599 +because I think it'll be + +00:26:35.600 --> 00:26:37.479 +a really excellent demonstration + +00:26:37.480 --> 00:26:39.679 +of some of the solid ideas + +00:26:39.680 --> 00:26:43.899 +behind how to get rolling with Bookclub Tapas. + +00:26:43.900 --> 00:26:46.639 +So I have my background section + +00:26:46.640 --> 00:26:49.039 +where I'm basically just sort of laying out, + +00:26:49.040 --> 00:26:53.239 +you know, what the objective is for the program. + +00:26:53.240 --> 00:26:55.119 +I have my vision where I'm doing + +00:26:55.120 --> 00:26:58.019 +some daydreaming about, you know, + +00:26:58.020 --> 00:26:59.639 +how this all ought to work. + +00:26:59.640 --> 00:27:00.919 +I date stamped this. + +00:27:00.920 --> 00:27:02.919 +As you can see, it's from a while ago, + +00:27:02.920 --> 00:27:05.599 +but I still have the full context of, you know, + +00:27:05.600 --> 00:27:08.159 +all the things that I've done working on this. + +00:27:08.160 --> 00:27:12.319 +I listed out a bunch of ideas + +00:27:12.320 --> 00:27:15.479 +for different forms for functions macros. + +00:27:15.480 --> 00:27:21.839 +I did different pieces of research. + +00:27:21.840 --> 00:27:23.199 +Yeah, I was trying to figure out + +00:27:23.200 --> 00:27:24.679 +for the width restriction macro, + +00:27:24.680 --> 00:27:26.599 +what types does it take? + +00:27:26.600 --> 00:27:28.479 +And I did a whole bunch of tests + +00:27:28.480 --> 00:27:31.279 +to try and ultimately figure it out. + +00:27:31.280 --> 00:27:35.719 +Because it claims in the documentation, + +00:27:35.720 --> 00:27:37.399 +I believe, that it will just take + +00:27:37.400 --> 00:27:39.439 +any type for labels. + +00:27:39.440 --> 00:27:43.959 +But in my testing, that's not + +00:27:43.960 --> 00:27:44.879 +ultimately what I found. + +00:27:44.880 --> 00:27:46.519 +The results of my tests + +00:27:46.520 --> 00:27:50.119 +is that symbols, numbers, they work. + +00:27:50.120 --> 00:27:51.319 +Strings do not. + +00:27:51.320 --> 00:27:52.919 +I'm not sure why that is. + +00:27:52.920 --> 00:27:54.439 +But for my purposes, + +00:27:54.440 --> 00:27:58.159 +this is what I need to know. + +00:27:58.160 --> 00:28:00.359 +I have my development focuses here. + +00:28:00.360 --> 00:28:03.879 +So I have my assorted goals + +00:28:03.880 --> 00:28:05.119 +for different directions + +00:28:05.120 --> 00:28:08.059 +I want to take the program. + +00:28:08.060 --> 00:28:13.339 +And then lastly, I have my functions, my macros. + +00:28:13.340 --> 00:28:14.439 +And this right here + +00:28:14.440 --> 00:28:18.079 +is the titular macro. + +00:28:18.080 --> 00:28:20.499 +This is ultimately the big meat + +00:28:20.500 --> 00:28:24.859 +of the program. + +00:28:24.860 --> 00:28:28.219 +And it's all contained happily organized + +00:28:28.220 --> 00:28:30.359 +inside my Bookclub file. + +00:28:30.360 --> 00:28:31.199 +I'm quite happy with it. + +00:28:31.200 --> 00:28:36.099 +I think it looks really nice. + +NOTE What else does Bookclub Tapas do? + +00:28:36.100 --> 00:28:40.759 +So what else does Bookclub tapas do? + +00:28:40.760 --> 00:28:44.519 +I don't know. It probably does a lot of stuff. + +00:28:44.520 --> 00:28:46.439 +It does all sorts of stuff + +00:28:46.440 --> 00:28:47.439 +that I don't know about yet, + +00:28:47.440 --> 00:28:48.879 +but this is where you come in. + +00:28:48.880 --> 00:28:51.439 +I'm really excited to see what people do + +00:28:51.440 --> 00:28:52.879 +when they take these ideas + +00:28:52.880 --> 00:28:54.019 +and run with them. + +00:28:54.020 --> 00:28:56.819 +And if you have something really cool you're doing with it, + +00:28:56.820 --> 00:28:59.239 +please email me and come talk to me about it. + +00:28:59.240 --> 00:29:00.599 +I'd love to hear about it. + +00:29:00.600 --> 00:29:08.159 +Again, my email is hello@ElephantErgonomics.com. + +NOTE Let's work together + +00:29:08.160 --> 00:29:10.839 +So last, before we wrap up, + +00:29:10.840 --> 00:29:12.599 +I want to go ahead and give + +00:29:12.600 --> 00:29:14.199 +a quick plug for my services. + +00:29:14.200 --> 00:29:17.019 +I am an independent software engineer + +00:29:17.020 --> 00:29:20.079 +that has an emphasis in backend design + +00:29:20.080 --> 00:29:21.599 +and general automation. + +00:29:21.600 --> 00:29:23.919 +In particular, I have an emphasis + +00:29:23.920 --> 00:29:26.839 +in that really cool new generative AI thing + +00:29:26.840 --> 00:29:28.559 +that everyone's been talking about recently. + +00:29:28.560 --> 00:29:30.679 +If you have a headache, + +00:29:30.680 --> 00:29:33.239 +you have some sort of pain point + +00:29:33.240 --> 00:29:34.799 +for your small or large business, + +00:29:34.800 --> 00:29:36.767 +you wish you could just wiggle your nose + +00:29:36.768 --> 00:29:38.999 +and have disappear, come talk to me. + +00:29:39.000 --> 00:29:41.599 +I'll make it disappear. I love doing that. + +00:29:41.600 --> 00:29:46.979 +Reach out to me at hello@ElephantErgonomics.com. + +00:29:46.980 --> 00:29:48.319 +If you think that Bookclub Tapas + +00:29:48.320 --> 00:29:51.039 +would be a great fit for your team and your project, + +00:29:51.040 --> 00:29:53.039 +I'd love to hop on and help you + +00:29:53.040 --> 00:29:55.119 +get the ball rolling quickly. + +00:29:55.120 --> 00:29:59.819 +Go ahead and email me at hello@ElephantErgonomics.com. + +00:29:59.820 --> 00:30:01.639 +Lastly, if you're a member + +00:30:01.640 --> 00:30:03.799 +of the larger Lisp community + +00:30:03.800 --> 00:30:06.859 +and you want to fund independent software development + +00:30:06.860 --> 00:30:08.319 +for things that really excite you, + +00:30:08.320 --> 00:30:09.639 +for passion projects + +00:30:09.640 --> 00:30:11.439 +that make our ecosystem richer, + +00:30:11.440 --> 00:30:17.079 +I'd love to look into accepting independent funding + +00:30:17.080 --> 00:30:20.419 +so I can commit more hours + +00:30:20.420 --> 00:30:22.679 +toward making that happen. + +00:30:22.680 --> 00:30:24.599 +Some of the projects that I want to work on + +00:30:24.600 --> 00:30:28.679 +are a Python Foreign Function Interface for Guile Scheme, + +00:30:28.680 --> 00:30:31.959 +a framework for rapidly creating simulation games + +00:30:31.960 --> 00:30:33.878 +that feels just as simple + +00:30:33.879 --> 00:30:36.239 +as writing Emacs configurations, + +00:30:36.240 --> 00:30:37.719 +I want to work on getting + +00:30:37.720 --> 00:30:41.459 +a full graphical web browser inside of Emacs, + +00:30:41.460 --> 00:30:43.359 +and I want to finish programs like Squint. + +00:30:43.360 --> 00:30:44.879 +These are just some of the projects + +00:30:44.880 --> 00:30:46.019 +I want to work on, + +00:30:46.020 --> 00:30:48.239 +but I need funding to do so. + +00:30:48.240 --> 00:30:49.559 +If you want to see these things happen, + +00:30:49.560 --> 00:30:53.799 +send me an email at hello@ElephantErgonomics.com + +00:30:53.800 --> 00:30:55.559 +with both your intention + +00:30:55.560 --> 00:30:57.359 +to pledge a monthly contribution + +00:30:57.360 --> 00:30:59.399 +as well as clarification, + +00:30:59.400 --> 00:31:02.079 +a sort of vote on which project + +00:31:02.080 --> 00:31:03.519 +you would like to see me prioritize. + +00:31:03.520 --> 00:31:06.679 +I would love to have folks reach out + +00:31:06.680 --> 00:31:07.519 +for any of these reasons. + +00:31:07.520 --> 00:31:12.199 +I would just love to talk to you. + +00:31:12.200 --> 00:31:14.619 +Thank you so much for watching! + +00:31:14.620 --> 00:31:16.519 +I really hope that the talk was interesting, + +00:31:16.520 --> 00:31:18.639 +and I'm really excited to see + +00:31:18.640 --> 00:31:19.719 +your thoughts and questions + +00:31:19.720 --> 00:31:21.959 +right now in the Q&A! + +00:31:21.960 --> 00:31:25.800 +Thank you so much for watching. Bye! diff --git a/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt new file mode 100644 index 00000000..f3af8a6f --- /dev/null +++ b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main--chapters.vtt @@ -0,0 +1,41 @@ +WEBVTT + + +00:00:03.620 --> 00:02:36.639 +Introduction + +00:02:36.640 --> 00:04:54.279 +What is Calc? + +00:04:54.280 --> 00:06:37.398 +calc-algebraic-entry + +00:06:37.399 --> 00:08:07.759 +calc-roll-down + +00:08:07.760 --> 00:08:58.179 +Advanced functions + +00:08:58.180 --> 00:09:54.719 +Solving equations with calc-solve-for + +00:09:54.720 --> 00:12:00.079 +Systems of equations + +00:12:00.080 --> 00:12:39.959 +calc-find-root + +00:12:39.960 --> 00:14:17.539 +Derivatives and integrals + +00:14:17.540 --> 00:18:12.159 +Programmable functions + +00:18:12.160 --> 00:20:08.799 +Plotting + +00:20:08.800 --> 00:22:38.599 +Wish list + +00:22:38.600 --> 00:23:35.920 +Wrapping up diff --git a/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt new file mode 100644 index 00000000..f0bf2d2a --- /dev/null +++ b/2025/captions/emacsconf-2025-calc--basic-calc-functionality-for-engineering-or-electronics--christopher-howard--main.vtt @@ -0,0 +1,888 @@ +WEBVTT captioned by sachac + +NOTE Introduction + +00:00:03.620 --> 00:00:08.799 +Hello, my name is Christopher Howard and welcome to my talk. + +00:00:08.800 --> 00:00:11.319 +This is basically an introduction + +00:00:11.320 --> 00:00:15.119 +to the built-in Emacs calculator, + +00:00:15.120 --> 00:00:18.319 +properly known as Emacs Calc, + +00:00:18.320 --> 00:00:21.439 +particularly from the perspective of someone + +00:00:21.440 --> 00:00:27.559 +with a technical background such as engineering or electronics. + +00:00:27.560 --> 00:00:32.879 +I will say, though, my personal interest is not really + +00:00:32.880 --> 00:00:37.839 +in digital computing or digital calculators, + +00:00:37.840 --> 00:00:42.519 +but lately has been focused more on analog computing. + +00:00:42.520 --> 00:00:46.799 +I have, for example, been working to master + +00:00:46.800 --> 00:00:50.839 +the venerable slide rule, a mechanical computer + +00:00:50.840 --> 00:00:57.319 +that calculates multiplication powers and logarithms. + +00:00:57.320 --> 00:01:02.199 +Here's a picture of one. + +00:01:02.200 --> 00:01:06.799 +It's a physical tool that was used for hundreds of years + +00:01:06.800 --> 00:01:08.999 +for this sort of thing + +00:01:09.000 --> 00:01:16.679 +before the handheld calculator was made popular. + +00:01:16.680 --> 00:01:18.639 +And I also had a project that I did + +00:01:18.640 --> 00:01:21.119 +for a while to several months + +00:01:21.120 --> 00:01:33.119 +to build an electronic analog computer. + +00:01:33.120 --> 00:01:38.679 +A rudimentary attempt of mine, but it's functional, + +00:01:38.680 --> 00:01:43.399 +and it's basically a 1960s or 1970s style + +00:01:43.400 --> 00:01:48.839 +electronic analog computer built very much on a budget, + +00:01:48.840 --> 00:01:52.559 +but the box in the middle is the computer proper + +00:01:52.560 --> 00:01:55.719 +which has most of the components inside of it + +00:01:55.720 --> 00:02:00.199 +as well as the potentiometers for setting values, + +00:02:00.200 --> 00:02:02.039 +and an operation switch. + +00:02:02.040 --> 00:02:04.399 +There's a patch panel on the left + +00:02:04.400 --> 00:02:07.119 +for connecting the different integrators, + +00:02:07.120 --> 00:02:11.319 +amplifiers, multipliers, and so forth together. + +00:02:11.320 --> 00:02:16.919 +Then the output of the simulation is displayed + +00:02:16.920 --> 00:02:19.799 +on the oscilloscope on the right side, + +00:02:19.800 --> 00:02:25.479 +which is a digital oscilloscope. + +00:02:25.480 --> 00:02:28.439 +To be honest, I think that a talk about analog computing + +00:02:28.440 --> 00:02:30.199 +would be much more interesting + +00:02:30.200 --> 00:02:32.039 +than the talk that I'm about to give, + +00:02:32.040 --> 00:02:36.639 +but unfortunately that would be out of scope for EmacsConf. + +NOTE What is Calc? + +00:02:36.640 --> 00:02:39.919 +So instead I will talk about Emacs Calc, + +00:02:39.920 --> 00:02:43.359 +the digital calculator built into Emacs. + +00:02:43.360 --> 00:02:47.519 +Emacs Calc, while not being a replacement for software + +00:02:47.520 --> 00:02:51.479 +like GNU Octave, does have advanced calculator functionality + +00:02:51.480 --> 00:02:55.039 +that can be useful in engineering, electronics, + +00:02:55.040 --> 00:03:00.759 +or other technical applications. So I don't want to oversell it, + +00:03:00.760 --> 00:03:06.479 +but I think functionality-wise, Calc is somewhere in between + +00:03:06.480 --> 00:03:12.239 +what you'd expect of a decent scientific calculator + +00:03:12.240 --> 00:03:23.939 +and an advanced graphics calculator. + +00:03:23.940 --> 00:03:28.839 +So this talk I'll mention is not intended to be a tutorial + +00:03:28.840 --> 00:03:33.839 +but only a brief introduction to Calc. + +00:03:33.840 --> 00:03:37.439 +Please refer to the built-in Calc info manual + +00:03:37.440 --> 00:03:46.739 +for detailed instructions on how to complete operations. + +00:03:46.740 --> 00:04:01.479 +Turn off my volume here. + +00:04:01.480 --> 00:04:05.719 +The documentation for Emacs Calc is built-in, + +00:04:05.720 --> 00:04:10.439 +although on some distributions you may have to install + +00:04:10.440 --> 00:04:24.479 +the Emacs documentation separately for licensing reasons. + +00:04:24.480 --> 00:04:28.599 +Calc presents itself as a stack-based calculator + +00:04:28.600 --> 00:04:31.599 +where entries are dropped onto a stack + +00:04:31.600 --> 00:04:36.739 +and then an operation is performed on the stack entries. + +00:04:36.740 --> 00:04:42.899 +For example, I can drop 1.23 onto the stack, + +00:04:42.900 --> 00:04:54.279 +and then 8.56, and then multiply them together. + +NOTE calc-algebraic-entry + +00:04:54.280 --> 00:05:01.559 +It may present itself as a stack-based calculator, + +00:05:01.560 --> 00:05:05.399 +but indeed, Calc is also capable of accepting input + +00:05:05.400 --> 00:05:07.739 +in the more well-known algebraic format + +00:05:07.740 --> 00:05:10.759 +by using the calc-algebraic-entry command, + +00:05:10.760 --> 00:05:14.999 +which by default is bound to the apostrophe (') key. + +00:05:15.000 --> 00:05:19.759 +So you type the apostrophe key, enter the algebraic input, + +00:05:19.760 --> 00:05:22.759 +including parentheses as needed. + +00:05:22.760 --> 00:05:28.199 +For example, here's a calculation of the resonance frequency + +00:05:28.200 --> 00:05:35.039 +of a coil which has an inductance of 250 microhenries + +00:05:35.040 --> 00:05:41.059 +and 160 picofarads, taken from one of my electronics handbooks. + +00:05:41.060 --> 00:05:50.019 +The formula for that is 1 over 2 pi + +00:05:50.020 --> 00:05:57.439 +and then the square root of our inductance + +00:05:57.440 --> 00:06:06.279 +which is in this case 250 microfarads - excuse me, microhenries + +00:06:06.280 --> 00:06:19.399 +and then the capacitance is 160 picofarads. + +00:06:19.400 --> 00:06:24.399 +Small typo here. + +00:06:24.400 --> 00:06:26.639 +Now I need to evaluate that one more time, + +00:06:26.640 --> 00:06:30.919 +because pi is a symbol. + +00:06:30.920 --> 00:06:37.398 +I get about 800 kHz resonant frequency. + +NOTE calc-roll-down + +00:06:37.399 --> 00:06:41.679 +The command calc-roll-down, + +00:06:41.680 --> 00:06:44.199 +which by default is bound to the TAB key, + +00:06:44.200 --> 00:06:47.919 +will swap the top two stack entries, + +00:06:47.920 --> 00:06:51.559 +which is sometimes useful if you need to manipulate something + +00:06:51.560 --> 00:06:56.999 +that's further down the stack. + +00:06:57.000 --> 00:07:02.039 +So I can swap this around and say multiply by two + +00:07:02.040 --> 00:07:05.479 +and then put it back where it was. + +00:07:05.480 --> 00:07:14.039 +This command is also capable of rolling the entire stack. + +00:07:14.040 --> 00:07:18.899 +Say I want to shift them all around. + +00:07:18.900 --> 00:07:21.399 +This can be done by passing extra arguments + +00:07:21.400 --> 00:07:23.559 +to the calc-roll-down function. + +00:07:23.560 --> 00:07:28.279 +That's a little bit inconvenient to do manually, + +00:07:28.280 --> 00:07:40.079 +so in my init file, I defined here a key definition + +00:07:40.080 --> 00:07:45.759 +that passes in those arguments correctly. + +00:07:45.760 --> 00:07:49.179 +I attached this to shift-tab, + +00:07:49.180 --> 00:07:52.319 +so this way, I can roll the entire stack. + +00:07:52.320 --> 00:07:56.159 +Then I could change one entry here + +00:07:56.160 --> 00:08:03.459 +and then put it back where it was. + +00:08:03.460 --> 00:08:07.759 +So Calc does algebraic input. + +NOTE Advanced functions + +00:08:07.760 --> 00:08:10.159 +It also does advanced functions + +00:08:10.160 --> 00:08:15.599 +that you would expect any handheld scientific calculator, + +00:08:15.600 --> 00:08:19.159 +including trigonometric functions. + +00:08:19.160 --> 00:08:25.319 +For example, we can get the sine of a number. + +00:08:25.320 --> 00:08:30.719 +Now I'll mention here that Calc has multiple modes. + +00:08:30.720 --> 00:08:32.319 +Right now it's in degree mode. + +00:08:32.320 --> 00:08:38.159 +You can switch over to radian mode if you want. + +00:08:38.160 --> 00:08:42.799 +I'm going to put it back in degrees. + +00:08:42.800 --> 00:08:49.799 +Drop 12 degrees on the stack, and then get the sine of that. + +00:08:49.800 --> 00:08:58.179 +And then with the inverse sine function, I can put it back. + +NOTE Solving equations with calc-solve-for + +00:08:58.180 --> 00:09:07.519 +Calc also has the nifty ability to solve equations for you + +00:09:07.520 --> 00:09:13.919 +so long as the equation is not too complicated. + +00:09:13.920 --> 00:09:19.959 +This is using the calc-solve-for function. + +00:09:19.960 --> 00:09:31.699 +For example, we could enter in an equation algebraically, + +00:09:31.700 --> 00:09:36.679 +then run calc-solve-for, and we just have to tell it + +00:09:36.680 --> 00:09:40.999 +what variable we want to solve for. And there we go. + +00:09:41.000 --> 00:09:43.199 +We can do this manually as well + +00:09:43.200 --> 00:09:54.719 +just so you can see that we get the same result. + +NOTE Systems of equations + +00:09:54.720 --> 00:09:57.959 +Calc is also able to solve systems of equations. + +00:09:57.960 --> 00:10:03.439 +We can put more than one equation on the stack, + +00:10:03.440 --> 00:10:08.959 +and then solve for several variables. + +00:10:08.960 --> 00:10:13.319 +To give a technical example for this, + +00:10:13.320 --> 00:10:30.659 +I'll show you a resistor network scribble that I did recently. + +00:10:30.660 --> 00:10:32.819 +Hopefully you can see that. Basically, + +00:10:32.820 --> 00:10:38.719 +it's fairly simple, a pretty simple resistor network + +00:10:38.720 --> 00:10:42.159 +with 1 kilo ohm and 10 kilo ohm resistors, + +00:10:42.160 --> 00:10:48.959 +and using the loop methods, we are calculating the currents, + +00:10:48.960 --> 00:10:52.759 +the current in each loop, and then that current can be used + +00:10:52.760 --> 00:10:58.839 +to solve for the voltage of each individual resistor + +00:10:58.840 --> 00:11:06.199 +if we want to. So at the bottom there we have the equations + +00:11:06.200 --> 00:11:11.519 +that we come up with as we work through each loop. + +00:11:11.520 --> 00:11:19.579 +And I'm going to paste that into Calc. + +00:11:19.580 --> 00:11:22.719 +To save some time, I'm going to copy and paste that + +00:11:22.720 --> 00:11:34.259 +from my notes instead of typing it out. + +00:11:34.260 --> 00:11:38.259 +So we have two equations there on the stack + +00:11:38.260 --> 00:11:44.719 +in one stack entry. We run that calc-solve-for function again, + +00:11:44.720 --> 00:11:49.899 +and we tell it which variables we want to solve for. + +00:11:49.900 --> 00:11:51.959 +And voila! Those are our currents, + +00:11:51.960 --> 00:11:55.719 +which we can then use to get the voltages + +00:11:55.720 --> 00:12:00.079 +for the individual resistors. + +NOTE calc-find-root + +00:12:00.080 --> 00:12:01.999 +I'll just briefly mention + +00:12:02.000 --> 00:12:05.839 +that if Calc is not able to solve an equation + +00:12:05.840 --> 00:12:07.779 +with calc-solve-for, + +00:12:07.780 --> 00:12:10.279 +then you might be helped by another calc function + +00:12:10.280 --> 00:12:11.559 +called calc-find-root. + +00:12:11.560 --> 00:12:14.439 +This function basically does a manual search + +00:12:14.440 --> 00:12:30.199 +for a numerical solution to the equation. + +00:12:30.200 --> 00:12:39.959 +And there's the documentation page on that. + +NOTE Derivatives and integrals + +00:12:39.960 --> 00:12:44.039 +Calc can also solve or find derivatives of functions, + +00:12:44.040 --> 00:12:47.579 +at least the more straightforward functions. + +00:12:47.580 --> 00:12:49.839 +For a simple example, + +00:12:49.840 --> 00:13:00.559 +we can get the derivative of that + +00:13:00.560 --> 00:13:11.979 +with the derivative function. + +00:13:11.980 --> 00:13:17.159 +On the other hand, Calc is also capable of figuring out + +00:13:17.160 --> 00:13:22.099 +indefinite integrals. + +00:13:22.100 --> 00:13:26.859 +Say we put that function back on the stack, + +00:13:26.860 --> 00:13:32.559 +and this time, we call the integral function. + +00:13:32.560 --> 00:13:35.079 +There you go. Of course, you have to add + +00:13:35.080 --> 00:13:39.819 +your own constant of integration. + +00:13:39.820 --> 00:13:43.399 +For integrals that Calc cannot figure out symbolically, + +00:13:43.400 --> 00:13:46.079 +a numerical integration method is available + +00:13:46.080 --> 00:13:59.998 +through the calc-num-integral command, which is documented... + +00:13:59.999 --> 00:14:17.539 +The function documentation is available here, more or less. + +NOTE Programmable functions + +00:14:17.540 --> 00:14:20.399 +I definitely need to mention + +00:14:20.400 --> 00:14:24.759 +that Calc is capable of doing programmable functions. + +00:14:24.760 --> 00:14:29.619 +That is to say, you can program your own functions into Calc. + +00:14:29.620 --> 00:14:32.239 +There are three separate ways to do this. + +00:14:32.240 --> 00:14:36.279 +One is through a macro method + +00:14:36.280 --> 00:14:41.539 +similar to Emacs's usual keyboard macros. + +00:14:41.540 --> 00:14:46.519 +The second method is to transform an algebraic function + +00:14:46.520 --> 00:14:50.859 +into a stored function definition. + +00:14:50.860 --> 00:14:54.059 +And the third is to use Elisp directly. + +00:14:54.060 --> 00:14:56.599 +Personally, I find that the second method + +00:14:56.600 --> 00:15:01.799 +is the most practical, the most convenient and practical + +00:15:01.800 --> 00:15:08.059 +in my opinion. So I'll give a quick example of that. + +00:15:08.060 --> 00:15:14.159 +So I could... Let's say I wanted to have a function + +00:15:14.160 --> 00:15:20.699 +for calculating capacitive reactance. + +00:15:20.700 --> 00:15:28.899 +I'll define that in algebraic mode first. + +00:15:28.900 --> 00:15:33.639 +The function for that is 1 over 2 pi + +00:15:33.640 --> 00:15:41.599 +the frequency and the capacitance. + +00:15:41.600 --> 00:15:44.959 +Drop that on the stack. You see, it does automatically + +00:15:44.960 --> 00:15:52.079 +get simplified a little bit, but it's the same function. + +00:15:52.080 --> 00:15:58.839 +And then I press letters Z and F. Do that again. + +00:15:58.840 --> 00:16:06.239 +Z and F to start transforming that into a stored function. + +00:16:06.240 --> 00:16:11.039 +It asks me to select a user key, a single key press. + +00:16:11.040 --> 00:16:15.479 +I'll use the letter c. + +00:16:15.480 --> 00:16:19.079 +Then it's going to ask for a longer command name. + +00:16:19.080 --> 00:16:24.639 +I've actually defined this once before, so it prefilled in + +00:16:24.640 --> 00:16:38.339 +that command name. + +00:16:38.340 --> 00:16:42.999 +Then I need to enter which variables in the formula + +00:16:43.000 --> 00:16:46.559 +are actual arguments, rather than just symbols + +00:16:46.560 --> 00:16:52.559 +to be evaluated later. I prefer to put this in with frequency + +00:16:52.560 --> 00:16:54.279 +and the capacitance after that, + +00:16:54.280 --> 00:16:57.799 +but actually in this particular case, + +00:16:57.800 --> 00:17:07.339 +it doesn't matter at all to the mathematics. + +00:17:07.340 --> 00:17:11.399 +So, now all I have to do, that this is defined, + +00:17:11.400 --> 00:17:15.199 +is I can drop the frequency on the stack, + +00:17:15.200 --> 00:17:24.399 +which we'll say, for this example, will be 4.5 MHz, + +00:17:24.400 --> 00:17:32.279 +and then drop on the capacitance, which in this example + +00:17:32.280 --> 00:17:40.319 +will be 22 pF. + +00:17:40.320 --> 00:17:42.439 +Then I'll call the function that I just defined. + +00:17:42.440 --> 00:17:45.239 +I don't really like having to try to remember + +00:17:45.240 --> 00:17:48.679 +the short letters that I've come up with, + +00:17:48.680 --> 00:17:57.839 +so I'll just use the longer name. + +00:17:57.840 --> 00:17:59.799 +I need to evaluate one more time + +00:17:59.800 --> 00:18:05.619 +because the symbol pi is in there and not yet evaluated. + +00:18:05.620 --> 00:18:07.539 +And so if I've done that right, + +00:18:07.540 --> 00:18:12.159 +we have a capacitive reactance of about 1600 ohms. + +NOTE Plotting + +00:18:12.160 --> 00:18:16.839 +As the last feature that I'll mention here, + +00:18:16.840 --> 00:18:24.059 +Emacs Calc does have an interface with gnuplot, + +00:18:24.060 --> 00:18:30.799 +if you want to have Calc work as your graphing calculator. + +00:18:30.800 --> 00:18:33.159 +I do need to be honest and mention + +00:18:33.160 --> 00:18:35.579 +that I don't generally use it myself + +00:18:35.580 --> 00:18:39.719 +because there's another program in GNOME + +00:18:39.720 --> 00:18:43.499 +that I've found to be generally more convenient + +00:18:43.500 --> 00:18:47.399 +for the things that I want to graph quickly. + +00:18:47.400 --> 00:18:53.399 +But I think I can give you a simple example. + +00:18:53.400 --> 00:19:00.339 +So first, we need to drop a range on the stack. + +00:19:00.340 --> 00:19:06.619 +Let's say 0 to 10. + +00:19:06.620 --> 00:19:11.639 +And then we need to drop the function on the stack. + +00:19:11.640 --> 00:19:17.839 +And then I believe it's the letters g and f that graph this. + +00:19:17.840 --> 00:19:22.319 +Let's see. Yep, there we go. + +00:19:22.320 --> 00:19:25.059 +So there's our function and it looks nice. + +00:19:25.060 --> 00:19:26.659 +That was pretty easy. + +00:19:26.660 --> 00:19:29.019 +That's the fast way to do it. + +00:19:29.020 --> 00:19:32.839 +I will, as a disclaimer, mention that + +00:19:32.840 --> 00:19:34.159 +using this quick approach, + +00:19:34.160 --> 00:19:38.759 +that sometimes more complicated graphs + +00:19:38.760 --> 00:19:39.999 +will not turn out nicely, + +00:19:40.000 --> 00:19:44.339 +because by default, the resolution will be pretty low. + +00:19:44.340 --> 00:19:48.119 +That is to say it's... gnuplot is going to be + +00:19:48.120 --> 00:19:49.899 +skipping a lot of points + +00:19:49.900 --> 00:19:52.039 +and so you'll have to learn a bit more + +00:19:52.040 --> 00:19:55.319 +about how to use the interface, + +00:19:55.320 --> 00:19:59.519 +what parameters to pass if you want all your graphs + +00:19:59.520 --> 00:20:03.699 +to come out looking nice. + +00:20:03.700 --> 00:20:08.799 +So that covers all the features that I wanted to cover. + +NOTE Wish list + +00:20:08.800 --> 00:20:13.279 +I wanted to briefly mention a wish list of items + +00:20:13.280 --> 00:20:16.679 +that I'd like to see in Calc. + +00:20:16.680 --> 00:20:23.639 +One of them would be improper integrals. + +00:20:23.640 --> 00:20:25.159 +So that's like our definite integrals + +00:20:25.160 --> 00:20:32.859 +except for where a limit of integration is infinity. + +00:20:32.860 --> 00:20:38.559 +That's something that can be useful in a few applications. + +00:20:38.560 --> 00:20:41.079 +Something else that would be neat to have would be + +00:20:41.080 --> 00:20:45.679 +annotations for row entries. So for example + +00:20:45.680 --> 00:20:48.819 +if I was putting together a sum of numbers + +00:20:48.820 --> 00:20:53.279 +for, say, my monthly budget, + +00:20:53.280 --> 00:20:57.479 +let's say I was paying $2,000 for my rent + +00:20:57.480 --> 00:21:03.831 +and let's say $800 a month for my groceries, + +00:21:03.832 --> 00:21:07.931 +(a lot of kids to feed there) + +00:21:07.932 --> 00:21:14.565 +and then say another $60 for dining out, and so on, + +00:21:14.566 --> 00:21:18.259 +it would be nice if there was some way + +00:21:18.260 --> 00:21:21.319 +to put a little annotation next to each number + +00:21:21.320 --> 00:21:23.399 +so that you could remember + +00:21:23.400 --> 00:21:27.039 +what the meaning of that number was more easily. + +00:21:27.040 --> 00:21:31.199 +I actually looked into programming this into Calc myself, + +00:21:31.200 --> 00:21:35.919 +but discovered that it would require reprogramming + +00:21:35.920 --> 00:21:41.839 +quite a bit of Calc to make that work well + +00:21:41.840 --> 00:21:43.479 +across all calc functionality, + +00:21:43.480 --> 00:21:46.939 +and so, eventually, I gave up. + +00:21:46.940 --> 00:21:51.139 +But I'd still really like to have that feature. + +00:21:51.140 --> 00:21:52.039 +The final thing, though + +00:21:52.040 --> 00:21:54.579 +I think this would not necessarily belong in Calc, + +00:21:54.580 --> 00:21:57.919 +I think it would be cool if Emacs had some way + +00:21:57.920 --> 00:22:00.599 +to run numerical solutions + +00:22:00.600 --> 00:22:02.599 +for systems of differential equations, + +00:22:02.600 --> 00:22:06.019 +also known as a differential analyzer. + +00:22:06.020 --> 00:22:09.279 +So this would allow you to be able to set up simulation models + +00:22:09.280 --> 00:22:11.679 +involving systems of differential equations, + +00:22:11.680 --> 00:22:14.879 +for example, a spring mass system, or pressure temperature, + +00:22:14.880 --> 00:22:18.039 +or what have you, and then run the simulation + +00:22:18.040 --> 00:22:22.119 +using numerical approximation. + +00:22:22.120 --> 00:22:24.079 +Maybe it would be silly + +00:22:24.080 --> 00:22:25.999 +to actually put that in Calc itself, + +00:22:26.000 --> 00:22:30.339 +but a nice interface maybe to some other software, + +00:22:30.340 --> 00:22:33.299 +simple software that did that, + +00:22:33.300 --> 00:22:35.779 +an easy to use interface for that + +00:22:35.780 --> 00:22:38.599 +would be really great. + +NOTE Wrapping up + +00:22:38.600 --> 00:22:41.800 +So that's my entire talk. + +00:22:41.801 --> 00:22:44.534 +I'll just mention some information. + +00:22:44.535 --> 00:22:48.365 +If you want to learn more about me + +00:22:48.366 --> 00:22:50.119 +or things that I'm interested in, + +00:22:50.120 --> 00:22:57.779 +I do not any longer have a web presence. + +00:22:57.780 --> 00:22:59.659 +I don't have a website anymore, + +00:22:59.660 --> 00:23:03.359 +but I do have a Gemini capsule + +00:23:03.360 --> 00:23:07.139 +that I post to all the time. + +00:23:07.140 --> 00:23:13.879 +And if you can install, if you're willing to install the... + +00:23:13.880 --> 00:23:19.079 +Gemini browser known as Elpher + +00:23:19.080 --> 00:23:23.698 +into Emacs, which is available from ELPA, + +00:23:23.699 --> 00:23:27.359 +then you can browse directly to it + +00:23:27.360 --> 00:23:31.439 +and look around my Gemini capsule. + +00:23:31.440 --> 00:23:35.920 +Thank you very much. diff --git a/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--answers.vtt b/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--answers.vtt new file mode 100644 index 00000000..eaf3a04e --- /dev/null +++ b/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--answers.vtt @@ -0,0 +1,1051 @@ +WEBVTT + +00:00:00.000 --> 00:00:04.599 +Recording started. + +00:00:04.600 --> 00:00:07.199 +Great. All right, you are live in Common Lisp on dev. + +00:00:07.200 --> 00:00:14.399 +This is Corwin back and I've got screwlisp with me, + +00:00:14.400 --> 00:00:18.759 +the host of the Lispy Gopher... Climate, I like to say. + +00:00:18.760 --> 00:00:20.319 +It used to be show. + +00:00:20.320 --> 00:00:24.679 +The Lispy Gopher show or the Lispy Gopher Climate. + +00:00:24.680 --> 00:00:31.119 +Thank you so much for joining us. Minutes. + +00:00:31.120 --> 00:00:33.639 +Yeah, we're just, we've got already + +00:00:33.640 --> 00:00:35.359 +a whole pad full of questions + +00:00:35.360 --> 00:00:38.039 +and we have a unique opportunity if you, + +00:00:38.040 --> 00:00:39.159 +if you check out the etherpad, + +00:00:39.160 --> 00:00:42.239 +you'll see some instructions there to join on Lambda Moo, + +00:00:42.240 --> 00:00:43.039 +which screwless, + +00:00:43.040 --> 00:00:46.319 +but I'm hoping you will talk to us a little bit about that + +00:00:46.320 --> 00:00:48.879 +as well as your, your very cool project. + +00:00:48.880 --> 00:00:52.839 +Oh yeah, so I main on Lambda, as Corwin is saying. + +00:00:52.840 --> 00:00:55.639 +And Corwin was pretending not to know the name of the show, + +00:00:55.640 --> 00:00:59.399 +but he has in fact appeared on an episode of it + +00:00:59.400 --> 00:01:00.879 +in January this year, I think. + +00:01:00.880 --> 00:01:04.919 +So he was just pretending there. I'm screwless of this. + +00:01:04.920 --> 00:01:06.919 +What's happening? + +00:01:06.920 --> 00:01:13.439 +10 minutes or less before we started going live here, + +00:01:13.440 --> 00:01:16.159 +they were like, remember how you said you fixed that bug? + +00:01:16.160 --> 00:01:21.479 +And then I had to quickly recapitulate my whole talk. + +00:01:21.480 --> 00:01:23.719 +And I introduced some new bugs while that was happening. + +00:01:23.720 --> 00:01:26.199 +But let's go through some of these questions. + +00:01:26.200 --> 00:01:29.479 +We're all hanging out in LambdaMoo. + +00:01:29.480 --> 00:01:37.639 +So if you mx telnet over to lambda.moo.mud.org port 8888. + +00:01:37.640 --> 00:01:40.279 +This is where we're talking at the moment + +00:01:40.280 --> 00:01:45.399 +with people like Ed Swarthout, DM, and yduJ, + +00:01:45.400 --> 00:01:47.559 +who I gossiped about in the show, + +00:01:47.560 --> 00:01:50.519 +and Sasha, and people were there a little bit as well. + +00:01:50.520 --> 00:01:53.359 +I'm just going to read some of the questions + +00:01:53.360 --> 00:01:59.759 +that GGXX in Lambdomoo has been relaying to me there, + +00:01:59.760 --> 00:02:08.239 +though I hear that there are a whole bunch of them now. + +00:02:08.240 --> 00:02:09.759 +Someone asks on the Etherpad, + +00:02:09.760 --> 00:02:13.199 +what do you mean when I say the agent is running slowly? + +00:02:13.200 --> 00:02:17.119 +Yeah, so if you saw in the talk, + +00:02:17.120 --> 00:02:19.639 +I was having the agent only attempt + +00:02:19.640 --> 00:02:21.959 +to act every 20 seconds. + +00:02:21.960 --> 00:02:25.399 +This is what I mean by the agent is acting slowly. + +00:02:25.400 --> 00:02:26.599 +So this is quite different + +00:02:26.600 --> 00:02:28.599 +to what people might expect within AI + +00:02:28.600 --> 00:02:30.679 +if people are talking about like the graphics card ones + +00:02:30.680 --> 00:02:33.599 +where you're trying crunch as fast as you can + +00:02:33.600 --> 00:02:36.399 +for as few seconds as you can, and then you stop. + +00:02:36.400 --> 00:02:39.399 +In contrast, my agent is just trying to do + +00:02:39.400 --> 00:02:42.279 +a simple action every 20 seconds. + +00:02:42.280 --> 00:02:45.119 +But if you keep going continuously + +00:02:45.120 --> 00:02:47.919 +at a simple action every 20 seconds + +00:02:47.920 --> 00:02:49.959 +without sleeping for days, + +00:02:49.960 --> 00:02:51.239 +it still adds up to a lot. + +00:02:51.240 --> 00:02:57.039 +So that was the significance of it running slowly. + +00:02:57.040 --> 00:03:00.639 +What else are people saying? TGXX to screwtape. + +00:03:00.640 --> 00:03:02.519 +Someone asked on the Etherpad, + +00:03:02.520 --> 00:03:04.759 +do you think that it would be too hard + +00:03:04.760 --> 00:03:06.439 +to add a second way + +00:03:06.440 --> 00:03:09.959 +to send commands from Common Lisps to Emacs? + +00:03:09.960 --> 00:03:12.919 +No, I put three of them together + +00:03:12.920 --> 00:03:14.559 +and I didn't talk about it + +00:03:14.560 --> 00:03:17.239 +because this is a kind of affected choice. + +00:03:17.240 --> 00:03:20.039 +Right now you're using Emacs client for that. + +00:03:20.040 --> 00:03:22.039 +That is the simplest way to implement. + +00:03:22.040 --> 00:03:24.039 +How about using the slime protocol? + +00:03:24.040 --> 00:03:28.799 +Elsewhere, I am just using the SLIME protocol. + +00:03:28.800 --> 00:03:31.639 +So, in everyone that's SLIME-connected. + +00:03:31.640 --> 00:03:33.399 +So, earlier on, you saw somebody + +00:03:33.400 --> 00:03:35.399 +running a SWANK server in Python. + +00:03:35.400 --> 00:03:38.439 +Normally, you run a SWANK server in Common Lisp. + +00:03:38.440 --> 00:03:41.599 +And a SWANK server is what Emacs SLIME, + +00:03:41.600 --> 00:03:45.039 +Superior Lisp Interaction Mode for Emacs, connects to. + +00:03:45.040 --> 00:03:49.039 +And then Swank comes with Swank Eval and Emacs. + +00:03:49.040 --> 00:03:50.959 +So after you've been slime connected, + +00:03:50.960 --> 00:03:55.039 +you can trivially send Emacs Lisp forms to Emacs + +00:03:55.040 --> 00:03:57.319 +using Swank Eval and Emacs. + +00:03:57.320 --> 00:04:00.679 +The reason that I chose to use + +00:04:00.680 --> 00:04:05.199 +Emacs server and Emacs client + +00:04:05.200 --> 00:04:14.039 +was that I was letting the Leonardo agent + +00:04:14.040 --> 00:04:18.799 +talk to Emacs using Swank, Eval, and Emacs. + +00:04:18.800 --> 00:04:21.599 +And I wanted my ECL image to be using + +00:04:21.600 --> 00:04:23.119 +a different notion of a server. + +00:04:23.120 --> 00:04:27.039 +So the ECL image, just because + +00:04:27.040 --> 00:04:28.959 +I chose to do it like this, + +00:04:28.960 --> 00:04:33.279 +is using Emacs client and Emacs server going via, + +00:04:33.280 --> 00:04:35.239 +I guess it's executing a program + +00:04:35.240 --> 00:04:36.439 +rather than using a shell. + +00:04:36.440 --> 00:04:40.639 +And Yeah, I was letting somebody else + +00:04:40.640 --> 00:04:42.439 +use Slime eval in Emacs. + +00:04:42.440 --> 00:04:45.039 +It would have been simpler + +00:04:45.040 --> 00:04:48.319 +if everybody just used Slime eval in Emacs. + +00:04:48.320 --> 00:04:50.919 +I thought I was getting something + +00:04:50.920 --> 00:04:56.079 +out of adding Emacs server into the mix. + +00:04:56.080 --> 00:04:57.319 +What's somebody saying? + +00:04:57.320 --> 00:05:00.319 +Idaj is weirded out by doing get foo bar + +00:05:00.320 --> 00:05:02.439 +instead of get foo quote bar. + +00:05:02.440 --> 00:05:04.359 +Yeah, that was Sandewall's choice. + +00:05:04.360 --> 00:05:06.679 +He was trying to pitch Lisp + +00:05:06.680 --> 00:05:09.159 +to logic notation people, + +00:05:09.160 --> 00:05:12.319 +so he lets people put commas in + +00:05:12.320 --> 00:05:15.559 +and then ignores them in certain expressions, + +00:05:15.560 --> 00:05:18.679 +and he doesn't have these Lisp-style quotes. + +00:05:18.680 --> 00:05:22.439 +Idaj is obviously from like Schlumberger + +00:05:22.440 --> 00:05:24.879 +and wherever else she was at in + +00:05:24.880 --> 00:05:28.039 +in the kind of list of traditions. + +00:05:28.040 --> 00:05:30.359 +Full of Spain is saying good observation. + +00:05:30.360 --> 00:05:33.839 +Yidaj is shocked that she's being mentioned. + +00:05:33.840 --> 00:05:40.519 +Interestingly Nosredna yduJ capitalizes Nosredna at the front, + +00:05:40.520 --> 00:05:45.079 +but she capitalizes yduJ at the back, just for clarity. + +00:05:45.080 --> 00:05:49.199 +You should read her Stanford page or her recipe site + +00:05:49.200 --> 00:05:57.999 +or anything if you're not clear on who yduJ is. + +00:05:58.000 --> 00:06:00.679 +It's actually you're looking for the word eclipsed. + +00:06:00.680 --> 00:06:03.559 +I think she eclipsed a dodge, + +00:06:03.560 --> 00:06:06.119 +I think is the English phrase that you're looking for. + +00:06:06.120 --> 00:06:08.839 +He does just saying she would not. + +00:06:08.840 --> 00:06:10.519 +She's no matter what I say + +00:06:10.520 --> 00:06:13.039 +she's not going to hug my software agent + +00:06:13.040 --> 00:06:20.719 +like she would hug a grandchild eyes me warily. + +00:06:20.720 --> 00:06:22.119 +And Sasha is not going to. + +00:06:22.120 --> 00:06:24.759 +Totally not training a general intelligence + +00:06:24.760 --> 00:06:26.199 +who requires a lot of data + +00:06:26.200 --> 00:06:28.959 +and also cuddles. Okay, so everybody who has children + +00:06:28.960 --> 00:06:31.599 +is disagreeing with me quoting Sandewall, + +00:06:31.600 --> 00:06:33.319 +who did have children and grandchildren, + +00:06:33.320 --> 00:06:36.119 +saying that he wanted machine intelligences + +00:06:36.120 --> 00:06:37.759 +to be like his grandchild. + +00:06:37.760 --> 00:06:40.839 +GGXX is saying somebody on Etherpad + +00:06:40.840 --> 00:06:43.119 +is asking what the Leonardo system is. + +00:06:43.120 --> 00:06:46.599 +Sandewall is a LISP scientist + +00:06:46.600 --> 00:06:51.159 +from the 60s, 70s, 80s, 90s, 90s, 10s. + +00:06:51.160 --> 00:06:55.599 +with things like bronze statues of him in Sweden. + +00:06:55.600 --> 00:06:59.599 +People outside of the Swedish-speaking sphere of science + +00:06:59.600 --> 00:07:01.119 +are less familiar with him. + +00:07:01.120 --> 00:07:04.119 +I guess he famously taught Robert Strand + +00:07:04.120 --> 00:07:08.319 +how to program in LISP, if that places him for you. + +00:07:08.320 --> 00:07:10.199 +What else did he do? + +00:07:10.200 --> 00:07:15.599 +Yeah, so he was on a kind of long trajectory of AI, + +00:07:15.600 --> 00:07:18.039 +which would now be called good old-fashioned AI. + +00:07:18.040 --> 00:07:22.639 +And he was coming from the situation calculus, + +00:07:22.640 --> 00:07:26.559 +then activity calculus kind of direction, + +00:07:26.560 --> 00:07:28.759 +which are extended first order logics + +00:07:28.760 --> 00:07:31.559 +for reasoning about change over time. + +00:07:31.560 --> 00:07:35.759 +And his last program he contributed to the world was this. + +00:07:35.760 --> 00:07:39.319 +From 2005 to 2014, he worked on + +00:07:39.320 --> 00:07:43.479 +this Leonardo system for his master's program. + +00:07:43.480 --> 00:07:45.279 +He was teaching at that time + +00:07:45.280 --> 00:07:48.519 +at the University of Linköping in Sweden. + +00:07:48.520 --> 00:07:53.199 +And... Then he just kind of gradually faded from view + +00:07:53.200 --> 00:07:55.519 +while he wrote his unpublished books + +00:07:55.520 --> 00:08:01.639 +on reasoning and change, I guess, between 2010 and 2014. + +00:08:01.640 --> 00:08:03.959 +And then I just kind of noticed this eventually. + +00:08:03.960 --> 00:08:07.839 +And I brought that software back. And that's what this is. + +00:08:07.840 --> 00:08:09.999 +And that's why it kind of weirdly exists. + +00:08:10.000 --> 00:08:15.479 +Welcome to Khaki Guest. Magenta Guest is gone. + +00:08:15.480 --> 00:08:16.759 +Pink Guest is gone. + +00:08:16.760 --> 00:08:23.639 +Blue Guest has arrived. Great. Somebody order six. + +00:08:23.640 --> 00:08:26.239 +Everybody orders sake from Emily. + +00:08:26.240 --> 00:08:29.599 +We're hanging out in Jay Lamott's sushi bar in Lambda, + +00:08:29.600 --> 00:08:31.639 +which is on the model railway + +00:08:31.640 --> 00:08:35.599 +on the table in the second guest bedroom in Lambda House + +00:08:35.600 --> 00:08:36.639 +where we're all hanging out. + +00:08:36.640 --> 00:08:43.559 +Oh, I think GGXX is ordering people up things. + +00:08:43.560 --> 00:08:46.399 +You know, just teach people about this. + +00:08:46.400 --> 00:08:52.279 +All right, I'm going to try looking + +00:08:52.280 --> 00:08:55.519 +at the etherpad manually. Sorry, I can read you. + +00:08:55.520 --> 00:08:57.319 +So the next question you have, + +00:08:57.320 --> 00:09:00.479 +somebody says, I found Eduardo's blog. + +00:09:00.480 --> 00:09:03.199 +OK, you just got through that. + +00:09:03.200 --> 00:09:06.199 +And then we were also, a question you answered + +00:09:06.200 --> 00:09:10.799 +is the other one that I see here, just about Lambda Moo. + +00:09:10.800 --> 00:09:14.199 +And I think you started to answer in the pad. + +00:09:14.200 --> 00:09:16.079 +But if you want to kind of read that out. + +00:09:16.080 --> 00:09:19.119 +I definitely haven't written anything in the pad. + +00:09:19.120 --> 00:09:23.719 +I'm going to just talk to Khaki Guest in Lambda. + +00:09:23.720 --> 00:09:25.879 +Sure, so why don't you do a little bit + +00:09:25.880 --> 00:09:27.279 +and just read this question. + +00:09:27.280 --> 00:09:31.279 +The question was, what is LambdaMOO and how do we use it? + +00:09:31.280 --> 00:09:33.399 +LambdaMOO is a module introduction, + +00:09:33.400 --> 00:09:35.319 +and you can tell that to it. + +00:09:35.320 --> 00:09:36.799 +There's instructions in the pad. + +00:09:36.800 --> 00:09:40.039 +I'll go ahead and drop that in the gen channel + +00:09:40.040 --> 00:09:42.599 +or in the dev channel chat right now. + +00:09:42.600 --> 00:09:46.919 +And I see it is already in there. + +00:09:46.920 --> 00:09:49.559 +But down at the bottom + +00:09:49.560 --> 00:09:53.439 +of the discussion links feedback area, + +00:09:53.440 --> 00:09:55.679 +you'll see a set of detailed instructions + +00:09:55.680 --> 00:09:58.519 +that ScrewList has provided us to get in there. + +00:09:58.520 --> 00:10:01.159 +I think that was actually GGXX + +00:10:01.160 --> 00:10:03.959 +who might have written that for us. + +00:10:03.960 --> 00:10:08.039 +Several changes evolved in the last 10 minutes + +00:10:08.040 --> 00:10:09.679 +before we went live here. + +00:10:09.680 --> 00:10:12.839 +But yeah, so LambdaMoo is + +00:10:12.840 --> 00:10:14.879 +the world's longest-running virtual reality. + +00:10:14.880 --> 00:10:19.119 +I guess it started in the end of October in 1990 + +00:10:19.120 --> 00:10:21.759 +and has run continuously to today. + +00:10:21.760 --> 00:10:24.599 +You can get there, ideally, with a MUD client. + +00:10:24.600 --> 00:10:27.479 +Technically, it's a MUD, comma, object-oriented. + +00:10:27.480 --> 00:10:30.199 +This is just where I hang out some degree of the week. + +00:10:30.200 --> 00:10:36.799 +yduJ is the wizard yduJ, or sorry, + +00:10:36.800 --> 00:10:40.919 +yduJ is also the wizard Nosredna of Lambdomoo, for example. + +00:10:40.920 --> 00:10:44.479 +It kind of fits into quite less history. + +00:10:44.480 --> 00:10:47.679 +I guess Pavel Curtis would have started in 1990 + +00:10:47.680 --> 00:10:52.799 +for Xerox PARC, originally. Just to go to what Khaki Guest + +00:10:52.800 --> 00:10:54.839 +has been continuing to talk about. + +00:10:54.840 --> 00:10:57.799 +Welcome to Brown, Guest, as well, I guess. + +00:10:57.800 --> 00:11:03.399 +Aki Guest says, to Screwtape, + +00:11:03.400 --> 00:11:04.959 +it seems like you're trying to build + +00:11:04.960 --> 00:11:07.279 +a more restrictive Turing test + +00:11:07.280 --> 00:11:11.159 +using the input output logs of an Emacs conversation. + +00:11:11.160 --> 00:11:12.159 +Is that accurate? + +00:11:12.160 --> 00:11:15.079 +Can you explain this idea of if it is intelligent, + +00:11:15.080 --> 00:11:17.239 +I'd like it to be like me? + +00:11:17.240 --> 00:11:20.039 +Otherwise, I don't know what intelligence is. + +00:11:20.040 --> 00:11:21.959 +Doesn't that seem a little egocentric? + +00:11:21.960 --> 00:11:25.399 +Is that a joke or a genuine definition of intelligence? + +00:11:25.400 --> 00:11:27.439 +Why do you think the link between + +00:11:27.440 --> 00:11:30.519 +input-output of Emacs human input-output + +00:11:30.520 --> 00:11:33.919 +is stronger than other forms of Turing tests? + +00:11:33.920 --> 00:11:36.319 +So I'm going to misread Turing tests + +00:11:36.320 --> 00:11:37.839 +for a moment as Turing-complete. + +00:11:37.840 --> 00:11:40.279 +And Sandewall's system is very specifically + +00:11:40.280 --> 00:11:45.519 +Our first-order logic, if we don't extend it, + +00:11:45.520 --> 00:11:49.239 +is not Turing-complete, for starters. + +00:11:49.240 --> 00:11:51.959 +And things like situation calculus, + +00:11:51.960 --> 00:11:53.839 +McCarthy's situation calculus, + +00:11:53.840 --> 00:11:55.239 +which I guess is prior to + +00:11:55.240 --> 00:11:58.439 +Sandewall's Leonardo's calculus, + +00:11:58.440 --> 00:12:02.319 +are extended first-order logics + +00:12:02.320 --> 00:12:03.959 +for reasoning about change. + +00:12:03.960 --> 00:12:05.519 +And so they're slightly + +00:12:05.520 --> 00:12:07.639 +more restricted than conventional, + +00:12:07.640 --> 00:12:10.239 +than general-purpose computer programs. + +00:12:10.240 --> 00:12:14.639 +And then what you're saying is, if it's intelligent, + +00:12:14.640 --> 00:12:16.119 +I'd expect it to be like me. + +00:12:16.120 --> 00:12:19.799 +I'm really just paraphrasing what Sandewall says about, + +00:12:19.800 --> 00:12:23.319 +well, he thinks his grandchildren are intelligent. + +00:12:23.320 --> 00:12:24.759 +So if a computer is intelligent, + +00:12:24.760 --> 00:12:26.239 +he thinks the computer will have to be + +00:12:26.240 --> 00:12:28.039 +similar to his grandchildren. + +00:12:28.040 --> 00:12:32.279 +This is in contrast to people + +00:12:32.280 --> 00:12:33.839 +who are using the terms AI + +00:12:33.840 --> 00:12:37.319 +to mean something a graphics card does + +00:12:37.320 --> 00:12:41.319 +with extremely specialized bulk matrix multiplication + +00:12:41.320 --> 00:12:43.919 +for a very short period of time + +00:12:43.920 --> 00:12:47.519 +on absolutely gigantic electrical + +00:12:47.520 --> 00:12:50.159 +and kind of memory and computing resources, + +00:12:50.160 --> 00:12:51.519 +which doesn't look at all like what + +00:12:51.520 --> 00:12:54.999 +Sandewall's grandchildren were doing. + +00:12:55.000 --> 00:12:56.399 +And this is why I'm kind of saying, + +00:12:56.400 --> 00:12:57.559 +well, if I have an agent, + +00:12:57.560 --> 00:13:00.839 +And my agent is quite simple. + +00:13:00.840 --> 00:13:04.519 +It uses Emacs server and Emacs client + +00:13:04.520 --> 00:13:07.559 +to send lines of basically extended + +00:13:07.560 --> 00:13:09.199 +first-order logic to the agent, + +00:13:09.200 --> 00:13:12.959 +and the agent then takes a kind of + +00:13:12.960 --> 00:13:15.399 +first-order logic-y action. + +00:13:15.400 --> 00:13:21.079 +And I was making the point + +00:13:21.080 --> 00:13:23.479 +that this looks more like me computing + +00:13:23.480 --> 00:13:27.519 +using of REPL-driven development like EEV, + +00:13:27.520 --> 00:13:30.479 +where in EEV I have basically a log + +00:13:30.480 --> 00:13:32.119 +of something I've previously done, + +00:13:32.120 --> 00:13:34.239 +and I can tap F8 and execute + +00:13:34.240 --> 00:13:36.479 +line after line after line. + +00:13:36.480 --> 00:13:38.839 +And I think if I see an agent doing that, + +00:13:38.840 --> 00:13:40.399 +I can clearly understand + +00:13:40.400 --> 00:13:43.639 +and relate to what the agent is doing. + +00:13:43.640 --> 00:13:45.519 +And so I'm not classifying + +00:13:45.520 --> 00:13:49.399 +Like, I never do gigabytes and gigabytes + +00:13:49.400 --> 00:13:52.279 +and gigabytes of matrix multiplications, + +00:13:52.280 --> 00:13:54.959 +so I can't relate to this as an idea of intelligence. + +00:13:54.960 --> 00:13:57.919 +Sorry. Welcome to GreenGuest teleporting in. + +00:13:57.920 --> 00:14:02.759 +FullSpain is saying, no one truly knows what intelligence is. + +00:14:02.760 --> 00:14:10.759 +All right. I kind of wished that this was working, + +00:14:10.760 --> 00:14:13.199 +because just before we went live, they said, + +00:14:13.200 --> 00:14:15.919 +hey, just have your example working quickly. + +00:14:15.920 --> 00:14:18.999 +Then I downloaded my example from my blog, + +00:14:19.000 --> 00:14:22.479 +and I'd double escaped some characters + +00:14:22.480 --> 00:14:26.799 +so that the escaped characters would show up in my blog. + +00:14:26.800 --> 00:14:29.759 +And I caused a lot of rampant chaos. + +00:14:29.760 --> 00:14:32.319 +If anyone else has a question. + +00:14:32.320 --> 00:14:40.759 +Guest has said, but. So. Great. + +00:14:40.760 --> 00:14:47.279 +I guess I could go back and try it. + +00:14:47.280 --> 00:14:50.399 +I probably should have jumped in a couple of minutes ago + +00:14:50.400 --> 00:14:53.279 +and just said the live stream did cut over, + +00:14:53.280 --> 00:14:54.919 +but we're continuing to record this + +00:14:54.920 --> 00:14:57.119 +and the whole session will be published + +00:14:57.120 --> 00:14:58.399 +along with the video on the website. + +00:14:58.400 --> 00:15:04.079 +Oh, well. Sorry about that. I tried that. + +00:15:04.080 --> 00:15:06.799 +I just lost a couple of minutes there + +00:15:06.800 --> 00:15:08.879 +and failed to give you the smooth morning. + +00:15:08.880 --> 00:15:14.199 +Oh, no, no. That's fine. I was just kind of rambling. + +00:15:14.200 --> 00:15:16.959 +Listen. Don't download a web page + +00:15:16.960 --> 00:15:19.799 +and try and convert it to an org file on the fly + +00:15:19.800 --> 00:15:21.959 +and just before you go live somewhere + +00:15:21.960 --> 00:15:23.319 +is the kind of moral here. + +00:15:23.320 --> 00:15:27.799 +You know, just saying that's pretty graphics, but it's long. + +00:15:27.800 --> 00:15:29.399 +She's dropping. See you later. Yeah. + +00:15:29.400 --> 00:15:31.239 +Let's, let's, let's all get out of here. + +00:15:31.240 --> 00:15:32.399 +Basically. I'm going to go see + +00:15:32.400 --> 00:15:36.159 +if I can look at this ether pad one last time + +00:15:36.160 --> 00:15:37.639 +and see if there are any questions + +00:15:37.640 --> 00:15:39.359 +just to not leave anyone else. + +00:15:39.360 --> 00:15:43.559 +Anyone out much to their chagrin possibly. + +00:15:43.560 --> 00:15:47.639 +Um, how to connect to LambdaMu, seems great. + +00:15:47.640 --> 00:15:52.159 +Oh, interesting guides, somebody wrote that. + +00:15:52.160 --> 00:15:55.439 +What do you mean by slowly? Yeah, so I'm saying taking + +00:15:55.440 --> 00:15:57.279 +a simple action every 20 seconds, + +00:15:57.280 --> 00:15:59.079 +this still adds up to a lot over time. + +00:15:59.080 --> 00:16:01.599 +Question, do you think that it would be, + +00:16:01.600 --> 00:16:04.079 +yeah, well, if you've used Slime, + +00:16:04.080 --> 00:16:05.959 +and hence you're using Swank, + +00:16:05.960 --> 00:16:07.239 +you can just Swank, Eval, + +00:16:07.240 --> 00:16:08.839 +and Emacs would be the more trivial way. + +00:16:08.840 --> 00:16:10.719 +I felt like I was getting something bonus + +00:16:10.720 --> 00:16:13.959 +by using, um, Emacs server. + +00:16:13.960 --> 00:16:17.359 +Somebody has a link to Eduardo's blog, + +00:16:17.360 --> 00:16:19.839 +which I think has been misspelled. + +00:16:19.840 --> 00:16:23.079 +It should be angkwu with no dot there, + +00:16:23.080 --> 00:16:27.199 +dot net, sharp sign EEV. + +00:16:27.200 --> 00:16:31.519 +So, Eduardo is the author of EEV mode. + +00:16:31.520 --> 00:16:33.079 +I found Eduardo's thing. + +00:16:33.080 --> 00:16:36.199 +Oh, this was the question, what is the Leonardo system, + +00:16:36.200 --> 00:16:38.479 +which I just answered. + +00:16:38.480 --> 00:16:42.959 +What is LambdaMOO? How do you use it? + +00:16:42.960 --> 00:16:45.559 +It's a mud, comma, object-oriented. + +00:16:45.560 --> 00:16:49.319 +So it's a multi-user dungeon kind of classical video game, + +00:16:49.320 --> 00:16:52.799 +still popular, but with extended object-oriented facilities. + +00:16:52.800 --> 00:16:57.359 +Companies like Harlequin, which yduJ + +00:16:57.360 --> 00:17:00.319 +and Ken Pitman, for example, were at, I think, in the 90s. + +00:17:00.320 --> 00:17:05.319 +Instead of modernly, you'd have Slack web apps or something. + +00:17:05.320 --> 00:17:08.079 +People used to have these MOOs and things. + +00:17:08.080 --> 00:17:15.519 +Okay, the music that's replaced me is evidently quite nice. + +00:17:15.520 --> 00:17:22.119 +Yes, get the hints. Thanks for being here. + +00:17:22.120 --> 00:17:29.359 +Well, let's continue this diatribe + +00:17:29.360 --> 00:17:33.639 +possibly on the Mastodon or something like that. + +00:17:33.640 --> 00:17:35.999 +We'll do some kind of... + +00:17:36.000 --> 00:17:40.519 +Let me thank you one more time for preparing this talk + +00:17:40.520 --> 00:17:44.359 +and for all that you do for the Free Software community + +00:17:44.360 --> 00:17:47.879 +and especially for Emacs. particularly appreciate you. + +00:17:47.880 --> 00:17:50.439 +Thank you for all you do for the Free Software community + +00:17:50.440 --> 00:17:53.319 +and particularly Emacs, Corwin and Bruce. + +00:17:53.320 --> 00:17:56.079 +I'm still waiting for a working demo of Dungeon Mode. + +00:17:56.080 --> 00:17:58.559 +My joke that I was setting up and never had a chance for + +00:17:58.560 --> 00:17:59.959 +was that I was going to say + +00:17:59.960 --> 00:18:03.599 +I wanted my agent to be using Dungeon Mode in Emacs. + +00:18:03.600 --> 00:18:05.999 +How's that? Okay, well, we'll work on that. + +00:18:06.000 --> 00:18:10.119 +That could be a project for the two of us in our copious free time. + +00:18:10.120 --> 00:18:13.559 +Definitely. Yeah. Okay. I'll let you go. + +00:18:13.560 --> 00:18:14.679 +I'm gonna abandon this stream. + +00:18:14.680 --> 00:18:17.039 +All right. I'll end out the recording + +00:18:17.040 --> 00:18:24.560 +and thanks to all who participated. Okay. See you later. diff --git a/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt b/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt new file mode 100644 index 00000000..59f437f1 --- /dev/null +++ b/2025/captions/emacsconf-2025-commonlisp--common-lisp-images-communicating-likeahuman-through-shared-emacs-slime-and-eev--screwlisp--main.vtt @@ -0,0 +1,1260 @@ +WEBVTT captioned by sachac and jay_bird + +NOTE Introduction + +00:00:00.000 --> 00:00:07.119 +Hey, everyone. This talk is on this tradition, + +00:00:07.120 --> 00:00:10.639 +intelligent agents in Emacs + +00:00:10.640 --> 00:00:13.799 +using my Leonardo software individuals, + +00:00:13.800 --> 00:00:16.919 +which I've mistyped as I just wrote here, I see. + +00:00:16.920 --> 00:00:20.159 +Thank you to Sacha and everyone + +00:00:20.160 --> 00:00:25.239 +at EmacsConf and Emacs, I guess. + +00:00:25.240 --> 00:00:26.599 +Sorry that I was running late. + +00:00:26.600 --> 00:00:29.759 +I'm screwlisp.small-web.org. + +00:00:29.760 --> 00:00:33.999 +I run those one or two weekly shows for a long time, + +00:00:34.000 --> 00:00:35.599 +the Lispy Gopher Climate. + +00:00:35.600 --> 00:00:42.199 +I'm active on the Mastodon at @screwlisp@gamerplus.org. + +00:00:42.200 --> 00:00:46.719 +I'm screwtape on lambda.moo.mud.org. + +00:00:46.720 --> 00:00:50.474 +And I ported, over the last kind of year, + +00:00:50.475 --> 00:00:58.499 +years, to some extent, I ported Eric Sandewall's system + +00:00:58.500 --> 00:01:01.519 +for developing intelligent software agents, + +00:01:01.520 --> 00:01:04.879 +which he finished working on in 2014. + +00:01:04.880 --> 00:01:10.119 +I got it working again around 2025. + +00:01:10.120 --> 00:01:14.199 +First, we're going to take a long arc. + +00:01:14.200 --> 00:01:16.759 +We're going to motivate... This is the idea. + +00:01:16.760 --> 00:01:18.119 +You can see I'm using Org Mode, + +00:01:18.120 --> 00:01:19.959 +which I hope provides a good example + +00:01:19.960 --> 00:01:25.359 +for all the Org-Mode-oriented talks this conference. + +00:01:25.360 --> 00:01:26.399 +But you can also see + +00:01:26.400 --> 00:01:33.107 +that I'm using Eduardo Ochs's eev minor mode with Org. + +00:01:33.108 --> 00:01:35.640 +But we can see a little bit of the difference + +00:01:35.641 --> 00:01:39.207 +between these two, and that will kind of evolve into + +00:01:39.208 --> 00:01:45.259 +my style with the agent communication in Emacs. + +00:01:45.260 --> 00:01:52.999 +So you can see I used eev anchors as my Emacs headings. + +00:01:53.000 --> 00:01:56.839 +In eev, you just evaluate Elisp expressions + +00:01:56.840 --> 00:01:58.679 +as links to places. + +00:01:58.680 --> 00:02:01.679 +An anchor will link you somewhere else in the document. + +00:02:01.680 --> 00:02:04.807 +So my table of contents links to my talk, I guess. + +00:02:04.808 --> 00:02:07.507 +Anchors come in two halves, + +00:02:07.508 --> 00:02:12.940 +so that's why I built that unique table of contents + +00:02:12.941 --> 00:02:21.479 +experience there. What else am I going to say? + +NOTE Totally normal computing + +00:02:21.480 --> 00:02:24.174 +So first, let's just do some totally normal computing + +00:02:24.175 --> 00:02:27.140 +because intelligence is going to be difficult to describe. + +00:02:27.141 --> 00:02:31.100 +Let's just try and compute normally in Emacs in Org Mode + +00:02:31.101 --> 00:02:34.359 +and then segue more so into eev, + +00:02:34.360 --> 00:02:38.359 +and then maybe I would like if an agent was intelligent, + +00:02:38.360 --> 00:02:40.839 +I would think that an intelligent agent + +00:02:40.840 --> 00:02:43.319 +would do something like what I'm doing. + +00:02:43.320 --> 00:02:47.239 +It should be recognizably similar to what I do myself. + +00:02:47.240 --> 00:02:52.399 +I don't think the word intelligence is relevant + +00:02:52.400 --> 00:02:55.679 +if it's not related to something I'm not familiar with. + +NOTE Using Emacs as a human + +00:02:55.680 --> 00:03:00.999 +Using Emacs as a human, reading headings from my article, + +00:03:01.000 --> 00:03:03.919 +using Common Lisp. Right, my friend jeremy_list + +00:03:03.920 --> 00:03:06.879 +wrote actually a big project, + +00:03:06.880 --> 00:03:09.799 +but part of it was base64 encoding, + +00:03:09.800 --> 00:03:17.439 +and I just yoinked his C code for base64 encoding, I think. + +00:03:17.440 --> 00:03:20.759 +This is just clearly some C-based 64 encoding. + +00:03:20.760 --> 00:03:24.279 +If you go to my blog, his project is actually a C++ project + +00:03:24.280 --> 00:03:29.579 +and you can see me doing this with C++ rather than C. + +00:03:29.580 --> 00:03:33.319 +But basically, you can go to my blog articles + +00:03:33.320 --> 00:03:40.299 +if you want more detail to read something instead. + +00:03:40.300 --> 00:03:42.433 +And then here's some embeddable Common Lisp, + +00:03:42.434 --> 00:03:48.439 +Jack Daniel's ECL ANSI Common Lisp compiler I guess. + +00:03:48.440 --> 00:03:49.639 +This is just what it looks like. + +00:03:49.640 --> 00:03:52.239 +You can see I'm using Org Mode trickily, + +00:03:52.240 --> 00:03:56.119 +using noweb to put the lines of the C source block + +00:03:56.120 --> 00:04:00.279 +in this one. We're tangling it to this file + +00:04:00.280 --> 00:04:01.919 +rather than evaluating it. + +00:04:01.920 --> 00:04:05.279 +So, you know, literate programming, tangle and weave. + +00:04:05.280 --> 00:04:06.999 +We're just using Org Mode + +00:04:07.000 --> 00:04:09.197 +like the other Org Mode people + +00:04:09.198 --> 00:04:12.079 +are all showing us this conference, I guess. + +00:04:12.080 --> 00:04:13.399 +Then we have to compile it. + +00:04:13.400 --> 00:04:16.039 +It's always hard to remember these invocations for me. + +00:04:16.040 --> 00:04:20.159 +Results file. The file is my .fas file, + +00:04:20.160 --> 00:04:24.559 +because the way ECL's C and C++ integration works + +00:04:24.560 --> 00:04:30.519 +is that it just has to be seen by compile-file in Lisp. + +00:04:30.520 --> 00:04:32.119 +I cached this earlier. + +00:04:32.120 --> 00:04:36.199 +Oh, I should actually start Lisp, actually, shouldn't I? + +00:04:36.200 --> 00:04:39.639 +How are we going to do this? + +00:04:39.640 --> 00:04:47.099 +(setq inferior-lisp-program "ecl"). We could M-x slime. + +00:04:47.100 --> 00:04:48.919 +Because... we better actually load this. + +00:04:48.920 --> 00:04:54.119 +I did a dry run before. + +00:04:54.120 --> 00:04:58.259 +I think we can just load this, because I already did it. + +00:04:58.260 --> 00:05:04.079 +But I cached it. Let's nuke the cache. + +00:05:04.080 --> 00:05:06.599 +Okay, I'm going to say that that probably worked. + +00:05:06.600 --> 00:05:09.319 +Now, as you saw, that base64 encoding + +00:05:09.320 --> 00:05:13.619 +was just, I guess, number to character code + +00:05:13.620 --> 00:05:19.140 +to other character code. So I wrote this higher-level Lisp one, + +00:05:19.141 --> 00:05:20.599 +but that's not really the point. + +00:05:20.600 --> 00:05:26.199 +Obviously, Emacs also has Base64 encoding. + +00:05:26.200 --> 00:05:27.979 +It's just a point that we might have + +00:05:27.980 --> 00:05:29.959 +C++ and C external programs + +00:05:29.960 --> 00:05:31.239 +that we'd like to be integrating + +00:05:31.240 --> 00:05:37.139 +into our Emacs agents capabilities. + +00:05:37.140 --> 00:05:46.474 +Here we can see a normal named Org Mode source block. + +00:05:46.475 --> 00:05:50.474 +that calls that function, then an Org Mode source block + +00:05:50.475 --> 00:05:56.299 +that calls Emacs's base64-decode-string as a way of + +00:05:56.300 --> 00:05:57.940 +validating it, I guess. + +00:05:57.941 --> 00:06:00.140 +We go to Org, so we can see... + +00:06:00.141 --> 00:06:04.407 +I have a named call to that function calling the Lisp function + +00:06:04.408 --> 00:06:07.040 +Org is just kind of like this. + +00:06:07.041 --> 00:06:11.559 +It's cached but I don't seem to have run it before. + +00:06:11.560 --> 00:06:13.574 +Then I do the Emacs decode. + +00:06:13.575 --> 00:06:15.974 +So if we just run this using C-c C-c, + +00:06:15.975 --> 00:06:17.240 +and we can kind of see + +00:06:17.241 --> 00:06:22.179 +what Org Mode is like a little bit here. + +00:06:22.180 --> 00:06:24.319 +All right, yes, so as we can see, + +00:06:24.320 --> 00:06:27.659 +oh hang on, let's run this as well actually. + +00:06:27.660 --> 00:06:32.193 +So the C embeddable Common Lisp + +00:06:32.194 --> 00:06:35.199 +base64 encoding gets us this. + +00:06:35.200 --> 00:06:38.079 +And then Emacs is decoding and gets us back, + +00:06:38.080 --> 00:06:40.319 +kind of validates it. I think I'm missing some things. + +00:06:40.320 --> 00:06:43.079 +I don't pad characters out to the correct byte lengths, + +00:06:43.080 --> 00:06:45.399 +that kind of thing, but it's fine. + +NOTE using this via eev as a human + +00:06:45.400 --> 00:06:48.719 +And then I kind of contrast that to, + +00:06:48.720 --> 00:06:53.179 +I really like what my friend mdhughes.tech, + +00:06:53.180 --> 00:06:57.319 +game dev of the ages, calls REPL-driven development, + +00:06:57.320 --> 00:07:06.139 +which he says is kind of the opposite of literate coding. + +00:07:06.140 --> 00:07:08.940 +I think eev, at least for me, + +00:07:08.941 --> 00:07:11.079 +is kind of like REPL-driven development. + +00:07:11.080 --> 00:07:16.159 +So in eev, if you just press F8, the thing happens. + +00:07:16.160 --> 00:07:17.479 +And if it's a red star line, + +00:07:17.480 --> 00:07:19.439 +the thing is an Emacs Lisp thing, + +00:07:19.440 --> 00:07:22.999 +and otherwise it goes to the eepitch target. + +00:07:23.000 --> 00:07:26.719 +So if I do this, great, now I'm pitching to that slime + +00:07:26.720 --> 00:07:32.759 +REPL ECL I made. And then I pressed F8. Press F8 again. + +00:07:32.760 --> 00:07:34.480 +The string got coerced to a list. + +00:07:34.481 --> 00:07:38.359 +F8. Now it's car codified. + +00:07:38.360 --> 00:07:41.319 +I quite like this, because this looks like something I can do + +00:07:41.320 --> 00:07:44.239 +and understand doing and reason about doing. + +00:07:44.240 --> 00:07:49.519 +Then I form a command to send from Lisp to Emacs. + +00:07:49.520 --> 00:07:52.599 +Then I do it and I recover the string from the beginning. + +00:07:52.600 --> 00:07:56.119 +I guess I had one of these here. Oh, by the way, look at + +00:07:56.120 --> 00:07:59.159 +What Org Mode did with an eev source block. + +00:07:59.160 --> 00:08:00.999 +And then when I close the source block + +00:08:01.000 --> 00:08:02.679 +using C-c ', + +00:08:02.680 --> 00:08:05.319 +it brings me back to the Org doc, + +00:08:05.320 --> 00:08:09.159 +which was a cool synergy between the eev minor mode + +00:08:09.160 --> 00:08:16.019 +and eev source blocks in Org Mode that I noticed. + +00:08:16.020 --> 00:08:22.599 +And so I kind of want my agents to be like this eev usage. + +00:08:22.600 --> 00:08:25.159 +Clearly, Org is super powerful, + +00:08:25.160 --> 00:08:28.159 +but I don't even like writing calls like this, + +00:08:28.160 --> 00:08:32.079 +where you write the function that will happen last first, + +00:08:32.080 --> 00:08:39.039 +so you're kind of writing right to left, first to last. + +00:08:39.040 --> 00:08:41.239 +Whereas in REPL-driven development, + +00:08:41.240 --> 00:08:43.199 +I guess I'm writing top to bottom, + +00:08:43.200 --> 00:08:46.979 +and eev, I guess, executable logs + +00:08:46.980 --> 00:08:48.599 +are logs that are like that. + +00:08:48.600 --> 00:08:52.378 +So I kind of like eev's view for reasoning + +00:08:52.379 --> 00:08:54.399 +more than Org's Tangle. + +00:08:54.400 --> 00:08:57.319 +Obviously, Tangle is trying to do tricky things, + +00:08:57.320 --> 00:09:01.359 +but maybe they have different specializations, + +00:09:01.360 --> 00:09:04.879 +and eev's one is more close + +00:09:04.880 --> 00:09:07.799 +to my own version of intelligence, maybe. + +NOTE Software individuals using eev in Emacs like a human + +00:09:07.800 --> 00:09:13.539 +Software individuals using eev in Emacs like a human. + +00:09:13.540 --> 00:09:17.279 +Yeah, you can always visit my blog post for more detail. + +00:09:17.280 --> 00:09:20.039 +Right, I made a CLOS object + +00:09:20.040 --> 00:09:22.519 +in Common Lisp to wrap doing this. + +00:09:22.520 --> 00:09:23.639 +It's not really the topic. + +00:09:23.640 --> 00:09:27.959 +It's in the appendix somewhere if you need it. + +00:09:27.960 --> 00:09:29.559 +So I've just executed that. + +00:09:29.560 --> 00:09:32.079 +You can look at the appendix in your own time. + +NOTE Sandewall's leonardo system + +00:09:32.080 --> 00:09:33.959 +Jumping over to actually starting + +00:09:33.960 --> 00:09:36.319 +our hypothetical intelligent agent. + +00:09:36.320 --> 00:09:38.239 +I guess we're doing eev here. + +00:09:38.240 --> 00:09:46.759 +So if we open this, press F8 a bunch of times. + +00:09:46.760 --> 00:09:49.199 +Oh, and if you were cloning it yourself, + +00:09:49.200 --> 00:09:56.719 +I guess that's what you would do. setq eepitch-buffer-name. + +00:09:56.720 --> 00:10:00.319 +Oh yeah, if you went to an eepitch shell and then came back. + +00:10:00.320 --> 00:10:01.679 +You would have had to do that, but I didn't. + +00:10:01.680 --> 00:10:04.239 +I didn't, so I didn't need to. + +00:10:04.240 --> 00:10:07.279 +Sandewall's style is to use relative paths + +00:10:07.280 --> 00:10:11.974 +to tell which agent is acting inside a software individual. + +00:10:11.975 --> 00:10:13.359 +Remembering a software individual + +00:10:13.360 --> 00:10:15.239 +is potentially a bunch of agents. + +00:10:15.240 --> 00:10:18.479 +And we load... So one individual, + +00:10:18.480 --> 00:10:21.919 +all the agents in each individual share a kernel. + +00:10:21.920 --> 00:10:25.599 +So only one agent in one software individual + +00:10:25.600 --> 00:10:28.279 +is active at any given time, but the agents are separate. + +00:10:28.280 --> 00:10:31.279 +They just all have to share the kernel resource, + +00:10:31.280 --> 00:10:38.319 +which is the Remus agent. Oh, I got rid of this. + +00:10:38.320 --> 00:10:43.279 +And start the CLE is the thing. + +00:10:43.280 --> 00:10:46.119 +Oh, I did need to have an EmacsConf knowledge base. + +00:10:46.120 --> 00:10:48.959 +Well, let's just keep eepitching for a little bit. + +00:10:48.960 --> 00:10:55.259 +So I think I made... I'm going to call it emacsconf-kb. + +00:10:55.260 --> 00:10:59.679 +Right, that looks likely. And I think that the agent... + +00:10:59.680 --> 00:11:03.479 +I can check this. I could have checked that. + +00:11:03.480 --> 00:11:12.699 +I could have done something like (get emacsconf-kb contents). + +00:11:12.700 --> 00:11:13.479 +Yeah, and you can see + +00:11:13.480 --> 00:11:15.879 +there's a location inside it which is agent1, + +00:11:15.880 --> 00:11:17.519 +which I assume is an entity file + +00:11:17.520 --> 00:11:20.599 +that I was working with before. + +00:11:20.600 --> 00:11:21.919 +And then what were we going to do? + +00:11:21.920 --> 00:11:28.279 +Oh yeah, back to the embeddable Common Lisp image. + +00:11:28.280 --> 00:11:36.099 +So if I just press our button back to there... + +NOTE Start a loop for one leonardo software individual + +00:11:36.100 --> 00:11:41.119 +And so my idea is that for an Emacs agent, + +00:11:41.120 --> 00:11:46.999 +basically, I'd like to have an Emacs Lisp list. + +00:11:47.000 --> 00:11:49.640 +And just when stuff gets into that list, + +00:11:49.641 --> 00:11:53.239 +the agent which is always running, but running slowly, + +00:11:53.240 --> 00:11:58.359 +will incrementally just do the stuff it finds in that list. + +00:11:58.360 --> 00:12:00.759 +Populating that list probably gets into stuff + +00:12:00.760 --> 00:12:03.199 +like your Beliefs, Desires, Intents framework + +00:12:03.200 --> 00:12:06.159 +and those kind of well-known and well-studied algorithms. + +00:12:06.160 --> 00:12:07.799 +That's not the point here. + +00:12:07.800 --> 00:12:14.259 +I just want to have a list in Emacs that my ECL... + +00:12:14.260 --> 00:12:16.079 +I'm just going to run a loop in ECL, + +00:12:16.080 --> 00:12:18.319 +and the ECL is going to keep sending + +00:12:18.320 --> 00:12:22.399 +anything it finds in that Emacs Lisp list + +00:12:22.400 --> 00:12:25.399 +to the software agent. The agent is also in Emacs, + +00:12:25.400 --> 00:12:28.759 +so it would be able to populate its own list itself + +00:12:28.760 --> 00:12:36.159 +if it had an idea of evaluating desires and chances to improve + +00:12:36.160 --> 00:12:37.559 +whatever it wants to improve + +00:12:37.560 --> 00:12:39.999 +and chances to avoid whatever it wants to avoid. + +00:12:40.000 --> 00:12:47.599 +We talked a little bit too much. Let's just start this. + +00:12:47.600 --> 00:12:51.539 +Sorry that I'm manually setting up my screen. + +00:12:51.540 --> 00:12:55.499 +Then let's put CLisp over here. + +00:12:55.500 --> 00:12:58.679 +Right, we could work with this, right? + +00:12:58.680 --> 00:13:00.099 +This loop isn't very important. + +00:13:00.100 --> 00:13:04.919 +It's just a Common Lisp loop. I copy my friend jmbr's style + +00:13:04.920 --> 00:13:08.199 +of using Lisp machine-style keyword arguments + +00:13:08.200 --> 00:13:12.119 +instead of symbols like cl-loop, + +00:13:12.120 --> 00:13:16.719 +the compatibility thing in Emacs Lisp does. + +00:13:16.720 --> 00:13:28.139 +I'd never initialized that. Well, let's do that. + +00:13:28.140 --> 00:13:30.679 +Okay, now we have the list. + +00:13:30.680 --> 00:13:35.019 +And just every 30, let's turn it down to every 20 seconds. + +00:13:35.020 --> 00:13:37.159 +Hypothetically, it's going to put + +00:13:37.160 --> 00:13:39.999 +whatever it finds in there, into there. + +00:13:40.000 --> 00:13:46.239 +And so, I think, yeah, and now... Great. + +00:13:46.240 --> 00:13:50.099 +So here I'm just going to fill it with stuff. + +00:13:50.100 --> 00:13:54.839 +And this is quite interesting, I think. + +00:13:54.840 --> 00:13:58.479 +It just shows I can put a whole bunch of stuff into that list. + +00:13:58.480 --> 00:14:01.199 +Ideally, the agent would populate it itself + +00:14:01.200 --> 00:14:03.359 +with a BDI algorithm or something. + +00:14:03.360 --> 00:14:04.919 +But if we just put some stuff in there, + +00:14:04.920 --> 00:14:07.799 +we'll see that it will all get sent + +00:14:07.800 --> 00:14:14.799 +basically using Eduardo's eepitch internal machinery, at least. + +00:14:14.800 --> 00:14:17.479 +And hence, it meets my requirement + +00:14:17.480 --> 00:14:20.779 +that it works exactly like I work. + +00:14:20.780 --> 00:14:25.859 +And then in eev, I just have to press M-e. + +00:14:25.860 --> 00:14:31.479 +Oh, it works via Emacs server, and I didn't start that, + +00:14:31.480 --> 00:14:39.719 +so if we server-start, hopefully... + +00:14:39.720 --> 00:14:42.799 +And then, ideally, things will just begin happening + +00:14:42.800 --> 00:14:53.119 +in this slime-repl C/Lisp agent. + +00:14:53.120 --> 00:15:05.419 +Oh, if this was still running. + +00:15:05.420 --> 00:15:07.199 +Okay, well we got at least one, + +00:15:07.200 --> 00:15:09.639 +but hypothetically lots of these will happen. + +00:15:09.640 --> 00:15:13.699 +So, show agent, I guess, + +00:15:13.700 --> 00:15:17.039 +happened over here. I put a whole bunch of "sleep-for"s in, + +00:15:17.040 --> 00:15:19.719 +because I thought that going slowly + +00:15:19.720 --> 00:15:21.319 +would make it seem more human. + +00:15:21.320 --> 00:15:24.639 +Like I saw in Eduardo's talk last year + +00:15:24.640 --> 00:15:29.099 +which is where I learned about eev. + +00:15:29.100 --> 00:15:32.319 +The system is a little fragile. + +00:15:32.320 --> 00:15:41.079 +Hypothetically, we have a whole bunch of agents. + +00:15:41.080 --> 00:15:43.039 +I guess every time it gets sent, + +00:15:43.040 --> 00:15:44.999 +it checks that we're in the right agent. + +00:15:45.000 --> 00:15:46.999 +And it's not actually just sending a string, + +00:15:47.000 --> 00:15:52.799 +it's sending a sequence of string actions over there. + +00:15:52.800 --> 00:15:57.479 +And so we see Emacs Lisp hypothetically put, + +00:15:57.480 --> 00:16:06.859 +I guess it put this "foo bar baz!" into an entity, message-1, + +00:16:06.860 --> 00:16:11.899 +which should be of type message, I guess, conceivably. + +00:16:11.900 --> 00:16:13.319 +I forget if I set that up earlier. + +00:16:13.320 --> 00:16:14.719 +It's in the appendix somewhere. + +00:16:14.720 --> 00:16:17.999 +And then it just called, it did a sequence of actions + +00:16:18.000 --> 00:16:21.319 +which was really just one action of showing that. + +00:16:21.320 --> 00:16:26.399 +And then I called b64-encode on message1, + +00:16:26.400 --> 00:16:30.599 +which I believe will have set message-1 encoded. + +00:16:30.600 --> 00:16:37.242 +Can I check that manually while it's happening? + +00:16:37.243 --> 00:16:51.499 +Disaster. Well that's what it should have been. + +00:16:51.500 --> 00:16:54.940 +Well, I did mention it was a little bit fragile. + +00:16:54.941 --> 00:17:03.279 +What if we put... Can we kind of rescue this? + +00:17:03.280 --> 00:17:07.239 +I don't want to try redoing this. It's slightly fragile. + +00:17:07.240 --> 00:17:12.639 +What it would do, we can see the actions are kind of getting there, + +00:17:12.640 --> 00:17:16.719 +but somehow my message didn't end up getting encoded + +00:17:16.720 --> 00:17:18.119 +by that sequence of actions. + +00:17:18.120 --> 00:17:23.279 +So this decode will have also made the decoded one be null. + +NOTE Let's do it manually + +00:17:23.280 --> 00:17:26.239 +Let's just do it manually. Should have worked. + +00:17:26.240 --> 00:17:30.559 +b64-encode, which calls out to Emacs + +00:17:30.560 --> 00:17:37.299 +to get everything actually done. + +00:17:37.300 --> 00:17:41.519 +Oh, I got interrupted by the agent. + +00:17:41.520 --> 00:17:43.320 +Well, if I do it manually, it worked. + +00:17:43.321 --> 00:17:53.519 +Hypothetically, the queue thing should have worked. Great. + +00:17:53.520 --> 00:17:56.840 +Well, you can see it's kind of working. + +00:17:56.841 --> 00:17:57.440 +Could be more robust. + +00:17:57.441 --> 00:18:03.640 +The reason is that I think what I did is a bit fragile, + +00:18:03.641 --> 00:18:07.107 +but the intent is that FIPA, + +00:18:07.108 --> 00:18:09.307 +Foundation for Intelligent Physical Agents's + +00:18:09.308 --> 00:18:15.639 +SL standard has tools for reliability + +00:18:15.640 --> 00:18:19.919 +through repetition and checking outcomes and that kind of thing. + +00:18:19.920 --> 00:18:22.959 +So I would use those. I'm not putting too much work + +00:18:22.960 --> 00:18:26.679 +into being ultra-reliable right now, but it kind of worked. + +00:18:26.680 --> 00:18:29.759 +We saw, I guess, at least Embeddable Common Lisp + +00:18:29.760 --> 00:18:35.599 +believed it used emacsclient externally, asynchronously, + +00:18:35.600 --> 00:18:38.359 +to send these to Emacs within Emacs. + +00:18:38.360 --> 00:18:41.599 +I put a whole bunch of sleeps into its thing + +00:18:41.600 --> 00:18:44.999 +to make it look slow and human-like, kind of happened + +00:18:45.000 --> 00:18:52.719 +because Emacs' model is that it's kind of single-threaded. + +00:18:52.720 --> 00:18:59.639 +Can I just... I bet if we run this again + +00:18:59.640 --> 00:19:02.119 +It'll at least look like it's succeeding + +00:19:02.120 --> 00:19:05.039 +because I fixed the base64 encoding + +00:19:05.040 --> 00:19:11.399 +and so forth in the background. I wonder if it will. + +NOTE Wrapping up + +00:19:11.400 --> 00:19:15.559 +In the meantime, let's wrap up this talk to some extent. + +00:19:15.560 --> 00:19:18.799 +Then I'm just kind of saying what I'm expecting to happen. + +00:19:18.800 --> 00:19:20.479 +I took out next action. + +00:19:20.480 --> 00:19:25.279 +Originally, I was keeping the list inside of the agent. + +00:19:25.280 --> 00:19:27.879 +Then I decided to keep the list inside Emacs + +00:19:27.880 --> 00:19:31.679 +because I have kind of first class Emacs is my IDE, + +00:19:31.680 --> 00:19:37.607 +so I have better access to what's going on in my IDE. + +NOTE Intelligence + +00:19:37.608 --> 00:19:39.559 +Then I wanted to talk about intelligence a little bit + +00:19:39.560 --> 00:19:41.199 +in whatever my remaining time is. + +00:19:41.200 --> 00:19:43.039 +I just have these great bullet points + +00:19:43.040 --> 00:19:45.559 +of Nosredna yduJ and Eric Sandewall. + +00:19:45.560 --> 00:19:50.039 +So Nosredna yduJ, when she was on the show quite a long time ago, + +00:19:50.040 --> 00:19:55.559 +she... I keep describing things as expert systems + +00:19:55.560 --> 00:19:57.039 +and she wanted to know what I meant + +00:19:57.040 --> 00:19:58.359 +when I said expert systems, + +00:19:58.360 --> 00:20:00.199 +and I gave her a Lisp software example + +00:20:00.200 --> 00:20:02.618 +and she said she personally wrote + +00:20:02.619 --> 00:20:06.279 +that software in the 80s that I was referring to + +00:20:06.280 --> 00:20:08.239 +and she wanted to know how it was an expert system. + +00:20:08.240 --> 00:20:10.039 +What I mean when I say expert system + +00:20:10.040 --> 00:20:19.839 +is a system that works kind of like I do and eev's eepitch does. + +00:20:19.840 --> 00:20:21.999 +It's where we can really reason + +00:20:22.000 --> 00:20:24.199 +in a very human-relatable way + +00:20:24.200 --> 00:20:26.479 +about what the inputs to the program is. + +00:20:26.480 --> 00:20:31.399 +And also a program should be exposed to other programs + +00:20:31.400 --> 00:20:36.559 +in terms of like a well-structured transfer of knowledge as inputs, + +00:20:36.560 --> 00:20:38.010 +and it should have a well-structured + +00:20:38.011 --> 00:20:41.939 +transfer of knowledge kind of outputs. + +00:20:41.940 --> 00:20:47.159 +I don't know why this b64-encode message wasn't working. + +00:20:47.160 --> 00:20:49.999 +Then we kind of faked it into working. + +00:20:50.000 --> 00:20:52.399 +It's going to be embarrassing for me + +00:20:52.400 --> 00:20:58.739 +if anybody watches this. But yeah, so yduJ's thing... + +00:20:58.740 --> 00:20:59.959 +And then I was going to also build + +00:20:59.960 --> 00:21:02.679 +that into Eric Sandewall's one. + +00:21:02.680 --> 00:21:05.639 +So this is my vision of expert systems + +00:21:05.640 --> 00:21:07.779 +as kind of maybe this is an important + +00:21:07.780 --> 00:21:11.679 +general style loosely associated with Lisp. + +00:21:11.680 --> 00:21:14.399 +Same as the Lisp editor Emacs. + +00:21:14.400 --> 00:21:17.665 +So Eric Sandewall's description of intelligence + +00:21:17.666 --> 00:21:21.159 +was that his grandchildren were intelligent. + +00:21:21.160 --> 00:21:26.439 +So if we had software agents that were intelligent, + +00:21:26.440 --> 00:21:32.439 +this would be true if and maybe only if they were similar + +00:21:32.440 --> 00:21:33.719 +to his grandchildren + +00:21:33.720 --> 00:21:36.319 +who were a good reference for intelligence. + +00:21:36.320 --> 00:21:39.199 +And grandchildren live for a really long time. + +00:21:39.200 --> 00:21:42.879 +They kind of learn gradually. + +00:21:42.880 --> 00:21:46.879 +They don't run on GPUs for a few minutes + +00:21:46.880 --> 00:21:51.879 +and then get thrown out forever, something like that. + +00:21:51.880 --> 00:21:54.959 +And so this is the kind of vision of, I guess, + +00:21:54.960 --> 00:21:57.919 +the Leonardo system software individual stuff. + +00:21:57.920 --> 00:22:03.946 +You can see we kind of faked it into... + +00:22:03.947 --> 00:22:06.320 +at least the show get message one decoded bits were working. + +00:22:06.321 --> 00:22:07.300 +I'm not sure what was happening + +00:22:07.301 --> 00:22:12.674 +with the Elisp ones that worked interactively, + +00:22:12.675 --> 00:22:18.607 +but then they didn't work in my loopy thing. + +00:22:18.608 --> 00:22:21.307 +Oh yeah, and then so I mentioned + +00:22:21.308 --> 00:22:24.640 +thank you to Sacha at the start of this talk. + +00:22:24.641 --> 00:22:26.974 +And so Eric Sandewall's emphasis + +00:22:26.975 --> 00:22:31.340 +that you'd really like intelligent software agents, + +00:22:31.341 --> 00:22:34.174 +Leonardo system agents, to be like your grandchildren. + +00:22:34.175 --> 00:22:40.659 +And I was talking to somebody, maybe to Ramin Honary + +00:22:40.660 --> 00:22:44.959 +who's doing the schemacs talk this year + +00:22:44.960 --> 00:22:46.874 +about Sacha's writing. + +00:22:46.875 --> 00:22:48.840 +A lot of Sacha's writing is about + +00:22:48.841 --> 00:22:51.774 +her experiences of life and technology, + +00:22:51.775 --> 00:22:54.374 +and especially raising A* + +00:22:54.375 --> 00:22:59.740 +and her observations of her progeny A*'s + +00:22:59.741 --> 00:23:05.319 +experiences of life and technology, + +00:23:05.320 --> 00:23:07.874 +I would say as well as being + +00:23:07.875 --> 00:23:18.039 +the Emacs News and Emacs conf doer that she is. + +00:23:18.040 --> 00:23:22.740 +Yeah, and so I think a lot of what Sacha is seen doing + +00:23:22.741 --> 00:23:25.840 +and concerned with are specifically what Eric Sandewall + +00:23:25.841 --> 00:23:31.207 +identifies as the study of intelligence as such, + +00:23:31.208 --> 00:23:36.479 +as should apply to computing as well. That was my thought + +00:23:36.480 --> 00:23:42.979 +on Sacha, Eric Sandewall, intelligence, and yduJ. + +00:23:42.980 --> 00:23:44.240 +I have this note from pizzapal... + +00:23:44.241 --> 00:23:46.274 +I didn't realize that Microsoft had announced + +00:23:46.275 --> 00:23:49.679 +that 2025 was going to be the year of the software agent. + +00:23:49.680 --> 00:23:51.199 +I only found this out in hindsight + +00:23:51.200 --> 00:23:54.199 +when I saw people crowing on the Mastodon + +00:23:54.200 --> 00:23:58.079 +about how Microsoft had basically declared + +00:23:58.080 --> 00:24:00.779 +that their Year of the Agent marketing campaign + +00:24:00.780 --> 00:24:04.459 +was a failure + +00:24:04.460 --> 00:24:09.279 +where basically people didn't like the same old web services + +00:24:09.280 --> 00:24:11.359 +but now while you're accessing, + +00:24:11.360 --> 00:24:15.239 +while you're formally kind of accessing a web service, + +00:24:15.240 --> 00:24:16.959 +the kind of web service that used to be called + +00:24:16.960 --> 00:24:19.279 +serverless web services, this kind of thing, + +00:24:19.280 --> 00:24:23.879 +but you're just being gibbered at by Microsoft Copilot + +00:24:23.880 --> 00:24:27.119 +while you're trying to use regular services. + +00:24:27.120 --> 00:24:29.279 +And people turned out not to like this. + +00:24:29.280 --> 00:24:32.399 +I think that, as we can see in this agent, + +00:24:32.400 --> 00:24:36.374 +the agent really needs to be running on its own clock + +00:24:36.375 --> 00:24:37.907 +and independently of you. + +00:24:37.908 --> 00:24:42.279 +Like if you imagine your body is getting + +00:24:42.280 --> 00:24:46.074 +novel, slightly speculative instructions from your brain + +00:24:46.075 --> 00:24:50.680 +constantly throughout your entire waking day, quite slowly, + +00:24:50.681 --> 00:24:54.974 +this is what an agent should be like. + +00:24:54.975 --> 00:24:59.540 +And it should be... Sandewall wrote about this. + +00:24:59.541 --> 00:25:01.540 +Basically, computer programs + +00:25:01.541 --> 00:25:04.840 +aren't going to want to use human natural language with each other. + +00:25:04.841 --> 00:25:06.674 +There's nothing desirable about that, + +00:25:06.675 --> 00:25:10.674 +so you wouldn't have two hypothetical Microsoft agents, + +00:25:10.675 --> 00:25:13.399 +which are just regular web services with + +00:25:13.400 --> 00:25:16.340 +a GPT model gibbering at you + +00:25:16.341 --> 00:25:19.839 +while you're trying to use the web service. + +00:25:19.840 --> 00:25:22.539 +I think we can see... + +00:25:22.540 --> 00:25:26.740 +Microsoft did the wrong thing with the word agent, + +00:25:26.741 --> 00:25:30.707 +allowing that agent is an overloaded term like static. + +00:25:30.708 --> 00:25:34.256 +I'm going to stop this. I'm not going to try and fix this. + +00:25:34.257 --> 00:25:36.313 +Sorry, everybody. Thank you. Talk to you on the Mastodon. + +00:25:36.314 --> 00:25:37.919 +Hopefully, see you on the show. + +00:25:37.920 --> 00:25:40.399 +See you at your conference talks. + +00:25:40.400 --> 00:25:45.599 +My blog has writing and examples of this with multi-agents, + +00:25:45.600 --> 00:25:50.819 +more C and C++ stuff, Lisp things. + +00:25:50.820 --> 00:25:53.439 +You're welcome to come on my show to be interviewed, + +00:25:53.440 --> 00:25:56.640 +however formally we do that. See everybody next time. diff --git a/2025/captions/emacsconf-2025-completion--corfuyasnippet-easier-than-i-thought--pedro-a-aranda-gutirrez--main.vtt b/2025/captions/emacsconf-2025-completion--corfuyasnippet-easier-than-i-thought--pedro-a-aranda-gutirrez--main.vtt new file mode 100644 index 00000000..49bf10f3 --- /dev/null +++ b/2025/captions/emacsconf-2025-completion--corfuyasnippet-easier-than-i-thought--pedro-a-aranda-gutirrez--main.vtt @@ -0,0 +1,1426 @@ +WEBVTT + +00:00:00.000 --> 00:00:02.319 +Nice to have you here on this talk. + +00:00:02.320 --> 00:00:04.519 +This is my second talk this year. + +00:00:04.520 --> 00:00:09.919 +First one was on things that I've done to Org Mode. + +00:00:09.920 --> 00:00:13.799 +Just as a side note, this presentation + +00:00:13.800 --> 00:00:16.279 +that I'm going to share with you + +00:00:16.280 --> 00:00:19.879 +about my work on Corfu and Jasnipit. + +00:00:19.880 --> 00:00:21.839 +I've prepared that on Org Mode + +00:00:21.840 --> 00:00:25.079 +and exported that with a work I've been doing + +00:00:25.080 --> 00:00:26.839 +to the latest exporter. + +00:00:26.840 --> 00:00:31.959 +Anyhow, what is my talk going to be about? + +00:00:31.960 --> 00:00:34.599 +It's going to be about Corfu and Yasnippet, + +00:00:34.600 --> 00:00:36.599 +which I thought would be difficult to integrate, + +00:00:36.600 --> 00:00:42.799 +and it was much easier than I thought. + +00:00:42.800 --> 00:00:46.959 +So just a short outline, my motivation, + +00:00:46.960 --> 00:00:49.959 +step-by-step of the things that I've been investigating, + +00:00:49.960 --> 00:00:55.919 +and some takeaways. So my motivation, yeah, snippet is old. + +00:00:55.920 --> 00:00:59.599 +So I've tried another, I've tried Temple + +00:00:59.600 --> 00:01:02.519 +and other template management packages, + +00:01:02.520 --> 00:01:08.159 +but it was really not my cup of tea. So mainly why? + +00:01:08.160 --> 00:01:10.919 +Mainly because I have a nice base of VR snippets + +00:01:10.920 --> 00:01:14.479 +I have generated for my needs. + +00:01:14.480 --> 00:01:17.799 +So it's not that I've been importing snippets + +00:01:17.800 --> 00:01:20.359 +from packages which are out there. + +00:01:20.360 --> 00:01:23.599 +No, they are my snippets. I'm used to them. + +00:01:23.600 --> 00:01:26.559 +And of course, migration counts as a cost. + +00:01:26.560 --> 00:01:32.639 +I've been using Company as my completion point function GUI for years, + +00:01:32.640 --> 00:01:38.919 +but with the time coming in features and so on it + +00:01:38.920 --> 00:01:44.359 +was it's was not as easy to set up as I wanted for my needs + +00:01:44.360 --> 00:01:53.119 +so I had been working I've been playing with Eaglet already some time for a language server protocol + +00:01:53.120 --> 00:01:57.039 +I had read about how easy it was to integrate with Corfu + +00:01:57.040 --> 00:02:02.839 +which was really nice and I had given it a try, + +00:02:02.840 --> 00:02:06.439 +but I'm using both graphical user interface mode in Emacs + +00:02:06.440 --> 00:02:07.839 +and text mode, + +00:02:07.840 --> 00:02:10.319 +and for text mode you need a corporate terminal, + +00:02:10.320 --> 00:02:16.399 +which was yet another package that I don't download. + +00:02:16.400 --> 00:02:21.479 +Well, and I didn't really find a quick way + +00:02:21.480 --> 00:02:24.479 +to get rid of company to get just snippet. + +00:02:24.480 --> 00:02:26.679 +So at the end, when, at the beginning, + +00:02:26.680 --> 00:02:33.959 +when I was using Corfu and Eglot, I also needed to load a company + +00:02:33.960 --> 00:02:35.759 +to have a snippet support, + +00:02:35.760 --> 00:02:37.639 +which was really like sort of weird + +00:02:37.640 --> 00:02:40.559 +because I wanted to get rid of, of your snippet. + +00:02:40.560 --> 00:02:47.199 +Anyhow, while I try now, I'm following the mailing list, + +00:02:47.200 --> 00:02:48.559 +the development mailing list, + +00:02:48.560 --> 00:02:51.799 +and I got interested when I heard something about + +00:02:51.800 --> 00:02:57.119 +TTI charge frames being announced for master. + +00:02:57.120 --> 00:02:59.599 +That would mean less packages to download + +00:02:59.600 --> 00:03:04.159 +because I thought I could get rid of Corfu, + +00:03:04.160 --> 00:03:07.359 +and I wanted to try if I could get rid of Corfu terminal + +00:03:07.360 --> 00:03:11.199 +and run Corfu without that. + +00:03:11.200 --> 00:03:18.799 +So, there were some hints there in that mailing list + +00:03:18.800 --> 00:03:21.879 +that made it interesting for me. + +00:03:21.880 --> 00:03:26.639 +And at the end, I'm also like a why not trying man, + +00:03:26.640 --> 00:03:29.119 +so I said let's give it a try. + +00:03:29.120 --> 00:03:33.479 +My requirements, I'm working always on a new Emacs, + +00:03:33.480 --> 00:03:36.759 +a decently new Emacs, normally from Master Vanilla. + +00:03:36.760 --> 00:03:42.559 +completely Vanilla and I don't have any extras like Doom or things like that. + +00:03:42.560 --> 00:03:45.519 +So I'm only Vanilla. And one of the things + +00:03:45.520 --> 00:03:50.279 +that I don't want is that on this Vanilla recent Emacs, + +00:03:50.280 --> 00:03:55.719 +I don't want a Kung Fu Terminal. I need your snippet. + +00:03:55.720 --> 00:03:57.359 +I'm basically an old man. + +00:03:57.360 --> 00:04:02.479 +Old dog does new tricks and snippets must, + +00:04:02.480 --> 00:04:06.239 +in my way of working, must be easy and quick to configure + +00:04:06.240 --> 00:04:10.479 +and Tempo or others that I've seen are not. + +00:04:10.480 --> 00:04:13.919 +I don't want any reminiscence of a company in my setup. + +00:04:13.920 --> 00:04:18.679 +And of course, don't forget that I've embraced + +00:04:18.680 --> 00:04:24.119 +the language protocol implementations and basically Eglot. + +00:04:24.120 --> 00:04:28.159 +My main focus now is Python and LaTeX, + +00:04:28.160 --> 00:04:31.719 +and I have PyLSB and TechLab. + +00:04:31.720 --> 00:04:37.599 +And I don't want to have to stop using them. + +00:04:37.600 --> 00:04:40.479 +So basic setup for Corfu and Eglot. + +00:04:40.480 --> 00:04:43.439 +You can find it everywhere you look for it. + +00:04:43.440 --> 00:04:46.559 +It's really easy. + +00:04:46.560 --> 00:04:51.119 +And actually, I also do something somehow naughty, + +00:04:51.120 --> 00:04:53.079 +which is to set this variable, + +00:04:53.080 --> 00:04:55.519 +the Corfu auto variable to true, + +00:04:55.520 --> 00:04:58.399 +although I know it's not recommended, blah, blah, blah. + +00:04:58.400 --> 00:05:02.959 +But I use that because I'm a bit lazy in that. + +00:05:02.960 --> 00:05:07.239 +So next step was looking at completion at point functions. + +00:05:07.240 --> 00:05:10.479 +So the information there if you go through the scatter + +00:05:10.480 --> 00:05:13.999 +and sometimes a bit cryptic. + +00:05:14.000 --> 00:05:16.599 +At the end I came up with something like the thing + +00:05:16.600 --> 00:05:18.399 +that you see there on the screen. + +00:05:18.400 --> 00:05:21.879 +So it's a function for just completion point + +00:05:21.880 --> 00:05:24.639 +so I need my list of keywords + +00:05:24.640 --> 00:05:30.039 +so that I'm going to be talking later + +00:05:30.040 --> 00:05:34.399 +and I have my bounds which is normally a word + +00:05:34.400 --> 00:05:37.119 +and from that I get the start and the end + +00:05:37.120 --> 00:05:38.919 +of the of the thing that I want to + +00:05:38.920 --> 00:05:47.319 +that I want to be my seed for looking and bringing up Corfu + +00:05:47.320 --> 00:05:53.439 +and of course I need some completion properties here + +00:05:53.440 --> 00:05:55.719 +This looked like this is what you need to do, + +00:05:55.720 --> 00:05:57.519 +but I had to dig quite deep + +00:05:57.520 --> 00:06:01.319 +to create a JavaScript keyword test + +00:06:01.320 --> 00:06:04.759 +and to understand the completion props. + +00:06:04.760 --> 00:06:11.759 +And as an update of what I've been doing in the last weeks, + +00:06:11.760 --> 00:06:13.879 +I've created a bound of things + +00:06:13.880 --> 00:06:18.679 +that point for me with a different thing + +00:06:18.680 --> 00:06:22.039 +that doesn't skip over non-blank characters, + +00:06:22.040 --> 00:06:25.039 +that only skips over non-blank characters. + +00:06:25.040 --> 00:06:28.999 +Why? Because Word was confusingly tech, + +00:06:29.000 --> 00:06:30.759 +because the backslash, + +00:06:30.760 --> 00:06:34.999 +like in the example for the teletype text, + +00:06:35.000 --> 00:06:36.919 +was not taken into account by Word. + +00:06:36.920 --> 00:06:39.959 +So I had to create my own one, + +00:06:39.960 --> 00:06:42.119 +which was a bunch of thing at point, + +00:06:42.120 --> 00:06:44.879 +and then my thing is non-blanks. + +00:06:44.880 --> 00:06:53.239 +Completion at point properties, what are they? + +00:06:53.240 --> 00:06:56.039 +They allow Emacs to know how to handle the information + +00:06:56.040 --> 00:06:57.879 +for a specific completion time. + +00:06:57.880 --> 00:07:02.319 +So you normally will have an annotation, + +00:07:02.320 --> 00:07:08.519 +which then can disappear if you use NerdIconScoreFull. + +00:07:08.520 --> 00:07:11.839 +which is what I'm doing currently, + +00:07:11.840 --> 00:07:17.559 +but I keep it commented just in case I get tired of Corfu + +00:07:17.560 --> 00:07:20.079 +and I want to have my completion function. + +00:07:20.080 --> 00:07:26.759 +Then the company kind is actually not something + +00:07:26.760 --> 00:07:30.999 +that comes from the company package, but does not require. + +00:07:31.000 --> 00:07:39.439 +And that's going to allow NerdEye Conscorfu to identify + +00:07:39.440 --> 00:07:44.839 +and put the right icon there in the completion list, + +00:07:44.840 --> 00:07:47.159 +as you will see in a couple of minutes. + +00:07:47.160 --> 00:07:50.439 +So it's a snippet key. + +00:07:50.440 --> 00:07:52.599 +So basically what this is telling you + +00:07:52.600 --> 00:07:54.319 +is that this is a snippet keyword. + +00:07:54.320 --> 00:07:56.799 +These two lines, either line, + +00:07:56.800 --> 00:07:59.999 +tell you that this is a snippet keyword. + +00:08:00.000 --> 00:08:05.279 +And that it should be added to the other completions + +00:08:05.280 --> 00:08:08.079 +that you already have in your list. + +00:08:08.080 --> 00:08:15.479 +Problems looking now next step + +00:08:15.480 --> 00:08:19.079 +once I had the completion props + +00:08:19.080 --> 00:08:21.439 +which was relatively easy was to go + +00:08:21.440 --> 00:08:24.399 +and get the keyword list right. + +00:08:24.400 --> 00:08:27.199 +I've been looking at pre-existing solutions + +00:08:27.200 --> 00:08:29.319 +like for example how the menu + +00:08:29.320 --> 00:08:34.399 +is built in by your snippet and it looked a bit like Mission Impossible. + +00:08:34.400 --> 00:08:40.439 +because the approach by all the things + +00:08:40.440 --> 00:08:43.199 +that I have seen and I have examined + +00:08:43.200 --> 00:08:45.639 +is to get the keys and the names + +00:08:45.640 --> 00:08:50.799 +and then further process them. + +00:08:50.800 --> 00:08:55.279 +My take was, do I really need both? + +00:08:55.280 --> 00:08:58.159 +At the end, if I use my own snippets, + +00:08:58.160 --> 00:09:00.439 +I'm going to be using something + +00:09:00.440 --> 00:09:02.559 +I would call meaningful keys for them + +00:09:02.560 --> 00:09:06.359 +or at least meaningful for these keys are meaningful for me + +00:09:06.360 --> 00:09:07.679 +and I try not to repeat them + +00:09:07.680 --> 00:09:09.959 +because it makes little sense to repeat a keyword. + +00:09:09.960 --> 00:09:13.919 +So why not center everything around the keys only + +00:09:13.920 --> 00:09:18.879 +and can that help simplify my code? + +00:09:18.880 --> 00:09:23.639 +So I started to dive into your snippet + +00:09:23.640 --> 00:09:27.319 +and I found a lot of useful semi-hidden functions there. + +00:09:27.320 --> 00:09:30.679 +I discovered that getting the list + +00:09:30.680 --> 00:09:34.959 +the list of keys for a given mode was not that difficult. + +00:09:34.960 --> 00:09:40.079 +And at the end what I started doing + +00:09:40.080 --> 00:09:47.079 +is get all the snipple tables used by a major mode + +00:09:47.080 --> 00:09:52.399 +and get the lists of the keys that you have in each table. + +00:09:52.400 --> 00:09:55.839 +Sometimes the list is empty + +00:09:55.840 --> 00:10:01.959 +so it's going to return a nil and that you have to discard. + +00:10:01.960 --> 00:10:05.999 +When you're using structured snippets + +00:10:06.000 --> 00:10:08.919 +like snippets and submenus and so on + +00:10:08.920 --> 00:10:12.359 +to get a structured menu, + +00:10:12.360 --> 00:10:14.999 +you also get some non-strings that you need to filter out + +00:10:15.000 --> 00:10:18.999 +in order to get a workable keyword list. + +00:10:19.000 --> 00:10:24.879 +At the end of the day, what I had was something like this. + +00:10:24.880 --> 00:10:30.959 +I have, for a mode, I went through all modes. + +00:10:30.960 --> 00:10:37.159 +through all modes associated to that and then I went + +00:10:37.160 --> 00:10:42.519 +I got my results from all the tables that I had + +00:10:42.520 --> 00:10:45.279 +for a for a given time for a given table + +00:10:45.280 --> 00:10:48.079 +so what you do is you get your the tables + +00:10:48.080 --> 00:10:53.119 +that are associated to a mode because surprise surprise + +00:10:53.120 --> 00:10:55.958 +Some modes have more than one table, + +00:10:55.959 --> 00:11:00.917 +and then what you do is you filter out all non strings + +00:11:00.918 --> 00:11:07.719 +from each of the keys list that you have for each table. + +00:11:07.720 --> 00:11:12.679 +So as you see, it's a 1, 2, 3, 4, 5, 6, 7 liner, + +00:11:12.680 --> 00:11:14.319 +which was not too much. + +00:11:14.320 --> 00:11:20.039 +By the way, if someone from Yasnippet is around, + +00:11:20.040 --> 00:11:26.959 +I sent a pull request to include this + +00:11:26.960 --> 00:11:28.999 +as a public function in Yasnipit + +00:11:29.000 --> 00:11:32.319 +because it might be nice to have it in a packet + +00:11:32.320 --> 00:11:33.840 +in order to do this kind of things. + +00:11:33.840 --> 00:11:41.239 +So fine-tuning I just adding a yes completion + +00:11:41.240 --> 00:11:44.719 +to the completion point functions was not enough + +00:11:44.720 --> 00:11:46.799 +I don't really know + +00:11:46.800 --> 00:11:51.199 +but exclusive node didn't seem to work how I wanted + +00:11:51.200 --> 00:11:57.399 +so I needed to escape sorry yeah I was saying I was getting rid of packages + +00:11:57.400 --> 00:12:00.999 +and I had to add one package + +00:12:01.000 --> 00:12:04.479 +in order to get a function which is very very nice + +00:12:04.480 --> 00:12:08.919 +and which is part of the cape function of the cape package + +00:12:08.920 --> 00:12:12.799 +and that's cape cap super. + +00:12:12.800 --> 00:12:16.439 +So at the end using that you define an alias + +00:12:16.440 --> 00:12:23.199 +which for that where you use cape cap super + +00:12:23.200 --> 00:12:25.799 +to have a list of what you want + +00:12:25.800 --> 00:12:29.079 +so in this case for example for the demo + +00:12:29.080 --> 00:12:32.759 +I'm going to make I'm using yes completion + +00:12:32.760 --> 00:12:37.719 +and then the elisp completion point function provided by Emacs. + +00:12:37.720 --> 00:12:43.999 +I combine them using cape cap super + +00:12:44.000 --> 00:12:47.679 +and with that I create a completion point + +00:12:47.680 --> 00:12:53.159 +a new completion point function which I call cape list mode + +00:12:53.160 --> 00:12:58.480 +and then I add this alias to the completion functions list + +00:12:58.520 --> 00:13:05.719 +and with that it is enough snippet expansion + +00:13:05.720 --> 00:13:14.479 +if you want to have your snippets expanded automatically, + +00:13:14.480 --> 00:13:27.999 +you have to add an exit function to the, I'm sorry, + +00:13:28.000 --> 00:13:30.879 +to the completion properties + +00:13:30.880 --> 00:13:34.119 +yet another functionality you have to add + +00:13:34.120 --> 00:13:39.199 +and to avoid this automatic selection to be too eager + +00:13:39.200 --> 00:13:43.319 +you need to add this set corfu + +00:13:43.320 --> 00:13:48.599 +on exact match to nil because otherwise + +00:13:48.600 --> 00:13:51.839 +you will always get the snippet expanded + +00:13:51.840 --> 00:13:55.039 +even if you don't want it Basically why? + +00:13:55.040 --> 00:13:57.639 +Basically because this would be suboptimal + +00:13:57.640 --> 00:14:05.359 +because the key can appear as part of a variable name. + +00:14:05.360 --> 00:14:10.599 +Another nice thing, I'm also creating my own themes. + +00:14:10.600 --> 00:14:13.759 +I'm trying to have very sleek themes + +00:14:13.760 --> 00:14:16.839 +that only cover the modes that I use + +00:14:16.840 --> 00:14:22.959 +and for that I have my own theme creator fork + +00:14:22.960 --> 00:14:26.959 +from the original team creator. + +00:14:26.960 --> 00:14:31.719 +In my personal work that I'm running at home, + +00:14:31.720 --> 00:14:34.159 +I only have the faces for the modes I use. + +00:14:34.160 --> 00:14:38.159 +I don't want to overload the thing + +00:14:38.160 --> 00:14:41.839 +with too much different things. + +00:14:41.840 --> 00:14:45.999 +Looking at this, I really didn't need, as you will see now, + +00:14:46.000 --> 00:14:50.079 +I don't need to add anything to my themes + +00:14:50.080 --> 00:14:53.279 +because the default faces for Corfu + +00:14:53.280 --> 00:14:58.319 +adapt quite well to most of the themes. + +00:14:58.320 --> 00:15:02.839 +So if I go back to my checklist decently remax yes + +00:15:02.840 --> 00:15:06.559 +compiled the one you'll see + +00:15:06.560 --> 00:15:09.239 +for the for in the demo I'm doing is a master + +00:15:09.240 --> 00:15:11.999 +compiled the day before yesterday + +00:15:12.000 --> 00:15:15.199 +so and I don't need Corfu terminal there. + +00:15:15.200 --> 00:15:16.559 +I need your snippet, + +00:15:16.560 --> 00:15:20.159 +and you're going to see that in a second + +00:15:20.160 --> 00:15:24.439 +with a couple of snippets that I can expand here. + +00:15:24.440 --> 00:15:27.479 +I don't want any reminiscence of a company in my setup, + +00:15:27.480 --> 00:15:32.119 +and there's none. Well, actually, company kind is there + +00:15:32.120 --> 00:15:33.719 +you see the company there + +00:15:33.720 --> 00:15:39.559 +but it isn't if I buy companies strictly speaking + +00:15:39.560 --> 00:15:44.679 +and for I don't want I need Eglot integration + +00:15:44.680 --> 00:15:50.400 +which I will also be showing you. Takeaways from all this, + +00:15:50.440 --> 00:15:55.279 +if you accept the extra burden + +00:15:55.280 --> 00:16:02.239 +of Corfu terminal for Emacs 30 or earlier Emacs 30s, + +00:16:02.240 --> 00:16:07.559 +it's not too difficult to get this set up running. + +00:16:07.560 --> 00:16:11.759 +Corfu was easier to integrate and configure than Company, + +00:16:11.760 --> 00:16:13.799 +and it's much lighter in terms + +00:16:13.800 --> 00:16:20.039 +of number of lines, et cetera. I learned a lot. + +00:16:20.040 --> 00:16:25.159 +Well, actually, yes, with the help of Cape, + +00:16:25.160 --> 00:16:27.399 +but it is much lighter and much easier + +00:16:27.400 --> 00:16:30.119 +to integrate and configure. + +00:16:30.120 --> 00:16:34.879 +I've learned a lot about computational functions in the process, + +00:16:34.880 --> 00:16:40.439 +which is, something that is always nice to learn new things + +00:16:40.440 --> 00:16:45.039 +and the Nerd Icons Corfu makes the + +00:16:45.040 --> 00:16:48.319 +at least at this point in time I might get tired of it + +00:16:48.320 --> 00:16:50.399 +but at this point in time it makes + +00:16:50.400 --> 00:16:53.679 +a makes a very nice overall look + +00:16:53.680 --> 00:16:58.039 +and look and feel for for Emacs. + +00:16:58.040 --> 00:17:02.039 +requests to whom it may concern cape has nice features + +00:17:02.040 --> 00:17:06.279 +that maybe could make their way into emacs + +00:17:06.280 --> 00:17:09.159 +i'm thinking basically about this cape super fun + +00:17:09.160 --> 00:17:12.399 +uh super function super cape function functionality + +00:17:12.400 --> 00:17:18.799 +which is very nice and overcomes the problem of linking + +00:17:18.800 --> 00:17:22.239 +and this exclusive and all this kind of things + +00:17:22.240 --> 00:17:26.479 +that we have currently in Corfu + +00:17:26.480 --> 00:17:28.439 +with the computational point functions. + +00:17:28.440 --> 00:17:32.959 +Corfu is also really nice to have and it's not too big + +00:17:32.960 --> 00:17:35.559 +so is there any possibility + +00:17:35.560 --> 00:17:40.079 +that it makes its way into Emacs? + +00:17:40.080 --> 00:17:42.399 +Please keep Yarn Snippet alive. + +00:17:42.400 --> 00:17:48.559 +I'm not saying here that my pull request should be there, + +00:17:48.560 --> 00:17:51.559 +but it would be nice if someone took a look + +00:17:51.560 --> 00:17:57.399 +and made it part of Yarn Snippet. + +00:17:57.400 --> 00:18:01.799 +And PS, currently on master, + +00:18:01.800 --> 00:18:07.799 +there's a lot of semantic highlighting going on, + +00:18:07.800 --> 00:18:13.719 +which is very, very nice. No criticism on that. + +00:18:13.720 --> 00:18:19.639 +but you may need to add to your snippet hook + +00:18:19.640 --> 00:18:25.039 +this simple local value for ElixirFontify semantically + +00:18:25.040 --> 00:18:30.719 +because at least in my case I felt that + +00:18:30.720 --> 00:18:32.439 +the face were a bit too pushy + +00:18:32.440 --> 00:18:37.280 +so I had to make a snippet mode + +00:18:37.334 --> 00:18:41.279 +use the old Emacs Lisp fontification. + +00:18:41.280 --> 00:18:46.279 +That's what we want to talk about. + +00:18:46.280 --> 00:18:54.999 +Any initial reactions to this? There's a question here. + +00:18:55.000 --> 00:18:59.159 +Someone asked, did you try Jasnepet Cup? + +00:18:59.160 --> 00:19:05.959 +If so, what did you miss from this approach? I tried that. + +00:19:05.960 --> 00:19:11.239 +And it's not that I missed anything. + +00:19:11.240 --> 00:19:16.519 +It was more or less that I wanted to do it myself. + +00:19:16.520 --> 00:19:24.159 +So I wanted to see what was behind it. That's my answer. + +00:19:24.160 --> 00:19:26.679 +There are lots of packages there, + +00:19:26.680 --> 00:19:31.719 +but I try to keep learning. So, this was a nice objective + +00:19:31.720 --> 00:19:40.159 +to learn a bit more about Emacs. And now, just a second. + +00:19:40.160 --> 00:19:44.879 +Now, a small demo. This is the interaction. + +00:19:44.880 --> 00:19:47.199 +And as you see, I have the snippet there. + +00:19:47.200 --> 00:19:52.879 +and I have a couple of snippets. + +00:19:52.880 --> 00:19:55.839 +So, for example, if I would like to say + +00:19:55.840 --> 00:19:58.879 +I want to define a function, I can go like this. + +00:19:58.880 --> 00:20:00.519 +And what you see here is that + +00:20:00.520 --> 00:20:04.319 +I have two snippets appearing and then some variables. + +00:20:04.320 --> 00:20:09.879 +So, I could go for def one or if I want a key map, for def key map, + +00:20:09.880 --> 00:20:11.479 +which would be something like this. + +00:20:11.480 --> 00:20:18.319 +And then when I press enter, I get directly into the map + +00:20:18.320 --> 00:20:26.719 +and I could say like, Show off mob. + +00:20:26.720 --> 00:20:30.079 +Then it sets out directly a prefix T, + +00:20:30.080 --> 00:20:35.039 +which is something that I asked for in Emacs master. + +00:20:35.040 --> 00:20:39.479 +So with prefix T, for those who prefix it true, + +00:20:39.480 --> 00:20:41.399 +for those who don't know it, + +00:20:41.400 --> 00:20:46.799 +it makes integrating this into keymaps in use package much easier. + +00:20:46.800 --> 00:20:51.119 +So the next thing would be + +00:20:51.120 --> 00:20:55.999 +I would like to write a description + +00:20:56.000 --> 00:21:04.999 +like for example a cool show off team up + +00:21:05.000 --> 00:21:08.599 +and then my keys are my functions and that would be it + +00:21:08.600 --> 00:21:15.839 +but you also have like but also have like this define function + +00:21:15.840 --> 00:21:21.679 +and of course you can say that's nice but there's no + +00:21:21.680 --> 00:21:23.799 +but you're not showing the integration + +00:21:23.800 --> 00:21:25.439 +with Eglot and you're right. + +00:21:25.440 --> 00:21:30.279 +So I'm going just to open up a small program + +00:21:30.280 --> 00:21:33.319 +that I'm currently developing in Python. + +00:21:33.320 --> 00:21:38.239 +X is a tool to do things in MP3. + +00:21:38.240 --> 00:21:42.279 +And here I would have like all these things. + +00:21:42.280 --> 00:21:45.359 +As you see here in the bottom, + +00:21:45.360 --> 00:21:49.079 +service running, pilot is local, eglot is active. + +00:21:49.080 --> 00:21:57.919 +So I have my eglot stop and then I go down. + +00:21:57.920 --> 00:22:00.519 +And I want to add a new argument here. + +00:22:00.520 --> 00:22:08.799 +I would go like for it. I would go like add flag. + +00:22:08.800 --> 00:22:13.759 +For example, I would add a flag + +00:22:13.760 --> 00:22:21.759 +and I would get a new flag to add here. + +00:22:21.760 --> 00:22:33.119 +Oops. Of course, this is integrated into Eagle Lord. + +00:22:33.120 --> 00:22:42.759 +So I'm getting your information about what I have. + +00:22:42.760 --> 00:22:52.359 +I don't have OS, so I would need to import here, + +00:22:52.360 --> 00:22:59.279 +but I can go up just to see + +00:22:59.280 --> 00:23:01.759 +if I would like to, for example, + +00:23:01.760 --> 00:23:11.879 +create a new a regular expression + +00:23:11.880 --> 00:23:15.439 +I'm getting this information that you see right now on call + +00:23:15.440 --> 00:23:17.359 +for I'm getting that from Eglot + +00:23:17.360 --> 00:23:18.919 +so you see there's the integration + +00:23:18.920 --> 00:23:20.839 +with with Eglot too in Python + +00:23:20.840 --> 00:23:23.559 +I have Eglot and as you've seen + +00:23:23.560 --> 00:23:30.239 +I also have the and all these are snippets fine + +00:23:30.240 --> 00:23:38.199 +more reactions and questions + +00:23:38.200 --> 00:23:54.239 +Because that would be my show off here. + +00:23:54.240 --> 00:23:56.759 +Any questions? Any more questions on the pad? + +00:23:56.760 --> 00:24:11.479 +but anyhow i'm going to try + +00:24:11.480 --> 00:24:13.239 +i'm going to try your snippet too + +00:24:13.240 --> 00:24:16.279 +and i'm going to be answering this question more + +00:24:16.280 --> 00:24:21.079 +yeah time is good okay fine + +00:24:21.080 --> 00:24:30.039 +so I would be done if there's no more reactions + +00:24:30.040 --> 00:24:33.239 +thank you so much You're welcome. + +00:24:33.240 --> 00:24:34.919 +If you have any other questions, folks, + +00:24:34.920 --> 00:24:37.079 +you can always follow up on the pad. + +00:24:37.080 --> 00:24:39.639 +That was a great demonstration, and I'm sure lots of people + +00:24:39.640 --> 00:24:43.519 +are looking forward to trying it out. + +00:24:43.520 --> 00:24:45.239 +Oh, I see some questions coming in now. + +00:24:45.240 --> 00:24:46.199 +You may go ahead if you like. + +00:24:46.200 --> 00:24:51.879 +okay fine uh what uh there's someone asking + +00:24:51.880 --> 00:24:57.079 +what do special characters in your snippets work well too + +00:24:57.080 --> 00:25:02.479 +what kind of i don't use special characters in the key name + +00:25:02.480 --> 00:25:05.199 +so in this case everything works quite nicely + +00:25:05.200 --> 00:25:11.359 +and then i'm passing i'm passing the control to your snippets + +00:25:11.360 --> 00:25:13.679 +so if there's any problem in your snippets + +00:25:13.680 --> 00:25:15.359 +with uh special characters + +00:25:15.360 --> 00:25:24.399 +that i don't know I don't use that as a key. + +00:25:24.400 --> 00:25:30.519 +I'm just using for key names. + +00:25:30.520 --> 00:25:38.399 +I normally use a, I only use letters, but that should work. + +00:25:38.400 --> 00:25:43.959 +I mean, let's, uh, let's give it a trial. + +00:25:43.960 --> 00:25:58.039 +Let's kill here. Yes. I don't want, I don't want to touch this. + +00:25:58.040 --> 00:26:01.039 +Ugh. let's go into this one uh + +00:26:01.040 --> 00:26:06.920 +let's say I'm going to define this for example like this + +00:26:06.959 --> 00:26:10.919 +and I'm going to create a new snippet + +00:26:10.920 --> 00:26:15.359 +I'm going to create a new snippet + +00:26:15.360 --> 00:26:18.119 +and use this is for example when you look at this + +00:26:18.120 --> 00:26:20.599 +if you if you have the the venue uh the new + +00:26:20.600 --> 00:26:26.159 +sorry the new way of the the new emacs uh + +00:26:26.160 --> 00:26:31.639 +semantical highlighting working + +00:26:31.640 --> 00:26:39.199 +this would be quite cramped this is why i'm using + +00:26:39.200 --> 00:26:43.039 +this is why i said uh the snippet the + +00:26:43.040 --> 00:26:49.039 +so is this more or less what you're talking about + +00:26:49.040 --> 00:27:01.479 +This is what you're talking about. Snippet. Save the snippet. + +00:27:01.480 --> 00:27:15.479 +So I'm going to... Snippet, load and put window. + +00:27:15.480 --> 00:27:21.279 +Enable interaction mode. Yes, I'm going to save. + +00:27:21.280 --> 00:27:24.439 +And I'm going to save that as FD test. on the file. + +00:27:24.440 --> 00:27:41.479 +No, I'm going to save this. Load. Load input window. + +00:27:41.480 --> 00:27:53.679 +I'm going to put this in Emacs Lisp mode. I want to save it. No. + +00:27:53.680 --> 00:28:27.359 +I'm going to write that directly into Emacs Lisp mode. + +00:28:27.360 --> 00:28:30.639 +going to go back into scratch buffer + +00:28:30.640 --> 00:28:43.079 +and here I have it and we have it here but anyhow + +00:28:43.080 --> 00:28:52.079 +and I'm just going to try to see if I feel like empty of course + +00:28:52.080 --> 00:28:58.839 +there's only one it will not show in Corfu, + +00:28:58.840 --> 00:29:01.519 +but I mean, I don't have any problems + +00:29:01.520 --> 00:29:20.999 +with that, as you see. Was that what you were meaning? + +00:29:21.000 --> 00:29:24.839 +Yeah, I guess that works. Fine. + +00:29:24.840 --> 00:29:29.039 +All right, shall we wrap up here + +00:29:29.040 --> 00:29:31.279 +so that you can have supper + +00:29:31.280 --> 00:29:40.919 +and have lunch and other things? Okay, fine for me. + +00:29:40.920 --> 00:29:46.319 +I was hoping to see the drop down. Just a second. + +00:29:46.320 --> 00:29:49.959 +I think we can do that too. Two seconds. + +00:29:49.960 --> 00:29:52.559 +How can we do that with a drop down? + +00:29:52.560 --> 00:29:57.719 +Yeah, if I say something like this. + +00:29:57.720 --> 00:30:04.919 +And then I go and save it. + +00:30:04.920 --> 00:30:08.799 +And I'm going to go and write this + +00:30:08.800 --> 00:30:16.719 +into, with a second, fine. + +00:30:16.720 --> 00:30:19.919 +And now I need to quit here, sorry. + +00:30:19.920 --> 00:30:26.639 +And I'm going to come back in a second with another remark. + +00:30:26.640 --> 00:30:31.559 +Well, I'm bringing back and now let's see. + +00:30:31.560 --> 00:30:34.839 +Let's see what we have in your snippets. + +00:30:34.840 --> 00:30:44.159 +It's not there. Why not? Just a second. Let's see if I go. + +00:30:44.160 --> 00:30:47.839 +I don't know if it matters that the name was + +00:30:47.840 --> 00:30:52.599 +that didn't have the characters in the beginning. + +00:30:52.600 --> 00:31:03.159 +Just a second. I think I know what is happening here. + +00:31:03.160 --> 00:31:21.439 +Do I have here? I have them. I'm going to clean. + +00:31:21.440 --> 00:31:28.879 +Oh, you're back in your home directories. Why? + +00:31:28.880 --> 00:31:35.879 +CD dash to get back in. Yeah. That's right. + +00:31:35.880 --> 00:31:37.799 +So you see how the name also has + +00:31:37.800 --> 00:31:39.319 +it doesn't have the same as the keys. + +00:31:39.320 --> 00:31:41.039 +I don't know if that affects what shows up. + +00:31:41.040 --> 00:31:49.399 +Yeah, we we can try that. That's a quick one. This is my. + +00:31:49.400 --> 00:31:51.279 +Fine, now that I have this, + +00:31:51.280 --> 00:31:55.359 +which is going to be quicker, we check again. + +00:31:55.360 --> 00:31:57.919 +They both seem to be the same now + +00:31:57.920 --> 00:32:03.079 +and I don't know if that affects, but anyhow, let's try it. + +00:32:03.080 --> 00:32:07.679 +I go and then I look at the AR snippets, if it's there. + +00:32:07.680 --> 00:32:11.879 +Yes, it is. Yeah, it's there. + +00:32:11.880 --> 00:32:18.559 +And then if I say there, there you are. Oh, look at that. + +00:32:18.560 --> 00:32:24.159 +It doesn't seem to be affecting. Fantastic. + +00:32:24.160 --> 00:32:32.119 +And by the way, it is there. + +00:32:32.120 --> 00:32:33.999 +Yeah, I really should spend time + +00:32:34.000 --> 00:32:36.599 +getting more templates set up with Snippet. + +00:32:36.600 --> 00:32:37.639 +I really love the fact that + +00:32:37.640 --> 00:32:40.399 +you can evaluate Emacs Lisp in it too. + +00:32:40.400 --> 00:32:43.399 +Yeah, I mean, just to make it bigger, + +00:32:43.400 --> 00:32:51.359 +try that because if I go into my, for example, + +00:32:51.360 --> 00:32:55.679 +into my org mode stuff + +00:32:55.680 --> 00:32:59.439 +and in my org mode, I go to the article, + +00:32:59.440 --> 00:33:03.319 +which is one of the big ones. + +00:33:03.320 --> 00:33:06.199 +I have things like, for example, + +00:33:06.200 --> 00:33:10.719 +I defined a couple of functions here to do if it's empty, + +00:33:10.720 --> 00:33:16.399 +if that is empty, just add a white space. + +00:33:16.400 --> 00:33:19.599 +If one is empty, add a white space. + +00:33:19.600 --> 00:33:23.319 +add a white space here so it becomes a comment. + +00:33:23.320 --> 00:33:27.279 +I have functions for to do more things on that + +00:33:27.280 --> 00:33:29.799 +and I also have like menus to see + +00:33:29.800 --> 00:33:33.599 +what language I want to choose for + +00:33:33.600 --> 00:33:37.079 +for my spell checking and so on so + +00:33:37.080 --> 00:33:40.319 +and that's all that's as you see + +00:33:40.320 --> 00:33:41.959 +this is a Lisp being evaluated + +00:33:41.960 --> 00:33:45.119 +so yes do I really encourage you + +00:33:45.120 --> 00:33:46.519 +I've also heard people use it, + +00:33:46.520 --> 00:33:47.799 +like, especially if they're working + +00:33:47.800 --> 00:33:49.919 +in different programming languages, + +00:33:49.920 --> 00:33:52.399 +so they can just have the syntax + +00:33:52.400 --> 00:33:54.359 +for the different languages + +00:33:54.360 --> 00:33:58.239 +be condensed into a consistent abbreviation. Yeah. + +00:33:58.240 --> 00:34:01.319 +And look, this is my article. I have another. + +00:34:01.320 --> 00:34:07.799 +This is when I'm writing articles. I have another one. + +00:34:07.800 --> 00:34:10.279 +I have another one for writing letters + +00:34:10.280 --> 00:34:14.399 +in org mode and so on. So, it's like letter, block, + +00:34:14.400 --> 00:34:16.559 +and you have the complete infrastructure + +00:34:16.560 --> 00:34:20.159 +and you don't have to type it by hand. + +00:34:20.160 --> 00:34:22.879 +So, it's really, really nice. + +00:34:22.880 --> 00:34:25.959 +Hmm, I think it might be nice to have + +00:34:25.960 --> 00:34:28.079 +a future Emacs carnival, you know, + +00:34:28.080 --> 00:34:31.239 +shared blogging theme thing be around + +00:34:31.240 --> 00:34:33.359 +having people share their snippets. + +00:34:33.360 --> 00:34:39.359 +No snippets and other things like for example, + +00:34:39.360 --> 00:34:41.319 +this is something stupid. + +00:34:41.320 --> 00:34:44.519 +I'm switching my themes. All right. + +00:34:44.520 --> 00:34:48.639 +And of course, there you see, + +00:34:48.640 --> 00:34:51.439 +I have also, this is also with, + +00:34:51.440 --> 00:34:54.519 +this is my way of switching buffers, + +00:34:54.520 --> 00:34:58.159 +which is with the shift control and tab, + +00:34:58.160 --> 00:35:00.559 +I can switch different families + +00:35:00.560 --> 00:35:02.519 +and then when I'm in a family, + +00:35:02.520 --> 00:35:06.999 +I can go and switch with control tab between the different, + +00:35:07.000 --> 00:35:15.599 +I'm using tab line by the way. I'm not using the other one. + +00:35:15.600 --> 00:35:20.839 +I'm using the old plain tab line with my themes. + +00:35:20.840 --> 00:35:23.519 +So that's more or less everything. + +00:35:23.520 --> 00:35:26.519 +Thank you for the peek into your workflow. + +00:35:26.520 --> 00:35:30.759 +I will work on getting the recordings for the live talks + +00:35:30.760 --> 00:35:33.919 +sorted out at some point very soon. + +00:35:33.920 --> 00:35:37.839 +I might even be able to get them out next week. + +00:35:37.840 --> 00:35:44.920 +So thanks again. All right. Have a nice supper. Same to you. diff --git a/2025/captions/emacsconf-2025-gardening--gardening-in-emacs-a-windows-users-tale-of-tending-tweaking-and-triumph--marco-bresciani--main--chapters.vtt b/2025/captions/emacsconf-2025-gardening--gardening-in-emacs-a-windows-users-tale-of-tending-tweaking-and-triumph--marco-bresciani--main--chapters.vtt new file mode 100644 index 00000000..0b803303 --- /dev/null +++ b/2025/captions/emacsconf-2025-gardening--gardening-in-emacs-a-windows-users-tale-of-tending-tweaking-and-triumph--marco-bresciani--main--chapters.vtt @@ -0,0 +1,32 @@ +WEBVTT + + +00:00:05.980 --> 00:00:39.039 +Introduction + +00:00:39.040 --> 00:02:11.519 +What is a digital garden? + +00:02:11.520 --> 00:03:39.199 +Why a digital garden? + +00:03:39.200 --> 00:04:57.439 +How to digital garden? + +00:04:57.440 --> 00:08:18.819 +How to make Emacs portable, on Windows + +00:08:18.820 --> 00:10:36.119 +My Emacs customization + +00:10:36.120 --> 00:14:50.659 +PlantUML and Japanese + +00:14:50.660 --> 00:16:04.519 +My Org Mode publishing configuration + +00:16:04.520 --> 00:17:03.279 +The final result + +00:17:03.280 --> 00:17:36.880 +Thank you for listening diff --git a/2025/captions/emacsconf-2025-gardening--gardening-in-emacs-a-windows-users-tale-of-tending-tweaking-and-triumph--marco-bresciani--main.vtt b/2025/captions/emacsconf-2025-gardening--gardening-in-emacs-a-windows-users-tale-of-tending-tweaking-and-triumph--marco-bresciani--main.vtt new file mode 100644 index 00000000..b853b855 --- /dev/null +++ b/2025/captions/emacsconf-2025-gardening--gardening-in-emacs-a-windows-users-tale-of-tending-tweaking-and-triumph--marco-bresciani--main.vtt @@ -0,0 +1,1110 @@ +WEBVTT captioned by rodion + +NOTE Introduction + +00:00:05.980 --> 00:00:08.959 +Hello, everyone. My name is Marco + +00:00:08.960 --> 00:00:13.359 +and today I'll talk about gardening with Emacs. + +00:00:13.360 --> 00:00:17.199 +Gardening? Yes, but digital gardening, obviously. + +00:00:17.200 --> 00:00:20.359 +But first, one thing: I'm sorry, yes, + +00:00:20.360 --> 00:00:22.519 +I'm a Microsoft Windows user. + +00:00:22.520 --> 00:00:24.679 +I know, I know. I said I'm sorry. + +00:00:24.680 --> 00:00:26.159 +Please stick with me. + +00:00:26.160 --> 00:00:27.319 +Do not skip this talk! + +00:00:27.320 --> 00:00:31.199 +Promise, I'll show you only free software! + +00:00:31.200 --> 00:00:33.199 +And speaking about free software, + +00:00:33.200 --> 00:00:35.919 +yes, this presentation is not made with Emacs, + +00:00:35.920 --> 00:00:39.039 +but I made it with LibreOffice. + +NOTE What is a digital garden? + +00:00:39.040 --> 00:00:41.999 +So what is a digital garden? + +00:00:42.000 --> 00:00:43.319 +A digital garden is + +00:00:43.320 --> 00:00:45.479 +your personal corner of the internet + +00:00:45.480 --> 00:00:47.839 +to cultivate ideas. + +00:00:47.840 --> 00:00:50.079 +Think of it like a real garden + +00:00:50.080 --> 00:00:54.394 +where you plant seeds (your new thoughts), + +00:00:54.395 --> 00:00:57.379 +you water them (you add the details), + +00:00:57.380 --> 00:00:59.959 +and watch them grow. + +00:00:59.960 --> 00:01:03.199 +Unlike a fixed-date blog, + +00:01:03.200 --> 00:01:06.319 +which shows only polished results, + +00:01:06.320 --> 00:01:09.279 +a garden includes works-in-progress-- + +00:01:09.280 --> 00:01:12.479 +like seedlings in a greenhouse. + +00:01:12.480 --> 00:01:14.759 +It's a network of notes + +00:01:14.760 --> 00:01:17.319 +connected by links and tags, + +00:01:17.320 --> 00:01:21.279 +helping you see patterns in your thinking. + +00:01:21.280 --> 00:01:24.159 +Here, the ideas are not static; + +00:01:24.160 --> 00:01:26.399 +they evolve as you learn, + +00:01:26.400 --> 00:01:29.359 +creating a living archive of your mind, + +00:01:29.360 --> 00:01:37.739 +just like the plants in a garden grow. + +00:01:37.740 --> 00:01:41.519 +Also here, instead of the blog platform, + +00:01:41.520 --> 00:01:46.879 +you decide the tools, the look, and your pace. + +00:01:46.880 --> 00:01:50.599 +I'll show you how I run my garden + +00:01:50.600 --> 00:01:53.039 +with plain Org Mode files + +00:01:53.040 --> 00:01:55.639 +and our favorite Emacs. + +00:01:55.640 --> 00:01:57.879 +In short: a digital garden + +00:01:57.880 --> 00:02:01.039 +is a flexible, pressure-free space + +00:02:01.040 --> 00:02:04.212 +to explore, learn in public + +00:02:04.213 --> 00:02:07.159 +and connect the knowledge-- + +00:02:07.160 --> 00:02:11.519 +your own digital ecosystem. + +NOTE Why a digital garden? + +00:02:11.520 --> 00:02:13.559 +Why a digital garden? + +00:02:13.560 --> 00:02:17.359 +Well, a digital garden keeps knowledge alive: + +00:02:17.360 --> 00:02:21.039 +instead of freezing content after "publish," + +00:02:21.040 --> 00:02:22.399 +you revisit and refine it, + +00:02:22.400 --> 00:02:26.079 +so ideas stay accurate and useful. + +00:02:26.080 --> 00:02:29.239 +By sharing half-formed thoughts early, + +00:02:29.240 --> 00:02:31.559 +you lower the barrier to writing + +00:02:31.560 --> 00:02:34.159 +and let concepts evolve gradually-- + +00:02:34.160 --> 00:02:37.839 +no need to wait for one "perfect" essay. + +00:02:37.840 --> 00:02:41.119 +Links and tags weave ideas together, + +00:02:41.120 --> 00:02:43.479 +revealing unexpected patterns + +00:02:43.480 --> 00:02:46.439 +that isolated posts would hide. + +00:02:46.440 --> 00:02:49.919 +This approach sheds perfectionism, + +00:02:49.920 --> 00:02:52.559 +encouraging small, regular updates + +00:02:52.560 --> 00:02:55.879 +that build momentum and invite collaboration. + +00:02:55.880 --> 00:03:00.079 +Well, actually, even not regular updates are fine. + +00:03:00.080 --> 00:03:04.879 +Early readers can offer feedback, share resources, + +00:03:04.880 --> 00:03:07.239 +or identify blind spots, + +00:03:07.240 --> 00:03:12.039 +accelerating your and their improvement. + +00:03:12.040 --> 00:03:14.719 +Over time, your garden can become + +00:03:14.720 --> 00:03:18.439 +a searchable showcase of your thinking, + +00:03:18.440 --> 00:03:21.239 +a living résumé for collaborators, peers, + +00:03:21.240 --> 00:03:25.919 +or anyone curious about how you learn. + +00:03:25.920 --> 00:03:27.799 +And what about me? + +00:03:27.800 --> 00:03:29.119 +Why a digital garden? + +00:03:29.120 --> 00:03:33.139 +Well, I actually have started a digital garden + +00:03:33.140 --> 00:03:39.199 +to learn Emacs and Org Mode. + +NOTE How to digital garden? + +00:03:39.200 --> 00:03:41.439 +How to digital garden? + +00:03:41.440 --> 00:03:42.999 +Well, start simple. + +00:03:43.000 --> 00:03:45.079 +Pick one place for your notes + +00:03:45.080 --> 00:03:46.119 +and put them online. + +00:03:46.120 --> 00:03:50.419 +Even the worst Github ever out there is fine. + +00:03:50.420 --> 00:03:53.519 +Then, well, maybe you can move out of GitHub, + +00:03:53.520 --> 00:03:55.019 +but that's another story. + +00:03:55.020 --> 00:03:57.919 +Capture your ideas quickly. + +00:03:57.920 --> 00:04:00.239 +Publish them, even rough, + +00:04:00.240 --> 00:04:02.939 +and maybe, if you want, tag them as seeds + +00:04:02.940 --> 00:04:06.439 +to let the other people know they are rough. + +00:04:06.440 --> 00:04:09.439 +Learning in public is useful + +00:04:09.440 --> 00:04:11.579 +because link-related pages + +00:04:11.580 --> 00:04:16.859 +so that readers can work through your thinking, + +00:04:16.860 --> 00:04:19.919 +helping them see your connections. + +00:04:19.920 --> 00:04:22.039 +Once a week or whenever you want, + +00:04:22.040 --> 00:04:24.959 +prune outdated pieces if you want + +00:04:24.960 --> 00:04:26.519 +or keep them there + +00:04:26.520 --> 00:04:30.459 +and add fresh insights if you have any. + +00:04:30.460 --> 00:04:33.399 +Share your updates openly. + +00:04:33.400 --> 00:04:38.079 +Invite comments because steady small steps + +00:04:38.080 --> 00:04:41.559 +will keep the garden thriving. + +00:04:41.560 --> 00:04:43.239 +And what about me? + +00:04:43.240 --> 00:04:46.359 +How I do digital garden work with Emacs? + +00:04:46.360 --> 00:04:51.139 +With Org Mode and its publishing to HTML file, + +00:04:51.140 --> 00:04:57.439 +and we will see it in a moment. + +NOTE How to make Emacs portable, on Windows + +00:04:57.440 --> 00:05:01.319 +How to make Emacs portable on Windows + +00:05:01.320 --> 00:05:03.699 +is the first topic. + +00:05:03.700 --> 00:05:05.999 +Well, being in Windows, + +00:05:06.000 --> 00:05:08.739 +I have the advantage and the possibility + +00:05:08.740 --> 00:05:10.879 +to bring and use my data + +00:05:10.880 --> 00:05:14.299 +and software basically everywhere: + +00:05:14.300 --> 00:05:18.159 +home, office, my sister-in-law's PC + +00:05:18.160 --> 00:05:19.439 +when she needs technical help, + +00:05:19.440 --> 00:05:21.439 +friends and the like. + +00:05:21.440 --> 00:05:23.239 +So for these reasons, + +00:05:23.240 --> 00:05:25.319 +it's been many, many years + +00:05:25.320 --> 00:05:28.519 +I'm using exclusively portable applications + +00:05:28.520 --> 00:05:31.539 +that do not need an installation + +00:05:31.540 --> 00:05:33.239 +and bring their own data + +00:05:33.240 --> 00:05:37.319 +and configuration bundled together. + +00:05:37.320 --> 00:05:38.799 +And now also Emacs is portable, + +00:05:38.800 --> 00:05:43.679 +inside my tiny, really tiny, USB key. + +00:05:43.680 --> 00:05:44.839 +How? + +00:05:44.840 --> 00:05:46.919 +I mean: not being sure + +00:05:46.920 --> 00:05:48.799 +if my USB key drive letter + +00:05:48.800 --> 00:05:52.119 +will be D:, E:, K:, + +00:05:52.120 --> 00:05:53.639 +or whatever other drive letter + +00:05:53.640 --> 00:05:54.759 +will be assigned to it + +00:05:54.760 --> 00:05:57.719 +by the system I'm plugging it into, + +00:05:57.720 --> 00:06:00.319 +how can I specify, to Emacs, + +00:06:00.320 --> 00:06:04.439 +that its home folder is on my USB? + +00:06:04.440 --> 00:06:07.359 +Well, I could maybe have used relative paths, + +00:06:07.360 --> 00:06:10.879 +but then, where's the fun of hacking things? + +00:06:10.880 --> 00:06:12.699 +The trick here is + +00:06:12.700 --> 00:06:17.679 +the not-so-well-known ~dp0 system variable + +00:06:17.680 --> 00:06:20.699 +that contains the execution directory + +00:06:20.700 --> 00:06:25.519 +full path of the executable file. + +00:06:25.520 --> 00:06:29.039 +And yes, it ends with a backslash, + +00:06:29.040 --> 00:06:33.339 +so composing it with other literal paths is ugly as well. + +00:06:33.340 --> 00:06:37.539 +The ~dp0 variable is only available + +00:06:37.540 --> 00:06:40.759 +inside a batch file during its execution, + +00:06:40.760 --> 00:06:46.719 +and expands to the drive (d) and the path (p), + +00:06:46.720 --> 00:06:50.700 +in which that batch file (0th) + +00:06:50.701 --> 00:06:55.499 +command line parameter is located + +00:06:55.500 --> 00:06:58.439 +(that obviously cannot change + +00:06:58.440 --> 00:07:02.399 +because it's executing). + +00:07:02.400 --> 00:07:04.679 +The data are obtained + +00:07:04.680 --> 00:07:08.733 +from the %0 system variable + +00:07:08.734 --> 00:07:10.599 +that contains the batch file name. + +00:07:10.600 --> 00:07:12.439 +I actually have never tried, + +00:07:12.440 --> 00:07:16.279 +but it should even allow to let the batch run + +00:07:16.280 --> 00:07:19.819 +from a UNC network location + +00:07:19.820 --> 00:07:22.639 +with no mapped drive letter at all! + +00:07:22.640 --> 00:07:24.279 +And that's the batch file + +00:07:24.280 --> 00:07:28.279 +I'm using to run Emacs with an automatically selected + +00:07:28.280 --> 00:07:31.139 +and fixed Emacs folder, + +00:07:31.140 --> 00:07:33.119 +emacshome folder, + +00:07:33.120 --> 00:07:35.899 +sibling of the unzipped Emacs one, + +00:07:35.900 --> 00:07:37.679 +regardless the computer I'm in + +00:07:37.680 --> 00:07:40.219 +and the assigned drive letter. + +00:07:40.220 --> 00:07:42.159 +If you need a portable Emacs, + +00:07:42.160 --> 00:07:45.519 +this is probably the simplest way to go! + +00:07:45.520 --> 00:07:48.399 +Just put the runemacs.bat file + +00:07:48.400 --> 00:07:50.079 +in your unzipped Emacs + +00:07:50.080 --> 00:07:54.379 +(well, 30.2 actually now) bin folder, + +00:07:54.380 --> 00:07:56.519 +and your Emacs and its configuration + +00:07:56.520 --> 00:07:58.619 +will always be there with you. + +00:07:58.620 --> 00:08:00.199 +With this, I'm basically + +00:08:00.200 --> 00:08:01.559 +creating the possibility + +00:08:01.560 --> 00:08:05.239 +to bring my own digital garden with me, + +00:08:05.240 --> 00:08:09.466 +just like a little desk Zen garden, + +00:08:09.467 --> 00:08:11.479 +and together with it, also, + +00:08:11.480 --> 00:08:13.859 +all the tools that I need to work on it, + +00:08:13.860 --> 00:08:18.819 +always with me, in my USB key. + +NOTE My Emacs customization + +00:08:18.820 --> 00:08:20.679 +Speaking about configuration, + +00:08:20.680 --> 00:08:22.199 +here comes the second topic: + +00:08:22.200 --> 00:08:25.479 +my Emacs customization. + +00:08:25.480 --> 00:08:28.079 +Having a portable Emacs allows to + +00:08:28.080 --> 00:08:31.319 +always have the configuration with me. + +00:08:31.320 --> 00:08:33.559 +Yes, okay, but which configuration? + +00:08:33.560 --> 00:08:38.519 +Well, obviously, I'm speaking of the init.el file + +00:08:38.520 --> 00:08:41.999 +that lives inside of the emacs.d folder + +00:08:42.000 --> 00:08:45.239 +in my emacshome portable configuration folder + +00:08:45.240 --> 00:08:46.879 +that we just saw. + +00:08:46.880 --> 00:08:48.319 +I'm not an Emacs expert, + +00:08:48.320 --> 00:08:51.519 +but I want to highlight a point here + +00:08:51.520 --> 00:08:55.559 +that has to be clear to every one of us: + +00:08:55.560 --> 00:08:59.159 +the set of basic considerations I had + +00:08:59.160 --> 00:09:02.019 +for text width, tabs versus spaces, + +00:09:02.020 --> 00:09:05.139 +trailing spaces, and so on. + +00:09:05.140 --> 00:09:07.299 +As you can see here, + +00:09:07.300 --> 00:09:08.959 +I'm pretty opinionated, + +00:09:08.960 --> 00:09:10.759 +but this is the important part: + +00:09:10.760 --> 00:09:15.339 +we are lucky enough to be able to use Emacs, + +00:09:15.340 --> 00:09:16.919 +that is presumably + +00:09:16.920 --> 00:09:20.359 +the most highly configurable tool ever, + +00:09:20.360 --> 00:09:21.679 +so let's use it! + +00:09:21.680 --> 00:09:24.279 +Remember that it's your Emacs, + +00:09:24.280 --> 00:09:27.859 +and you can and must configure it + +00:09:27.860 --> 00:09:28.879 +for your needs, + +00:09:28.880 --> 00:09:33.139 +even if it might seem ridiculous to others. + +00:09:33.140 --> 00:09:35.279 +Here, the configuration you see + +00:09:35.280 --> 00:09:37.239 +is not the important part. + +00:09:37.240 --> 00:09:39.759 +The important part is how you feel + +00:09:39.760 --> 00:09:42.419 +with your configuration. + +00:09:42.420 --> 00:09:45.359 +For example: I have a fill-column-indicator + +00:09:45.360 --> 00:09:47.319 +at 72 characters, + +00:09:47.320 --> 00:09:49.479 +I prefer spaces instead of tabs, + +00:09:49.480 --> 00:09:53.019 +no trailing spaces, truncate lines, and so on. + +00:09:53.020 --> 00:09:55.479 +It might seem weird to some of you + +00:09:55.480 --> 00:09:57.959 +and to most of my colleagues + +00:09:57.960 --> 00:09:58.959 +(and friends as well, + +00:09:58.960 --> 00:10:00.619 +but that's another story!) + +00:10:00.620 --> 00:10:02.239 +and it might even be. + +00:10:02.240 --> 00:10:05.199 +But I'm comfortable with my configuration, + +00:10:05.200 --> 00:10:07.599 +and you should be with yours too. + +00:10:07.600 --> 00:10:11.479 +That is: as an owner and worker + +00:10:11.480 --> 00:10:13.479 +of my own digital garden, + +00:10:13.480 --> 00:10:15.719 +it's obviously easier for me + +00:10:15.720 --> 00:10:18.079 +to choose my own tools + +00:10:18.080 --> 00:10:21.039 +and adapt those to my needs, + +00:10:21.040 --> 00:10:23.159 +instead of the opposite! + +00:10:23.160 --> 00:10:25.719 +If I want to put the roses + +00:10:25.720 --> 00:10:27.759 +in a circle instead of a row + +00:10:27.760 --> 00:10:30.399 +that is maybe the best practice, who cares? + +00:10:30.400 --> 00:10:36.119 +It's my garden, and I use it as I want. + +NOTE PlantUML and Japanese + +00:10:36.120 --> 00:10:38.439 +Continuing on the configuration party, + +00:10:38.440 --> 00:10:44.859 +the third topic is PlantUML and Japanese. + +00:10:44.860 --> 00:10:47.199 +Why those two are listed together? + +00:10:47.200 --> 00:10:48.679 +Well, they are weird enough + +00:10:48.680 --> 00:10:50.879 +to be both part of my configuration. + +00:10:50.880 --> 00:10:52.839 +First, I think PlantUML + +00:10:52.840 --> 00:10:55.019 +is a very nice and powerful tool, + +00:10:55.020 --> 00:10:57.359 +so integrating it in Emacs + +00:10:57.360 --> 00:10:58.899 +is pretty useful, + +00:10:58.900 --> 00:11:01.079 +even if I'm currently using it + +00:11:01.080 --> 00:11:04.239 +only to generate SVG images + +00:11:04.240 --> 00:11:08.959 +when publishing my digital garden to HTML. + +00:11:08.960 --> 00:11:10.599 +There are some pain points + +00:11:10.600 --> 00:11:11.759 +that I still have to solve, + +00:11:11.760 --> 00:11:14.739 +and I know that it's also possible to use it + +00:11:14.740 --> 00:11:16.279 +for (pre)viewing diagrams + +00:11:16.280 --> 00:11:19.159 +directly in Emacs, without publishing, + +00:11:19.160 --> 00:11:22.839 +but maybe I don't need this feature at the moment. + +00:11:22.840 --> 00:11:27.119 +And I have to thank our favorite Sacha Chua here, + +00:11:27.120 --> 00:11:29.279 +because she taught me (through Mastodon) + +00:11:29.280 --> 00:11:32.359 +how to automatically answer y, + +00:11:32.360 --> 00:11:33.919 +when publishing in HTML, + +00:11:33.920 --> 00:11:36.919 +every time that PlantUML has to (re)generate an SVG. + +00:11:36.920 --> 00:11:39.199 +So, thank you Sacha. + +00:11:39.200 --> 00:11:41.839 +Moving to Japanese, let me go back to + +00:11:41.840 --> 00:11:43.559 +the previous slide for a moment + +00:11:43.560 --> 00:11:46.319 +to show you a bit more in detail + +00:11:46.320 --> 00:11:49.799 +the coding system I've configured. + +00:11:49.800 --> 00:11:54.239 +If this PC is helping me in moving + +00:11:54.240 --> 00:11:56.359 +back to the previous slide. + +00:11:56.360 --> 00:12:02.519 +Okay, so let me... No, it's not working. + +00:12:02.520 --> 00:12:05.819 +It's not... Okay. + +00:12:05.820 --> 00:12:09.399 +So, speaking about Japanese, + +00:12:09.400 --> 00:12:12.359 +I have studied Japanese. + +00:12:12.360 --> 00:12:13.799 +My wife is Japanese, + +00:12:13.800 --> 00:12:15.599 +but that's a detail. + +00:12:15.600 --> 00:12:18.039 +So I frequently write in Japanese, + +00:12:18.040 --> 00:12:19.639 +and I wanted to write in Japanese + +00:12:19.640 --> 00:12:21.219 +also inside Emacs. + +00:12:21.220 --> 00:12:23.239 +I learned, as you can see, + +00:12:23.240 --> 00:12:25.559 +that UTF-8 DOS + +00:12:25.560 --> 00:12:28.479 +is a more than enough coding system + +00:12:28.480 --> 00:12:31.139 +to allow me writing in the same file, + +00:12:31.140 --> 00:12:35.639 +both Italian with all our accented letters + +00:12:35.640 --> 00:12:40.359 +and Japanese through Windows IME system. + +00:12:40.360 --> 00:12:44.879 +This allows me to properly write, save, read files, + +00:12:44.880 --> 00:12:48.719 +but it was not enough for copying + +00:12:48.720 --> 00:12:51.179 +and pasting Japanese text. + +00:12:51.180 --> 00:12:55.119 +If I copied some Japanese text from the browser + +00:12:55.120 --> 00:12:56.759 +or even from another text editor, + +00:12:56.760 --> 00:12:57.879 +it didn't work. + +00:12:57.880 --> 00:13:00.679 +It only pasted the rubbish in Emacs + +00:13:00.680 --> 00:13:04.559 +until I found out that for whatever reason, + +00:13:04.560 --> 00:13:07.679 +I had to use, as you can see in bold, + +00:13:07.680 --> 00:13:13.279 +UTF-16LE DOS for the selection coding system. + +00:13:13.280 --> 00:13:14.879 +And this basically allows me + +00:13:14.880 --> 00:13:17.719 +to copy Japanese from another file, + +00:13:17.720 --> 00:13:19.599 +text editor, browser, whatever, + +00:13:19.600 --> 00:13:22.699 +and paste it in Emacs and vice versa. + +00:13:22.700 --> 00:13:24.399 +So the lesson here is, + +00:13:24.400 --> 00:13:26.279 +if you need European languages + +00:13:26.280 --> 00:13:29.159 +and Japanese inside your Emacs, + +00:13:29.160 --> 00:13:32.359 +well, this coding system works. + +00:13:32.360 --> 00:13:36.999 +Let me go back to PlantUML and Japanese. + +00:13:37.000 --> 00:13:40.519 +Another interesting thing about Japanese + +00:13:40.520 --> 00:13:44.279 +is this nice macro I found + +00:13:44.280 --> 00:13:46.979 +in the Emacs mailing list + +00:13:46.980 --> 00:13:49.719 +to add furigana to Japanese kanjis + +00:13:49.720 --> 00:13:53.639 +when exporting or publishing to HTML. + +00:13:53.640 --> 00:13:55.559 +It's actually even possible to do the same + +00:13:55.560 --> 00:13:57.679 +with LaTeX export/publish + +00:13:57.680 --> 00:14:00.359 +and I'll give you some references later. + +00:14:00.360 --> 00:14:03.239 +It's very useful because I can show, + +00:14:03.240 --> 00:14:06.859 +as you can see on the example at the bottom, + +00:14:06.860 --> 00:14:10.219 +I can show the easier-to-read pronunciation + +00:14:10.220 --> 00:14:14.079 +even for readers with really basic knowledge of Japanese. + +00:14:14.080 --> 00:14:17.319 +(And it's also useful to myself, actually, + +00:14:17.320 --> 00:14:20.259 +to remember how to pronounce those kanji!) + +00:14:20.260 --> 00:14:22.559 +For those of you that have no idea + +00:14:22.560 --> 00:14:27.039 +on how to read or write Japanese, well, sorry. + +00:14:27.040 --> 00:14:31.479 +As you can see, the garden evolved from the beginning + +00:14:31.480 --> 00:14:33.319 +on how to use Emacs and Org Mode, + +00:14:33.320 --> 00:14:35.199 +and it's evolving further, + +00:14:35.200 --> 00:14:37.399 +and here it's becoming open to + +00:14:37.400 --> 00:14:40.639 +different plants (or PlantUML…) + +00:14:40.640 --> 00:14:43.839 +and also be able to adapt + +00:14:43.840 --> 00:14:50.659 +to different foreign visitors' needs. + +NOTE My Org Mode publishing configuration + +00:14:50.660 --> 00:14:54.879 +Third topic: my Org Mode publishing configuration, + +00:14:54.880 --> 00:14:58.159 +or where the digital garden is born. + +00:14:58.160 --> 00:15:00.839 +The latest (but not least!) part of + +00:15:00.840 --> 00:15:03.359 +the creation and tending of my digital garden + +00:15:03.360 --> 00:15:07.119 +is the publishing file that is needed to export + +00:15:07.120 --> 00:15:11.279 +the whole Org Mode project into HTML. + +00:15:11.280 --> 00:15:14.759 +Here I do not have many fancy configurations, + +00:15:14.760 --> 00:15:19.519 +even though I'm copying the publishing.el file itself + +00:15:19.520 --> 00:15:21.459 +in the output folder, + +00:15:21.460 --> 00:15:24.859 +to make it available in the published version of the garden. + +00:15:24.860 --> 00:15:28.519 +Also I have added the mentioned configuration + +00:15:28.520 --> 00:15:32.979 +to manage SVG (or PNG) exports from PlantUML + +00:15:32.980 --> 00:15:34.279 +(thank you again, Sacha), + +00:15:34.280 --> 00:15:36.999 +and I'm also forcing HTML5 + +00:15:37.000 --> 00:15:40.059 +without scripts as the result format. + +00:15:40.060 --> 00:15:41.239 +Together with this, + +00:15:41.240 --> 00:15:43.439 +I also have a fancy CSS addition + +00:15:43.440 --> 00:15:44.359 +to the default one + +00:15:44.360 --> 00:15:48.239 +that uses the System Font Stack concept + +00:15:48.240 --> 00:15:49.759 +to harmonize fonts + +00:15:49.760 --> 00:15:51.879 +with readers' local systems, + +00:15:51.880 --> 00:15:54.319 +without downloading or injecting + +00:15:54.320 --> 00:15:55.279 +external fonts. + +00:15:55.280 --> 00:15:57.799 +I've customized links and tags a bit, + +00:15:57.800 --> 00:15:59.839 +with the CSS, together with tables + +00:15:59.840 --> 00:16:01.159 +and some other pieces here and there, + +00:16:01.160 --> 00:16:04.519 +but nothing too much fancy. + +NOTE The final result + +00:16:04.520 --> 00:16:08.439 +So, this is one (not-so-)random page + +00:16:08.440 --> 00:16:10.039 +of my digital garden, + +00:16:10.040 --> 00:16:12.359 +or my knowledge 枯山水, + +00:16:12.360 --> 00:16:17.619 +my knowledge Zen garden, as I prefer to call it. + +00:16:17.620 --> 00:16:20.519 +This is, specifically, the page related + +00:16:20.520 --> 00:16:23.639 +to write about the Digital Garden concept itself, + +00:16:23.640 --> 00:16:26.079 +as a sort of meta-writing. + +00:16:26.080 --> 00:16:27.319 +You can see the different + +00:16:27.320 --> 00:16:28.879 +rendering of the links, + +00:16:28.880 --> 00:16:31.639 +depending if they are internal, in blue, + +00:16:31.640 --> 00:16:37.659 +or external to the garden in gray-ish. + +00:16:37.660 --> 00:16:39.439 +You can see the Japanese furigana + +00:16:39.440 --> 00:16:40.919 +on top of the kanjis, + +00:16:40.920 --> 00:16:44.359 +and you also can see the automatic table of contents, + +00:16:44.360 --> 00:16:47.599 +the custom aside component that highlights + +00:16:47.600 --> 00:16:50.819 +the latest modification date, and so on. + +00:16:50.820 --> 00:16:53.279 +Everything I've spoke about here + +00:16:53.280 --> 00:16:55.919 +is available in my digital garden + +00:16:55.920 --> 00:16:57.599 +in my knowledge kare-san-sui, again, + +00:16:57.600 --> 00:17:00.599 +as a sort of self-description + +00:17:00.600 --> 00:17:03.279 +of the digital garden itself. + +NOTE Thank you for listening + +00:17:03.280 --> 00:17:04.279 +Thank you, everyone, + +00:17:04.280 --> 00:17:06.079 +for being with me till the end. + +00:17:06.080 --> 00:17:08.719 +So as I said, if you want more details + +00:17:08.720 --> 00:17:10.039 +about these topics, + +00:17:10.040 --> 00:17:13.159 +take a look at my knowledge kare-san-sui. + +00:17:13.160 --> 00:17:16.359 +The link is here, and feel free to contact me + +00:17:16.360 --> 00:17:17.479 +through Delta Chat + +00:17:17.480 --> 00:17:20.319 +at this email address. + +00:17:20.320 --> 00:17:21.319 +Yes, I know. + +00:17:21.320 --> 00:17:23.719 +It's a Microsoft email address. + +00:17:23.720 --> 00:17:25.079 +It's an old one. + +00:17:25.080 --> 00:17:29.019 +I recycled it. I know. It's my fault. + +00:17:29.020 --> 00:17:36.880 +Thank you again, and happy Emacs everyone! diff --git a/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--answers.vtt b/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--answers.vtt new file mode 100644 index 00000000..c9034d0b --- /dev/null +++ b/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--answers.vtt @@ -0,0 +1,448 @@ +WEBVTT + +00:00:00.000 --> 00:00:02.219 +I first of all want to address the feedback. + +00:00:02.220 --> 00:00:06.099 +You're absolutely right. I should have stuck to one theme. + +00:00:06.100 --> 00:00:09.099 +Unfortunately, I was using vanilla Emacs + +00:00:09.100 --> 00:00:10.299 +and not my own config. + +00:00:10.300 --> 00:00:13.459 +So to show that it can work, apologies for that. + +00:00:13.460 --> 00:00:18.419 +I will keep that in mind the next time I do such a demo. + +00:00:18.420 --> 00:00:21.539 +The first question, I mean, the feedback was considered + +00:00:21.540 --> 00:00:23.819 +using similar background dark only + +00:00:23.820 --> 00:00:25.419 +or light only throughout the help, + +00:00:25.420 --> 00:00:29.859 +throughout the help with iStream. + +00:00:29.860 --> 00:00:31.819 +The question, the first question is, + +00:00:31.820 --> 00:00:35.419 +should I know all my contact email address by heart + +00:00:35.420 --> 00:00:38.499 +or is some kind of contact list? + +00:00:38.500 --> 00:00:42.019 +Unfortunately, right now, this is just to get started. + +00:00:42.020 --> 00:00:45.859 +So it is, you have to know it by heart, + +00:00:45.860 --> 00:00:47.619 +but I take this as feedback. + +00:00:47.620 --> 00:00:51.339 +I will write this down for myself as a feature request. + +00:00:51.340 --> 00:00:53.779 +I will make sure that all contacts + +00:00:53.780 --> 00:00:58.419 +or some kind of tab support is present for email addresses. + +00:00:58.420 --> 00:01:03.659 +I do not use the org system for replying so much. + +00:01:03.660 --> 00:01:06.259 +I use it for knowing the context. + +00:01:06.260 --> 00:01:12.019 +So I don't really reply using the org mode itself to reply. + +00:01:12.020 --> 00:01:16.019 +So I did not focus on that feature. But this is doable. + +00:01:16.020 --> 00:01:18.739 +We can certainly add a tab support + +00:01:18.740 --> 00:01:24.619 +for any contacts that you may have, org contacts. + +00:01:24.620 --> 00:01:28.059 +Or I don't know if there's any other package that does that. + +00:01:28.060 --> 00:01:29.699 +So if it is, let me know. + +00:01:29.700 --> 00:01:33.899 +Org contacts is what comes to my mind. + +00:01:33.900 --> 00:01:36.739 +The second question is, what would it take + +00:01:36.740 --> 00:01:40.139 +to use the org pieces of this with? + +00:01:40.140 --> 00:01:45.019 +offline IMAP or other non Gmail mail setups. + +00:01:45.020 --> 00:01:46.059 +I use fast mail. + +00:01:46.060 --> 00:01:52.779 +Currently, I use only Gmail because that's my workflow + +00:01:52.780 --> 00:01:58.019 +and it works with a Gmail API. + +00:01:58.020 --> 00:02:00.859 +So which means the Python script that goes along with it + +00:02:00.860 --> 00:02:05.179 +only works with Gmail and no other system for now. + +00:02:05.180 --> 00:02:06.939 +This is the current package. + +00:02:06.940 --> 00:02:09.459 +However, yes, I will note this down. + +00:02:09.460 --> 00:02:12.059 +I don't know what it will take + +00:02:12.060 --> 00:02:16.379 +to include this offline IMAP setup + +00:02:16.380 --> 00:02:18.499 +or any other non-Gmail setup. + +00:02:18.500 --> 00:02:23.139 +Let me tinker with it and find out what it will involve. + +00:02:23.140 --> 00:02:30.019 +So give me some time, maybe I will get to it. + +00:02:30.020 --> 00:02:43.739 +Sorry, sorry. Oops. Okay. Okay. May I continue? + +00:02:43.740 --> 00:02:46.739 +Hi, Bella. Yes, please. Sorry for the confusion. + +00:02:46.740 --> 00:02:53.179 +Hi, Amin. All right. So the next one is, + +00:02:53.180 --> 00:02:56.939 +do you worry about sending some info to a wrong person + +00:02:56.940 --> 00:02:58.899 +due to some unseen technical issues, + +00:02:58.900 --> 00:03:03.299 +for example, due to memory overflow? + +00:03:03.300 --> 00:03:05.739 +Again, I have not been focusing + +00:03:05.740 --> 00:03:07.139 +on replying from within Emacs. + +00:03:07.140 --> 00:03:09.659 +so much, or using my package, + +00:03:09.660 --> 00:03:13.019 +I usually do it through the Gmail interface. + +00:03:13.020 --> 00:03:18.299 +I usually use this to get the context within the project, + +00:03:18.300 --> 00:03:22.059 +download all the emails, make sure that I have acted on emails + +00:03:22.060 --> 00:03:23.859 +which Gmail doesn't do so well. + +00:03:23.860 --> 00:03:25.099 +I don't know what the action is. + +00:03:25.100 --> 00:03:28.499 +I don't want to use Gmail as a to-do list. + +00:03:28.500 --> 00:03:30.146 +Org Mode is great at this. + +00:03:30.147 --> 00:03:32.646 +Any work I have to do, any reports I have to compile, + +00:03:32.647 --> 00:03:39.099 +all of that Org Mode does. I don't use it for replying + +00:03:39.100 --> 00:03:43.459 +or doing its actions around the email, which I focus on. + +00:03:43.460 --> 00:03:45.859 +But point taken, let me see + +00:03:45.860 --> 00:03:47.779 +if there is a like Gmail offers. + +00:03:47.780 --> 00:03:52.219 +you know, for 10 seconds or something you can still undo + +00:03:52.220 --> 00:03:54.739 +so that it doesn't go out of your email + +00:03:54.740 --> 00:03:59.659 +if you made a mistake or if there's a problem with your, + +00:03:59.660 --> 00:04:04.619 +you know, Gmail or email sending should sort of stop. + +00:04:04.620 --> 00:04:07.019 +Let me think about that. + +00:04:07.020 --> 00:04:09.396 +So, I've not paid attention to that, + +00:04:09.397 --> 00:04:11.104 +but I'll take your point. + +00:04:11.105 --> 00:04:17.539 +The next one, you should say what org-gmail is + +00:04:17.540 --> 00:04:20.219 +and not its goals and non-goals, + +00:04:20.220 --> 00:04:22.019 +which in this case is more helpful + +00:04:22.020 --> 00:04:24.739 +to help people get their head around this. + +00:04:24.740 --> 00:04:26.379 +You had some good ones in your slides, + +00:04:26.380 --> 00:04:28.859 +but not your GitHub page. Okay, great. + +00:04:28.860 --> 00:04:30.579 +Okay, so I will definitely take + +00:04:30.580 --> 00:04:33.779 +the information from the slides + +00:04:33.780 --> 00:04:38.499 +and give it to, I mean, put it back into my readme. + +00:04:38.500 --> 00:04:40.179 +It's been a while since I updated ReadMe, + +00:04:40.180 --> 00:04:42.179 +and you're absolutely right. + +00:04:42.180 --> 00:04:45.779 +It probably doesn't say why you need org email. + +00:04:45.780 --> 00:04:49.059 +So that would be definitely something that I can do. + +00:04:49.060 --> 00:04:51.659 +Wanting to add the goal is an easier way + +00:04:51.660 --> 00:04:53.819 +to add one-off email into org mode + +00:04:53.820 --> 00:04:56.419 +and org agenda workflows and first. + +00:04:56.420 --> 00:04:57.779 +Love seeing a different way + +00:04:57.780 --> 00:04:59.539 +of looking at and working with email. + +00:04:59.540 --> 00:05:00.659 +Thank you so much for that. + +00:05:00.660 --> 00:05:05.619 +Yes, that's the idea here is if we can integrate email + +00:05:05.620 --> 00:05:08.339 +and I think there is memacs, you know, + +00:05:08.340 --> 00:05:11.579 +that's one package that I love. + +00:05:11.580 --> 00:05:17.099 +It can integrate all of the other stuff into your org mode. + +00:05:17.100 --> 00:05:21.539 +That worked, but I like email and dealing with email. + +00:05:21.540 --> 00:05:26.099 +That is my single source of truth outside of org mode. + +00:05:26.100 --> 00:05:28.819 +So that's the only one I need for now. + +00:05:28.820 --> 00:05:32.659 +And I like seeing the action + +00:05:32.660 --> 00:05:35.099 +and the history on my org agenda. + +00:05:35.100 --> 00:05:37.259 +That's one of the reasons why I built this package. + +00:05:37.260 --> 00:05:43.699 +And I hope that answers that. + +00:05:43.700 --> 00:05:49.459 +There is one more saying, how does it handle attachments? + +00:05:49.460 --> 00:05:52.819 +If it doesn't, do you have a plan to add this feature? + +00:05:52.820 --> 00:05:55.859 +Attachments is a bit tricky for me right now + +00:05:55.860 --> 00:05:58.619 +because I don't understand org-attach so well. + +00:05:58.620 --> 00:06:01.299 +I don't use org-attach, but you're absolutely right. + +00:06:01.300 --> 00:06:05.339 +It does make sense to have org-attach also. + +00:06:05.340 --> 00:06:08.259 +And it's definitely in my plan to include org-attach. + +00:06:08.260 --> 00:06:12.459 +I don't think I talked about it in my talk, + +00:06:12.460 --> 00:06:14.739 +but I definitely have that idea. + +00:06:14.740 --> 00:06:17.339 +First I have to wrap myself, my head + +00:06:17.340 --> 00:06:21.339 +around the idea of org-attach and how it, + +00:06:21.340 --> 00:06:26.059 +because I don't like, what I don't like about org-attach, + +00:06:26.060 --> 00:06:28.899 +I'll tell you, is default is, + +00:06:28.900 --> 00:06:31.699 +it opens a new folder called data + +00:06:31.700 --> 00:06:34.379 +and there are, it uses a unique code + +00:06:34.380 --> 00:06:37.859 +and there are subfolders in it, which I do not appreciate + +00:06:37.860 --> 00:06:43.659 +because I want all those files also to be within the same context. + +00:06:43.660 --> 00:06:45.779 +of my project or area. + +00:06:45.780 --> 00:06:50.859 +And that's one of the reasons I, and I'm sure you can customize that. + +00:06:50.860 --> 00:06:52.099 +There are ways to do that, + +00:06:52.100 --> 00:06:55.379 +but I have to pay more attention to this. + +00:06:55.380 --> 00:06:58.729 +Right now, all of the attachments are dealt with in Gmail, + +00:06:58.730 --> 00:07:01.219 +which is not a good system to handle that + +00:07:01.220 --> 00:07:03.579 +because it's so out of context. + +00:07:03.580 --> 00:07:06.379 +And there are like 25 contexts in the same inbox, + +00:07:06.380 --> 00:07:08.419 +which I do not appreciate. + +00:07:08.420 --> 00:07:11.059 +So even the attachments are like that. + +00:07:11.060 --> 00:07:13.539 +But Org Mode has a much better way of handling it, + +00:07:13.540 --> 00:07:16.099 +or Emacs has a much better way of handling it. + +00:07:16.100 --> 00:07:20.339 +I will definitely put my attention + +00:07:20.340 --> 00:07:22.219 +to this and get this feature out. + +00:07:22.220 --> 00:07:25.299 +This is all customer feedback for me, so to speak. + +00:07:25.300 --> 00:07:30.179 +So I would definitely request all of you to try it out. + +00:07:30.180 --> 00:07:32.179 +And tell me, you know, good + +00:07:32.180 --> 00:07:34.939 +or bad things about the package. + +00:07:34.940 --> 00:07:38.619 +And you've been very candid so far. Please be so. + +00:07:38.620 --> 00:07:43.539 +So, you know, so be it that be candid with your feedback + +00:07:43.540 --> 00:07:46.699 +and I will get to know how to go with this. + +00:07:46.700 --> 00:07:49.699 +With so much, I mean, I'm not an expert in Elisp, + +00:07:49.700 --> 00:07:57.019 +but I have a workaround, which is I have generative AI support, + +00:07:57.020 --> 00:07:58.339 +which has done well with me. + +00:07:58.340 --> 00:08:03.659 +I test the software better, so I can use the generative AI + +00:08:03.660 --> 00:08:05.139 +to help me with the coding, + +00:08:05.140 --> 00:08:08.539 +but I can test it so that it works for me. + +00:08:08.540 --> 00:08:10.739 +And I would request your help + +00:08:10.740 --> 00:08:13.259 +also in testing this software. + +00:08:13.260 --> 00:08:16.179 +So for sure. Thank you so much for your question. + +00:08:16.180 --> 00:08:21.271 +If there are any more, I can definitely answer them. diff --git a/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--main--chapters.vtt b/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--main--chapters.vtt new file mode 100644 index 00000000..23622244 --- /dev/null +++ b/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--main--chapters.vtt @@ -0,0 +1,77 @@ +WEBVTT + + +00:00:00.000 --> 00:00:19.839 +Before we begin + +00:00:19.840 --> 00:01:02.799 +The 4-year overnight success + +00:01:02.800 --> 00:01:15.599 +The real title + +00:01:15.600 --> 00:01:34.279 +Why not gnus/mu4e/notmuch? + +00:01:34.280 --> 00:02:17.919 +The honest answer + +00:02:17.920 --> 00:02:49.439 +The org-gmail philosophy + +00:02:49.440 --> 00:03:21.199 +Architecture (the boring but important slide) + +00:03:21.200 --> 00:04:37.479 +Demo 1: From gmail to org + +00:04:37.480 --> 00:05:43.039 +Settings + +00:05:43.040 --> 00:07:56.879 +Downloading + +00:07:56.880 --> 00:09:33.679 +Replying + +00:09:33.680 --> 00:10:57.159 +Label management + +00:10:57.160 --> 00:12:04.119 +Refiling + +00:12:04.120 --> 00:13:37.139 +Archiving + +00:13:37.140 --> 00:15:53.679 +Action commands + +00:15:53.680 --> 00:16:28.279 +Org Agenda + +00:16:28.280 --> 00:17:07.439 +Trash + +00:17:07.440 --> 00:17:40.559 +Real workflow: GTD + +00:17:40.560 --> 00:18:35.959 +Real Workflow: P.A.R.A. + +00:18:35.960 --> 00:20:07.679 +What this is NOT + +00:20:07.680 --> 00:20:54.759 +Technical decisions + +00:20:54.760 --> 00:21:41.439 +Roadmap + +00:21:41.440 --> 00:22:32.939 +Contributing + +00:22:32.940 --> 00:22:41.119 +The big picture + +00:22:41.120 --> 00:23:04.400 +Let's connect diff --git a/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--main.vtt b/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--main.vtt new file mode 100644 index 00000000..06ab2200 --- /dev/null +++ b/2025/captions/emacsconf-2025-gmail--orggmail-a-deep-integration-of-gmail-into-your-org-mode--bala-ramadurai--main.vtt @@ -0,0 +1,1764 @@ +WEBVTT captioned by bala + +NOTE Before we begin + +00:00:00.000 --> 00:00:01.759 +Hello everyone. + +00:00:01.760 --> 00:00:03.439 +My name is Bala Ramadurai. + +00:00:03.440 --> 00:00:07.839 +Today I'm going to be talking about org-gmail. + +00:00:07.840 --> 00:00:10.039 +That's something that I put together. + +00:00:10.040 --> 00:00:12.719 +This is what I call gmail meets org mode. + +00:00:12.720 --> 00:00:15.119 +And they get along too. + +00:00:15.120 --> 00:00:16.519 +Let's talk about email + +00:00:16.520 --> 00:00:19.839 +and how to manage email via org mode. + +NOTE The 4-year overnight success + +00:00:19.840 --> 00:00:23.919 +This project is a four year overnight success. + +00:00:23.920 --> 00:00:26.039 +It was in 2021. + +00:00:26.040 --> 00:00:27.279 +I said, Hey, wait a second. + +00:00:27.280 --> 00:00:30.519 +It'll be so cool if we can integrate Gmail with org. + +00:00:30.520 --> 00:00:32.959 +So I started trying out new things. + +00:00:32.960 --> 00:00:34.399 +And immediately I realized + +00:00:34.400 --> 00:00:36.799 +this is a much larger project than I thought. + +00:00:36.800 --> 00:00:40.599 +So it lived in someday maybe.org + +00:00:40.600 --> 00:00:42.599 +for about three years. + +00:00:42.600 --> 00:00:48.759 +Enter 2024 AI arrives and in 2025 I had a working + +00:00:48.760 --> 00:00:50.919 +prototype in 24 hours flat. + +00:00:50.920 --> 00:00:55.759 +So three years and 364 days, nothing much happened + +00:00:55.760 --> 00:00:58.159 +and one day it actually got it working. + +00:00:58.160 --> 00:01:00.919 +Sometimes procrastination is just waiting for the + +00:01:00.920 --> 00:01:02.799 +right tools. + +NOTE The real title + +00:01:02.800 --> 00:01:05.519 +The real title should have been org mail for + +00:01:05.520 --> 00:01:08.479 +people who like org mode more than email. + +00:01:08.480 --> 00:01:12.799 +The Gmail monster that has always been attacking us. + +00:01:12.800 --> 00:01:15.599 +Okay, but we still have to deal with email. + +NOTE Why not gnus/mu4e/notmuch? + +00:01:15.600 --> 00:01:18.599 +One of the most common questions that I've got so far. + +00:01:18.600 --> 00:01:24.639 +Why not gnus or mu4e or notmuch, or other tools. + +00:01:24.640 --> 00:01:26.359 +They are amazing. + +00:01:26.360 --> 00:01:29.239 +Use them if it works for you, absolutely. + +00:01:29.240 --> 00:01:30.319 +Just go right ahead. + +00:01:30.320 --> 00:01:32.239 +If it works for you, don't change anything + +00:01:32.240 --> 00:01:34.279 +because this looks cool. + +NOTE The honest answer + +00:01:34.280 --> 00:01:36.599 +Well, the honest answer for me is that + +00:01:36.600 --> 00:01:39.399 +they want to be your email client. + +00:01:39.400 --> 00:01:40.879 +That's not what I am after. + +00:01:40.880 --> 00:01:42.959 +I don't want an email client. + +00:01:42.960 --> 00:01:45.039 +I have enough email clients already. + +00:01:45.040 --> 00:01:46.239 +I don't want one more. + +00:01:46.240 --> 00:01:49.359 +And they require 500 lines of config. + +00:01:49.360 --> 00:01:50.679 +I've tried it. + +00:01:50.680 --> 00:01:53.039 +It's a lot of maintenance for myself, + +00:01:53.040 --> 00:01:54.359 +I still have those somewhere. + +00:01:54.360 --> 00:01:57.319 +The mu4e config or the gnus config. + +00:01:57.320 --> 00:01:59.439 +They struggle with Gmail's labels, + +00:01:59.440 --> 00:02:01.839 +threading, messages and deletion. + +00:02:01.840 --> 00:02:05.439 +I find it tough, and it's either + +00:02:05.440 --> 00:02:07.079 +all in emacs or nothing. + +00:02:07.080 --> 00:02:10.079 +It cannot be a combinatorial approach, + +00:02:10.080 --> 00:02:11.159 +is what I realized. + +00:02:11.160 --> 00:02:13.519 +So I said, why can't we have both? + +00:02:13.520 --> 00:02:15.959 +I want the org mode's focus + +00:02:15.960 --> 00:02:17.919 +and Gmail's flexibility. + +NOTE The org-gmail philosophy + +00:02:17.920 --> 00:02:20.559 +Org-gmail philosophy is very simple. + +00:02:20.560 --> 00:02:22.199 +You triage in Gmail. + +00:02:22.200 --> 00:02:26.279 +Use the fast web UI for the easy stuff + +00:02:26.280 --> 00:02:27.879 +and process in org mode. + +00:02:27.880 --> 00:02:30.639 +Pull important threads where you do real work. + +00:02:30.640 --> 00:02:33.719 +And of course, a two way sync is possible. + +00:02:33.720 --> 00:02:36.639 +Changes flow both directions. + +00:02:36.640 --> 00:02:39.479 +Big inspiration has been org-gcal. + +00:02:39.480 --> 00:02:42.319 +I named it org-gmail because I saw org-gcal. + +00:02:42.320 --> 00:02:43.159 +It was so cool. + +00:02:43.160 --> 00:02:44.759 +I really wanted it. + +00:02:44.760 --> 00:02:47.719 +Think of it like an org capture for email, but + +00:02:47.720 --> 00:02:49.439 +just bidirectional. + +NOTE Architecture (the boring but important slide) + +00:02:49.440 --> 00:02:52.999 +Alright, the architecture (boring, but important + +00:02:53.000 --> 00:02:56.679 +slide) is that Gmail interacts with Python via an + +00:02:56.680 --> 00:02:59.439 +API and interacts with Emacs Lisp. + +00:02:59.440 --> 00:03:02.519 +User commands, org formatting, all that magic is + +00:03:02.520 --> 00:03:04.279 +done on the Emacs side with Lisp. + +00:03:04.280 --> 00:03:09.140 +Python side handles the Gmail API, OAuth, + +00:03:09.141 --> 00:03:12.407 +json wrangling and Gmail API handles + +00:03:12.408 --> 00:03:13.959 +the actual email data. + +00:03:13.960 --> 00:03:17.679 +You can do pip install, add to the load path, and + +00:03:17.680 --> 00:03:21.199 +10 minute OAuth setup, you are all set. + +NOTE Demo 1: From gmail to org + +00:03:21.200 --> 00:03:27.079 +We'll switch over to demo from gmail to org. + +00:03:27.080 --> 00:03:29.039 +How do you go about doing that? + +00:03:29.040 --> 00:03:32.879 +I will start off with a demo folder that I have. + +00:03:32.880 --> 00:03:35.119 +It has this tree structure. + +00:03:35.120 --> 00:03:36.559 +Ignore the tilde files. + +00:03:36.560 --> 00:03:37.919 +So this is what it contains. + +00:03:37.920 --> 00:03:41.639 +An org folder with all the working directory, the + +00:03:41.640 --> 00:03:44.639 +actual where the life of org mode is. + +00:03:44.640 --> 00:03:48.239 +And I have a credentials.json, this is for logging + +00:03:48.240 --> 00:03:49.119 +into Gmail. + +00:03:49.120 --> 00:03:50.799 +This is a file that you can download. + +00:03:50.800 --> 00:03:53.319 +The instructions are in my README in the + +00:03:53.320 --> 00:03:54.159 +repository. + +00:03:54.160 --> 00:03:56.119 +You can find out how to get yourself a + +00:03:56.120 --> 00:03:57.719 +credentials.json. + +00:03:57.720 --> 00:03:59.159 +It's not very difficult. + +00:03:59.160 --> 00:04:01.479 +Once you have these, you're all set. + +00:04:01.480 --> 00:04:05.359 +All you need to do is if you have straight or any + +00:04:05.360 --> 00:04:08.539 +of the other VC packages ready, that you can take + +00:04:08.540 --> 00:04:11.500 +a Git repository and have that in your folder, you + +00:04:11.501 --> 00:04:13.399 +can do that, or you can do it like this. + +00:04:13.400 --> 00:04:15.159 +Have a Git clone. + +00:04:15.160 --> 00:04:16.479 +Like I'm doing it right now. + +00:04:16.480 --> 00:04:19.239 +Just clone it, keep it in. + +00:04:19.240 --> 00:04:20.874 +And now you'll see + +00:04:20.875 --> 00:04:23.199 +that the Gmail is already there. + +00:04:23.200 --> 00:04:25.199 +There are two files that are really ultra + +00:04:25.200 --> 00:04:28.039 +important, which is, gmail_label_manager.py and + +00:04:28.040 --> 00:04:30.479 +org-gmail.el. + +00:04:30.480 --> 00:04:31.899 +These are the two files that do the email + +00:04:31.900 --> 00:04:33.199 +processing. + +00:04:33.200 --> 00:04:35.199 +I have a plain vanilla Emacs + +00:04:35.200 --> 00:04:37.479 +that I'm going to use for the demo. + +NOTE Settings + +00:04:37.480 --> 00:04:39.439 +These are a few settings + +00:04:39.440 --> 00:04:42.159 +that you will need in order to get going. + +00:04:42.160 --> 00:04:45.959 +So one is the Gmail itself, the elisp, and the + +00:04:45.960 --> 00:04:47.039 +Python script. + +00:04:47.040 --> 00:04:49.399 +You'll need to require the package. + +00:04:49.400 --> 00:04:52.399 +The org agenda files need to be set. + +00:04:52.400 --> 00:04:54.839 +If they're already there, then yes, it needs to + +00:04:54.840 --> 00:04:55.879 +include the org files. + +00:04:55.880 --> 00:04:59.279 +Main settings are, you need an org file in order + +00:04:59.280 --> 00:05:02.239 +to download all the emails from Gmail. + +00:05:02.240 --> 00:05:03.879 +You need the credentials path. + +00:05:03.880 --> 00:05:05.519 +You need the Python script, + +00:05:05.520 --> 00:05:07.439 +wherever it is pointed to that. + +00:05:07.440 --> 00:05:10.039 +The date drawer, you can customize it + +00:05:10.040 --> 00:05:11.319 +to whatever you want. + +00:05:11.320 --> 00:05:12.159 +I call it org-gmail. + +00:05:12.160 --> 00:05:14.639 +You can set it to ignore certain labels, + +00:05:14.640 --> 00:05:15.799 +not to download it. + +00:05:15.800 --> 00:05:17.359 +You're not interested in certain labels + +00:05:17.360 --> 00:05:18.479 +being downloaded. + +00:05:18.480 --> 00:05:19.599 +You can set that + +00:05:19.600 --> 00:05:21.959 +and process time out of 300 seconds. + +00:05:21.960 --> 00:05:25.359 +These are some things to keep life sane in this + +00:05:25.360 --> 00:05:27.819 +plain vanilla emacs. + +00:05:27.820 --> 00:05:30.799 +So I have this refile targets and stuff. + +00:05:30.800 --> 00:05:33.579 +That's the main org-gmail settings are all here. + +00:05:33.580 --> 00:05:37.879 +I'm going to eval this buffer so that we have all + +00:05:37.880 --> 00:05:40.039 +of it and we are all set. + +00:05:40.040 --> 00:05:43.039 +So we have org-gmail ready to work right now. + +NOTE Downloading + +00:05:43.040 --> 00:05:44.959 +The first thing I'm going to show you is + +00:05:44.960 --> 00:05:48.079 +org-gmail-download-by-label. + +00:05:48.080 --> 00:05:50.599 +This is the demo Gmail that I have. + +00:05:50.600 --> 00:05:53.619 +They all have some kind of test emails and I'm + +00:05:53.620 --> 00:05:56.199 +going to label them. + +00:05:56.200 --> 00:06:00.719 +I've created this hierarchy of labels here based + +00:06:00.720 --> 00:06:04.119 +on Tiago Forte's PARA - Project, Area, Resources, + +00:06:04.120 --> 00:06:06.079 +Archives structure. + +00:06:06.080 --> 00:06:09.439 +1Projects, DemoProject1, 2Areas, DemoArea, + +00:06:09.440 --> 00:06:12.119 +4Archives, 2025, OldProject. + +00:06:12.120 --> 00:06:14.959 +I've labeled them inside my Gmail. + +00:06:14.960 --> 00:06:20.759 +Okay, now let's go to Emacs and we will now + +00:06:20.760 --> 00:06:23.719 +download these things, but before downloading + +00:06:23.720 --> 00:06:26.919 +them, you will need to authenticate. + +00:06:26.920 --> 00:06:28.800 +So for that, you can start + +00:06:28.801 --> 00:06:30.900 +with any org-gmail command. + +00:06:30.901 --> 00:06:35.079 +So I'm going to take org-gmail-download-by-label. + +00:06:35.080 --> 00:06:38.839 +When I press that, it immediately opens a session + +00:06:38.840 --> 00:06:39.999 +in my browser. + +00:06:40.000 --> 00:06:40.659 +Okay? + +00:06:40.660 --> 00:06:45.799 +What you can't see is a list of my Gmail accounts + +00:06:45.800 --> 00:06:46.759 +that I'm going to select. + +00:06:46.760 --> 00:06:50.039 +I'm going to select my one Gmail account, and I'm + +00:06:50.040 --> 00:06:53.199 +going to show you the next screen. + +00:06:53.200 --> 00:06:56.999 +So in this screen, you'll have to continue and + +00:06:57.000 --> 00:06:59.119 +select, and the authentication is completed. + +00:06:59.120 --> 00:07:02.679 +So once it's, this is done, you can close this. + +00:07:02.680 --> 00:07:08.999 +Come back to Emacs and you will have Select Gmail. + +00:07:09.000 --> 00:07:10.439 +So it has tab support. + +00:07:10.440 --> 00:07:11.719 +If you click tab, it will tell you + +00:07:11.720 --> 00:07:13.919 +what all labels are available. + +00:07:13.920 --> 00:07:16.319 +I can pick anyone. + +00:07:16.320 --> 00:07:21.839 +1Projects/DemoProject1, and let's see what happens. + +00:07:21.840 --> 00:07:26.479 +It starts downloading and it downloads. + +00:07:26.480 --> 00:07:28.799 +And all three messages, four messages, + +00:07:28.800 --> 00:07:29.719 +five messages. + +00:07:29.720 --> 00:07:30.759 +Six, seven. + +00:07:30.760 --> 00:07:33.319 +There are 11 messages in total, + +00:07:33.320 --> 00:07:36.039 +and it's downloading all of them. + +00:07:36.040 --> 00:07:40.319 +~/demo/org/0Inbox. + +00:07:40.320 --> 00:07:42.079 +That's where I have it. + +00:07:42.080 --> 00:07:44.399 +And here are the emails. + +00:07:44.400 --> 00:07:46.439 +They're all in org mode, format. + +00:07:46.440 --> 00:07:48.399 +All the emails are in here. + +00:07:48.400 --> 00:07:49.719 +Since it's org mode, + +00:07:49.720 --> 00:07:52.679 +it can fold them all and you will see those emails. + +00:07:52.680 --> 00:07:54.279 +So these are five emails + +00:07:54.280 --> 00:07:56.879 +that are present for the DemoProject1. + +NOTE Replying + +00:07:56.880 --> 00:07:59.279 +The next one I wanted to show you was + +00:07:59.280 --> 00:08:01.039 +reply without leaving emacs. + +00:08:01.040 --> 00:08:04.919 +Let's go back to emacs. + +00:08:04.920 --> 00:08:06.479 +How am I going to reply? + +00:08:06.480 --> 00:08:09.319 +org-gmail-reply-at-point. + +00:08:09.320 --> 00:08:11.379 +That's how I'm going to reply. + +00:08:11.380 --> 00:08:13.119 +Reply all or reply. + +00:08:13.120 --> 00:08:13.759 +Okay. + +00:08:13.760 --> 00:08:16.199 +Let's first find out what is the email all about. + +00:08:16.200 --> 00:08:16.719 +Okay. + +00:08:16.720 --> 00:08:19.319 +There's just one sender with just one recipient. + +00:08:19.320 --> 00:08:21.399 +So the reply all or reply + +00:08:21.400 --> 00:08:23.020 +doesn't make a difference. + +00:08:23.021 --> 00:08:23.700 +Okay? + +00:08:23.701 --> 00:08:28.339 +So we will reply at point and if it's Reply All, + +00:08:28.340 --> 00:08:30.999 +it includes my own email as well. + +00:08:31.000 --> 00:08:34.399 +In this, my email is .mx. + +00:08:34.400 --> 00:08:35.159 +Okay. + +00:08:35.160 --> 00:08:39.279 +Cc, I can cc anybody I want and I won't do that. + +00:08:39.280 --> 00:08:42.039 +I have a Gmail reply window. + +00:08:42.040 --> 00:08:43.439 +Split window here. + +00:08:43.440 --> 00:08:47.159 +C-c C-c is what will send the reply. + +00:08:47.160 --> 00:08:50.479 +C-c C-k is what will cancel the reply. + +00:08:50.480 --> 00:08:51.919 +I want to reply. + +00:08:51.920 --> 00:08:57.779 +So let's say test reply from within emacs + +00:08:57.780 --> 00:09:00.559 +and bala@balaramadurai.net + +00:09:00.560 --> 00:09:01.719 +should receive this email. + +00:09:01.720 --> 00:09:02.999 +Okay. + +00:09:03.000 --> 00:09:07.599 +Initial successfully reply sent for this email id. + +00:09:07.600 --> 00:09:08.599 +Okay. + +00:09:08.600 --> 00:09:11.959 +A feature request I can already imagine is + +00:09:11.960 --> 00:09:15.439 +the reply also appearing at the bottom of this. + +00:09:15.440 --> 00:09:16.759 +It's not yet there. + +00:09:16.760 --> 00:09:18.279 +In the next version I will have that. + +00:09:18.280 --> 00:09:22.319 +Let's check if I've have sent that email. + +00:09:22.320 --> 00:09:25.319 +Let's check in the sent box. + +00:09:25.320 --> 00:09:29.119 +I just checked in the sent and yes, + +00:09:29.120 --> 00:09:31.959 +a test reply from within emacs, does show up. + +00:09:31.960 --> 00:09:33.039 +Okay, great. + +00:09:33.040 --> 00:09:33.679 +That works. + +NOTE Label management + +00:09:33.680 --> 00:09:36.959 +The third demo is going to be on label management. + +00:09:36.960 --> 00:09:38.439 +How do I manage labels? + +00:09:38.440 --> 00:09:39.359 +Let's see. + +00:09:39.360 --> 00:09:40.399 +Let's go back to emacs. + +00:09:40.400 --> 00:09:46.599 +Suppose, I am not keen on this DemoProject1 for this. + +00:09:46.600 --> 00:09:50.839 +It should belong to DemoArea, okay? + +00:09:50.840 --> 00:09:52.919 +For this thread itself doesn't belong to this. + +00:09:52.920 --> 00:09:57.879 +Let's do org-gmail-edit-label-at-point. + +00:09:57.880 --> 00:10:00.879 +Well, I don't want one project at all. + +00:10:00.880 --> 00:10:05.899 +It should be under 2Areas/DemoArea. + +00:10:05.900 --> 00:10:08.559 +I don't think it, it's not tab supported. + +00:10:08.560 --> 00:10:09.519 +You should know this. + +00:10:09.520 --> 00:10:09.999 +I will. + +00:10:10.000 --> 00:10:11.439 +That's another feature request. + +00:10:11.440 --> 00:10:14.599 +2Areas/DemoArea. + +00:10:14.600 --> 00:10:17.679 +And when I say this, it should update it. + +00:10:17.680 --> 00:10:19.039 +Yes, it has updated it. + +00:10:19.040 --> 00:10:21.039 +So you can see that it has updated + +00:10:21.040 --> 00:10:22.159 +the label here as well. + +00:10:22.160 --> 00:10:26.159 +We can go check if it has indeed changed it + +00:10:26.160 --> 00:10:29.399 +in our... what is the name of the email? + +00:10:29.400 --> 00:10:31.439 +It's a test mail for one project demo + +00:10:31.440 --> 00:10:33.459 +and the date is at 3 12. + +00:10:33.460 --> 00:10:36.839 +Let's check if DemoArea has it. + +00:10:36.840 --> 00:10:39.559 +It's not refreshed, but there are two, + +00:10:39.560 --> 00:10:42.279 +two emails now under DemoArea. + +00:10:42.280 --> 00:10:43.639 +It's obviously done the job well. + +00:10:43.640 --> 00:10:46.119 +It's happening as expected. + +00:10:46.120 --> 00:10:49.159 +I just turned this back from DemoArea to + +00:10:49.160 --> 00:10:50.159 +DemoProject1. + +00:10:50.160 --> 00:10:53.759 +If you decide that I want to move all of + +00:10:53.760 --> 00:10:56.559 +DemoProject1 to archive, I'm done with the + +00:10:56.560 --> 00:10:57.159 +project. + +NOTE Refiling + +00:10:57.160 --> 00:10:58.319 +Oh, by the way, you could... + +00:10:58.320 --> 00:10:59.599 +that's the whole point + +00:10:59.600 --> 00:11:00.919 +of this is to have + +00:11:00.920 --> 00:11:05.199 +all of this refiled into your project, + +00:11:05.200 --> 00:11:06.719 +you can do that. + +00:11:06.720 --> 00:11:08.919 +I don't know if I have that. + +00:11:08.920 --> 00:11:11.639 +Yes, I have demo project one + +00:11:11.640 --> 00:11:17.519 +and I could have emails and I created a node + +00:11:17.520 --> 00:11:20.439 +and I moved everything there to that folder + +00:11:20.440 --> 00:11:24.799 +so that when I want to look at the demo project. + +00:11:24.800 --> 00:11:25.959 +Let me look at this. + +00:11:25.960 --> 00:11:29.559 +In that context, in the project context and email, + +00:11:29.560 --> 00:11:33.959 +I have notes, let's say, and one of the emails is + +00:11:33.960 --> 00:11:34.839 +a note. + +00:11:34.840 --> 00:11:38.359 +And I want to be able to keep it that way. + +00:11:38.360 --> 00:11:41.719 +I could refile it and put it under notes as well, + +00:11:41.720 --> 00:11:44.439 +saying that this has some password, it has some + +00:11:44.440 --> 00:11:46.559 +reference that I need to have it there. + +00:11:46.560 --> 00:11:48.199 +I can have it under notes as well. + +00:11:48.200 --> 00:11:49.919 +So that's the advantage. + +00:11:49.920 --> 00:11:52.879 +Once it's inside the org mode system, you can do + +00:11:52.880 --> 00:11:55.239 +many things that are usually org-modesy. + +00:11:55.240 --> 00:11:57.599 +So you can do all of that within your org mode + +00:11:57.600 --> 00:12:00.199 +with emails, manipulate them, see it under a + +00:12:00.200 --> 00:12:01.359 +context, reply to that. + +00:12:01.360 --> 00:12:02.574 +All of that can happen + +00:12:02.575 --> 00:12:04.119 +right within your project context. + +NOTE Archiving + +00:12:04.120 --> 00:12:05.439 +You're done with this project. + +00:12:05.440 --> 00:12:06.999 +You want to move to archive. + +00:12:07.000 --> 00:12:09.479 +So what you need to do is you don't have to be + +00:12:09.480 --> 00:12:11.839 +here, you can do it this from anywhere. + +00:12:11.840 --> 00:12:15.199 +Bulk movement of labels, you can do it. + +00:12:15.200 --> 00:12:19.679 +If you had consult, embark, ivy, or helm, this will + +00:12:19.680 --> 00:12:22.439 +show up as a dropdown and it looks neater. + +00:12:22.440 --> 00:12:24.399 +This, I'm using a vanilla emacs, so this is what + +00:12:24.400 --> 00:12:26.279 +you would see, but it has tab support. + +00:12:26.280 --> 00:12:27.519 +You can use that. + +00:12:27.520 --> 00:12:32.319 +So I want to transfer 1Projects/DemoArea1, I want + +00:12:32.320 --> 00:12:32.999 +to move it to archive. + +00:12:33.000 --> 00:12:36.719 +So let's say 4Archives is the folder. + +00:12:36.720 --> 00:12:41.759 +So 4Archives/2025 already set this up. + +00:12:41.760 --> 00:12:46.739 +I have not created this label in Gmail. + +00:12:46.740 --> 00:12:48.680 +So do I need to go back to Gmail and create that? + +00:12:48.681 --> 00:12:49.839 +No, not at all. + +00:12:49.840 --> 00:12:52.159 +You can do this from the comfort of your org mode. + +00:12:52.160 --> 00:12:54.679 +Go in here and enter this. + +00:12:54.680 --> 00:12:55.639 +Let's see what happens. + +00:12:55.640 --> 00:12:57.759 +So it found that it is not there. + +00:12:57.760 --> 00:13:01.439 +So it created a new label and it's now moving all + +00:13:01.440 --> 00:13:04.799 +of the emails, all of those threads into archives + +00:13:04.800 --> 00:13:07.079 +without deleting 1Projects/DemoProject1. + +00:13:07.080 --> 00:13:09.639 +So it still has 1Projects/DemoProject1 and it also + +00:13:09.640 --> 00:13:10.639 +updated the labels here. + +00:13:10.640 --> 00:13:12.239 +So the project has been moved. + +00:13:12.240 --> 00:13:14.999 +If you want to move it to archive this entire... + +00:13:15.000 --> 00:13:16.479 +You can do that too. + +00:13:16.480 --> 00:13:19.079 +Let's see if it has archives. + +00:13:19.080 --> 00:13:21.959 +Yes, it has archives and I have it... + +00:13:21.960 --> 00:13:24.519 +have a heading called 2025. + +00:13:24.520 --> 00:13:26.274 +My demo project can be moved there + +00:13:26.275 --> 00:13:27.279 +and I'm done here. + +00:13:27.280 --> 00:13:28.399 +My project was done. + +00:13:28.400 --> 00:13:30.079 +All the emails are moved to archive. + +00:13:30.080 --> 00:13:32.479 +So is this project from my project folder. + +00:13:32.480 --> 00:13:34.919 +You can integrate it into your workflow, your org + +00:13:34.920 --> 00:13:37.139 +mode workflow. + +NOTE Action commands + +00:13:37.140 --> 00:13:39.039 +Next, we have action commands. + +00:13:39.040 --> 00:13:41.399 +What all can you do with singular emails? + +00:13:41.400 --> 00:13:44.999 +You can do four things with single emails. + +00:13:45.000 --> 00:13:49.659 +Delegate, defer, act on it or trash at point. + +00:13:49.660 --> 00:13:50.399 +Defer. + +00:13:50.400 --> 00:13:52.519 +Doesn't seem to work yet. + +00:13:52.520 --> 00:13:53.599 +That is a snooze part. + +00:13:53.600 --> 00:13:54.759 +Doesn't seem to work yet. + +00:13:54.760 --> 00:13:55.719 +That's another bug. + +00:13:55.720 --> 00:13:58.239 +That's the second bug I have in my package. + +00:13:58.240 --> 00:13:59.599 +But the rest of them work. + +00:13:59.600 --> 00:14:02.519 +Delegate is to move it to somebody so they can do + +00:14:02.520 --> 00:14:03.119 +the job. + +00:14:03.120 --> 00:14:06.399 +Act is you will do it with a context with a to-do + +00:14:06.400 --> 00:14:08.119 +which will show up in your agenda. + +00:14:08.120 --> 00:14:10.839 +Trash the email from your Gmail, and you are done. + +00:14:10.840 --> 00:14:12.079 +Okay, let's do that. + +00:14:12.080 --> 00:14:13.879 +Let's go back to emacs. + +00:14:13.880 --> 00:14:18.079 +I just moved everything back to DemoProject1. + +00:14:18.080 --> 00:14:20.919 +I moved everything back so that I can demonstrate + +00:14:20.920 --> 00:14:22.679 +the four actions that I'm showing. + +00:14:22.680 --> 00:14:23.519 +At least three actions. + +00:14:23.520 --> 00:14:25.039 +One of them doesn't work yet. + +00:14:25.040 --> 00:14:30.179 +So if I want to delegate it to somebody in this + +00:14:30.180 --> 00:14:31.607 +case myself, but I can delegate it + +00:14:31.608 --> 00:14:32.839 +to anybody I want. + +00:14:32.840 --> 00:14:36.159 +So how do I do that so I can delegate this, or + +00:14:36.160 --> 00:14:38.959 +delegate is org-gmail-delegate-at-point. + +00:14:38.960 --> 00:14:42.279 +Move the cursor to the email, delegate it to this + +00:14:42.280 --> 00:14:44.919 +guy balaramadurai.net. + +00:14:44.920 --> 00:14:46.607 +You can add a note saying, + +00:14:46.608 --> 00:14:50.799 +Hey, act on task quickly. + +00:14:50.800 --> 00:14:53.399 +Boss is watching. + +00:14:53.400 --> 00:14:54.919 +Okay? + +00:14:54.920 --> 00:14:59.519 +So you can say yes, and this thread gets forwarded + +00:14:59.520 --> 00:15:01.440 +to your colleague + +00:15:01.441 --> 00:15:03.559 +and so that they can take this up. + +00:15:03.560 --> 00:15:05.819 +It has indeed arrived here. + +00:15:05.820 --> 00:15:07.039 +You can see. + +00:15:07.040 --> 00:15:08.839 +Boss is watching. + +00:15:08.840 --> 00:15:11.399 +The test reply was also arrived here. + +00:15:11.400 --> 00:15:13.079 +You can also see that email. + +00:15:13.080 --> 00:15:15.359 +So that was delegate. + +00:15:15.360 --> 00:15:18.519 +So how do we set up actions? + +00:15:18.520 --> 00:15:21.199 +So let's not mess this email. + +00:15:21.200 --> 00:15:22.599 +This is the second email. + +00:15:22.600 --> 00:15:23.919 +How do you act + +00:15:23.920 --> 00:15:24.919 +on it? + +00:15:24.920 --> 00:15:27.159 +That's an action you set for yourself is add + +00:15:27.160 --> 00:15:31.000 +action at point, and you do that. + +00:15:31.001 --> 00:15:32.940 +What action can you set for yourself? + +00:15:32.941 --> 00:15:38.619 +Write a long report using an LLM. + +00:15:38.620 --> 00:15:42.279 +Okay, so it's changed the status to a to-do task. + +00:15:42.280 --> 00:15:44.959 +And the to-do is right here. + +00:15:44.960 --> 00:15:47.833 +Now, here you can schedule it + +00:15:47.834 --> 00:15:50.700 +to say tomorrow 9:00 AM. + +00:15:50.701 --> 00:15:51.800 +So there you go. + +00:15:51.801 --> 00:15:53.679 +At 9:00 AM I'll be looking at this. + +NOTE Org Agenda + +00:15:53.680 --> 00:15:55.119 +Now here's the cool part. + +00:15:55.120 --> 00:15:58.933 +You can actually find the whole thing + +00:15:58.934 --> 00:16:00.559 +in org agenda. + +00:16:00.560 --> 00:16:03.267 +So my entire email threads + +00:16:03.268 --> 00:16:05.959 +are all in the org agenda. + +00:16:05.960 --> 00:16:09.679 +They're all present here and my task associated is + +00:16:09.680 --> 00:16:11.319 +also here in the agenda. + +00:16:11.320 --> 00:16:12.767 +This is marked TODO, + +00:16:12.768 --> 00:16:14.919 +means I haven't acted on that email. + +00:16:14.920 --> 00:16:16.159 +It's still pending. + +00:16:16.160 --> 00:16:19.119 +And what do I have to do is right here within + +00:16:19.120 --> 00:16:21.559 +here, which is the action that I have to carry on + +00:16:21.560 --> 00:16:22.719 +in the DemoProject1. + +00:16:22.720 --> 00:16:24.533 +You can see that demo project one + +00:16:24.534 --> 00:16:25.739 +is showing up in the bottom. + +00:16:25.740 --> 00:16:28.279 +Okay. It's cool way you can also see it in the agenda. + +NOTE Trash + +00:16:28.280 --> 00:16:31.599 +I am not interested in this email at all. + +00:16:31.600 --> 00:16:33.199 +Let's say I, I want to delete it. + +00:16:33.200 --> 00:16:33.719 +Let's see. + +00:16:33.720 --> 00:16:35.319 +Yes, I finished the task. + +00:16:35.320 --> 00:16:37.599 +Now the task is finished. + +00:16:37.600 --> 00:16:40.039 +I really don't want to see this email, this + +00:16:40.040 --> 00:16:40.919 +message alone. + +00:16:40.920 --> 00:16:42.159 +Alright. + +00:16:42.160 --> 00:16:42.599 +Easy peasy. + +00:16:42.600 --> 00:16:46.679 +Let's do Gmail Trash at point. + +00:16:46.680 --> 00:16:48.020 +And you say, message, + +00:16:48.021 --> 00:16:49.901 +I don't want to delete the entire thread. + +00:16:49.880 --> 00:16:50.399 +Yes. + +00:16:50.400 --> 00:16:51.959 +Delete it. + +00:16:51.960 --> 00:16:53.239 +Delete the message alone. + +00:16:53.240 --> 00:16:54.239 +And it's gone. + +00:16:54.240 --> 00:16:56.039 +But it's not gone. + +00:16:56.040 --> 00:16:57.159 +It's gone to the trash. + +00:16:57.160 --> 00:16:59.733 +The entire subtree was deleted + +00:16:59.734 --> 00:17:01.880 +and we have a clean flow here. + +00:17:01.881 --> 00:17:04.479 +I have archived, it is still in the archive, but + +00:17:04.480 --> 00:17:07.439 +it's still active according to my Gmail folder. + +NOTE Real workflow: GTD + +00:17:07.440 --> 00:17:09.574 +Next I'm going to show you is + +00:17:09.575 --> 00:17:12.039 +real workflow capture. + +00:17:12.040 --> 00:17:15.799 +You can use label in email with ToProcess + +00:17:15.800 --> 00:17:19.359 +downloaded to the inbox.org, and do one of these + +00:17:19.360 --> 00:17:20.599 +you've already seen. + +00:17:20.600 --> 00:17:22.519 +Later still doesn't work. + +00:17:22.520 --> 00:17:25.639 +I will get it to work, but hopefully by the time + +00:17:25.640 --> 00:17:28.759 +the conference is up, you will have the feature up + +00:17:28.760 --> 00:17:29.399 +and ready. + +00:17:29.400 --> 00:17:32.679 +Rest of the stuff works, delegate works, trash + +00:17:32.680 --> 00:17:34.039 +works, and add action works. + +00:17:34.040 --> 00:17:37.479 +We are in weekly review can have an email context, + +00:17:37.480 --> 00:17:40.559 +not just links to an external URL. + +NOTE Real Workflow: P.A.R.A. + +00:17:40.560 --> 00:17:46.519 +In the P.A.R.A Our Project, Areas, Resources and + +00:17:46.520 --> 00:17:50.039 +Archives structure, you can have Gmail labels + +00:17:50.040 --> 00:17:51.199 +mirror your PARA structure. + +00:17:51.200 --> 00:17:53.879 +You can have that within your org mode structure, + +00:17:53.880 --> 00:17:56.239 +and you can mimic that very well. + +00:17:56.240 --> 00:17:59.419 +All the emails embedded in your own structure and + +00:17:59.420 --> 00:18:02.067 +you can download it by label + +00:18:02.068 --> 00:18:03.520 +in the place you want. + +00:18:03.521 --> 00:18:05.439 +I'm still working on that feature where you can + +00:18:05.440 --> 00:18:08.559 +have it inside the project structure itself rather + +00:18:08.560 --> 00:18:09.839 +than an index.org. + +00:18:09.840 --> 00:18:11.719 +It'll take some time, but I will do it. + +00:18:11.720 --> 00:18:14.839 +But right now you can refile it once it's in the + +00:18:14.840 --> 00:18:17.459 +index.org or any other file you choose, and then + +00:18:17.460 --> 00:18:21.039 +you can bulk move labels to archive and move that + +00:18:21.040 --> 00:18:23.319 +entire project repository to + +00:18:23.320 --> 00:18:26.319 +your archive also. That works very well. + +00:18:26.320 --> 00:18:29.919 +And your org files and Gmail stay in sync + +00:18:29.920 --> 00:18:33.039 +effortlessly, and the whole email part of it + +00:18:33.040 --> 00:18:35.239 +becomes part of your knowledge management system. + +00:18:35.240 --> 00:18:35.959 +Okay. + +NOTE What this is NOT + +00:18:35.960 --> 00:18:37.639 +We have reached the end of the demo. + +00:18:37.640 --> 00:18:39.667 +Hopefully you understood + +00:18:39.668 --> 00:18:41.799 +what org-gmail was all about. + +00:18:41.800 --> 00:18:44.639 +If you have any questions, let me know, but some + +00:18:44.640 --> 00:18:47.519 +bits of warning, I wanted to give you what this + +00:18:47.520 --> 00:18:50.239 +package is not, it's not a full fledged email + +00:18:50.240 --> 00:18:50.959 +client. + +00:18:50.960 --> 00:18:55.319 +It's meant for label management and importing some + +00:18:55.320 --> 00:18:58.739 +emails that you wanted or you're interested in to + +00:18:58.740 --> 00:19:02.079 +the context of your projects or areas or your GTD + +00:19:02.080 --> 00:19:02.679 +context. + +00:19:02.680 --> 00:19:07.159 +It is not a replacement for gnus, mu4e or notmuch. + +00:19:07.160 --> 00:19:10.479 +It is not a way to read all your emails in emacs. + +00:19:10.480 --> 00:19:13.439 +It cannot handle a large server load for sure. + +00:19:13.440 --> 00:19:15.679 +It is not offline capable. + +00:19:15.680 --> 00:19:17.359 +It needs API access. + +00:19:17.360 --> 00:19:19.479 +So bear that in mind. + +00:19:19.480 --> 00:19:22.159 +What it is, is a bridge between + +00:19:22.160 --> 00:19:23.879 +gmail and org mode. + +00:19:23.880 --> 00:19:27.359 +It's a way to manage important email threads. + +00:19:27.360 --> 00:19:29.559 +So you can keep updating threads. + +00:19:29.560 --> 00:19:32.039 +Whenever there's a reply, you keep downloading it + +00:19:32.040 --> 00:19:32.919 +to that thread. + +00:19:32.920 --> 00:19:35.279 +If you want to keep track of what's going on, what + +00:19:35.280 --> 00:19:37.079 +is the logical way you can all see it. + +00:19:37.080 --> 00:19:40.599 +You can even use ellama or one of those to make + +00:19:40.600 --> 00:19:41.999 +sense of the conversation. + +00:19:42.000 --> 00:19:45.279 +If it's a long longish thread, it's a power tool + +00:19:45.280 --> 00:19:49.079 +for the getting things done or Tiago Forte's PARA + +00:19:49.080 --> 00:19:49.839 +method. + +00:19:49.840 --> 00:19:52.119 +I've used PARA for a long time now. + +00:19:52.120 --> 00:19:54.839 +I'm a power user of PARA, so to speak, so I find + +00:19:54.840 --> 00:19:56.319 +this extremely useful myself. + +00:19:56.320 --> 00:19:59.067 +It's about 800 lines of Python + +00:19:59.068 --> 00:20:02.479 +and about 300 to 500 lines of elisp. + +00:20:02.480 --> 00:20:06.999 +It's usable in 10 minutes, but can remain powerful + +00:20:07.000 --> 00:20:07.679 +for years. + +NOTE Technical decisions + +00:20:07.680 --> 00:20:10.599 +So some technical decisions that I took. + +00:20:10.600 --> 00:20:13.419 +Why Python plus Gmail, API. + +00:20:13.420 --> 00:20:17.959 +Gmail API is better at handling than an imap with + +00:20:17.960 --> 00:20:19.359 +all the other metadata. + +00:20:19.360 --> 00:20:20.199 +I found it easier. + +00:20:20.200 --> 00:20:22.679 +Python has excellent Google API libraries. + +00:20:22.680 --> 00:20:25.479 +Email calls Python via the call-process. + +00:20:25.480 --> 00:20:27.559 +json is the interchange format. + +00:20:27.560 --> 00:20:29.879 +Why not pure elisp? + +00:20:29.880 --> 00:20:33.799 +For one, OAuth 2.0 flow is a bit complex. + +00:20:33.800 --> 00:20:35.719 +I found it a bit complex to meander on. + +00:20:35.720 --> 00:20:38.139 +That's probably why it took me three years, 364 + +00:20:38.140 --> 00:20:40.319 +days to get over it. + +00:20:40.320 --> 00:20:43.839 +Gmail API Client libraries are mature, easier to + +00:20:43.840 --> 00:20:48.459 +test/debug separately and lets emacs do what it + +00:20:48.460 --> 00:20:50.159 +does best, which is text editing. + +00:20:50.160 --> 00:20:54.759 +Pragmatism over purity, the emacs way since 1976. + +NOTE Roadmap + +00:20:54.760 --> 00:20:57.159 +Okay, some roadmap here. + +00:20:57.160 --> 00:21:00.239 +But near term I want better error messages. + +00:21:00.240 --> 00:21:02.759 +It still gives me python error messages. + +00:21:02.760 --> 00:21:05.039 +There are some asynchronous operations there's no + +00:21:05.040 --> 00:21:06.319 +blocking going on. + +00:21:06.320 --> 00:21:08.879 +It needs a search integration soon. + +00:21:08.880 --> 00:21:11.119 +Attachment I have not yet touched. + +00:21:11.120 --> 00:21:13.879 +That's a big big if, I don't know how to integrate + +00:21:13.880 --> 00:21:15.879 +with org-attach, I'm still wondering how to do + +00:21:15.880 --> 00:21:16.439 +that. + +00:21:16.440 --> 00:21:19.519 +Perhaps I should be able to interact with Outlook + +00:21:19.520 --> 00:21:21.919 +also, fast mail, proton mail. + +00:21:21.920 --> 00:21:24.759 +I don't know AI summaries of thread. + +00:21:24.760 --> 00:21:27.759 +I'm thinking ellama could do it, but I'm not very + +00:21:27.760 --> 00:21:28.319 +sure. + +00:21:28.320 --> 00:21:32.079 +Calendar integration is a nice idea, but org-gcal + +00:21:32.080 --> 00:21:33.319 +and org gmail... + +00:21:33.320 --> 00:21:34.279 +How will they interact? + +00:21:34.280 --> 00:21:35.839 +How will that work? + +00:21:35.840 --> 00:21:37.759 +I'm still not sure. I use them separately. + +00:21:37.760 --> 00:21:40.599 +And any other feature requests that you may have, + +00:21:40.600 --> 00:21:41.439 +just let me know. + +NOTE Contributing + +00:21:41.440 --> 00:21:44.919 +What I may need help with if you have the time and + +00:21:44.920 --> 00:21:47.439 +you're interested in this project, is to test it + +00:21:47.440 --> 00:21:49.079 +on macOS and Windows. + +00:21:49.080 --> 00:21:50.159 +I use Linux. + +00:21:50.160 --> 00:21:51.759 +I use it on Debian. + +00:21:51.760 --> 00:21:52.719 +It works fine. + +00:21:52.720 --> 00:21:54.359 +OAuth edge cases. + +00:21:54.360 --> 00:21:55.719 +I'm not sure how it works. + +00:21:55.720 --> 00:21:57.519 +It shows me some error or the other + +00:21:57.520 --> 00:21:58.119 +here and there. + +00:21:58.120 --> 00:22:00.919 +Definitely documentation needs improvements. + +00:22:00.920 --> 00:22:04.239 +Other email provider expertise will be welcome. + +00:22:04.240 --> 00:22:07.359 +What's ready is, GitHub repo with issues. + +00:22:07.360 --> 00:22:10.239 +You can start with that could be great if you can + +00:22:10.240 --> 00:22:11.879 +tell me some issues with that. + +00:22:11.880 --> 00:22:13.879 +Some kind of development guide. + +00:22:13.880 --> 00:22:15.479 +I am not a programmer. + +00:22:15.480 --> 00:22:18.079 +I vibe-coded most of it. + +00:22:18.080 --> 00:22:20.919 +So a development guide, a true blood developer, + +00:22:20.920 --> 00:22:22.479 +if they can come and tell me, + +00:22:22.480 --> 00:22:23.999 +here is what you should be doing, + +00:22:24.000 --> 00:22:26.239 +I'm more than happy to listen to that. + +00:22:26.240 --> 00:22:27.959 +And probably a test suite. + +00:22:27.960 --> 00:22:28.959 +I do that manually. + +00:22:28.960 --> 00:22:31.239 +All of this, some kind of help with that + +00:22:31.240 --> 00:22:32.939 +will also work. + +NOTE The big picture + +00:22:32.940 --> 00:22:36.559 +The big picture is org-mode and Gmail + +00:22:36.560 --> 00:22:37.679 +can be friends. + +00:22:37.680 --> 00:22:41.119 +They can bond over a cup of coffee. + +NOTE Let's connect + +00:22:41.120 --> 00:22:41.959 +Let's connect. + +00:22:41.960 --> 00:22:47.659 +Here are my details and I am all game to listen to + +00:22:47.660 --> 00:22:48.679 +your question and answers. + +00:22:48.680 --> 00:22:51.279 +I'm happy to give you any answer or responses that + +00:22:51.280 --> 00:22:51.999 +I find. + +00:22:52.000 --> 00:22:54.439 +Please do connect with me on LinkedIn. I have my + +00:22:54.440 --> 00:22:58.359 +website here, and please do fork or install + +00:22:58.360 --> 00:23:00.519 +org-gmail and let me know what you think. + +00:23:00.520 --> 00:23:02.759 +Let's talk about taming email. + +00:23:02.760 --> 00:23:04.400 +Thank you very much. diff --git a/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--answers.vtt b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--answers.vtt new file mode 100644 index 00000000..aa234934 --- /dev/null +++ b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--answers.vtt @@ -0,0 +1,995 @@ +WEBVTT + +NOTE Q: I noticed that it took a considerable amount of time to send email. Is it possible to configure gnus to use an external smtp client to send emails? + +00:00:00.000 --> 00:00:02.117 +Okay, so first question. + +00:00:02.118 --> 00:00:05.037 +I noticed that it took considerable amount of time to send email. + +00:00:05.038 --> 00:00:09.637 +Is it possible to configure to use an external SMTP client + +00:00:09.638 --> 00:00:14.357 +to send emails? Right, yes, it definitely is possible. + +00:00:14.358 --> 00:00:18.957 +In fact, in the past, I've used, I believe, MSMTP, + +00:00:18.958 --> 00:00:23.317 +which is a small SMTP implementation + +00:00:23.318 --> 00:00:27.437 +that's independent of Emacs. So you can do that. + +00:00:27.438 --> 00:00:30.757 +It's also possible to, pointed + +00:00:30.758 --> 00:00:34.997 +to have it use the sendmail binary on your system. + +00:00:34.998 --> 00:00:41.637 +If you have a local MTA mail transfer agents + +00:00:41.638 --> 00:00:46.117 +like Exim or Postfix installed and configure. + +00:00:46.118 --> 00:00:50.037 +I believe that should also dispatch + +00:00:50.038 --> 00:00:51.997 +and return instantaneously + +00:00:51.998 --> 00:00:55.157 +and then have Postfix or Exim + +00:00:55.158 --> 00:00:57.997 +deal with sending the message on their terms + +00:00:57.998 --> 00:01:02.197 +without blocking Emacs. I don't know, it depends. + +00:01:02.198 --> 00:01:04.917 +Normally it's not always that slow. Sometimes it is. + +00:01:04.918 --> 00:01:11.917 +I think it also depends on the load on your mail server. + +00:01:11.918 --> 00:01:14.917 +Sometimes it's instantaneous, sometimes not. + +00:01:14.918 --> 00:01:17.837 +So I hope that helps. + +NOTE Q: Is the dovecot workaround actually a solution? + +00:01:17.838 --> 00:01:20.597 +Let's see, is the Dovecot workaround + +00:01:20.598 --> 00:01:21.917 +actually a solution? + +00:01:21.918 --> 00:01:24.437 +I haven't tried it, but if it works smoothly, + +00:01:24.438 --> 00:01:27.477 +I'll surely do so. It is, it really is. + +00:01:27.478 --> 00:01:31.637 +I've actually been using that setup for many years. + +00:01:31.638 --> 00:01:45.837 +I can't remember. Oh, I believe it's Eric Abramson + +00:01:45.838 --> 00:01:49.077 +who first shared instructions on how to set this up. + +00:01:49.078 --> 00:02:04.037 +Let's see if I can find it. There we go. Yeah, this is it. + +00:02:04.038 --> 00:02:06.957 +I'll share this on IRC as well. + +00:02:06.958 --> 00:02:15.517 +Yeah, so Dovecot is very, very efficient. + +00:02:15.518 --> 00:02:21.557 +It's written in C. And yeah, when you point Gnus + +00:02:21.558 --> 00:02:23.237 +to an IMAP server like Dovecot, + +00:02:23.238 --> 00:02:25.037 +dealing with email is pretty instantaneous. + +00:02:25.038 --> 00:02:29.157 +This article or post by Eric is great. + +00:02:29.158 --> 00:02:32.397 +Although I will say that + +00:02:32.398 --> 00:02:34.997 +there was a recent major release of Dovecot. + +00:02:34.998 --> 00:02:37.877 +I can't remember if it's 2.4 or 2.5. + +00:02:37.878 --> 00:02:39.597 +and it's a breaking change. + +00:02:39.598 --> 00:02:42.557 +They change a lot of the configuration syntax, + +00:02:42.558 --> 00:02:44.077 +so there's a high likelihood + +00:02:44.078 --> 00:02:47.477 +that this drop-in configuration won't work, + +00:02:47.478 --> 00:02:49.237 +even though that's what I used + +00:02:49.238 --> 00:02:51.957 +as my starting point a couple years ago. + +00:02:51.958 --> 00:02:56.237 +I will be writing an article on my personal site + +00:02:56.238 --> 00:03:02.717 +to go over how to configure recent versions of Dovecot + +00:03:02.718 --> 00:03:07.117 +for such a setup, for a local setup. + +NOTE Q: Do you have experience with mu4e or Notmuch, and why would you say Gnus is worth using compared to these? + +00:03:07.118 --> 00:03:15.957 +Let's see. Do you have experience with Mu4e or not much? + +00:03:15.958 --> 00:03:22.397 +And why would you say Gnus is worth using compared to these? + +00:03:22.398 --> 00:03:23.837 +I do have experience with these, + +00:03:23.838 --> 00:03:25.517 +although it goes back many years, + +00:03:25.518 --> 00:03:27.757 +and I'm sure both of these have evolved since, + +00:03:27.758 --> 00:03:31.837 +and they're great pieces of software in their own rights. + +00:03:31.838 --> 00:03:33.917 +And actually I did use them in that order. + +00:03:33.918 --> 00:03:37.397 +Like I first tried Mu4e in Emacs, + +00:03:37.398 --> 00:03:40.277 +when I started using email in Emacs, + +00:03:40.278 --> 00:03:44.277 +then I tried Notmuch for a while, and then I went to Gnus. + +00:03:44.278 --> 00:03:51.157 +They're great. They have like pros and cons. + +00:03:51.158 --> 00:03:52.397 +Mu4e, I believe, has + +00:03:52.398 --> 00:03:55.357 +excellent maildir handling directly, + +00:03:55.358 --> 00:03:58.357 +if I'm not mistaken, unlike Gnus, + +00:03:58.358 --> 00:04:00.837 +so you can point it directly + +00:04:00.838 --> 00:04:03.637 +to your maildirs locally, + +00:04:03.638 --> 00:04:06.157 +and it should work fine, + +00:04:06.158 --> 00:04:08.157 +if I'm remembering correctly. + +00:04:08.158 --> 00:04:11.477 +NotMuch is also excellent. + +00:04:11.478 --> 00:04:12.477 +The thing with Notmuch + +00:04:12.478 --> 00:04:13.957 +is that it uses Xapien + +00:04:13.958 --> 00:04:17.877 +for indexing and searching email. + +00:04:17.878 --> 00:04:20.397 +It's tag-based, so you can tag messages. + +00:04:20.398 --> 00:04:24.077 +And then, yeah, it's amazing + +00:04:24.078 --> 00:04:26.197 +for tagging and searching capabilities, + +00:04:26.198 --> 00:04:28.877 +very powerful search features. + +00:04:28.878 --> 00:04:31.677 +And my reason for trying Gnus + +00:04:31.678 --> 00:04:33.637 +and then, I don't know, eventually + +00:04:33.638 --> 00:04:37.037 +liking it was couple of years ago, + +00:04:37.038 --> 00:04:38.437 +I went through this kind of phase + +00:04:38.438 --> 00:04:40.597 +of trying and trying to like use + +00:04:40.598 --> 00:04:43.357 +and stick with packages + +00:04:43.358 --> 00:04:45.317 +that are built into GNU Emacs + +00:04:45.318 --> 00:04:47.157 +as much as possible. + +00:04:47.158 --> 00:04:51.877 +No particular reason that I would like, + +00:04:51.878 --> 00:04:54.197 +you know, recommend people do that per se, + +00:04:54.198 --> 00:04:57.037 +but yeah, that's just what I wanted to do. + +00:04:57.038 --> 00:05:00.597 +Cause I noticed my configurations + +00:05:00.598 --> 00:05:02.277 +were like growing unwieldy. + +00:05:02.278 --> 00:05:07.797 +So I, like many others declared, Emacs in its bankruptcy, + +00:05:07.798 --> 00:05:11.677 +in its file bankruptcy, and configure things from scratch + +00:05:11.678 --> 00:05:15.717 +and try to use whatever that Emacs had to offer + +00:05:15.718 --> 00:05:18.797 +built in itself, and then only reach for a couple + +00:05:18.798 --> 00:05:20.277 +of external packages here and there. + +00:05:20.278 --> 00:05:24.717 +So that's what I went to. That's how I ended up on Gnu's. + +00:05:24.718 --> 00:05:26.397 +And it's been very nice. + +00:05:26.398 --> 00:05:29.557 +I've tried a few other email clients + +00:05:29.558 --> 00:05:31.237 +since then, temporarily, + +00:05:31.238 --> 00:05:33.197 +like I tried AERC, A-E-R-C, + +00:05:33.198 --> 00:05:36.197 +which is not built into Emacs, + +00:05:36.198 --> 00:05:36.797 +but I don't know, + +00:05:36.798 --> 00:05:38.197 +I keep coming back to Gnus. + +00:05:38.198 --> 00:05:42.757 +It's great to have it all, to be able to do all these things + +00:05:42.758 --> 00:05:47.677 +from within GNU Emacs. Let's see, some notes and feedback. + +00:05:47.678 --> 00:05:52.557 +Thank you for all the kind words folks, appreciate it. + +00:05:52.558 --> 00:05:56.557 +I'm glad that you found the presentation helpful + +00:05:56.558 --> 00:05:59.157 +or somewhat useful. Let's see, new question. + +00:05:59.158 --> 00:06:05.319 +Oh, and I will check IRC as well. + +NOTE Q: At my organization, we're forced to use OAuth with outlook and they've also blacklisted all email clients except thunderbird (but they don't support it, only the webmail or the outlook app). Do you know if this is something that can be circumvented in Gnus? + +00:06:05.320 --> 00:06:06.917 +Let's see, at my organization, + +00:06:06.918 --> 00:06:09.317 +we're forced to use OAuth with Outlook, + +00:06:09.318 --> 00:06:11.157 +and they've also blacklisted + +00:06:11.158 --> 00:06:13.517 +all email clients except Thunderbird, + +00:06:13.518 --> 00:06:15.237 +but they don't support it, + +00:06:15.238 --> 00:06:17.037 +only the Webmail or the Outlook app. + +00:06:17.038 --> 00:06:18.517 +Do you know if this is something + +00:06:18.518 --> 00:06:23.997 +that can be circumvented in Gnus? Let's see. + +00:06:23.998 --> 00:06:29.797 +So if I'm pretty sure, at least with the recent Emacs versions, + +00:06:29.798 --> 00:06:37.677 +Gnus does support xOAuth as a backend. + +00:06:37.678 --> 00:06:41.557 +So I think you should be able to do that + +00:06:41.558 --> 00:06:45.677 +even with just the things, the machinery built into Emacs. + +00:06:45.678 --> 00:06:53.917 +Even so, I think there are external packages and programs. + +00:06:53.918 --> 00:06:58.717 +One of them I think comes from this Cyrus IMAP world + +00:06:58.718 --> 00:07:02.357 +of things that implement like XOAuth. + +00:07:02.358 --> 00:07:04.797 +So you should be able to do that. + +00:07:04.798 --> 00:07:09.397 +You should be able to use that to get authenticated + +00:07:09.398 --> 00:07:12.237 +to your organization's mail server. + +00:07:12.238 --> 00:07:15.797 +But I've never tried that myself. + +00:07:15.798 --> 00:07:22.837 +In terms of like blacklisting all email clients, + +00:07:22.838 --> 00:07:27.637 +I don't know how they would do it outside of, you know, + +00:07:27.638 --> 00:07:29.797 +this kind of authentication thingy. + +00:07:29.798 --> 00:07:32.317 +If, you know, they check + +00:07:32.318 --> 00:07:34.674 +the user agent header or something, + +00:07:34.640 --> 00:07:37.279 +that's pretty easy to customize and set. + +00:07:37.280 --> 00:07:40.879 +With Gnus, you can set, define a posting style + +00:07:40.880 --> 00:07:43.279 +to set a custom user agent. + +00:07:43.280 --> 00:07:48.719 +So, yeah, that's as far as I know. + +00:07:48.720 --> 00:07:50.079 +Thunderbird is pretty nice too. + +00:07:50.080 --> 00:07:54.159 +Like I reach out for it sometimes + +00:07:54.160 --> 00:07:55.799 +when I'm in a rush or can't, + +00:07:55.800 --> 00:08:00.159 +don't have the time to like set up Gnus with + +00:08:00.160 --> 00:08:04.039 +like some new like IMAP server or something. + +00:08:04.040 --> 00:08:05.519 +I reach for it sometimes, but yeah, + +00:08:05.520 --> 00:08:10.359 +I primarily use Gnus. I see. + +00:08:10.360 --> 00:08:11.719 +So the question says they tried it + +00:08:11.720 --> 00:08:13.279 +with not much and it never worked. + +00:08:13.280 --> 00:08:19.999 +Even KML on Android didn't work. + +00:08:20.000 --> 00:08:23.519 +Right. Yeah, I'm not sure. + +00:08:23.520 --> 00:08:27.039 +If you can like provide maybe more details + +00:08:27.040 --> 00:08:29.319 +as to like what doesn't work + +00:08:29.320 --> 00:08:32.079 +or if you get any particular error messages + +00:08:32.080 --> 00:08:37.359 +or like how they're trying to like prevent you from using it, + +00:08:37.360 --> 00:08:38.439 +then maybe folks could have some ideas + +00:08:38.440 --> 00:08:41.999 +of maybe how to get around that. + +00:08:42.000 --> 00:08:45.999 +Yeah. Let's see, I'm going to go + +00:08:46.000 --> 00:08:59.959 +over and take a look at IRC. Yes, scoring is great. + +00:08:59.960 --> 00:09:02.959 +In it for bankruptcy, + +00:09:02.960 --> 00:09:06.559 +they have mail to use outlook from Gnus, right? + +00:09:06.560 --> 00:09:11.999 +Yeah, there are various like solutions and workarounds. + +00:09:12.000 --> 00:09:23.519 +Yeah, let's see. How's the schedule looking? + +00:09:23.520 --> 00:09:24.519 +I think the next talk + +00:09:24.520 --> 00:09:30.519 +is gonna start pretty soon, if I'm not mistaken. + +00:09:30.520 --> 00:09:34.279 +Yeah, so I believe that's about all the time + +00:09:34.280 --> 00:09:36.799 +that we have on the stream for the Q&A, + +00:09:36.800 --> 00:09:40.759 +but of course I'll hang around here on big blue button + +00:09:40.760 --> 00:09:45.279 +and IRC for a while if folks would like to ask more questions. + +00:09:45.280 --> 00:09:47.279 +And also feel free to email me, + +00:09:47.280 --> 00:09:49.099 +bandali@gnu.org + +00:09:49.100 --> 00:10:31.539 +or at kelar.org with any questions. + +00:10:31.540 --> 00:10:35.719 +Thanks again for the kind words folks, appreciate it. + +00:10:35.720 --> 00:10:38.399 +Yeah, I myself also wish + +00:10:38.400 --> 00:10:41.319 +that there were like some tutorials or something + +00:10:41.320 --> 00:10:43.679 +when I was getting started with Gnus, + +00:10:43.680 --> 00:10:46.119 +but we didn't have that. So, and I've been meaning + +00:10:46.120 --> 00:10:49.999 +to like record a talk like this for years for EmacsConf, + +00:10:50.000 --> 00:10:53.039 +but yeah, funnily enough, after like 10 years of, + +00:10:53.040 --> 00:10:54.919 +at my 10th anniversary + +00:10:54.920 --> 00:10:55.879 +of being involved with the conference, + +00:10:55.880 --> 00:10:57.999 +I finally put together a talk of my own + +00:10:58.000 --> 00:11:08.199 +to talk about configuring Gnus. + +00:11:08.200 --> 00:11:25.959 +Let's see. Oh, I see, I see. + +00:11:25.960 --> 00:11:29.719 +So the organization is doing some kind of check + +00:11:29.720 --> 00:11:41.239 +during setting up of OAuth. + +00:11:41.240 --> 00:11:45.639 +So I think how that works is + +00:11:45.640 --> 00:11:47.399 +sometimes these email clients, + +00:11:47.400 --> 00:11:50.040 +I think at least this is the case for Gmail or something, + +00:11:50.118 --> 00:11:55.037 +where a project such as Thunderbird + +00:11:55.038 --> 00:12:00.557 +needs to apply for some kind of token + +00:12:00.558 --> 00:12:02.517 +to be able to authenticate + +00:12:02.518 --> 00:12:05.117 +and connect its users to a mail server. + +00:12:05.118 --> 00:12:10.197 +So all I will say is + +00:12:10.198 --> 00:12:12.237 +that Thunderbird is free software + +00:12:12.238 --> 00:12:13.517 +and the sources are available + +00:12:13.518 --> 00:12:15.517 +and you might be able to find + +00:12:15.518 --> 00:12:19.637 +the token that they use and yeah. + +00:12:19.638 --> 00:13:13.877 +Right, so yeah, I'm just reading this comment here. + +00:13:13.878 --> 00:13:16.077 +You're very welcome again. + +00:13:16.078 --> 00:13:18.797 +I hope you find it useful in some way. + +NOTE Comment: Liked how I started with a clean setup + +00:13:18.798 --> 00:13:21.597 +So they say that they like the fact + +00:13:21.598 --> 00:13:25.237 +that I started with a clean setup and built from that. + +00:13:25.238 --> 00:13:27.117 +Reading and writing emails in Emacs + +00:13:27.118 --> 00:13:28.917 +is definitely not straightforward. + +00:13:28.918 --> 00:13:30.357 +And I find it frustrating + +00:13:30.358 --> 00:13:32.317 +that there are so many pieces to put together + +00:13:32.318 --> 00:13:34.397 +and a bunch of documentation to read. + +00:13:34.398 --> 00:13:39.317 +And they admit that they find Gnus overwhelming. + +00:13:39.318 --> 00:13:42.757 +I sympathize and empathize. + +00:13:42.758 --> 00:13:45.317 +I've been in that very same situation. + +00:13:45.318 --> 00:13:50.557 +And yeah, it's totally okay to feel like that. + +00:13:50.558 --> 00:13:55.437 +I mean, email itself is kind of complex, + +00:13:55.438 --> 00:13:57.517 +even on the server side. + +00:13:57.518 --> 00:14:00.517 +If you've ever looked or have been interested + +00:14:00.518 --> 00:14:02.677 +in self-hosting your email, + +00:14:02.678 --> 00:14:06.637 +you know that there are so many moving parts and pieces. + +00:14:06.638 --> 00:14:14.397 +So yeah, I hope that this short video + +00:14:14.398 --> 00:14:18.277 +can be a useful first step + +00:14:18.278 --> 00:14:19.757 +of getting you set up to + +00:14:19.758 --> 00:14:22.957 +at least be able to read your emails + +00:14:22.958 --> 00:14:26.557 +and compose and send them within Emacs + +00:14:26.558 --> 00:14:30.837 +so that you can see that it's possible + +00:14:30.838 --> 00:14:34.837 +and get that positive feedback loop going + +00:14:34.838 --> 00:14:41.157 +and get the encouragement and then go from there. + +00:14:41.158 --> 00:15:06.597 +Yeah, Gnus is most definitely very extensible. + +00:15:06.598 --> 00:15:10.157 +It already has a lot of backends built into GNU Emacs, + +00:15:10.158 --> 00:15:12.437 +and there are other ones + +00:15:12.438 --> 00:15:14.237 +that people have written externally + +00:15:14.238 --> 00:15:18.557 +on various code hosting forges + +00:15:18.558 --> 00:15:27.877 +that you can download and set up. Yeah, thank you all. + +00:15:27.878 --> 00:15:30.717 +It's nice to see that the talk + +00:15:30.718 --> 00:15:33.917 +has kind of resonated with so many folks. + +00:15:33.918 --> 00:15:41.237 +And, yeah, it is encouragement + +00:15:41.238 --> 00:15:44.197 +for me to finally get around to starting + +00:15:44.198 --> 00:15:47.997 +perhaps either a tutorial series + +00:15:47.998 --> 00:15:50.477 +or like a video series like this + +00:15:50.478 --> 00:15:54.117 +concretely showing and walking through + +00:15:54.118 --> 00:15:57.917 +how to like set up and configure these different aspects. + +00:15:57.918 --> 00:16:00.277 +There were so many other things that I wanted to show, + +00:16:00.278 --> 00:16:04.557 +but didn't have the time + +00:16:04.558 --> 00:16:06.437 +or couldn't squeeze it into + +00:16:06.438 --> 00:16:09.037 +the 15, 20 minute format for the conference. + +00:16:09.038 --> 00:17:34.659 +Yeah. I'm going to hang out here for a few more minutes. + +NOTE Comment: They would have liked to see a quick demo of Gnus while it is fully configured and tweaked + +00:17:34.660 --> 00:17:36.557 +Another comment, they would have liked + +00:17:36.558 --> 00:17:38.717 +to see a quick demo of Gnus + +00:17:38.718 --> 00:17:41.117 +while it is fully configured and tweaked. + +00:17:41.118 --> 00:17:43.357 +That's kind of a teaser. + +00:17:43.358 --> 00:17:52.357 +I can definitely do that sometime after the conference. + +00:17:52.358 --> 00:17:59.637 +Truth be told, I don't customize the looks of it heavily. + +00:17:59.638 --> 00:18:01.757 +I use the default layout + +00:18:01.758 --> 00:18:03.957 +for the summary and article buffers. + +00:18:03.958 --> 00:18:12.557 +With Gnus, you can even reconfigure that + +00:18:12.558 --> 00:18:15.637 +to arrange these in your preferred location or layout. + +00:18:15.638 --> 00:18:18.717 +I don't really do any of that. + +00:18:18.718 --> 00:18:22.797 +For the most part, my setup is pretty simple. + +NOTE My init file + +00:18:22.798 --> 00:18:27.757 +I can actually maybe show my init file here. Let's see. + +00:18:27.758 --> 00:18:58.717 +Yeah, so this is, I guess, part of my Gnus configuration. + +00:18:58.718 --> 00:19:01.437 +I configure a couple of mail servers, + +00:19:01.438 --> 00:19:04.637 +set up these expiry targets + +00:19:04.638 --> 00:19:07.597 +so that I can hit capital E on a message + +00:19:07.598 --> 00:19:12.437 +and then have it be archived. You can have it be immediate. + +00:19:12.438 --> 00:19:15.477 +I do that for work messages + +00:19:15.478 --> 00:19:17.677 +or you can use the default seven day, + +00:19:17.678 --> 00:19:21.797 +where if a message is older than seven days, + +00:19:21.798 --> 00:19:23.317 +like once it reaches that age + +00:19:23.318 --> 00:19:26.357 +and it's been marked as expired and it'll be moved into, + +00:19:26.358 --> 00:19:29.597 +like for example, this yearly archive directory, + +00:19:29.598 --> 00:19:34.079 +like archive. For example, 2025. + +NOTE Mail splitting + +00:19:34.080 --> 00:19:35.317 +Yeah, you can do like mail splitting, + +00:19:35.318 --> 00:19:38.557 +automatically filing email. + +00:19:38.558 --> 00:19:44.037 +The fancy splitting is the more powerful variant. + +00:19:44.038 --> 00:19:46.917 +You can use like all kinds of regular expressions + +00:19:46.918 --> 00:19:48.917 +and move email around depending on + +00:19:48.918 --> 00:19:50.877 +what field or what header + +00:19:50.878 --> 00:19:52.637 +matches what regular expression. + +NOTE Gnus parameters + +00:19:52.638 --> 00:20:00.397 +What else? Gnus has things, + +00:20:00.398 --> 00:20:03.477 +has a facility like Gnus parameters + +00:20:03.478 --> 00:20:07.237 +for configuring individual groups or directories. + +00:20:07.238 --> 00:20:11.477 +Like if you file all the mailing or the mails + +00:20:11.478 --> 00:20:15.797 +for a particular mailing list into a certain group. + +00:20:15.798 --> 00:20:20.237 +And for example, if they add + +00:20:20.238 --> 00:20:22.917 +the name of the mailing list + +00:20:22.918 --> 00:20:26.437 +to the, subject header. + +00:20:26.438 --> 00:20:28.957 +They prefix the subject header with the name of the list. + +00:20:28.958 --> 00:20:30.637 +You can set that here + +00:20:30.638 --> 00:20:32.877 +and Gnus will automatically + +00:20:32.878 --> 00:20:39.117 +hide that for you. So, let's see. + +00:20:39.118 --> 00:20:54.637 +There's a news agent, + +00:20:54.638 --> 00:20:58.917 +which I won't even get into because it's a rabbit hole. + +00:20:58.918 --> 00:21:01.877 +It's pretty cool. Definitely check it out. + +00:21:01.878 --> 00:21:07.517 +You can define what MIME parts should be buttonized + +00:21:07.518 --> 00:21:09.277 +so that you can like easily toggle them + +00:21:09.278 --> 00:21:11.077 +when displaying the article. + +00:21:11.078 --> 00:21:14.837 +Yeah, you can customize the list + +00:21:14.838 --> 00:21:17.597 +of the headers that are displayed and the order of them. + +00:21:17.598 --> 00:21:22.997 +Like I showed in the sample init file that I provided. + +00:21:22.998 --> 00:21:31.019 +Gnus can integrate with Dired. + +NOTE Custom signatures + +00:21:31.020 --> 00:21:35.957 +You can set like custom signatures like here. + +00:21:35.958 --> 00:21:37.877 +I might define something + +00:21:37.878 --> 00:21:44.797 +and then I use it later in the posting, + +00:21:44.798 --> 00:21:48.517 +in the posting, the news posting styles variable. + +00:21:48.518 --> 00:22:05.019 +I set a signature to that. Yeah. + +NOTE Other customizations + +00:22:05.020 --> 00:22:09.997 +You can write custom like functions to move email around. + +00:22:09.998 --> 00:22:13.919 +So I have this like Gnus chunk article function + +00:22:13.920 --> 00:22:19.117 +that I bind to v s, + +00:22:19.118 --> 00:22:22.317 +so v is the prefix came up that I defined, + +00:22:22.318 --> 00:22:29.757 +and then s, so you can do things like that. + +00:22:29.758 --> 00:22:34.197 +You can customize the format of the topic lines, + +00:22:34.198 --> 00:22:39.557 +so if I actually launch Gnus with my own configuration, + +00:22:39.558 --> 00:22:43.397 +this is how it might look like, so. + +00:22:43.398 --> 00:22:58.437 +You can define archive decoders + +00:22:58.438 --> 00:23:02.317 +to let you like automatically decode + +00:23:02.318 --> 00:23:04.957 +inside the Gnus article buffer, + +00:23:04.958 --> 00:23:10.157 +how to extract certain archive formats. + +00:23:10.158 --> 00:23:13.037 +Like for example, I defined this one for Gzip. + +00:23:13.038 --> 00:23:18.637 +You can set like discouraged alternatives + +00:23:18.638 --> 00:23:22.077 +to like, for example, hide HTML email by default, + +00:23:22.078 --> 00:23:26.997 +especially if there is a plain text version. I do that. + +00:23:26.998 --> 00:23:34.997 +GNU says machinery around like encrypting emails. + +00:23:34.998 --> 00:23:41.759 +It has a bunch of customizations. + +00:23:41.760 --> 00:23:44.797 +that you can configure and have Gnus behave a certain way. + +00:23:44.798 --> 00:23:48.637 +For example, when replying to signed or encrypted emails. + +00:23:48.638 --> 00:24:01.957 +And yeah. Anyway. That's about it. + +00:24:01.958 --> 00:24:04.557 +So yeah, thanks again for hanging out with me, folks. + +00:24:04.558 --> 00:24:08.877 +I appreciate all the kind words. + +00:24:08.878 --> 00:24:13.117 +comments and yeah, I'm also + +00:24:13.118 --> 00:24:17.037 +looking forward to trying and putting together + +00:24:17.038 --> 00:24:21.997 +more videos or articles about Gnus. + +00:24:21.998 --> 00:24:28.117 +Definitely one about configuring Dovecot for local mail. + +00:24:28.118 --> 00:24:31.157 +And yeah, take it from there. Thanks again. + +00:24:31.158 --> 00:24:33.688 +Hope you enjoy the rest of the conference. diff --git a/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt new file mode 100644 index 00000000..fc516878 --- /dev/null +++ b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main--chapters.vtt @@ -0,0 +1,50 @@ +WEBVTT + + +00:00:02.620 --> 00:01:25.239 +Introduction + +00:01:25.240 --> 00:02:49.959 +Demo + +00:02:49.960 --> 00:03:58.559 +Don't panic + +00:03:58.560 --> 00:05:46.239 +Configuring servers + +00:05:46.240 --> 00:06:26.599 +.authinfo + +00:06:26.600 --> 00:08:25.719 +Configuration + +00:08:25.720 --> 00:09:40.079 +Starting Gnus + +00:09:40.080 --> 00:10:19.899 +Always showing groups + +00:10:19.900 --> 00:11:30.119 +Reading messages + +00:11:30.120 --> 00:12:55.159 +Debugging IMAP + +00:12:55.160 --> 00:14:25.559 +Topics + +00:14:25.560 --> 00:15:24.319 +Customizing message display + +00:15:24.320 --> 00:17:26.659 +Sending emails + +00:17:26.660 --> 00:19:27.959 +Plans + +00:19:27.960 --> 00:20:12.759 +Wrapping up + +00:20:12.760 --> 00:21:37.760 +nnimap diff --git a/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt new file mode 100644 index 00000000..c4e86336 --- /dev/null +++ b/2025/captions/emacsconf-2025-gnus--reading-and-writing-emails-in-gnu-emacs-with-gnus--amin-bandali--main.vtt @@ -0,0 +1,1332 @@ +WEBVTT captioned by sachac + +NOTE Introduction + +00:00:02.620 --> 00:00:04.799 +Hello, my name is Amin Bandali, + +00:00:04.800 --> 00:00:06.359 +and today I'd like to talk about + +00:00:06.360 --> 00:00:08.799 +reading and writing emails in GNU Emacs + +00:00:08.800 --> 00:00:14.319 +using Gnus specifically. + +00:00:14.320 --> 00:00:16.879 +Gnus has had this sort of reputation + +00:00:16.880 --> 00:00:20.599 +of being difficult to approach and configure. + +00:00:20.600 --> 00:00:23.359 +That's understandable + +00:00:23.360 --> 00:00:26.319 +because it has many, many options + +00:00:26.320 --> 00:00:27.679 +and major and minor modes + +00:00:27.680 --> 00:00:30.679 +that interact in different ways with each other. + +00:00:30.680 --> 00:00:35.319 +And it also doesn't help that Gnus started originally + +00:00:35.320 --> 00:00:36.359 +as a newsreader + +00:00:36.360 --> 00:00:38.759 +rather than a mail client. + +00:00:38.760 --> 00:00:40.879 +So a lot of the terminology that it uses + +00:00:40.880 --> 00:00:42.519 +is also rooted in that, + +00:00:42.520 --> 00:00:45.559 +in reading and writing news. + +00:00:45.560 --> 00:00:48.119 +But nevertheless, with this video and talk, + +00:00:48.120 --> 00:00:52.159 +I hope to provide a sort + +00:00:52.160 --> 00:00:55.759 +of very quick introduction + +00:00:55.760 --> 00:00:57.539 +of starting to use Gnus + +00:00:57.540 --> 00:01:00.919 +to read and write email and send it. + +00:01:00.920 --> 00:01:02.679 +We will use Gnus' IMAP support, + +00:01:02.680 --> 00:01:06.119 +mainly because a lot of people + +00:01:06.120 --> 00:01:08.679 +these days have email accounts + +00:01:08.680 --> 00:01:10.759 +with mail service providers + +00:01:10.760 --> 00:01:12.039 +that support IMAP, + +00:01:12.040 --> 00:01:14.319 +which is an open standard. + +00:01:14.320 --> 00:01:17.479 +So it's widely available and supported + +00:01:17.480 --> 00:01:19.719 +across many different providers + +00:01:19.720 --> 00:01:25.239 +as well as mail clients or mail user agents as well. + +NOTE Demo + +00:01:25.240 --> 00:01:30.559 +Okay, so let's just jump straight right in. + +00:01:30.560 --> 00:01:34.279 +I will enter this demo directory that I created + +00:01:34.280 --> 00:01:36.919 +for the purposes of this demonstration + +00:01:36.920 --> 00:01:40.999 +and change my home directory to this one + +00:01:41.000 --> 00:01:49.839 +so that we can safely experiment with Gnus here. + +00:01:49.840 --> 00:01:53.979 +For this presentation, I've written up + +00:01:53.980 --> 00:01:56.839 +a quick initialization file or init file + +00:01:56.840 --> 00:01:59.719 +that I will share afterwards as well + +00:01:59.720 --> 00:02:01.639 +to get us going with Gnus. + +00:02:01.640 --> 00:02:04.519 +There's not much to it at the moment. + +00:02:04.520 --> 00:02:07.399 +Just set up the package archives and + +00:02:07.400 --> 00:02:09.479 +install the keycast package + +00:02:09.480 --> 00:02:14.079 +for showing the key presses in the mode line. + +00:02:14.080 --> 00:02:15.359 +Yeah, that's about it. + +00:02:15.360 --> 00:02:16.239 +And I'll also define + +00:02:16.240 --> 00:02:20.279 +a little like inline function +emacs.d + +00:02:20.280 --> 00:02:24.079 +that allows me to conveniently write + +00:02:24.080 --> 00:02:26.639 +and have it expanded + +00:02:26.640 --> 00:02:29.300 +or refer to files and directories, rather, + +00:02:29.301 --> 00:02:30.900 +paths that we could expand, + +00:02:30.901 --> 00:02:32.833 +inside my Emacs configuration directory. + +00:02:32.834 --> 00:02:37.500 +I also have this eval-last-sexp + +00:02:37.501 --> 00:02:41.119 +bound to a global key, + +00:02:41.120 --> 00:02:43.279 +so that I will be able to easily + +00:02:43.280 --> 00:02:47.519 +use it for this talk. + +00:02:47.520 --> 00:02:49.959 +Okay, let's jump right in. + +NOTE Don't panic + +00:02:49.960 --> 00:02:52.239 +First things first, don't panic. + +00:02:52.240 --> 00:02:55.267 +And that's actually also the name + +00:02:55.268 --> 00:02:58.359 +of the very first node + +00:02:58.360 --> 00:03:01.559 +in the Gnus manual when you open it. + +00:03:01.560 --> 00:03:02.839 +And it's actually nice. + +00:03:02.840 --> 00:03:04.479 +I definitely, definitely recommend + +00:03:04.480 --> 00:03:07.079 +that you look through + +00:03:07.080 --> 00:03:10.199 +at least the very first couple of chapters of this, + +00:03:10.200 --> 00:03:14.199 +skim through it, and later on refer to it + +00:03:14.200 --> 00:03:16.133 +whenever you find something confusing + +00:03:16.134 --> 00:03:19.499 +or don't understand it. + +00:03:19.500 --> 00:03:21.359 +But yeah, we'll start + +00:03:21.360 --> 00:03:22.399 +with these two paragraphs here. + +00:03:22.400 --> 00:03:23.639 +So again, a Gnus installation + +00:03:23.640 --> 00:03:28.119 +is basically just a list of one or more servers + +00:03:28.120 --> 00:03:30.119 +and the subscribed groups from those servers + +00:03:30.120 --> 00:03:32.319 +and articles in those groups. + +00:03:32.320 --> 00:03:34.279 +You can already kind of see + +00:03:34.280 --> 00:03:39.479 +where that influence of a newsreader comes in. + +00:03:39.480 --> 00:03:41.839 +But yeah, basically what it's saying is that, + +00:03:41.840 --> 00:03:43.839 +you know, we have one or more servers. + +00:03:43.840 --> 00:03:47.079 +We can think of them as email servers. + +00:03:47.080 --> 00:03:49.359 +Groups can be like, we can think + +00:03:49.360 --> 00:03:52.959 +of them as folders or directories. + +00:03:52.960 --> 00:03:55.239 +And yeah, articles, + +00:03:55.240 --> 00:03:58.559 +those would be like our email messages. + +NOTE Configuring servers + +00:03:58.560 --> 00:03:59.679 +With Gnus, we can add + +00:03:59.680 --> 00:04:06.119 +and configure servers mainly using two variables. + +00:04:06.120 --> 00:04:07.919 +One of them is the gnus-select-method + +00:04:07.920 --> 00:04:11.479 +and the other is gnus-secondary-select-methods. + +00:04:11.480 --> 00:04:15.759 +The first one predates the second one + +00:04:15.760 --> 00:04:17.559 +and I generally don't recommend using it, because + +00:04:17.560 --> 00:04:22.559 +first of all, it can only point + +00:04:22.560 --> 00:04:26.359 +to one server, and that server, + +00:04:26.360 --> 00:04:27.879 +because it's the primary, + +00:04:27.880 --> 00:04:32.559 +then Gnus won't add a prefix to its groups, + +00:04:32.560 --> 00:04:34.839 +so later on, as you get into + +00:04:34.840 --> 00:04:36.679 +more advanced features of Gnus + +00:04:36.680 --> 00:04:38.519 +and, for example, want to write rules + +00:04:38.520 --> 00:04:42.959 +to modify your message composition + +00:04:42.960 --> 00:04:47.039 +in a way for certain groups, or file mail, + +00:04:47.040 --> 00:04:48.799 +automatically classify mail, + +00:04:48.800 --> 00:04:51.879 +this distinction can become + +00:04:51.880 --> 00:04:53.959 +confusing and annoying. + +00:04:53.960 --> 00:04:57.199 +My recommendation is to always and only use + +00:04:57.200 --> 00:05:01.799 +the gnus-secondary-select-methods. + +00:05:01.800 --> 00:05:07.319 +Yeah, so let's do that here. + +00:05:07.320 --> 00:05:10.299 +I'm gonna uncomment this portion. + +00:05:10.300 --> 00:05:16.419 +So here, I set the primary select method to nil, + +00:05:16.420 --> 00:05:24.159 +and the second one, I define an nnimap server + +00:05:24.160 --> 00:05:30.039 +of the nnimap backend. + +00:05:30.040 --> 00:05:32.439 +I give it the name ec25gnus. + +00:05:32.440 --> 00:05:35.879 +What I want it to do is to + +00:05:35.880 --> 00:05:37.799 +connect to my mail server, + +00:05:37.800 --> 00:05:41.079 +which is at this address, + +00:05:41.080 --> 00:05:46.239 +and fetch emails from it over TLS with this username. + +NOTE .authinfo + +00:05:46.240 --> 00:05:50.719 +And then the passwords or the credentials, + +00:05:50.720 --> 00:05:56.839 +you can put them in the .authinfo file. + +00:05:56.840 --> 00:05:58.799 +Normally, you would want to, for example, + +00:05:58.800 --> 00:06:03.719 +encrypt this file with your GPG key. + +00:06:03.720 --> 00:06:06.719 +But for this demonstration, I haven't. + +00:06:06.720 --> 00:06:10.479 +So yeah, the format is the keyword "machine" + +00:06:10.480 --> 00:06:15.239 +followed by the name of your Gnus server or account, + +00:06:15.240 --> 00:06:17.199 +followed by the word "login", + +00:06:17.200 --> 00:06:19.199 +then your login username, + +00:06:19.200 --> 00:06:23.959 +and then the password, which here it's not shown. + +00:06:23.960 --> 00:06:26.599 +Yeah. + +NOTE Configuration + +00:06:26.600 --> 00:06:28.679 +But before we actually set this, + +00:06:28.680 --> 00:06:31.479 +I'll just show you that if we like start Gnus + +00:06:31.480 --> 00:06:33.719 +with M-x gnus, + +00:06:33.720 --> 00:06:36.439 +initially, it will just show + +00:06:36.440 --> 00:06:37.759 +an error like this. + +00:06:37.760 --> 00:06:40.399 +Even if we continue, it's empty. + +00:06:40.400 --> 00:06:43.399 +There's not much because Gnus doesn't know + +00:06:43.400 --> 00:06:47.039 +where to fetch these emails from. + +00:06:47.040 --> 00:06:52.159 +And that's what we will configure. + +00:06:52.160 --> 00:06:55.859 +Excuse me. + +00:06:55.860 --> 00:06:57.559 +Yeah, so just for convenience, + +00:06:57.560 --> 00:06:59.079 +we can bind Gnus to, + +00:06:59.080 --> 00:07:00.679 +for example, C-c g, as I've done here. + +00:07:00.680 --> 00:07:04.119 +You will want to set your name + +00:07:04.120 --> 00:07:05.799 +and email address, like so. + +00:07:05.800 --> 00:07:09.239 +Here we tell Emacs + +00:07:09.240 --> 00:07:11.439 +that we are going to be using Gnus for reading email, + +00:07:11.440 --> 00:07:12.839 +because Emacs comes + +00:07:12.840 --> 00:07:14.759 +with other email clients as well, + +00:07:14.760 --> 00:07:18.559 +such as Rmail, and in fact, defaults to Rmail, + +00:07:18.560 --> 00:07:24.839 +so this way, we tell it to use Gnus. + +00:07:24.840 --> 00:07:31.559 +By default, Gnus puts its newsrc file and other files, + +00:07:31.560 --> 00:07:34.319 +I believe it still scatters them + +00:07:34.320 --> 00:07:35.439 +in a few different directories + +00:07:35.440 --> 00:07:36.279 +in your home directory, + +00:07:36.280 --> 00:07:37.399 +so it's a little bit messy. + +00:07:37.400 --> 00:07:40.039 +So what I prefer to do is to just put it + +00:07:40.040 --> 00:07:42.439 +all under the Gnus directory + +00:07:42.440 --> 00:07:47.439 +inside of my Emacs configuration, as I do here. + +00:07:47.440 --> 00:07:50.639 +Yeah, and then here we just tell Gnus + +00:07:50.640 --> 00:07:53.319 +to, like, don't try to bother + +00:07:53.320 --> 00:07:55.759 +with a generic newsrc file + +00:07:55.760 --> 00:07:57.119 +that would be shared + +00:07:57.120 --> 00:07:58.399 +with other news readers. + +00:07:58.400 --> 00:07:59.679 +Just want to use it for email. + +00:07:59.680 --> 00:08:01.959 +And yeah, so we just tell Gnus + +00:08:01.960 --> 00:08:03.039 +to keep all of its data + +00:08:03.040 --> 00:08:08.079 +inside a dedicated .newsrc.eld + +00:08:08.080 --> 00:08:12.159 +(for Emacs Lisp data) file instead. + +00:08:12.160 --> 00:08:15.199 +And we can also have Gnus not prompt us + +00:08:15.200 --> 00:08:19.679 +when we want to exit with q. + +00:08:19.680 --> 00:08:23.399 +Anyway, so let's go ahead and evaluate this. + +00:08:23.400 --> 00:08:25.719 +So this has been set, + +NOTE Starting Gnus + +00:08:25.720 --> 00:08:32.267 +so if we type M-x gnus again, or hit C-c g, + +00:08:32.268 --> 00:08:35.699 +now we're faced with an empty buffer, + +00:08:35.700 --> 00:08:37.399 +and it says no news is good news, + +00:08:37.400 --> 00:08:38.399 +and that's actually + +00:08:38.400 --> 00:08:40.719 +one of the characteristics of Gnus + +00:08:40.720 --> 00:08:44.779 +is that by default it tries + +00:08:44.780 --> 00:08:47.619 +to like sort of declutter + +00:08:47.620 --> 00:08:49.199 +and show us a little less possible + +00:08:49.200 --> 00:08:50.819 +in the group buffer, + +00:08:50.820 --> 00:08:53.259 +meaning that if you don't have + +00:08:53.260 --> 00:08:55.639 +any groups with unread or marked + +00:08:55.640 --> 00:09:00.119 +or, like, starred messages, it will not show them. + +00:09:00.120 --> 00:09:03.959 +To actually see all of our groups or folders, + +00:09:03.960 --> 00:09:08.359 +we hit shift L or capital L, + +00:09:08.360 --> 00:09:12.419 +and we see that we have an inbox here, + +00:09:12.420 --> 00:09:14.879 +as expected. So we enter the inbox, + +00:09:14.880 --> 00:09:17.459 +and we see that there is an article there + +00:09:17.460 --> 00:09:20.779 +and it's already been marked as read. + +00:09:20.780 --> 00:09:22.679 +But if we mark it as unread + +00:09:22.680 --> 00:09:25.959 +and exit and enter Gnus again, + +00:09:25.960 --> 00:09:27.279 +this is what we would see. + +00:09:27.280 --> 00:09:28.839 +We would see that our group + +00:09:28.840 --> 00:09:34.099 +and then we enter it, we see our mail here. + +00:09:34.100 --> 00:09:36.159 +Yeah, and this is our very first email + +00:09:36.160 --> 00:09:40.079 +that we read in GNU Emacs here, inside Gnus. + +NOTE Always showing groups + +00:09:40.080 --> 00:09:43.839 +It might be useful to have Gnus always show + +00:09:43.840 --> 00:09:46.839 +certain groups or folders + +00:09:46.840 --> 00:09:48.319 +even if they don't have + +00:09:48.320 --> 00:09:52.339 +anything unread or marked inside of them. + +00:09:52.340 --> 00:09:56.039 +The way we can do that is + +00:09:56.040 --> 00:09:57.599 +by setting this variable + +00:09:57.600 --> 00:10:01.339 +gnus-permanently-visible-groups + +00:10:01.340 --> 00:10:03.039 +to a regular expression + +00:10:03.040 --> 00:10:09.119 +that describes the name of these groups. + +00:10:09.120 --> 00:10:11.539 +So if we launch Gnus again, + +00:10:11.540 --> 00:10:14.759 +this time, we see that that group is visible, + +00:10:14.760 --> 00:10:19.899 +even though there's no unread messages in it. + +NOTE Reading messages + +00:10:19.900 --> 00:10:24.399 +When we enter a group or folder, + +00:10:24.400 --> 00:10:26.719 +we will see a list of all of our messages. + +00:10:26.720 --> 00:10:27.799 +Here, we only have one. + +00:10:27.800 --> 00:10:31.939 +We can press M-u or Alt-u + +00:10:31.940 --> 00:10:34.679 +to mark something as unread. + +00:10:34.680 --> 00:10:38.539 +You can press d to mark it as read. + +00:10:38.540 --> 00:10:40.079 +If you press just u, + +00:10:40.080 --> 00:10:41.959 +it'll tick the article, + +00:10:41.960 --> 00:10:44.039 +which is kind of the equivalent + +00:10:44.040 --> 00:10:46.999 +of marking the message or email + +00:10:47.000 --> 00:10:50.539 +as starred in other email clients + +00:10:50.540 --> 00:10:55.719 +such as Thunderbird. + +00:10:55.720 --> 00:11:00.639 +We see that when there are groups + +00:11:00.640 --> 00:11:03.959 +that have starred or ticked messages + +00:11:03.960 --> 00:11:04.679 +inside of them, + +00:11:04.680 --> 00:11:05.599 +Gnus will mark them + +00:11:05.600 --> 00:11:16.019 +with this little star here, or asterisk. + +00:11:16.020 --> 00:11:17.639 +This talk is just barely + +00:11:17.640 --> 00:11:19.039 +scratching the surface. + +00:11:19.040 --> 00:11:21.080 +Let's see how far... + +00:11:21.081 --> 00:11:22.759 +How am I doing with the time? + +00:11:22.760 --> 00:11:30.119 +Okay, 11 minutes already. + +NOTE Debugging IMAP + +00:11:30.120 --> 00:11:32.079 +Just a couple of helpful things here, + +00:11:32.080 --> 00:11:36.919 +like this nnimap-record-commands variable. + +00:11:36.920 --> 00:11:38.519 +It's useful when you want to debug + +00:11:38.520 --> 00:11:40.119 +your IMAP setup with Gnus. + +00:11:40.120 --> 00:11:42.859 +If you set it to anything non-nil, + +00:11:42.860 --> 00:11:46.699 +it will log the commands that it runs + +00:11:46.700 --> 00:11:49.539 +to a special `*imap log*` buffer. + +00:11:49.540 --> 00:11:50.719 +And here I just set it + +00:11:50.720 --> 00:11:52.679 +to this init-file-debug variable, + +00:11:52.680 --> 00:11:55.159 +which is set to non-nil + +00:11:55.160 --> 00:11:56.439 +whenever you launch Emacs + +00:11:56.440 --> 00:11:59.279 +with the --debug-init switch, + +00:11:59.280 --> 00:12:02.239 +so that's pretty helpful. + +00:12:02.240 --> 00:12:05.119 +You want to also set your sent folder, + +00:12:05.120 --> 00:12:07.479 +basically, where Gnus will save + +00:12:07.480 --> 00:12:09.439 +a copy of the message that you just sent. + +00:12:09.440 --> 00:12:12.799 +Normally, I think the convention these days is, + +00:12:12.800 --> 00:12:16.599 +a lot of you know servers and clients + +00:12:16.600 --> 00:12:18.799 +use a dedicated sent folder, + +00:12:18.800 --> 00:12:24.339 +but with Gnus, I just prefer to use INBOX itself. + +00:12:24.340 --> 00:12:27.119 +Mainly because then I will have + +00:12:27.120 --> 00:12:28.759 +threading working for free, + +00:12:28.760 --> 00:12:31.939 +so I can read the entire thread + +00:12:31.940 --> 00:12:34.299 +of an email chain there in one place. + +00:12:34.300 --> 00:12:35.319 +Of course, we don't have to keep + +00:12:35.320 --> 00:12:38.899 +the messages in there forever. + +00:12:38.900 --> 00:12:42.079 +And in fact, Gnus has facilities, + +00:12:42.080 --> 00:12:43.479 +both manual and automated, + +00:12:43.480 --> 00:12:45.999 +for expiring emails into + +00:12:46.000 --> 00:12:52.679 +different locations or different folders. + +00:12:52.680 --> 00:12:55.159 +Yeah. So let's move on here. + +NOTE Topics + +00:12:55.160 --> 00:13:02.039 +Topics are another nice feature of Gnus. + +00:13:02.040 --> 00:13:03.279 +So this is useful + +00:13:03.280 --> 00:13:05.359 +for creating some topics + +00:13:05.360 --> 00:13:08.459 +and then classifying or grouping + +00:13:08.460 --> 00:13:10.599 +your directories there. + +00:13:10.600 --> 00:13:11.799 +So we will see the use + +00:13:11.800 --> 00:13:13.639 +of this in a moment, + +00:13:13.640 --> 00:13:17.019 +where, let's say, I want to add + +00:13:17.020 --> 00:13:19.999 +a second account to Gnus. + +00:13:20.000 --> 00:13:23.559 +This one I'm going to call ec25work. + +00:13:23.560 --> 00:13:24.679 +Let's pretend that + +00:13:24.680 --> 00:13:29.859 +this is my work email. + +00:13:29.860 --> 00:13:32.479 +So if we open Gnus now, + +00:13:32.480 --> 00:13:36.999 +we see that our work INBOX + +00:13:37.000 --> 00:13:37.959 +also shows up here. + +00:13:37.960 --> 00:13:41.299 +And because we enabled topic mode, + +00:13:41.300 --> 00:13:42.359 +we see that we have + +00:13:42.360 --> 00:13:43.439 +these sort of buttons + +00:13:43.440 --> 00:13:44.839 +like Gnus and misc here. + +00:13:44.840 --> 00:13:46.679 +And we can, I believe, + +00:13:46.680 --> 00:13:49.799 +create a topic with capital T n. + +00:13:49.800 --> 00:13:52.879 +We can call it personal, this one. + +00:13:52.880 --> 00:13:56.939 +Let's create another one, work. + +00:13:56.940 --> 00:13:59.579 +And then what we can do is go + +00:13:59.580 --> 00:14:02.799 +over the directory that we want, + +00:14:02.800 --> 00:14:04.759 +for example, this one, + +00:14:04.760 --> 00:14:08.219 +hit capital T m to move it + +00:14:08.220 --> 00:14:11.899 +to the personal topic, + +00:14:11.900 --> 00:14:13.079 +and this work one, + +00:14:13.080 --> 00:14:15.199 +move it to the work topic. + +00:14:15.200 --> 00:14:17.439 +So we can nicely classify + +00:14:17.440 --> 00:14:23.119 +and group our groups folders here, + +00:14:23.120 --> 00:14:24.719 +which is especially useful + +00:14:24.720 --> 00:14:25.559 +when you have hundreds of them. + +NOTE Customizing message display + +00:14:25.560 --> 00:14:29.759 +Anyhow, we can customize + +00:14:29.760 --> 00:14:35.039 +different aspects of message display. + +00:14:35.040 --> 00:14:35.839 +Like for example, + +00:14:35.840 --> 00:14:38.199 +we can this way customize + +00:14:38.200 --> 00:14:39.199 +and change the order of + +00:14:39.200 --> 00:14:41.599 +which headers we want to see and where. + +00:14:41.600 --> 00:14:45.199 +So if I launch Gnus + +00:14:45.200 --> 00:14:48.459 +and go back to this email here, + +00:14:48.460 --> 00:14:52.139 +these are the headers that we see at the top. + +00:14:52.140 --> 00:14:52.639 +Excuse me. + +00:14:52.640 --> 00:14:55.159 +And with Gnus we can always + +00:14:55.160 --> 00:14:57.799 +We can have it show all the headers + +00:14:57.800 --> 00:15:01.999 +by pressing t to toggle the headers. + +00:15:02.000 --> 00:15:04.579 +Here we can see all the nitty-gritty + +00:15:04.580 --> 00:15:06.359 +and all of the headers in the message + +00:15:06.360 --> 00:15:12.219 +and we can toggle it back with t again. + +00:15:12.220 --> 00:15:16.479 +We can modify and customize the sorting + +00:15:16.480 --> 00:15:20.019 +with dedicated sorting functions. + +00:15:20.020 --> 00:15:20.999 +It comes with a number of them + +00:15:21.000 --> 00:15:21.599 +out of the box + +00:15:21.600 --> 00:15:24.319 +but we can define them as well. + +NOTE Sending emails + +00:15:24.320 --> 00:15:29.759 +Now to send emails. Let's see. + +00:15:29.760 --> 00:15:30.999 +We will be using message, + +00:15:31.000 --> 00:15:34.939 +and that's what Gnus itself uses. + +00:15:34.940 --> 00:15:38.579 +So I will set things up here. + +00:15:38.580 --> 00:15:42.639 +Let's see. + +00:15:42.640 --> 00:15:44.519 +Okay, so first of all, + +00:15:44.520 --> 00:15:46.439 +we want to have Gnus mark + +00:15:46.440 --> 00:15:48.519 +the messages that we write to others + +00:15:48.520 --> 00:15:49.759 +as read automatically, + +00:15:49.760 --> 00:15:51.359 +so this option does that. + +00:15:51.360 --> 00:15:58.039 +And then we define posting styles this way + +00:15:58.040 --> 00:16:01.619 +using the prefix, the name + +00:16:01.620 --> 00:16:04.359 +of the IMAP server. + +00:16:04.360 --> 00:16:06.519 +And this is how we can tell it to use + +00:16:06.520 --> 00:16:09.199 +what email address for the From [header] + +00:16:09.200 --> 00:16:14.599 +and which SMTP server to send it with. + +00:16:14.600 --> 00:16:17.879 +Yeah, and then gcc is where Gnus will save + +00:16:17.880 --> 00:16:20.199 +the copy of the messages that we write. + +00:16:20.200 --> 00:16:24.139 +So if we go ahead and launch Gnus again. + +00:16:24.140 --> 00:16:26.279 +We can go into our personal email here, + +00:16:26.280 --> 00:16:28.919 +hit m to compose a new message. + +00:16:28.920 --> 00:16:33.559 +We can prepare an email to, + +00:16:33.560 --> 00:16:35.119 +let's say, our work address. + +00:16:35.120 --> 00:16:42.419 +Hello from EmacsConf 2025 Gnus talk. + +00:16:42.420 --> 00:16:47.639 +Hello, this is just a test. :) + +00:16:47.640 --> 00:16:55.739 +Yeah, and we hit send. + +00:16:55.740 --> 00:16:56.919 +The sending will be done + +00:16:56.920 --> 00:17:03.479 +using Emacs's built-in SMTP libraries. + +00:17:03.480 --> 00:17:05.119 +Sometimes it can take a moment. + +00:17:05.120 --> 00:17:07.599 +Okay, that's it. It's done. + +00:17:07.600 --> 00:17:09.259 +So if we go back out + +00:17:09.260 --> 00:17:11.559 +and if we hit g to get new news, + +00:17:11.560 --> 00:17:15.679 +we should be able to see our new email there + +00:17:15.680 --> 00:17:17.639 +in the other account that we just sent it to. + +00:17:17.640 --> 00:17:22.360 +So we can come here, open it, + +00:17:22.361 --> 00:17:26.659 +and there we go. + +NOTE Plans + +00:17:26.660 --> 00:17:29.239 +There is a lot to configure in Gnus, + +00:17:29.240 --> 00:17:31.439 +and we're just barely scratching the surface, + +00:17:31.440 --> 00:17:34.079 +and unfortunately I don't have the time + +00:17:34.080 --> 00:17:34.999 +to explain all of these + +00:17:35.000 --> 00:17:36.519 +but I do plan on doing + +00:17:36.520 --> 00:17:38.839 +a much longer running series, + +00:17:38.840 --> 00:17:41.499 +whether it's text or videos, + +00:17:41.500 --> 00:17:42.879 +showing how to configure + +00:17:42.880 --> 00:17:45.319 +and use a lot of these different aspects of Gnus. + +00:17:45.320 --> 00:17:49.519 +But yeah, here, near the end, just a couple of... + +00:17:49.520 --> 00:17:54.919 +quick things. I find it's nice to have message + +00:17:54.920 --> 00:17:56.519 +prompt us for [confirmation] + +00:17:56.520 --> 00:17:59.199 +that we do want to send a message. + +00:17:59.200 --> 00:18:01.359 +Actually, when it does that, I take + +00:18:01.360 --> 00:18:02.599 +another look over my email + +00:18:02.600 --> 00:18:07.059 +to make sure I don't have any typos. + +00:18:07.060 --> 00:18:09.519 +It's generally a good idea to wrap your messages + +00:18:09.520 --> 00:18:14.119 +around 70 or 72 characters. + +00:18:14.120 --> 00:18:16.619 +We do that here. + +00:18:16.620 --> 00:18:19.159 +We can tell Gnus to forward messages + +00:18:19.160 --> 00:18:22.599 +as a proper MIME part, + +00:18:22.600 --> 00:18:27.059 +instead of some half-broken way. + +00:18:27.060 --> 00:18:30.119 +This customization, the sendmail function, + +00:18:30.120 --> 00:18:34.239 +is how we tell Gnus with message + +00:18:34.240 --> 00:18:38.239 +to use the SMTP library to sending the email, + +00:18:38.240 --> 00:18:42.479 +and these two variables are useful for + +00:18:42.480 --> 00:18:45.959 +omitting our own email address + +00:18:45.960 --> 00:18:47.439 +when we want to send someone, + +00:18:47.440 --> 00:18:50.179 +like when we hit r, to reply to someone. + +00:18:50.180 --> 00:18:51.959 +if we configure these variables, + +00:18:51.960 --> 00:18:52.959 +then Gnus won't add + +00:18:52.960 --> 00:18:56.059 +our own address to the To or Cc, + +00:18:56.060 --> 00:18:58.479 +which is pretty useful. + +00:18:58.480 --> 00:18:59.919 +I also find it helpful + +00:18:59.920 --> 00:19:03.359 +to unbind C-c C-s. + +00:19:03.360 --> 00:19:04.974 +That's another key + +00:19:04.975 --> 00:19:06.319 +for sending the message [in addition to C-c C-c]. + +00:19:06.320 --> 00:19:09.719 +And because C-c C-d, + +00:19:09.720 --> 00:19:13.359 +which is very close to it on the QWERTY layout, + +00:19:13.360 --> 00:19:15.719 +is useful for saving a draft + +00:19:15.720 --> 00:19:16.839 +and then coming back to it, + +00:19:16.840 --> 00:19:20.079 +I don't want to accidentally hit C-c C-s, + +00:19:20.080 --> 00:19:22.039 +and send the message prematurely. + +00:19:22.040 --> 00:19:25.979 +So I unbind it. + +00:19:25.980 --> 00:19:27.959 +Yeah, anyway, that's about it. + +NOTE Wrapping up + +00:19:27.960 --> 00:19:31.039 +That's a kind of very quick tour + +00:19:31.040 --> 00:19:37.119 +and introduction of setting up Gnus. + +00:19:37.120 --> 00:19:40.719 +Here, we just configured a remote IMAP server, + +00:19:40.720 --> 00:19:43.519 +but we can also, of course, + +00:19:43.520 --> 00:19:46.359 +set up a local IMAP server such as Dovecot + +00:19:46.360 --> 00:19:48.399 +and point Gnus to there, + +00:19:48.400 --> 00:19:52.799 +and use programs like OfflineIMAP, I believe, + +00:19:52.800 --> 00:19:57.479 +or the mbsync program from isync package + +00:19:57.480 --> 00:20:02.939 +or isync project to synchronize our messages + +00:20:02.940 --> 00:20:04.479 +to local mail directories + +00:20:04.480 --> 00:20:06.279 +and then point Gnus to it. + +00:20:06.280 --> 00:20:08.359 +The reason we might want to use that + +00:20:08.360 --> 00:20:11.719 +is to always have a copy of our messages at hand + +00:20:11.720 --> 00:20:12.759 +so we can use offline. + +NOTE nnimap + +00:20:12.760 --> 00:20:17.439 +And why use nnimap specifically? + +00:20:17.440 --> 00:20:27.399 +As of now, the Maildir backend included with Gnus + +00:20:27.400 --> 00:20:29.679 +is very inefficient, + +00:20:29.680 --> 00:20:31.399 +especially when dealing with + +00:20:31.400 --> 00:20:33.839 +tens or hundreds of thousands of messages + +00:20:33.840 --> 00:20:36.659 +like some of us are. + +00:20:36.660 --> 00:20:38.759 +It just takes an eternity to try + +00:20:38.760 --> 00:20:43.259 +and index them and get going. + +00:20:43.260 --> 00:20:44.639 +In that case, what I recommend doing + +00:20:44.640 --> 00:20:47.799 +is instead of interfacing directly with Maildir, + +00:20:47.800 --> 00:20:52.359 +for Gnus, just install and run + +00:20:52.360 --> 00:20:54.359 +Dovecot, a local IMAP server, + +00:20:54.360 --> 00:20:59.819 +and point Gnus to that. + +00:20:59.820 --> 00:21:02.959 +I plan on writing tutorials or doing videos + +00:21:02.960 --> 00:21:06.639 +about these other aspects + +00:21:06.640 --> 00:21:10.519 +of configuring Gnus after the conference. + +00:21:10.520 --> 00:21:11.439 +That's about it for me, + +00:21:11.440 --> 00:21:14.119 +so I hope you find this helpful. + +00:21:14.120 --> 00:21:16.679 +If you have any questions, + +00:21:16.680 --> 00:21:18.239 +please feel free to email me + +00:21:18.240 --> 00:21:23.759 +at bandali@gnu.org or @kelar.org. + +00:21:23.760 --> 00:21:25.879 +You can take a look at my personal website + +00:21:25.880 --> 00:21:26.839 +where I plan on posting + +00:21:26.840 --> 00:21:31.059 +other Emacs and Gnus materials. + +00:21:31.060 --> 00:21:33.039 +And yeah, thank you for watching + +00:21:33.040 --> 00:21:35.159 +and I hope you enjoy the rest of the conference. + +00:21:35.160 --> 00:21:37.760 +Take care. diff --git a/2025/captions/emacsconf-2025-graphics--modern-emacselisp-hardwaresoftware-accelerated-graphics--emanuel-berg--main.vtt b/2025/captions/emacsconf-2025-graphics--modern-emacselisp-hardwaresoftware-accelerated-graphics--emanuel-berg--main.vtt new file mode 100644 index 00000000..f922227a --- /dev/null +++ b/2025/captions/emacsconf-2025-graphics--modern-emacselisp-hardwaresoftware-accelerated-graphics--emanuel-berg--main.vtt @@ -0,0 +1,75 @@ +WEBVTT captioned by sachac + +00:00:00.000 --> 00:00:04.999 +[ This video has no narration. ] + +NOTE space box intro (elisp model matrix pipeline c dynamic module) + +00:00:05.000 --> 00:01:58.999 +space box intro (elisp model matrix pipeline c dynamic module) + +NOTE parallel (sdl/linux multicore pthreads) + +00:01:59.000 --> 00:02:03.999 +parallel (sdl/linux multicore pthreads) + + +NOTE bad snake (oop eieio) + +00:02:04.000 --> 00:03:29.999 +bad snake (oop eieio) + +NOTE solar (ecs) + +00:03:30.000 --> 00:04:31.999 +solar (ecs) + +NOTE 60 fps 1 (opengl cpu) + +00:04:32.000 --> 00:05:35.999 +60 fps 1 (opengl cpu) + +NOTE earth (grid ascii) + +00:05:36.000 --> 00:06:01.999 +earth (grid ascii) + +NOTE studio (image unicode) + +00:06:02.000 --> 00:09:31.999 +studio (image unicode) + +NOTE 60 fps 2 (gpu) + +00:09:32.000 --> 00:11:56.999 +60 fps 2 (gpu) + +NOTE rgb triangle (glsl vertex/fragment shaders) + +00:11:57.000 --> 00:13:08.999 +rgb triangle (glsl vertex/fragment shaders) + +NOTE ansi cube (software functional shader) + +00:13:09.000 --> 00:13:32.999 +ansi cube (software functional shader) + +NOTE horizon (gradient) + +00:13:33.000 --> 00:15:15.999 +horizon (gradient) + +NOTE shell color table (zsh) + +00:15:16.000 --> 00:16:12.999 +shell color table (zsh) + +NOTE luki-lisp (macros) + +00:16:13.000 --> 00:18:24.999 +luki-lisp (macros) + +NOTE incal & rave dave outro (debug text triangles) + +00:18:25.000 --> 00:22:15.777 +incal & rave dave outro (debug text triangles) diff --git a/2025/captions/emacsconf-2025-greader--gnu-emacs-greader-gnam-reader-mode-is-the-best-emacs-mode-in-existence--yuval-langer--main.vtt b/2025/captions/emacsconf-2025-greader--gnu-emacs-greader-gnam-reader-mode-is-the-best-emacs-mode-in-existence--yuval-langer--main.vtt new file mode 100644 index 00000000..780ff013 --- /dev/null +++ b/2025/captions/emacsconf-2025-greader--gnu-emacs-greader-gnam-reader-mode-is-the-best-emacs-mode-in-existence--yuval-langer--main.vtt @@ -0,0 +1,223 @@ +WEBVTT captioned by sachac + +NOTE Introduction + +00:00:01.460 --> 00:00:03.785 +Hi, I'm Yuval Langer. + +00:00:03.786 --> 00:00:09.479 +Some may know me as cow_2001 on IRC. + +00:00:09.480 --> 00:00:12.119 +I'd like to tell you about greader mode, + +00:00:12.120 --> 00:00:14.519 +a versatile text-to-speech package + +00:00:14.520 --> 00:00:18.399 +written by Michelangelo Rodriguez. + +00:00:18.400 --> 00:00:20.399 +Sometimes you want to read a bunch + +00:00:20.400 --> 00:00:23.039 +and cannot be bothered, right? + +00:00:23.040 --> 00:00:25.079 +You'd rather plop on your chair + +00:00:25.080 --> 00:00:27.519 +and let the words come to you. + +00:00:27.520 --> 00:00:31.157 +You can do it using greader Mode. + +NOTE What is greader mode? + +00:00:31.158 --> 00:00:33.119 +What is greader mode? + +00:00:33.120 --> 00:00:36.319 +Greader mode is a text-to-speech minor mode + +00:00:36.320 --> 00:00:40.399 +with which you can read any buffer using the point. + +00:00:40.400 --> 00:00:41.602 +You move your point + +00:00:41.603 --> 00:00:43.559 +right before the text you want to read + +00:00:43.560 --> 00:00:47.639 +and run greader-read command. + +00:00:47.640 --> 00:00:50.839 +You can then use the left and right arrow keys + +00:00:50.840 --> 00:00:56.599 +to jump to the previous sentence or the next sentence. + +NOTE Installing Greader + +00:00:56.600 --> 00:00:59.143 +Installing GReader: + +00:00:59.144 --> 00:01:05.439 +Greader is available on the GNU Emacs app store + +00:01:05.440 --> 00:01:07.285 +and its copyright assigned to + +00:01:07.286 --> 00:01:10.959 +the Free Software Foundation. + +00:01:10.960 --> 00:01:12.857 +To install Greader, + +00:01:12.858 --> 00:01:19.279 +you can run M-x list-packages RET. + +00:01:19.280 --> 00:01:23.099 +look it up with C-s greader, + +00:01:23.100 --> 00:01:26.679 +press i to mark it for installation, + +00:01:26.680 --> 00:01:31.759 +and then press x to execute the installation. + +NOTE Basic usage + +00:01:31.760 --> 00:01:33.211 +Basic usage: + +00:01:33.212 --> 00:01:37.559 +We can now open a text file and start reading. + +00:01:37.560 --> 00:01:42.599 +Let's open The Willows by Algernon Blackwood. + +00:01:42.600 --> 00:01:44.479 +I've never read the story, + +00:01:44.480 --> 00:01:48.279 +but HP Lovecraft said it was the best horror story + +00:01:48.280 --> 00:01:52.959 +he had ever read, so it is in my reading list. + +00:01:52.960 --> 00:02:01.519 +Now load greader using M-x greader-mode. + +00:02:01.520 --> 00:02:08.139 +To start reading, press C-r SPC. + +00:02:08.140 --> 00:02:10.559 +The Project Gutenberg ebook of The willows. + +00:02:10.560 --> 00:02:14.079 +This will run the greader-read command. + +00:02:14.080 --> 00:02:16.799 +To stop, press the SPC key. + +00:02:16.800 --> 00:02:20.819 +This will run the greader-stop command. + +NOTE Navigation + +00:02:20.820 --> 00:02:22.359 +Navigation: + +00:02:22.360 --> 00:02:24.679 +You can navigate like you normally do, + +00:02:24.680 --> 00:02:27.559 +but using the left or right arrow keys + +00:02:27.560 --> 00:02:30.199 +will move the point between sentences + +00:02:30.200 --> 00:02:33.087 +instead of characters. + +00:02:33.088 --> 00:02:36.639 +So... This ebook is... + +00:02:36.640 --> 00:02:38.095 +You may copy it, give it away, + +00:02:38.096 --> 00:02:41.479 +or reuse it if you are not. + +00:02:41.480 --> 00:02:43.580 +Let's move to the start of the story. + +00:02:57.040 --> 00:02:58.088 +"After leaving Vienna, + +00:02:58.089 --> 00:02:59.839 +and long before you come to Budapest, + +00:02:59.840 --> 00:03:00.919 +the Danube enters a region + +00:03:00.920 --> 00:03:02.919 +of singular loneliness and desolation, + +00:03:02.920 --> 00:03:04.879 +where its waters spread away on all sides, + +00:03:04.880 --> 00:03:06.199 +regardless of a main channel, + +00:03:06.200 --> 00:03:08.799 +and the country becomes a swamp for miles upon miles, + +00:03:08.800 --> 00:03:11.759 +covered by a vast sea of low willow bushes." + +NOTE Reading rate + +00:03:12.380 --> 00:03:15.839 +Reading rate: this reading rate is rather slow. + +00:03:15.840 --> 00:03:19.519 +Let's pick up the pace using the plus key. + +00:03:19.520 --> 00:03:23.519 +This will run the greader-inc-rate command. + +00:03:23.520 --> 00:03:26.780 +You must do that while greader is reading. + +00:03:37.885 --> 00:03:39.779 +Now it is too fast. + +00:03:39.780 --> 00:03:44.679 +We can slow down using the - key. + +00:03:44.680 --> 00:03:52.485 +This will run the greader-dec-rate command. + +00:03:54.560 --> 00:03:59.384 +"In high flood this great acreage + +00:03:59.385 --> 00:04:01.239 +of sand, shingle-beds, and willow-grown islands + +00:04:01.240 --> 00:04:02.439 +is almost topped by the water, + +00:04:02.440 --> 00:04:03.609 +but in normal seasons the bushes + +00:04:03.610 --> 00:04:04.919 +bend and rustle in the free winds, + +00:04:04.920 --> 00:04:06.399 +showing their silver leaves to the sunshine + +00:04:06.400 --> 00:04:08.320 +in an ever-moving plain of bewildering beauty." diff --git a/2025/captions/emacsconf-2025-hyperboleqa--questions-and-answers-to-help-you-fly-with-hyperbole--bob-weiner--main.vtt b/2025/captions/emacsconf-2025-hyperboleqa--questions-and-answers-to-help-you-fly-with-hyperbole--bob-weiner--main.vtt new file mode 100644 index 00000000..d20eabe4 --- /dev/null +++ b/2025/captions/emacsconf-2025-hyperboleqa--questions-and-answers-to-help-you-fly-with-hyperbole--bob-weiner--main.vtt @@ -0,0 +1,2203 @@ +WEBVTT + +00:00:00.000 --> 00:00:12.239 +All right, you're good to go. Are people here? + +00:00:12.240 --> 00:00:15.639 +Let me read the first question to you since I'm here. + +00:00:15.640 --> 00:00:17.639 +The first question here is, + +00:00:17.640 --> 00:00:20.599 +I'm excited to know opinion and current state + +00:00:20.600 --> 00:00:23.799 +of using NCP and AI for PKMs and PIEs. + +00:00:23.800 --> 00:00:28.639 +Since they do carry a lot of burden out of us, it means a lot of process. + +00:00:28.640 --> 00:00:33.439 +How does our pipeline stand with the coming days? + +00:00:33.440 --> 00:00:35.119 +Thanks for the question. + +00:00:35.120 --> 00:00:40.239 +AI is obviously on everybody's mind. + +00:00:40.240 --> 00:00:43.719 +We haven't done a lot of integration + +00:00:43.720 --> 00:00:47.199 +with any of the popular AI engines, + +00:00:47.200 --> 00:00:50.519 +but I think as you'll see through this Q&A session, + +00:00:50.520 --> 00:00:54.559 +Hyperbole's function is really to interlink + +00:00:54.560 --> 00:00:57.959 +your information everywhere throughout Emacs. + +00:00:57.960 --> 00:01:02.279 +And so, whether you're using a chatbot + +00:01:02.280 --> 00:01:04.919 +in a specific buffer, + +00:01:04.920 --> 00:01:11.359 +you can use hyperbole implicit links, implicit buttons + +00:01:11.360 --> 00:01:17.039 +to activate different actions there as well. + +00:01:17.040 --> 00:01:20.399 +So sometimes it takes a bit of customization, + +00:01:20.400 --> 00:01:25.999 +a small amount of two to seven lines of code to do that. + +00:01:26.000 --> 00:01:30.839 +As we get to working with more of these engines, + +00:01:30.840 --> 00:01:34.119 +we'll build that into the core part of Hyperbole. + +00:01:34.120 --> 00:01:40.039 +But right now, that's left as an extension + +00:01:40.040 --> 00:01:43.359 +for users who are heavily using MCP + +00:01:43.360 --> 00:01:45.879 +or other protocols right now. + +00:01:45.880 --> 00:01:50.239 +We have, for example, integrated + +00:01:50.240 --> 00:01:57.559 +with LSPs, you know, for coding and have that interface through xref + +00:01:57.560 --> 00:02:01.199 +and basically using the single key, the action key, + +00:02:01.200 --> 00:02:02.719 +which is made a return. + +00:02:02.720 --> 00:02:08.919 +You can jump around to any of your source definitions + +00:02:08.920 --> 00:02:10.999 +from any reference in almost any language + +00:02:11.000 --> 00:02:14.599 +that anybody uses today. So you can extrapolate from that + +00:02:14.600 --> 00:02:17.119 +how that might work with AI as well. + +00:02:17.120 --> 00:02:22.999 +And I think you'll see later when we talk about HiWiki + +00:02:23.000 --> 00:02:26.719 +that we're now enabling just just wiki words + +00:02:26.720 --> 00:02:30.079 +to be buttons in hyperbole. + +00:02:30.080 --> 00:02:33.999 +So those could be part of your chat with an AI + +00:02:34.000 --> 00:02:37.519 +and you just click on it and you jump right to all your references + +00:02:37.520 --> 00:02:49.119 +associated with that terminology. Thanks for the question. + +00:02:49.120 --> 00:02:51.839 +Should I just go through the second question? + +00:02:51.840 --> 00:02:54.199 +I thought people would be glad. + +00:02:54.200 --> 00:02:56.559 +As a normal user who codes and takes notes, + +00:02:56.560 --> 00:02:58.759 +I really want to deep dive and learn Hyperbole, + +00:02:58.760 --> 00:03:02.079 +but always end up winding back up to Embark + +00:03:02.080 --> 00:03:04.399 +and Org Mode being the better system. + +00:03:04.400 --> 00:03:06.479 +For me, Hyperbole looks over engineering + +00:03:06.480 --> 00:03:08.079 +or over the peer system, + +00:03:08.080 --> 00:03:10.119 +which other individual packages do well. + +00:03:10.120 --> 00:03:15.399 +And outside DMAC, there's no system supporting Hyperbole or any usability. + +00:03:15.400 --> 00:03:17.519 +And I think you've cited answering + +00:03:17.520 --> 00:03:21.159 +that already, so go ahead. + +00:03:21.160 --> 00:03:26.919 +Right, hyperbole is large, but there's reasons behind that. + +00:03:26.920 --> 00:03:30.599 +We're just trying to link all your information in Emacs. + +00:03:30.600 --> 00:03:38.079 +So I think you can see my screen here in Emacs. + +00:03:38.080 --> 00:03:45.439 +So for example, you can take any Lisp expression, + +00:03:45.440 --> 00:03:49.239 +even a variable like here we have in hyperbole + +00:03:49.240 --> 00:03:50.959 +Hyperbdur variable + +00:03:50.960 --> 00:03:53.519 +and I just hit the action key made a return + +00:03:53.520 --> 00:03:57.759 +and in my mini buffer I see the value of that variable, + +00:03:57.760 --> 00:04:01.599 +but I could just as well take any other expression + +00:04:01.600 --> 00:04:03.919 +and take the outer parens off + +00:04:03.920 --> 00:04:05.679 +and change them to angle brackets + +00:04:05.680 --> 00:04:08.239 +and now that's a live Hyper button + +00:04:08.240 --> 00:04:12.079 +could be in a comment in a programming buffer in this case. + +00:04:12.080 --> 00:04:15.679 +It's in K outliner buffer, + +00:04:15.680 --> 00:04:19.159 +which is a an auto-numbered outliner part of hyperbole. + +00:04:19.160 --> 00:04:23.599 +So let's just try this and say made a return. + +00:04:23.600 --> 00:04:28.719 +I pressed and it ran occur and found all the occurrences of buttons. + +00:04:28.720 --> 00:04:31.919 +And similarly in here, I could just jump and go + +00:04:31.920 --> 00:04:35.519 +to any of these lines directly + +00:04:35.520 --> 00:04:37.919 +by hitting made a return in that buffer as well. + +00:04:37.920 --> 00:04:39.799 +So all your text, all your sort + +00:04:39.800 --> 00:04:44.879 +of what we call implicit links become live and hyperbole. + +00:04:44.880 --> 00:04:46.519 +And you didn't have to learn much. + +00:04:46.520 --> 00:04:48.559 +You just learn, you know, if you know a little Lisp + +00:04:48.560 --> 00:04:50.279 +or how to type any expression, + +00:04:50.280 --> 00:04:52.879 +then you just change the outer brackets. + +00:04:52.880 --> 00:04:55.079 +And all of a sudden, you have hyperbuttons. + +00:04:55.080 --> 00:05:01.079 +So hyperbole, you can learn a little bit at a time. + +00:05:01.080 --> 00:05:04.479 +And although it seems daunting at first + +00:05:04.480 --> 00:05:06.879 +because it has so much functionality, + +00:05:06.880 --> 00:05:09.679 +very large and rich architecture. + +00:05:09.680 --> 00:05:13.639 +But what we do is teach people one piece at a time. + +00:05:13.640 --> 00:05:17.919 +So just to continue on that a little bit, + +00:05:17.920 --> 00:05:19.639 +implicit buttons are buttons + +00:05:19.640 --> 00:05:23.359 +that exist just from the text pattern in the buffer. + +00:05:23.360 --> 00:05:28.279 +So you saw an example of changing Lisp into implicit buttons right there. + +00:05:28.280 --> 00:05:30.959 +I could do keystrokes. + +00:05:30.960 --> 00:05:33.119 +I can just type them out in my buffer + +00:05:33.120 --> 00:05:34.879 +and surround them with braces. + +00:05:34.880 --> 00:05:37.439 +So here's something, let's see, + +00:05:37.440 --> 00:05:41.079 +this is actually a command in the K Outliner + +00:05:41.080 --> 00:05:45.799 +to jump to the cell numbered four. So let's just do that. + +00:05:45.800 --> 00:05:47.599 +And it took me right there, right? + +00:05:47.600 --> 00:05:51.759 +So I'm just pressing made a return to activate these buttons. + +00:05:51.760 --> 00:05:56.279 +Similarly, any sort of, this is a complex example, + +00:05:56.280 --> 00:05:59.479 +but any path name I can surround with double quotes, + +00:05:59.480 --> 00:06:01.079 +and it's a live hyper button. + +00:06:01.080 --> 00:06:05.479 +In this case, I want to jump to a path name called readme.md, + +00:06:05.480 --> 00:06:08.359 +but it's in a directory that's specified + +00:06:08.360 --> 00:06:13.519 +by an actual list variable. And then I want to go directly + +00:06:13.520 --> 00:06:17.479 +to a headline within that file called hyperbole manual. + +00:06:17.480 --> 00:06:19.759 +And within that headline, I wanna go + +00:06:19.760 --> 00:06:22.719 +to the eighth line relative to that. + +00:06:22.720 --> 00:06:24.879 +So all I have to do, made a return again, + +00:06:24.880 --> 00:06:28.959 +and boom, I'm in that, I'm directly linked to that. + +00:06:28.960 --> 00:06:33.799 +And Hyperbole has ways that you can just split your windows like this + +00:06:33.800 --> 00:06:38.079 +and create that reference in the source buffer right there. + +00:06:38.080 --> 00:06:41.999 +You just press a few keys and it'll embed that link. + +00:06:42.000 --> 00:06:43.839 +We'll see that a little later. + +00:06:43.840 --> 00:06:47.319 +Another example, so all of these buttons, + +00:06:47.320 --> 00:06:49.599 +if I just show you here, + +00:06:49.600 --> 00:06:52.279 +you can press Control-H, Capital-A anytime. + +00:06:52.280 --> 00:06:54.319 +and it will show you exactly + +00:06:54.320 --> 00:06:56.559 +what made a return will do in that context. + +00:06:56.560 --> 00:06:59.479 +In this case, it's an implicit button, + +00:06:59.480 --> 00:07:03.119 +and it shows you even where the button starts and ends, + +00:07:03.120 --> 00:07:06.679 +what type of action it will run, + +00:07:06.680 --> 00:07:08.039 +it's a link to a file line, + +00:07:08.040 --> 00:07:09.999 +and then what arguments it takes. + +00:07:10.000 --> 00:07:13.999 +So Hyperbole extracts all this meta information + +00:07:14.000 --> 00:07:16.679 +just from the text in your buffer + +00:07:16.680 --> 00:07:19.119 +and displays it to you conveniently + +00:07:19.120 --> 00:07:22.319 +so you can know before you ever touch a hyper button + +00:07:22.320 --> 00:07:24.479 +if it will do something that you want it to do. + +00:07:24.480 --> 00:07:28.559 +Here we have a fairly advanced button + +00:07:28.560 --> 00:07:31.519 +that's very simple to do. You just specify a bug in Emacs + +00:07:31.520 --> 00:07:34.279 +that you want to reference to. + +00:07:34.280 --> 00:07:40.039 +Notice no delimiters, just bug pound, whatever, made a return. + +00:07:40.040 --> 00:07:45.479 +And I'm in GNU's reading the conversation for that bug. + +00:07:45.480 --> 00:07:48.719 +And I can just, you know, move + +00:07:48.720 --> 00:07:50.919 +through all the conversation. + +00:07:50.920 --> 00:07:56.039 +I can quit out of there and go back to where I was. + +00:07:56.040 --> 00:07:59.599 +So very, very easy to use these implicit buttons + +00:07:59.600 --> 00:08:00.879 +because they're already there + +00:08:00.880 --> 00:08:03.679 +throughout your Emacs buffers. + +00:08:03.680 --> 00:08:06.119 +I described the control HA, what that does. + +00:08:06.120 --> 00:08:09.359 +And there's other types of buttons + +00:08:09.360 --> 00:08:11.559 +that we can get into as questions go on, + +00:08:11.560 --> 00:08:14.719 +but you can create your own explicit buttons + +00:08:14.720 --> 00:08:18.719 +that have a little slightly different delimiter than you see + +00:08:18.720 --> 00:08:19.799 +in the implicit buttons. + +00:08:19.800 --> 00:08:24.759 +And this one I just put in here to show you that + +00:08:24.760 --> 00:08:30.439 +If you use it and you go, this is the hyperbole to do list, + +00:08:30.440 --> 00:08:31.879 +which is an org buffer. + +00:08:31.880 --> 00:08:35.079 +But I wanted to show in here that similarly, + +00:08:35.080 --> 00:08:37.799 +we have implicit buttons for to do's in the work. + +00:08:37.800 --> 00:08:39.679 +And when we hit made a return, + +00:08:39.680 --> 00:08:42.679 +it just changes the state of that to do. + +00:08:42.680 --> 00:08:44.919 +And I can cycle through those + +00:08:44.920 --> 00:08:47.399 +but even better with the prefix argument + +00:08:47.400 --> 00:08:50.399 +if I have multiple sequences of to do's + +00:08:50.400 --> 00:08:53.519 +because there's Bob and Matt's that maintain hyperbole + +00:08:53.520 --> 00:08:55.999 +so I can shift to Bob's to do's + +00:08:56.000 --> 00:08:57.759 +with control you made a return + +00:08:57.760 --> 00:09:00.079 +and then cycle through the states for me + +00:09:00.080 --> 00:09:05.039 +So very very easy to use, + +00:09:05.040 --> 00:09:08.319 +you know something that's a little bit more difficult to do + +00:09:08.320 --> 00:09:16.239 +I think in org without it and So that's an explicit button + +00:09:16.240 --> 00:09:19.479 +where I had to actually say I want to create this button, + +00:09:19.480 --> 00:09:21.599 +and I had to specify what type it is. + +00:09:21.600 --> 00:09:23.759 +If I show you the information there again, + +00:09:23.760 --> 00:09:25.879 +you see it has a little different type + +00:09:25.880 --> 00:09:29.679 +called a keyboard key, which runs just the key sequence. + +00:09:29.680 --> 00:09:34.759 +So you're starting to see already + +00:09:34.760 --> 00:09:36.839 +that explicit buttons have a type + +00:09:36.840 --> 00:09:38.159 +that's connected to an action + +00:09:38.160 --> 00:09:41.199 +that an implicit button can do as well. + +00:09:41.200 --> 00:09:42.959 +So all of this ties back together. + +00:09:42.960 --> 00:09:47.079 +And finally, there's a homepage that Hyperbole has, + +00:09:47.080 --> 00:09:49.159 +a personal homepage that you have. + +00:09:49.160 --> 00:09:52.999 +You hit Control-H-H, which is our mini-buffer menu, + +00:09:53.000 --> 00:09:58.319 +and then you hit what is it, B for button file + +00:09:58.320 --> 00:10:01.439 +and then P for personal file. + +00:10:01.440 --> 00:10:05.239 +And that just brings you to basically a set of links + +00:10:05.240 --> 00:10:10.199 +that you can create buttons in any format you want. + +00:10:10.200 --> 00:10:12.479 +There's no structure that you see here. + +00:10:12.480 --> 00:10:18.759 +But the nice thing is that all of these buttons that have these names, as we call them, + +00:10:18.760 --> 00:10:20.279 +with the delimiters here, + +00:10:20.280 --> 00:10:23.799 +can be referenced now as what we call global buttons + +00:10:23.800 --> 00:10:28.239 +wherever you are in Emacs. So I'm in a separate buffer here + +00:10:28.240 --> 00:10:30.719 +and say I want to jump to that to-do button + +00:10:30.720 --> 00:10:33.279 +that's labeled TD on line 10 down there. + +00:10:33.280 --> 00:10:35.519 +No matter what I have on screen, + +00:10:35.520 --> 00:10:39.199 +I can hit control H, H, G for global button, + +00:10:39.200 --> 00:10:43.719 +A for activate, and then it gives me a list of those. + +00:10:43.720 --> 00:10:47.119 +So I know it's TD, I just put TD in. + +00:10:47.120 --> 00:10:52.159 +Okay, that's a path link problem I have, + +00:10:52.160 --> 00:10:56.359 +but when I fix the link, it would go to it. + +00:10:56.360 --> 00:10:58.239 +So you can create buttons + +00:10:58.240 --> 00:11:01.639 +that you can access in any mode, anywhere, + +00:11:01.640 --> 00:11:05.799 +and just give them quick names, and it's very easy. + +00:11:05.800 --> 00:11:08.559 +So that kind of gives you an idea + +00:11:08.560 --> 00:11:11.719 +of how you can get very productive + +00:11:11.720 --> 00:11:14.999 +with hyperbole with just a few simple techniques. + +00:11:15.000 --> 00:11:30.439 +You still there Sacha? Yep, I'm still here. + +00:11:30.440 --> 00:11:37.079 +I have too many tabs. + +00:11:37.080 --> 00:11:46.199 +So the question is, I've been using activities.el + +00:11:46.200 --> 00:11:48.879 +and bufferload to save dedicated workplaces, + +00:11:48.880 --> 00:11:52.159 +open buffers, and decisions in tabs and frames + +00:11:52.160 --> 00:11:54.599 +for tasks and projects across the next sessions. + +00:11:54.600 --> 00:12:00.119 +Can I do something similar with Hyper-V? Yes, you can. + +00:12:00.120 --> 00:12:03.719 +And activities is a nice package from alphapapa. + +00:12:03.720 --> 00:12:07.399 +We've actually been working with it lately. + +00:12:07.400 --> 00:12:11.159 +So we're probably in the next month or so + +00:12:11.160 --> 00:12:13.479 +we'll have a specific integration + +00:12:13.480 --> 00:12:15.999 +to activities built into Hyperbole. + +00:12:16.000 --> 00:12:21.519 +But right now, we don't. But of course, you can call + +00:12:21.520 --> 00:12:23.279 +any of its functions or key bindings + +00:12:23.280 --> 00:12:26.079 +using the techniques that I just showed you earlier. + +00:12:26.080 --> 00:12:33.599 +But what we do have built in if you go to the menu again. + +00:12:33.600 --> 00:12:35.959 +and you see control HH, + +00:12:35.960 --> 00:12:43.039 +and then there's a W, Windows, WinConfig menu, + +00:12:43.040 --> 00:12:48.399 +and there's two types of window configurations that you can save here. + +00:12:48.400 --> 00:12:52.599 +They are, right now, they're per Emacs session. + +00:12:52.600 --> 00:12:55.759 +They're not stored beyond that, + +00:12:55.760 --> 00:12:58.519 +but we'll probably add that in as well, + +00:12:58.520 --> 00:12:59.879 +or we'll use activities for that. + +00:12:59.880 --> 00:13:07.199 +so the two types are you can either just save a window configuration in a frame + +00:13:07.200 --> 00:13:10.319 +to actually it stores the frame configuration + +00:13:10.320 --> 00:13:13.359 +to a ring just like the kill ring + +00:13:13.360 --> 00:13:16.119 +so you have the three commands at the right + +00:13:16.120 --> 00:13:21.239 +you can save with an s you can pop one off the ring with p + +00:13:21.240 --> 00:13:25.959 +or you can just yank and keep cycling through with a y + +00:13:25.960 --> 00:13:31.119 +and it will restore the frame configuration that you saved. + +00:13:31.120 --> 00:13:35.079 +Similarly you can just do it by name + +00:13:35.080 --> 00:13:36.839 +and you can say I want to add a name + +00:13:36.840 --> 00:13:45.799 +and then you know just give it a name again win win C and store it and it stores it there + +00:13:45.800 --> 00:13:48.559 +and then you can get back to it by name as well. + +00:13:48.560 --> 00:13:51.319 +So fairly fairly easy to use as well + +00:13:51.320 --> 00:13:54.999 +and again integrated in the same simple menu system. + +00:13:55.000 --> 00:13:57.079 +So thanks for that question. + +00:13:57.080 --> 00:14:07.119 +Should I just go to the next question? + +00:14:07.120 --> 00:14:10.079 +How well do hyperbole and org mode work together? + +00:14:10.080 --> 00:14:12.759 +Is there any kind of integration? + +00:14:12.760 --> 00:14:18.079 +Yes, in fact, that's really good. + +00:14:18.080 --> 00:14:22.359 +I'll just mention something. Let me go back to my homepage. + +00:14:22.360 --> 00:14:26.679 +I just stored that here. So we gave a talk at an earlier + +00:14:26.680 --> 00:14:31.559 +Emacs conference right here on org + +00:14:31.560 --> 00:14:33.199 +and hyperbole integration. + +00:14:33.200 --> 00:14:35.919 +So that's a good one to go back to. + +00:14:35.920 --> 00:14:39.479 +And I believe it's in this files + +00:14:39.480 --> 00:14:41.599 +included with hyperbole as well. + +00:14:41.600 --> 00:14:45.079 +So you can learn various techniques + +00:14:45.080 --> 00:14:48.199 +of how the action key helps you in org. + +00:14:48.200 --> 00:14:51.679 +It does special things in tables. + +00:14:51.680 --> 00:15:00.239 +And there's some nice support for, for example, working with code blocks. + +00:15:00.240 --> 00:15:02.639 +Let me see where that is. Okay, so right back here. + +00:15:02.640 --> 00:15:09.759 +So you can run them with the action key. + +00:15:09.760 --> 00:15:15.039 +You can refresh the output and do things like that. + +00:15:15.040 --> 00:15:17.559 +So again, if I just hit Control-H-A, + +00:15:17.560 --> 00:15:20.439 +it'll tell me that it's in SmartOrg, + +00:15:20.440 --> 00:15:24.359 +and it'll give me all the different contexts that that operates within. + +00:15:24.360 --> 00:15:26.559 +So there's a lot that it does in here. + +00:15:26.560 --> 00:15:30.479 +And you can see it would point on the dir value of a code block definition + +00:15:30.480 --> 00:15:33.559 +that will actually display a summary + +00:15:33.560 --> 00:15:35.199 +and all sorts of functionality. + +00:15:35.200 --> 00:15:37.439 +So the integration is quite tight. + +00:15:37.440 --> 00:15:39.679 +And one of the things we do + +00:15:39.680 --> 00:15:41.799 +since made return is used in org, + +00:15:41.800 --> 00:15:44.719 +we have a customization setting, C even O. + +00:15:44.720 --> 00:15:48.239 +And you have these three settings where you can say, + +00:15:48.240 --> 00:15:53.359 +I want me to return to, I want hyperbole to control that + +00:15:53.360 --> 00:15:57.279 +and everything that the action key does I want to happen. + +00:15:57.280 --> 00:16:00.479 +Or I only want hyperbole to control + +00:16:00.480 --> 00:16:03.239 +when I'm over a hyperbole implicit explicit button. + +00:16:03.240 --> 00:16:09.159 +Or I want org to control that key and never use hyperbole. + +00:16:09.160 --> 00:16:10.799 +So you just set that once, + +00:16:10.800 --> 00:16:13.919 +it's persistent across sessions and you're good to go. + +00:16:13.920 --> 00:16:16.399 +And again, it's built right into the menus. + +00:16:16.400 --> 00:16:23.919 +So but even following that we've the latest addition to hyperbole is Something + +00:16:23.920 --> 00:16:25.799 +and this is the first time + +00:16:25.800 --> 00:16:29.799 +we're really showing it publicly is the high wiki + +00:16:29.800 --> 00:16:33.559 +Which is a new subsystem as we call it + +00:16:33.560 --> 00:16:44.719 +and this is I think the best wiki capability in Emacs now what it does is it automatically highlights + +00:16:44.720 --> 00:16:48.119 +let me turn it on I have to turn on high wiki mode + +00:16:48.120 --> 00:16:54.679 +and you see those wiki words now got highlighted so any any wiki word + +00:16:54.680 --> 00:16:58.839 +which is the capitalized alpha word you know + +00:16:58.840 --> 00:17:01.439 +so you can have multiple capitals in there + +00:17:01.440 --> 00:17:06.039 +and I'll get recognized can be used as a wiki word + +00:17:06.040 --> 00:17:09.519 +so for example when I just type hi wiki here + +00:17:09.520 --> 00:17:11.559 +it automatically recognizes it, + +00:17:11.560 --> 00:17:14.239 +and you see it turned it into a hyperlink button, + +00:17:14.240 --> 00:17:18.159 +which again, Control-H-A will tell me exactly what it does there. + +00:17:18.160 --> 00:17:23.119 +But I can just hit the action key, made a return, + +00:17:23.120 --> 00:17:26.879 +and it'll display my hiwiki.org file. + +00:17:26.880 --> 00:17:30.559 +All wiki pages are org files. + +00:17:30.560 --> 00:17:35.679 +So we're using that for the wikis, and you have + +00:17:35.680 --> 00:17:40.359 +You can export an entire wiki + +00:17:40.360 --> 00:17:43.159 +using essentially the org export capability + +00:17:43.160 --> 00:17:48.599 +With a little extra set of features that we've added in + +00:17:48.600 --> 00:17:51.199 +but let's say even better you see + +00:17:51.200 --> 00:17:54.119 +I have this heading here so let me just change this + +00:17:54.120 --> 00:17:59.239 +you go back here and I'll say go to heading + +00:17:59.240 --> 00:18:01.039 +so you just put a pound on it + +00:18:01.040 --> 00:18:05.679 +and now that whole thing is a reference to a specific org section. + +00:18:05.680 --> 00:18:08.439 +Notice there's no org IDs here. + +00:18:08.440 --> 00:18:11.639 +There's nothing other than the text that you're seeing. + +00:18:11.640 --> 00:18:13.439 +There's not even a delimiter. + +00:18:13.440 --> 00:18:17.839 +So we have automatic implicit hyper buttons + +00:18:17.840 --> 00:18:20.679 +being added in any buffer. + +00:18:20.680 --> 00:18:23.959 +Could be a comment in a programming buffer with all you + +00:18:23.960 --> 00:18:26.599 +You don't have to add anything. + +00:18:26.600 --> 00:18:31.999 +I'll show you how to create a new page in a minute. + +00:18:32.000 --> 00:18:35.959 +But you see I can link to any org section without any IDs. + +00:18:35.960 --> 00:18:38.799 +And then I can also do like org-roam does, + +00:18:38.800 --> 00:18:42.039 +but without the indexing or database that it requires. + +00:18:42.040 --> 00:18:46.839 +I can scan over all of my wiki files and headings. + +00:18:46.840 --> 00:18:48.759 +find a match really quickly. + +00:18:48.760 --> 00:18:53.279 +So we can get into some of that a little later as well. + +00:18:53.280 --> 00:18:55.759 +But, you know, very convenient. + +00:18:55.760 --> 00:18:58.439 +There's nothing that you change on org to do this. + +00:18:58.440 --> 00:19:00.879 +So how do I create a wiki word? + +00:19:00.880 --> 00:19:07.359 +Well, let's say I wanted, you know, wiki word for me. + +00:19:07.360 --> 00:19:09.999 +So that's already, that was a wiki word, + +00:19:10.000 --> 00:19:12.959 +but now this is a new one. So you see it doesn't highlight + +00:19:12.960 --> 00:19:16.559 +because I haven't created a wiki page yet. + +00:19:16.560 --> 00:19:20.319 +So all I hit is the action key, and boom. + +00:19:20.320 --> 00:19:23.519 +Now it created it as a new wiki word. + +00:19:23.520 --> 00:19:24.879 +It created the .org file. + +00:19:24.880 --> 00:19:28.279 +If I don't edit this file, it won't save it, + +00:19:28.280 --> 00:19:32.359 +and it'll not become a word in case you made an accident. + +00:19:32.360 --> 00:19:34.319 +But let's just say I want to say it. + +00:19:34.320 --> 00:19:39.159 +So, you know, heading. That's it. I'm just in org mode. + +00:19:39.160 --> 00:19:42.879 +Now anytime that high wiki mode is active, + +00:19:42.880 --> 00:19:46.239 +in any buffer essentially, + +00:19:46.240 --> 00:19:50.279 +I can type that out and it'll recognize it. + +00:19:50.280 --> 00:19:53.039 +Notice so that's not a wiki word. + +00:19:53.040 --> 00:19:55.279 +So it's highlighting and it's unhighlighting + +00:19:55.280 --> 00:19:56.599 +right as I type. + +00:19:56.600 --> 00:20:03.199 +So, again, you can embed these as org links in org. + +00:20:03.200 --> 00:20:09.439 +There's a special format like this, HiWiki word + +00:20:09.440 --> 00:20:11.239 +that you can make an org link + +00:20:11.240 --> 00:20:13.479 +if I was in org mode, just like that. + +00:20:13.480 --> 00:20:16.599 +So there's all sorts of compatibility, + +00:20:16.600 --> 00:20:18.319 +but basically it's just words, + +00:20:18.320 --> 00:20:21.119 +and HiWiki takes care of the rest for you. + +00:20:21.120 --> 00:20:26.679 +So there's a directory where all these, it's HiWiki, + +00:20:26.680 --> 00:20:28.879 +hi wiki tilde slash + +00:20:28.880 --> 00:20:32.719 +hi wiki is the default place where all these would be found + +00:20:32.720 --> 00:20:36.359 +and there's a menu now in hyperbole for hi wiki h + +00:20:36.360 --> 00:20:40.639 +and you can see it has a lot of capabilities + +00:20:40.640 --> 00:20:44.359 +but i can say b go into the directory of all the files + +00:20:44.360 --> 00:20:47.799 +just pull them up and any of these you'll see + +00:20:47.800 --> 00:20:59.959 +let me give you one like this me okay so you can see the other wiki words being highlighted in here + +00:20:59.960 --> 00:21:04.039 +so it's very fast to this there's almost no delay for anything + +00:21:04.040 --> 00:21:14.679 +and yet very flexible and you have this ability you know where you could type emacs section dash 1 dash 2 + +00:21:14.680 --> 00:21:16.759 +and If you didn't have delimiters around it, + +00:21:16.760 --> 00:21:18.479 +but you can put any delimiters + +00:21:18.480 --> 00:21:20.839 +like double quotes or parentheses, + +00:21:20.840 --> 00:21:25.159 +and then it'll match without you having to change the header at all + +00:21:25.160 --> 00:21:28.439 +with the spaces included and all of those. + +00:21:28.440 --> 00:21:31.919 +know will get recognized. + +00:21:31.920 --> 00:21:35.599 +I don't know if this if the section exists right there. + +00:21:35.600 --> 00:21:41.959 +So anyway a lot of capability you can see that here where I did the high + +00:21:41.960 --> 00:21:45.519 +it actually highlights as an org link + +00:21:45.520 --> 00:21:46.839 +because it is an org link + +00:21:46.840 --> 00:21:50.319 +and it'll operate just like any other org link + +00:21:50.320 --> 00:21:54.279 +even though it's a high wiki word link as well. + +00:21:54.280 --> 00:21:55.759 +So very powerful stuff + +00:21:55.760 --> 00:22:00.959 +and totally integrated with Org Mode throughout. + +00:22:00.960 --> 00:22:06.439 +Great. There's another question. + +00:22:06.440 --> 00:22:09.039 +Are there any talks from this year's Emacs Conf + +00:22:09.040 --> 00:22:12.599 +that discuss things that would work well with Hyperbole? + +00:22:12.600 --> 00:22:19.279 +No. Unfortunately, I had to work yesterday, so I haven't... + +00:22:19.280 --> 00:22:22.639 +been following the conference as much as I do. + +00:22:22.640 --> 00:22:25.559 +Maybe somebody else could comment on that. + +00:22:25.560 --> 00:22:29.519 +But I think, you know, again, + +00:22:29.520 --> 00:22:31.879 +it's like pick your favorite mode, + +00:22:31.880 --> 00:22:34.719 +pick your favorite type of information. + +00:22:34.720 --> 00:22:36.839 +Can I hyperbole work with that? + +00:22:36.840 --> 00:22:39.999 +You know, the answer is almost always yes. + +00:22:40.000 --> 00:22:44.959 +So, you know, if I show you just a little bit, + +00:22:44.960 --> 00:22:48.679 +if I show you some of these implicit button types, + +00:22:48.680 --> 00:22:53.359 +just so you know the amount of code + +00:22:53.360 --> 00:22:56.279 +involved to create a type. + +00:22:56.280 --> 00:22:59.679 +So here's like a male, recognizing + +00:22:59.680 --> 00:23:01.639 +an email address as a button. + +00:23:01.640 --> 00:23:05.519 +It's a little long so that it creates a lot of things + +00:23:05.520 --> 00:23:09.199 +but you know it's less than 15 lines of code for that. + +00:23:09.200 --> 00:23:12.199 +Path names are complicated so that's a longer one + +00:23:12.200 --> 00:23:18.799 +but let's look at so here's one recognizing a bibliography entry. + +00:23:18.800 --> 00:23:24.879 +So it can be between two and 20 lines of code + +00:23:24.880 --> 00:23:27.519 +to create an entirely new button type. + +00:23:27.520 --> 00:23:32.159 +And you create it once, and you just add it to the set of types, + +00:23:32.160 --> 00:23:35.479 +just like at the fun, except it's done with this macro + +00:23:35.480 --> 00:23:39.479 +called def, implicit button type, and defib. + +00:23:39.480 --> 00:23:45.559 +And it's part of your hyperlinking system forever then. + +00:23:45.560 --> 00:23:49.799 +So say you got dumped with 5,000 documents + +00:23:49.800 --> 00:23:51.519 +that were in this weird text format, + +00:23:51.520 --> 00:23:54.119 +and they all had cross-references among them, + +00:23:54.120 --> 00:23:56.792 +but it was, again, using a weird format. + +00:23:56.760 --> 00:23:59.919 +You could just write your own little type for that, + +00:23:59.920 --> 00:24:04.319 +and then those 5,000 documents are hyperlinked for you + +00:24:04.320 --> 00:24:08.759 +every time you're browsing them in Emacs automatically. + +00:24:08.760 --> 00:24:11.959 +So we do that all the time, create small things, + +00:24:11.960 --> 00:24:15.159 +but all of these are built into Hyperbole. + +00:24:15.160 --> 00:24:20.199 +Markdown links, tech info links, all of that's automatic. + +00:24:20.200 --> 00:24:26.199 +I could even be in a shell mode, and I just say ls, + +00:24:26.200 --> 00:24:30.519 +and these are hyperlinks that Hyperbole understands, right? + +00:24:30.520 --> 00:24:31.759 +It just jumps right to the file. + +00:24:31.760 --> 00:24:36.999 +So grep-n, You know, looking at any line numbers, + +00:24:37.000 --> 00:24:39.839 +you don't have to remember + +00:24:39.840 --> 00:24:41.959 +all these different commands anymore. + +00:24:41.960 --> 00:24:44.319 +You just hit made a return, + +00:24:44.320 --> 00:24:46.599 +and Hyperbole does the right thing + +00:24:46.600 --> 00:24:48.359 +in all these different contexts, + +00:24:48.360 --> 00:24:52.639 +including following cross-references in code. + +00:24:52.640 --> 00:24:56.079 +So I would say that's your answer. + +00:24:56.080 --> 00:24:58.399 +Most things that people are talking about, + +00:24:58.400 --> 00:25:02.199 +we've already probably integrated with Hyperbole + +00:25:02.200 --> 00:25:04.639 +or with a little bit of custom coding. + +00:25:04.640 --> 00:25:11.199 +You can do it. I think that's the end of the etherpad questions for now, + +00:25:11.200 --> 00:25:12.919 +but I see a number of people in the room, + +00:25:12.920 --> 00:25:15.439 +so you can continue the conversation. + +00:25:15.440 --> 00:25:18.719 +We'll be on the stream for another five minutes or so, + +00:25:18.720 --> 00:25:22.319 +but yes, please go ahead. Great. Yeah. + +00:25:22.320 --> 00:25:27.639 +I mean, people, does everybody have, can talk on the conference? + +00:25:27.640 --> 00:25:31.439 +I was expecting to just talk with people here. + +00:25:31.440 --> 00:25:40.799 +Let's see. Yeah. Can anybody say anything here? + +00:25:40.800 --> 00:25:52.039 +Hi, Bob. I can say something. Hey, Matt. Hi. Yeah. + +00:25:52.040 --> 00:25:55.199 +Maybe you want to bring up a topic. + +00:25:55.200 --> 00:25:56.839 +I think I... Yes. Sorry, Bob. + +00:25:56.840 --> 00:26:05.839 +I think I saw a question here on IOC. It was like this. + +00:26:05.840 --> 00:26:08.599 +Interesting, but the many different link formats + +00:26:08.600 --> 00:26:11.279 +makes reading and analyzing my notes + +00:26:11.280 --> 00:26:14.959 +much harder and less usable outside Emacs. + +00:26:14.960 --> 00:26:18.759 +I don't know if you have some comment on that. + +00:26:18.760 --> 00:26:22.319 +Well, I mean, the different formats that you're saying, + +00:26:22.320 --> 00:26:24.839 +like angle brackets or curly braces, + +00:26:24.840 --> 00:26:31.319 +are just so that you can utilize many different types. + +00:26:31.320 --> 00:26:35.599 +of buttons, but if you just want to use key sequences, + +00:26:35.600 --> 00:26:37.759 +there's only one markup format. + +00:26:37.760 --> 00:26:41.599 +With org, you've got the square brackets, + +00:26:41.600 --> 00:26:44.919 +which are consistent, but in order to have different types, + +00:26:44.920 --> 00:26:47.279 +you have to type a prefix name, + +00:26:47.280 --> 00:26:53.279 +like you see the HY for the High Wiki buttons in org mode. + +00:26:53.280 --> 00:26:56.999 +So I think the trade-off is pretty much the same, + +00:26:57.000 --> 00:27:02.239 +but Hyperbole always, always works + +00:27:02.240 --> 00:27:04.559 +to minimize the amount of markup. + +00:27:04.560 --> 00:27:07.439 +Markdown is pretty simple. A lot of people like that. + +00:27:07.440 --> 00:27:10.759 +But I think you'll find in hyperbole texts, + +00:27:10.760 --> 00:27:15.479 +they read just like regular language. + +00:27:15.480 --> 00:27:19.599 +I mean, the delimiters are fairly invisible. + +00:27:19.600 --> 00:27:23.039 +So I'm not sure what the issue is there. + +00:27:23.040 --> 00:27:24.919 +And again, you can choose your own. + +00:27:24.920 --> 00:27:27.639 +You can make your own types with your own delimiters. + +00:27:27.640 --> 00:27:31.359 +There's even a custom macro + +00:27:31.360 --> 00:27:33.399 +that instead of using that defib + +00:27:33.400 --> 00:27:35.559 +where you have to type out list code, + +00:27:35.560 --> 00:27:37.519 +you can use regular expressions. + +00:27:37.520 --> 00:27:41.239 +And in one line, you can define your own type of button + +00:27:41.240 --> 00:27:42.919 +with its own delimiters. + +00:27:42.920 --> 00:27:47.879 +So, you know, depending on what works well for your eyes, + +00:27:47.880 --> 00:27:51.359 +you can make Hyperbole adapt quite well to that. + +00:27:51.360 --> 00:27:54.319 +And again, if you start using the HiWiki, + +00:27:54.320 --> 00:27:57.479 +there's literally zero markup on that. + +00:27:57.480 --> 00:27:59.599 +So you're just reading text, + +00:27:59.600 --> 00:28:01.759 +and when you want something hyperlinked, + +00:28:01.760 --> 00:28:04.599 +it's like a glossary or a dictionary entry. + +00:28:04.600 --> 00:28:09.599 +It's just there, and it's just highlighted in the text. + +00:28:09.600 --> 00:28:17.479 +So I don't see much barrier to using it with many different types of documents. + +00:28:17.480 --> 00:28:23.319 +Let me go back to the Emacs here. + +00:28:23.320 --> 00:28:27.039 +If there are any other questions. + +00:28:27.040 --> 00:28:36.639 +Let me see. Let me go back to that. This K outline here. + +00:28:36.640 --> 00:28:38.719 +So we covered HiWiki. + +00:28:38.720 --> 00:28:42.999 +We're in the, I'll just show you some things + +00:28:43.000 --> 00:28:44.039 +that we wanted to highlight + +00:28:44.040 --> 00:28:46.279 +if people didn't have specific questions. + +00:28:46.280 --> 00:28:48.879 +But feel free to jump in anytime + +00:28:48.880 --> 00:28:51.399 +if you want to ask something. + +00:28:51.400 --> 00:28:57.039 +So what we're looking at here is a K Outliner document. + +00:28:57.040 --> 00:29:00.399 +There's, you know, hyperbole is pretty well documented. + +00:29:00.400 --> 00:29:04.719 +There's a large manual. There's interactive. + +00:29:04.720 --> 00:29:09.319 +demos of it and there are videos as well + +00:29:09.320 --> 00:29:12.079 +but the K Outliner is unique in Emacs + +00:29:12.080 --> 00:29:17.439 +because it it can do like full legal auto numbering you + +00:29:17.440 --> 00:29:21.399 +just say I want to create a new headline + +00:29:21.400 --> 00:29:23.919 +and you can see or I could create four + +00:29:23.920 --> 00:29:26.679 +I could say I want to create three more of these + +00:29:26.680 --> 00:29:29.239 +and I can do it all at once with one key + +00:29:29.240 --> 00:29:33.679 +I can then just tab to make sublevels here + +00:29:33.680 --> 00:29:40.319 +and you see this is using a specific outline format that we have + +00:29:40.320 --> 00:29:43.919 +but if we do dot in the view specs here + +00:29:43.920 --> 00:29:48.239 +it changes to legal outlining so it's really that simple + +00:29:48.240 --> 00:29:51.399 +and all of these numbers are automatically maintained + +00:29:51.400 --> 00:29:56.639 +as I move stuff around I can use like org mode alt arrow keys + +00:29:56.640 --> 00:30:00.119 +to like move things up and down, right? + +00:30:00.120 --> 00:30:00.839 +And just move them around. + +00:30:00.840 --> 00:30:04.719 +And when I run out, you know, when it can't go any higher, + +00:30:04.720 --> 00:30:06.039 +it gives me an error. + +00:30:06.040 --> 00:30:11.079 +And then it's just free form typing here with auto-wrapping. + +00:30:11.080 --> 00:30:13.759 +The nice thing is that there's, + +00:30:13.760 --> 00:30:17.359 +there's actually these hidden, + +00:30:17.360 --> 00:30:22.519 +let's get, hidden what are called ID stamps. + +00:30:22.520 --> 00:30:24.919 +So these are permanent hyperlink anchors + +00:30:24.920 --> 00:30:26.719 +that are assigned to each cell. + +00:30:26.720 --> 00:30:29.679 +So as this cell moves in the outline, + +00:30:29.680 --> 00:30:32.679 +you notice that this 29 didn't change. + +00:30:32.680 --> 00:30:37.439 +So you can move and all those other auto numbers shift + +00:30:37.440 --> 00:30:40.359 +to represent the actual outline structure. + +00:30:40.360 --> 00:30:44.079 +But this ID stamp of 29 stays the same. + +00:30:44.080 --> 00:30:47.679 +So you can embed that in links and say, + +00:30:47.680 --> 00:30:51.719 +I want to link to cell 29. + +00:30:51.720 --> 00:30:55.999 +If I go, let me just go to the K Outliner example. + +00:30:56.000 --> 00:30:59.039 +And I'll show you one of those, which is really cool. + +00:30:59.040 --> 00:31:02.599 +Because what you can do is say, I want to link + +00:31:02.600 --> 00:31:06.999 +Let me find that. It's down here somewhere. + +00:31:07.000 --> 00:31:12.199 +I think there's 3A. Where was it? Yeah, okay. + +00:31:12.200 --> 00:31:16.479 +So see right here, this is an internal link + +00:31:16.480 --> 00:31:21.200 +with just the pound and then the relative ID, as we call it, 3B. + +00:31:21.200 --> 00:31:25.719 +But of course, somebody may have moved 3B in the outline. + +00:31:25.720 --> 00:31:27.919 +So when Hyperbole inserts a link, + +00:31:27.920 --> 00:31:32.039 +it puts this equal with the ID stamp in it automatically. + +00:31:32.040 --> 00:31:35.839 +So if what'll happen is when I reference this, + +00:31:35.840 --> 00:31:37.639 +okay, it's still the same. + +00:31:37.640 --> 00:31:40.959 +But if it had changed, it would update this link + +00:31:40.960 --> 00:31:44.759 +and would change the 3B to say it was 3D now + +00:31:44.760 --> 00:31:50.519 +based on this permalink, the 08 that's hidden away in here. + +00:31:50.520 --> 00:31:52.439 +So you don't have to do anything. + +00:31:52.440 --> 00:31:56.599 +It's just that you have these automatic hyperlink anchors + +00:31:56.600 --> 00:31:58.959 +that are embedded in your outlines again. + +00:31:58.960 --> 00:32:04.519 +sort of like org IDs, but you have to manually place those in org. + +00:32:04.520 --> 00:32:09.039 +And it just makes linking much simpler. + +00:32:09.040 --> 00:32:10.359 +And you can reference this. + +00:32:10.360 --> 00:32:13.799 +You can reference the file and the cell number. + +00:32:13.800 --> 00:32:15.999 +And again, you don't put this hyperbole. + +00:32:16.000 --> 00:32:17.679 +You don't put this in. + +00:32:17.680 --> 00:32:20.719 +And then you can even have these view specs, which say, + +00:32:20.720 --> 00:32:25.919 +I want to clip the display to one line, + +00:32:25.920 --> 00:32:27.399 +and I want to delete. ellipses. + +00:32:27.400 --> 00:32:31.079 +So here we see a view over the same outline + +00:32:31.080 --> 00:32:37.319 +that's all in one mode. So it's just incredibly capable. + +00:32:37.320 --> 00:32:40.079 +So here we've said, you know, + +00:32:40.080 --> 00:32:42.879 +there's no blank lines between cells. + +00:32:42.880 --> 00:32:46.719 +now I change the view spec and put a blank line in there + +00:32:46.720 --> 00:32:51.879 +and it's all changed so lots of consistency that you get + +00:32:51.880 --> 00:32:55.599 +when you when you change a node in the outline + +00:32:55.600 --> 00:32:58.799 +the whole tree shifts and all of this is maintained + +00:32:58.800 --> 00:33:02.839 +all of the structure is maintained automatically by hyperbole + +00:33:02.840 --> 00:33:09.479 +and you can embed or Tables in here as well. + +00:33:09.480 --> 00:33:17.079 +So if I just press made a return action key again on this or Disabled. + +00:33:17.080 --> 00:33:21.799 +Okay. So now I enabled org mode here + +00:33:21.800 --> 00:33:31.719 +and where you see like tab here shifts a cell when I'm inside a The table tab just operates like normal org tables. + +00:33:31.720 --> 00:33:33.519 +So I can do all of the things + +00:33:33.520 --> 00:33:40.839 +that I can do in org table mode as well within this k-outline. + +00:33:40.840 --> 00:33:43.399 +So it seems pretty useful to me, + +00:33:43.400 --> 00:33:48.519 +but of course, I helped write it. + +00:33:48.520 --> 00:33:51.279 +But I think you see some of the benefits + +00:33:51.280 --> 00:33:53.959 +that can accrue by using that format. + +00:33:53.960 --> 00:33:57.839 +But this is just this is just one piece of hyperbole, + +00:33:57.840 --> 00:34:01.559 +a major mode that you can choose to use or ignore entirely, + +00:34:01.560 --> 00:34:04.039 +you know, dependent on your needs. + +00:34:04.040 --> 00:34:06.399 +If you're writing requirements, documents, + +00:34:06.400 --> 00:34:08.879 +or anything that needs structure, + +00:34:08.880 --> 00:34:12.079 +I think that's where this is really ideal. + +00:34:12.080 --> 00:34:14.279 +You can write a legal document, + +00:34:14.280 --> 00:34:16.159 +and you've got auto-numbering, + +00:34:16.160 --> 00:34:18.679 +which is always, if you've ever used Word + +00:34:18.680 --> 00:34:21.039 +or any of those word processors, + +00:34:21.040 --> 00:34:26.479 +it's really a pain to maintain those hierarchies in those compared to here. + +00:34:26.480 --> 00:34:32.239 +Okay, so that was just showing you the KL liner. + +00:34:32.240 --> 00:34:35.279 +Does anybody have any questions + +00:34:35.280 --> 00:34:43.279 +or I'll just continue down a bit? + +00:34:43.280 --> 00:34:47.999 +Okay, so some other capabilities + +00:34:48.000 --> 00:34:49.959 +that we've fairly recently put in. + +00:34:49.960 --> 00:34:52.799 +Well, this has been here for a long time. + +00:34:52.800 --> 00:34:58.719 +You can, I think the binding I use is Control-C-M. + +00:34:58.720 --> 00:35:00.159 +I forget what it is. + +00:35:00.160 --> 00:35:07.159 +No, sorry, that's Control-C, Control-M. + +00:35:07.160 --> 00:35:14.319 +Now let's CTRL C, forward slash. + +00:35:14.320 --> 00:35:21.719 +Okay, so what I wanted to show you here is that the action key + +00:35:21.720 --> 00:35:26.679 +on any double quote, single quote, usually, + +00:35:26.680 --> 00:35:30.079 +or paired delimiters will select that whole thing. + +00:35:30.080 --> 00:35:33.239 +There is this capability, and I probably just select bigger + +00:35:33.240 --> 00:35:35.119 +and bigger chunks of text, + +00:35:35.120 --> 00:35:39.319 +but this is really nice that you can just go anywhere + +00:35:39.320 --> 00:35:42.479 +in pretty much any mode and hit made a return. + +00:35:42.480 --> 00:35:46.559 +And so in Lisp, you can be on the trailing paren + +00:35:46.560 --> 00:35:50.599 +and it will select the whole expression or the opening + +00:35:50.600 --> 00:35:52.879 +and it'll select just that piece + +00:35:52.880 --> 00:35:56.159 +but even better when you're copying pasting + +00:35:56.160 --> 00:36:02.039 +I can now if there's no region selected control W made a W + +00:36:02.040 --> 00:36:05.679 +will act on the structured entity + +00:36:05.680 --> 00:36:09.359 +that you're at the beginning or ending delimiter for + +00:36:09.360 --> 00:36:12.199 +without you having to highlight the region + +00:36:12.200 --> 00:36:14.719 +So if I hit made a return, it would highlight it, + +00:36:14.720 --> 00:36:19.839 +but let's just do made a W to cut that and then I'll yank it here. + +00:36:19.840 --> 00:36:23.599 +And you see it grabbed the whole expression + +00:36:23.600 --> 00:36:25.599 +and just let you yank it. + +00:36:25.600 --> 00:36:29.679 +So it's a nice add on to the basic Emacs commands + +00:36:29.680 --> 00:36:33.159 +that just let you operate a lot more efficiently. + +00:36:33.160 --> 00:36:35.359 +You can do something similar in C mode. + +00:36:35.360 --> 00:36:39.439 +You know, on the braces, you can select the whole function + +00:36:39.440 --> 00:36:40.439 +with one key press, + +00:36:40.440 --> 00:36:43.079 +made a return, and then copy it somewhere. + +00:36:43.080 --> 00:36:50.559 +And Hyperbole integrates with Ace Window if you use that. + +00:36:50.560 --> 00:36:56.799 +So let me split this a few ways. And let's do it over here. + +00:36:56.800 --> 00:37:06.799 +We'll just go to scratch. Okay. And then I can go, + +00:37:06.800 --> 00:37:08.119 +it's sort of interesting, + +00:37:08.120 --> 00:37:11.120 +it works with the, with Dired as well. + +00:37:11.120 --> 00:37:16.519 +So I can go here and say, I want to So if I do Meta O, + +00:37:16.520 --> 00:37:22.159 +ACE window will show me the labels to use, A, D, or S, to do something. + +00:37:22.160 --> 00:37:24.559 +Like I can move to any of those windows. + +00:37:24.560 --> 00:37:27.959 +But what Hyperbole lets you do + +00:37:27.960 --> 00:37:30.759 +is say I want to throw with T, + +00:37:30.760 --> 00:37:36.399 +like this glass.org file over to the bottom window. + +00:37:36.400 --> 00:37:42.479 +So I go MetaO to invoke it. I say I want a T to throw it. + +00:37:42.480 --> 00:37:46.399 +then where do I want to throw it to s the window and + +00:37:46.400 --> 00:37:49.879 +Then you see it's now displaying glass org + +00:37:49.880 --> 00:37:56.679 +so I can do that with files I can do it with regions of text you can + +00:37:56.680 --> 00:37:58.719 +Replace things in a buffer + +00:37:58.720 --> 00:38:01.199 +or throw the whole thing to the window + +00:38:01.200 --> 00:38:02.759 +so a couple extra commands + +00:38:02.760 --> 00:38:06.519 +that it extends ace window with you + +00:38:06.520 --> 00:38:12.159 +can even I think, well, we also have this command, + +00:38:12.160 --> 00:38:16.799 +I think it's Control-C, yeah. + +00:38:16.800 --> 00:38:21.719 +So what it did there was it just selected the files + +00:38:21.720 --> 00:38:22.799 +that I had marked in Dura, + +00:38:22.800 --> 00:38:26.839 +it selected and created a window grid out of all of them. + +00:38:26.840 --> 00:38:29.559 +you know, so I hit like three keystrokes. + +00:38:29.560 --> 00:38:35.159 +That's kind of convenient if you want to see + +00:38:35.160 --> 00:38:38.159 +a lot of information all at once. + +00:38:38.160 --> 00:38:42.239 +And so we covered all that. I won't go into it too much, + +00:38:42.240 --> 00:38:46.639 +but there's a whole nother window and frame control system + +00:38:46.640 --> 00:38:50.799 +under the screen menu here if you type control HHS. + +00:38:50.800 --> 00:38:54.479 +then you can select either controlling windows or frames. + +00:38:54.480 --> 00:38:56.119 +Let's do windows. + +00:38:56.120 --> 00:39:00.479 +And it has this menu where it's just sort of showing you. + +00:39:00.480 --> 00:39:07.839 +I can like split my windows vertically or horizontally. + +00:39:07.840 --> 00:39:13.759 +I can widen by a pixel or I can say, or character. + +00:39:13.760 --> 00:39:18.319 +I can say, use my prefix argument to change that to 10. + +00:39:18.320 --> 00:39:22.479 +And then when I shrink it, shrinks it up by 10 + +00:39:22.480 --> 00:39:27.319 +or it narrows it width by 10 or it widens it by 10. + +00:39:27.320 --> 00:39:33.679 +So it has this concept of prefix arguments that persist + +00:39:33.680 --> 00:39:35.719 +and you just type in the number + +00:39:35.720 --> 00:39:38.359 +and then you can issue any number of the commands. + +00:39:38.360 --> 00:39:41.679 +So you could move windows or frames + +00:39:41.680 --> 00:39:44.919 +or create them, delete them, cycle through them, + +00:39:44.920 --> 00:39:48.279 +all sorts of things, including relative to movement, + +00:39:48.280 --> 00:39:50.719 +relative to the edges of your screens. + +00:39:50.720 --> 00:39:52.559 +So if you have multiple screens + +00:39:52.560 --> 00:39:54.479 +and many frames that you use, + +00:39:54.480 --> 00:39:59.639 +it just makes management very convenient. + +00:39:59.640 --> 00:40:02.439 +And then you just cue to quit out of there + +00:40:02.440 --> 00:40:04.959 +and you're back wherever you were. + +00:40:04.960 --> 00:40:10.439 +So, Finally, we have a lot of documentation. + +00:40:10.440 --> 00:40:12.599 +This is just a link to the videos, + +00:40:12.600 --> 00:40:16.239 +which is in the readme and in the manuals. + +00:40:16.240 --> 00:40:21.399 +There's two demos or tutorials. One to get you started. + +00:40:21.400 --> 00:40:24.719 +Notice I'm using these implicit buttons, so keystrokes, + +00:40:24.720 --> 00:40:26.879 +and I can just made a return on that. + +00:40:26.880 --> 00:40:30.519 +And that takes me to, here's all the videos. + +00:40:30.520 --> 00:40:34.239 +And you can get started with that + +00:40:34.240 --> 00:40:38.279 +or just interact with this demo that we have. + +00:40:38.280 --> 00:40:41.519 +And there's one for the K Outliner as well. + +00:40:41.520 --> 00:40:45.399 +One of the things that If you're into videos + +00:40:45.400 --> 00:40:46.919 +and you need to link to them, + +00:40:46.920 --> 00:40:50.519 +notice what you're seeing here. This is a hyperbole feature + +00:40:50.520 --> 00:40:54.919 +which is very difficult to achieve any other way that I've seen + +00:40:54.920 --> 00:40:59.279 +where you want a specific start and stop time + +00:40:59.280 --> 00:41:01.039 +in a video that you want to play. + +00:41:01.040 --> 00:41:05.639 +Hyperbole has a built-in link type for that. + +00:41:05.640 --> 00:41:08.760 +as you see here. So this is the name of the link + +00:41:08.760 --> 00:41:10.919 +that you can reference it by, + +00:41:10.920 --> 00:41:14.279 +and then this is the actual link expression. + +00:41:14.280 --> 00:41:17.479 +So I could just go and play a video right here, + +00:41:17.480 --> 00:41:22.079 +and this is from one long intro to hyperbole that we did. + +00:41:22.080 --> 00:41:25.759 +So it's just linking to the specific sections. + +00:41:25.760 --> 00:41:27.439 +But that's something, again, + +00:41:27.440 --> 00:41:29.519 +this could be embedded anywhere. + +00:41:29.520 --> 00:41:33.759 +in any file and it would start to play. + +00:41:33.760 --> 00:41:36.559 +Uh, I guess I could try YouTube. + +00:41:36.560 --> 00:41:43.239 +Well, I don't want to. Yeah. Okay. It's on my other screen. + +00:41:43.240 --> 00:41:48.199 +So, but it did, it did, uh, link to it. + +00:41:48.200 --> 00:41:53.319 +So, um, yeah, just, you know, tremendous capability + +00:41:53.320 --> 00:41:56.919 +to interlink your information that way. + +00:41:56.920 --> 00:42:00.359 +And, uh, You know, again, you learn it bit by bit. + +00:42:00.360 --> 00:42:04.279 +You can study one particular section right here. + +00:42:04.280 --> 00:42:09.039 +Just jump directly to that if you want to know about it. + +00:42:09.040 --> 00:42:13.319 +The manual is interlinked, has an extensive glossary, + +00:42:13.320 --> 00:42:16.119 +cross-references of sections. + +00:42:16.120 --> 00:42:23.119 +And if you go in there, this is the hyperlinked manual. + +00:42:23.120 --> 00:42:25.119 +So this is the structure of it + +00:42:25.120 --> 00:42:27.799 +with all the subsystems documented. + +00:42:27.800 --> 00:42:31.519 +But one of the sections we've added + +00:42:31.520 --> 00:42:33.559 +is developing with hyperbole. + +00:42:33.560 --> 00:42:37.319 +So if you are or you want to create your own button types, + +00:42:37.320 --> 00:42:38.919 +this explains how to do it. + +00:42:38.920 --> 00:42:42.959 +Creating types, you can create your own action + +00:42:42.960 --> 00:42:44.999 +and implicit button types. + +00:42:45.000 --> 00:42:48.359 +And if you look in here, there are three ways + +00:42:48.360 --> 00:42:55.039 +to create implicit button types from simpler to harder. + +00:42:55.040 --> 00:42:59.079 +So like, here's an example + +00:42:59.080 --> 00:43:03.679 +where the do pressing control X after this expression + +00:43:03.680 --> 00:43:07.199 +defines a new action button link type called pilot. + +00:43:07.200 --> 00:43:13.359 +So let's say, I don't know if I have this set up, but we can try it. + +00:43:13.360 --> 00:43:21.999 +Yeah, I don't have the variable setup, + +00:43:22.000 --> 00:43:25.759 +but basically, you know, it can get you. + +00:43:25.760 --> 00:43:31.359 +This is a one line definition of a new action type. + +00:43:31.360 --> 00:43:36.399 +that can get you to a Python file + +00:43:36.400 --> 00:43:39.639 +based on whatever your Python path is set to + +00:43:39.640 --> 00:43:42.919 +with this simple syntax right here. + +00:43:42.920 --> 00:43:45.199 +And here we're going to the file. + +00:43:45.200 --> 00:43:48.399 +So we have no idea where this is on the file system. + +00:43:48.400 --> 00:43:54.959 +And the same way like if you use man path, Python path, + +00:43:54.960 --> 00:44:08.599 +you can embed buttons. Let's just go to scratch buffer. + +00:44:08.600 --> 00:44:17.919 +My first read-only. It doesn't want me to go. + +00:44:17.920 --> 00:44:24.999 +It must be kind of strange. + +00:44:25.000 --> 00:44:34.799 +Something with this key window that I have over here. + +00:44:34.800 --> 00:44:41.039 +Let me just move off there. Look at that. + +00:44:41.040 --> 00:44:46.519 +Maybe it's just activating that. + +00:44:46.520 --> 00:44:53.319 +Yeah, it keeps jumping back there. + +00:44:53.320 --> 00:44:55.919 +I don't know. I have to get this straight. + +00:44:55.920 --> 00:45:02.199 +Yeah, it's not letting me type the buttons. + +00:45:02.200 --> 00:45:15.839 +Let me see if I can turn off the key casting. + +00:45:15.840 --> 00:45:23.519 +Yeah, maybe that'll help. just gonna exit out of here. + +00:45:23.520 --> 00:45:32.960 +Does anybody have any questions they want to cover? + +00:45:33.000 --> 00:45:39.079 +I was just gonna show you yeah a little more on type definitions + +00:45:39.080 --> 00:45:53.119 +if there was any interest OK, there's nobody piping up. + +00:45:53.120 --> 00:45:56.999 +Let me see if there's any other questions. + +00:45:57.000 --> 00:46:04.439 +Hi, Bob. I haven't seen any more questions. + +00:46:04.440 --> 00:46:10.839 +Yeah, so maybe it's you, me, and someone called Max is here in the channel. + +00:46:10.840 --> 00:46:19.479 +OK. Okay, so if Max doesn't have any questions + +00:46:19.480 --> 00:46:24.839 +and there aren't other people, we can just end it there. + +00:46:24.840 --> 00:46:34.479 +I don't want to have an audience of zero or talk to that. + +00:46:34.480 --> 00:46:37.919 +So, but I think that was a good overview, Max, right? + +00:46:37.920 --> 00:46:45.479 +Yes, definitely covered a lot in a short time. + +00:46:45.480 --> 00:46:48.639 +And hopefully, you know, just try it out. + +00:46:48.640 --> 00:46:52.399 +At the top here, it shows you how to install it. + +00:46:52.400 --> 00:46:56.559 +It's pretty simple, basic package and installation. + +00:46:56.560 --> 00:47:02.719 +And we're happy to help anybody get started if they need to. + +00:47:02.720 --> 00:47:05.199 +So thanks, everyone. + +00:47:05.200 --> 00:47:09.279 +And we'll answer any further questions on the Etherpad after this. diff --git a/2025/captions/emacsconf-2025-juicemacs--juicemacs-exploring-speculative-jit-compilation-for-elisp-in-java--kana--main.vtt b/2025/captions/emacsconf-2025-juicemacs--juicemacs-exploring-speculative-jit-compilation-for-elisp-in-java--kana--main.vtt new file mode 100644 index 00000000..46820e94 --- /dev/null +++ b/2025/captions/emacsconf-2025-juicemacs--juicemacs-exploring-speculative-jit-compilation-for-elisp-in-java--kana--main.vtt @@ -0,0 +1,1238 @@ +WEBVTT captioned by kana + + +00:00:01.200 --> 00:00:02.803 +Hello! This is Kana! + +00:00:02.903 --> 00:00:04.367 +And today I'll be talking about + +00:00:04.368 --> 00:00:06.067 +<b>J</b>ust-<b>I</b>n-<b>T</b>ime compilation, or JIT, + +00:00:06.068 --> 00:00:07.363 +for Emacs Lisp, + +00:00:07.463 --> 00:00:11.163 +based on my work-in-progress Emacs clone, Juicemacs. + +00:00:11.263 --> 00:00:13.533 +Juicemacs aims to explore a few things + +00:00:13.534 --> 00:00:15.843 +that I've been wondering about for a while. + +00:00:15.943 --> 00:00:18.567 +For exmaple, what if we had better or even + +00:00:18.568 --> 00:00:21.223 +transparent concurrency in ELisp? + +00:00:21.323 --> 00:00:23.243 +Or, can we have a concurrent GUI? + +00:00:23.343 --> 00:00:26.783 +One that does not block, or is blocked by Lisp code? + +00:00:26.883 --> 00:00:31.067 +And finally what can JIT compilation do for ELisp? + +00:00:31.068 --> 00:00:34.083 +Will it provide better performance? + +00:00:34.183 --> 00:00:37.400 +However, a main problem with explorations + +00:00:37.401 --> 00:00:38.623 +in Emacs clones is that, + +00:00:38.723 --> 00:00:40.863 +Emacs is a whole universe. + +00:00:40.963 --> 00:00:43.600 +And that means, to make these explorations + +00:00:43.601 --> 00:00:45.383 +meaningful for Emacs users, + +00:00:45.483 --> 00:00:47.967 +we need to cover a lot of Emacs features, + +00:00:47.968 --> 00:00:50.543 +before we can ever begin. + +00:00:50.643 --> 00:00:53.923 +For example, one of the features of Emacs is that, + +00:00:54.023 --> 00:00:56.003 +it supports a lot of encodings. + +00:00:56.103 --> 00:00:59.267 +Let's look at this string: it can be encoded + +00:00:59.268 --> 00:01:03.643 +in both Unicode and Shift-JIS, a Japanese encoding system. + +00:01:03.743 --> 00:01:07.067 +But currently, Unicode does not have + +00:01:07.068 --> 00:01:09.803 +an official mapping for this "ki" (﨑) character. + +00:01:09.903 --> 00:01:12.767 +So when we map from Shift-JIS to Unicode, + +00:01:12.768 --> 00:01:14.423 +in most programming languages, + +00:01:14.523 --> 00:01:16.533 +you end up with something like this: + +00:01:16.534 --> 00:01:19.143 +it's a replacement character. + +00:01:19.243 --> 00:01:22.067 +But in Emacs, it actually extends + +00:01:22.068 --> 00:01:23.883 +the Unicode range by threefold, + +00:01:23.983 --> 00:01:26.833 +and uses the extra range to losslessly + +00:01:26.834 --> 00:01:29.483 +support characters like this. + +00:01:29.583 --> 00:01:31.923 +So if you want to support this feature, + +00:01:32.023 --> 00:01:34.033 +that basically rules out all string + +00:01:34.034 --> 00:01:37.243 +libraries with Unicode assumptions. + +00:01:37.843 --> 00:01:40.067 +For another, you need to support + +00:01:40.068 --> 00:01:41.883 +the regular expressions in Emacs, + +00:01:41.983 --> 00:01:45.023 +which are, really irregular. + +00:01:45.123 --> 00:01:46.900 +For example, it supports asserting + +00:01:46.901 --> 00:01:49.403 +about the user cursor position. + +00:01:49.503 --> 00:01:52.033 +And it also uses some character tables, + +00:01:52.034 --> 00:01:53.883 +that can be modified from Lisp code, + +00:01:53.983 --> 00:01:56.163 +to determine to case mappings. + +00:01:56.263 --> 00:01:59.567 +And all that makes it really hard, or even + +00:01:59.568 --> 00:02:05.123 +impossible to use any existing regexp libraries. + +00:02:05.223 --> 00:02:07.883 +Also, you need a functional garbage collector. + +00:02:07.983 --> 00:02:09.867 +You need threading primitives, because + +00:02:09.868 --> 00:02:12.323 +Emacs has already had some threading support. + +00:02:12.423 --> 00:02:14.533 +And you might want the performance of your clone + +00:02:14.534 --> 00:02:18.963 +to match Emacs, even with its native compilation enabled. + +00:02:19.063 --> 00:02:21.500 +Not to mention you also need a GUI for an editor. + +00:02:21.501 --> 00:02:23.543 +And so on. + +00:02:23.643 --> 00:02:25.633 +For Juicemacs, building on Java and + +00:02:25.634 --> 00:02:27.563 +a compiler framework called Truffle, + +00:02:27.663 --> 00:02:30.503 +helps in getting better performance; + +00:02:30.603 --> 00:02:32.933 +and by choosing a language with a good GC, + +00:02:32.934 --> 00:02:38.063 +we can actually focus more on the challenges above. + +00:02:38.163 --> 00:02:41.433 +Currently, Juicemacs has implemented three out of, + +00:02:41.434 --> 00:02:43.983 +at least four of the interpreters in Emacs. + +00:02:44.083 --> 00:02:46.363 +One for lisp code, one for bytecode, + +00:02:46.463 --> 00:02:48.567 +and one for regular expressions, + +00:02:48.568 --> 00:02:50.903 +all of them JIT-capable. + +00:02:51.003 --> 00:02:53.667 +Other than these, Emacs also has around + +00:02:53.668 --> 00:02:56.083 +two thousand built-in functions in C code. + +00:02:56.183 --> 00:02:57.333 +And Juicemacs has around + +00:02:57.334 --> 00:02:59.763 +four hundred of them implemented. + +00:02:59.863 --> 00:03:03.603 +It's not that many, but it is surprisingly enough + +00:03:03.703 --> 00:03:05.200 +to bootstrap Emacs and run + +00:03:05.201 --> 00:03:08.483 +the portable dumper, or pdump, in short. + +00:03:08.583 --> 00:03:11.243 +Let's have a try. + +00:03:11.343 --> 00:03:11.703 + + +00:03:11.803 --> 00:03:14.923 +So this is the binary produced by Java native image. + +00:03:15.023 --> 00:03:17.167 +And it's loading all the files + +00:03:17.168 --> 00:03:18.763 +needed for bootstrapping. + +00:03:18.863 --> 00:03:22.233 +Then it dumps the memory to a file to + +00:03:22.234 --> 00:03:24.923 +be loaded later, giving us fast startup. + +00:03:25.023 --> 00:03:28.723 +As we can see here, it throws some frame errors + +00:03:28.823 --> 00:03:31.400 +because Juicemacs doesn't have an editor UI + +00:03:31.401 --> 00:03:33.283 +or functional frames yet. + +00:03:33.383 --> 00:03:35.367 +But otherwise, it can already run + +00:03:35.368 --> 00:03:36.643 +quite some lisp code. + +00:03:36.743 --> 00:03:40.400 +For example, this code uses the benchmark library + +00:03:40.401 --> 00:03:44.403 +to measure the performance of this Fibonacci function. + +00:03:44.503 --> 00:03:47.067 +And we can see here, the JIT engine is + +00:03:47.068 --> 00:03:51.163 +already kicking in and makes the execution faster. + +00:03:51.263 --> 00:03:53.483 +In addition to that, with a bit of workaround, + +00:03:53.583 --> 00:03:56.467 +Juicemacs can also run some of the ERT, + +00:03:56.468 --> 00:04:01.043 +or, <b>E</b>macs <b>R</b>egression <b>T</b>est suite, that comes with Emacs. + +00:04:01.143 --> 00:04:05.823 +So... Yes, there are a bunch of test failures, + +00:04:05.923 --> 00:04:07.933 +which means we are not that compatible + +00:04:07.934 --> 00:04:09.523 +with Emacs and need more work. + +00:04:09.623 --> 00:04:12.803 +But the whole testing procedure runs fine, + +00:04:12.903 --> 00:04:14.767 +and it has proper stack traces, + +00:04:14.768 --> 00:04:17.803 +which is quite useful for debugging Juicemacs. + +00:04:17.903 --> 00:04:21.033 +So with that, a rather functional JIT runtime, + +00:04:21.034 --> 00:04:25.983 +let's now try look into today's topic, JIT compilation for ELisp. + +00:04:26.083 --> 00:04:28.533 +So, you probably know that Emacs has supported + +00:04:28.534 --> 00:04:32.083 +native-compilation, or nativecomp in short, for some time now. + +00:04:32.183 --> 00:04:35.033 +It mainly uses GCC to compile Lisp code + +00:04:35.034 --> 00:04:37.363 +into native code, ahead of time. + +00:04:37.463 --> 00:04:41.433 +And during runtime, Emacs loads those compiled files, + +00:04:41.434 --> 00:04:44.523 +and gets the performance of native code. + +00:04:44.623 --> 00:04:47.643 +However, for example, for installed packages, + +00:04:47.743 --> 00:04:49.059 +we might want to compile them when we + +00:04:49.060 --> 00:04:51.823 +actually use them instead of ahead of time. + +00:04:51.923 --> 00:04:53.733 +And Emacs supports this through + +00:04:53.734 --> 00:04:55.683 +this <i>native-comp-jit-compilation</i> flag. + +00:04:55.783 --> 00:04:59.767 +What it does is, during runtime, Emacs sends + +00:04:59.768 --> 00:05:03.203 +loaded files to external Emacs worker processes, + +00:05:03.303 --> 00:05:06.903 +which will then compile those files asynchronously. + +00:05:07.003 --> 00:05:09.043 +And when the compilation is done, + +00:05:09.143 --> 00:05:11.967 +the current Emacs session will load the compiled code back + +00:05:11.968 --> 00:05:16.323 +and improves its performance, on the fly. + +00:05:16.423 --> 00:05:18.643 +When you look at this procedure, however, it is, + +00:05:18.743 --> 00:05:21.563 +ahead-of-time compilation, done at runtime. + +00:05:21.663 --> 00:05:25.123 +And it is what current Emacs calls JIT compilation. + +00:05:25.223 --> 00:05:27.867 +But if you look at some other JIT engines, + +00:05:27.868 --> 00:05:31.803 +you'll see much more complex architectures. + +00:05:31.903 --> 00:05:34.233 +So, take luaJIT for an example, + +00:05:34.234 --> 00:05:36.163 +in addition to this red line here, + +00:05:36.263 --> 00:05:38.767 +which leads us from an interpreted state + +00:05:38.768 --> 00:05:40.643 +to a compiled native state, + +00:05:40.743 --> 00:05:42.163 +which is also what Emacs does, + +00:05:42.263 --> 00:05:44.333 +LuaJIT also supports going from + +00:05:44.334 --> 00:05:47.523 +a compiled state back to its interpreter. + +00:05:47.623 --> 00:05:51.483 +And this process is called "deoptimization". + +00:05:51.583 --> 00:05:55.300 +In contrast to its name, deoptimization here actually + +00:05:55.301 --> 00:05:58.563 +enables a huge category of JIT optimizations. + +00:05:58.663 --> 00:06:00.163 +They are called speculation. + +00:06:01.463 --> 00:06:04.600 +Basically, with speculation, the compiler + +00:06:04.601 --> 00:06:07.683 +can use runtime statistics to speculate, + +00:06:07.783 --> 00:06:11.443 +to make bolder assumptions in the compiled code. + +00:06:11.543 --> 00:06:13.983 +And when the assumptions are invalidated, + +00:06:14.083 --> 00:06:18.323 +the runtime deoptimizes the code, updates statistics, + +00:06:18.423 --> 00:06:21.133 +and then recompile the code based on new assumptions, + +00:06:21.134 --> 00:06:24.443 +and that will make the code more performant. + +00:06:24.543 --> 00:06:26.763 +Let's look at an example. + +00:06:28.463 --> 00:06:30.967 +So, here is a really simple function, + +00:06:30.968 --> 00:06:33.083 +that adds one to the input number. + +00:06:33.183 --> 00:06:36.167 +But in Emacs, it is not that simple, + +00:06:36.168 --> 00:06:38.203 +because Emacs has three categories of numbers, + +00:06:38.303 --> 00:06:42.700 +that is, fix numbers, or machine-word-sized integers, + +00:06:42.701 --> 00:06:45.603 +floating numbers, and big integers. + +00:06:45.703 --> 00:06:47.600 +And when we compile this, we need + +00:06:47.601 --> 00:06:49.363 +to handle all three cases. + +00:06:49.463 --> 00:06:52.600 +And if we analyze the code produced by Emacs, + +00:06:52.601 --> 00:06:54.683 +as is shown by this gray graph here, + +00:06:54.783 --> 00:06:58.083 +we can see that it has, two paths: + +00:06:58.183 --> 00:07:01.403 +One fast path, that does fast fix number addition; + +00:07:01.503 --> 00:07:03.967 +and one for slow paths, that calls out + +00:07:03.968 --> 00:07:06.523 +to an external plus-one function, + +00:07:06.623 --> 00:07:09.683 +to handle floating number and big integers. + +00:07:09.783 --> 00:07:13.167 +Now, if we pass integers into this function, + +00:07:13.168 --> 00:07:16.283 +it's pretty fast because it's on the fast path. + +00:07:16.383 --> 00:07:19.767 +However, if we pass in a floating number, + +00:07:19.768 --> 00:07:21.843 +then it has to go through the slow path, + +00:07:21.943 --> 00:07:25.563 +doing an extra function call, which is slow. + +00:07:25.663 --> 00:07:28.733 +What speculation might help here is that, + +00:07:28.734 --> 00:07:31.443 +it can have flexible fast paths. + +00:07:31.543 --> 00:07:34.563 +When we pass a floating number into this function, + +00:07:34.663 --> 00:07:37.400 +which currently has only fixnumbers on the fast path, + +00:07:37.401 --> 00:07:40.723 +it also has to go through the slow path. + +00:07:40.823 --> 00:07:44.567 +But the difference is that, a speculative runtime can + +00:07:44.568 --> 00:07:47.763 +deoptimize and recompile the code to adapt to this. + +00:07:47.863 --> 00:07:50.367 +And when it recompiles, it might add + +00:07:50.368 --> 00:07:52.643 +floating number onto the fast path, + +00:07:52.743 --> 00:07:55.003 +and now floating number operations are also fast. + +00:07:55.103 --> 00:07:58.567 +And this kind of speculation is why + +00:07:58.568 --> 00:08:03.603 +speculative runtime can be really fast. + +00:08:03.703 --> 00:08:05.723 +Let's take a look at some benchmarks. + +00:08:05.823 --> 00:08:09.423 +They're obtained with the <i>elisp-benchmarks</i> library on ELPA. + +00:08:09.523 --> 00:08:12.600 +The blue line here is for nativecomp, + +00:08:12.601 --> 00:08:16.043 +and these blue areas mean that nativecomp is slower. + +00:08:16.143 --> 00:08:19.133 +And, likewise, green areas mean that + +00:08:19.134 --> 00:08:20.523 +Juicemacs is slower. + +00:08:20.623 --> 00:08:22.867 +At a glance, the two (or four) + +00:08:22.868 --> 00:08:25.143 +actually seems somehow on par, to me. + +00:08:25.243 --> 00:08:30.383 +But, let's take a closer look at some of them. + +00:08:30.483 --> 00:08:32.667 +So, the first few benchmarks are the classic, + +00:08:32.668 --> 00:08:33.983 +Fibonacci benchmarks. + +00:08:34.083 --> 00:08:36.933 +We know that, the series is formed by + +00:08:36.934 --> 00:08:39.203 +adding the previous two numbers in the series. + +00:08:39.303 --> 00:08:41.700 +And looking at this expression here, + +00:08:41.701 --> 00:08:44.043 +Fibonacci benchmarks are quite intensive + +00:08:44.143 --> 00:08:46.800 +in number additions, subtractions, + +00:08:46.801 --> 00:08:49.103 +and function calls, if you use recursions. + +00:08:49.203 --> 00:08:51.000 +And it is exactly why + +00:08:51.001 --> 00:08:54.323 +Fibonacci series is a good benchmark. + +00:08:54.423 --> 00:08:57.243 +And looking at the results here... wow. + +00:08:57.343 --> 00:08:59.843 +Emacs nativecomp executes instantaneously. + +00:08:59.943 --> 00:09:04.523 +It's a total defeat for Juicemacs, seemingly. + +00:09:04.623 --> 00:09:08.043 +Now, if you're into benchmarks, you know something is wrong here: + +00:09:08.143 --> 00:09:11.683 +we are comparing the different things. + +00:09:11.783 --> 00:09:14.200 +So let's look under the hood + +00:09:14.201 --> 00:09:15.483 +and disassemble the function + +00:09:15.583 --> 00:09:17.567 +with this convenient Emacs command + +00:09:17.568 --> 00:09:19.063 +called <i>disassemble</i>... + +00:09:19.163 --> 00:09:23.043 +And these two lines of code is what we got. + +00:09:23.143 --> 00:09:24.700 +So, we already can see + +00:09:24.701 --> 00:09:26.123 +what's going on here: + +00:09:26.223 --> 00:09:29.963 +GCC sees Fibonacci is a pure function, + +00:09:30.063 --> 00:09:31.867 +because it returns the same value + +00:09:31.868 --> 00:09:33.243 +for the same arguments, + +00:09:33.343 --> 00:09:35.700 +so GCC chooses to do the computation + +00:09:35.701 --> 00:09:36.723 +at compile time + +00:09:36.823 --> 00:09:39.133 +and inserts the final number directly + +00:09:39.134 --> 00:09:40.323 +into the compiled code. + +00:09:41.823 --> 00:09:43.603 +It is actually great! + +00:09:43.703 --> 00:09:45.400 +Because it shows that nativecomp + +00:09:45.401 --> 00:09:47.283 +knows about pure functions, + +00:09:47.383 --> 00:09:48.700 +and can do all kinds of things + +00:09:48.701 --> 00:09:51.203 +like removing or constant-folding them. + +00:09:51.303 --> 00:09:54.403 +And Juicemacs just does not do that. + +00:09:54.503 --> 00:09:57.367 +However, we are also concerned about + +00:09:57.368 --> 00:09:59.003 +the things we mentioned earlier: + +00:09:59.103 --> 00:10:00.900 +the performance of number additions, + +00:10:00.901 --> 00:10:02.983 +or function calls. + +00:10:03.083 --> 00:10:05.633 +So, in order to let the benchmarks + +00:10:05.634 --> 00:10:06.863 +show some extra things, + +00:10:06.963 --> 00:10:08.367 +we need to modify it a bit... + +00:10:08.368 --> 00:10:11.323 +by simply making things non-constant. + +00:10:11.423 --> 00:10:15.203 +With that, Emacs gets much slower now. + +00:10:15.303 --> 00:10:17.133 +And again, let's look what's + +00:10:17.134 --> 00:10:21.083 +happening behind these numbers. + +00:10:21.183 --> 00:10:23.500 +Similarly, with the <i>disassemble</i> command, + +00:10:23.501 --> 00:10:25.643 +we can look into the assembly. + +00:10:25.743 --> 00:10:28.019 +And again, we can already see + +00:10:28.020 --> 00:10:29.303 +what's happening here. + +00:10:29.403 --> 00:10:32.083 +So, Juicemacs, due to its speculation nature, + +00:10:32.183 --> 00:10:35.443 +supports fast paths for all three kind of numbers. + +00:10:35.543 --> 00:10:39.233 +However, currently, Emacs nativecomp + +00:10:39.234 --> 00:10:41.243 +does not have any fast path + +00:10:41.343 --> 00:10:43.433 +for the operations here like additions, + +00:10:43.434 --> 00:10:45.803 +or subtractions, or comparisons, + +00:10:45.903 --> 00:10:48.067 +which is exactly what + +00:10:48.068 --> 00:10:50.963 +Fibonacci benchmarks are measuring. + +00:10:51.063 --> 00:10:53.800 +Emacs, at this time, has to call some generic, + +00:10:53.801 --> 00:10:57.963 +external functions for them, and this is slow. + +00:11:00.063 --> 00:11:03.203 +But is nativecomp really that slow? + +00:11:03.303 --> 00:11:04.967 +So, I also ran the same benchmark + +00:11:04.968 --> 00:11:07.083 +in Common Lisp, with SBCL. + +00:11:07.183 --> 00:11:09.000 +And nativecomp is already fast, + +00:11:09.001 --> 00:11:11.003 +compared to untyped SBCL. + +00:11:11.103 --> 00:11:15.500 +It's because SBCL also emits call instructions + +00:11:15.501 --> 00:11:18.483 +when it comes to no type info. + +00:11:18.583 --> 00:11:21.700 +However, once we declare the types, + +00:11:21.701 --> 00:11:25.283 +SBCL is able to compile a fast path for fix numbers, + +00:11:25.383 --> 00:11:27.467 +which makes its performance on par + +00:11:27.468 --> 00:11:30.683 +with speculative JIT engines (that is, Juicemacs), + +00:11:30.783 --> 00:11:34.763 +because, now both of us are now on fast paths. + +00:11:36.063 --> 00:11:38.400 +Additionally, if we are bold enough + +00:11:38.401 --> 00:11:41.203 +to pass this safety zero flag to SBCL, + +00:11:41.303 --> 00:11:43.700 +it will remove all the slow paths + +00:11:43.701 --> 00:11:44.963 +and type checks, + +00:11:45.063 --> 00:11:46.367 +and its performance is close + +00:11:46.368 --> 00:11:48.643 +to what you get with C. + +00:11:48.743 --> 00:11:51.299 +Well, probably we don't want safety zero + +00:11:51.300 --> 00:11:52.063 +most of the time. + +00:11:52.163 --> 00:11:55.133 +But even then, if nativecomp were to + +00:11:55.134 --> 00:11:57.763 +get fast paths for more constructs, + +00:11:57.863 --> 00:11:59.867 +there certainly is quite + +00:11:59.868 --> 00:12:03.563 +some room for performance improvement. + +00:12:04.063 --> 00:12:06.803 +Let's look at some more benchmarks. + +00:12:06.903 --> 00:12:08.933 +For example, for this inclist, + +00:12:08.934 --> 00:12:10.923 +or increment-list, benchmark, + +00:12:11.023 --> 00:12:14.333 +Juicemacs is really slow here. Partly, + +00:12:14.334 --> 00:12:17.603 +it comes from the cost of Java boxing integers. + +00:12:17.703 --> 00:12:20.300 +On the other hand, for Emacs nativecomp, + +00:12:20.301 --> 00:12:22.043 +for this particular benchmark, + +00:12:22.143 --> 00:12:23.667 +it actually has fast paths + +00:12:23.668 --> 00:12:25.523 +for all of the operations. + +00:12:25.623 --> 00:12:27.723 +And that's why it can be so fast, + +00:12:27.823 --> 00:12:30.667 +and that also proves the nativecomp + +00:12:30.668 --> 00:12:33.843 +has a lot potential for improvement. + +00:12:33.943 --> 00:12:35.833 +There is another benchmark here + +00:12:35.834 --> 00:12:37.963 +that use advices. + +00:12:38.063 --> 00:12:40.500 +So Emacs Lisp supports using + +00:12:40.501 --> 00:12:42.203 +advices to override functions + +00:12:42.303 --> 00:12:44.833 +by wrapping the original function, and an advice + +00:12:44.834 --> 00:12:47.443 +function, two of them, inside a glue function. + +00:12:47.543 --> 00:12:51.467 +And in this benchmark, we advice the Fibonacci function + +00:12:51.468 --> 00:12:54.523 +to cache the first ten entries to speed up computation, + +00:12:54.623 --> 00:13:00.003 +as can be seen in the speed-up in the Juicemacs results. + +00:13:00.103 --> 00:13:02.900 +However, it seems that nativecomp does not yet + +00:13:02.901 --> 00:13:08.523 +compile glue functions, and that makes advices slower. + +00:13:08.623 --> 00:13:12.043 +With these benchmarks, let's discuss this big question: + +00:13:12.143 --> 00:13:16.563 +Should GNU Emacs adopt speculative JIT compilation? + +00:13:16.663 --> 00:13:18.967 +Well, the hidden question is actually, + +00:13:18.968 --> 00:13:21.223 +is it worth it? + +00:13:21.323 --> 00:13:24.163 +And, my personal answer is, maybe not. + +00:13:24.263 --> 00:13:28.133 +The first reason is that, slow paths, like, floating numbers, + +00:13:28.134 --> 00:13:31.043 +are actually not that frequent in Emacs. + +00:13:31.143 --> 00:13:34.100 +And optimizing for fast paths like fix numbers + +00:13:34.101 --> 00:13:37.983 +can already get us very good performance already. + +00:13:38.083 --> 00:13:40.333 +And the second or main reason is that, + +00:13:40.334 --> 00:13:43.163 +speculative JIT is very hard. + +00:13:43.263 --> 00:13:46.843 +LuaJIT, for example, took a genius to build. + +00:13:46.943 --> 00:13:50.967 +Even with the help of GCC, we need to hand-write + +00:13:50.968 --> 00:13:54.283 +all those fast path or slow path or switching logic. + +00:13:54.383 --> 00:13:58.133 +We need to find a way to deoptimize, which requires + +00:13:58.134 --> 00:14:01.803 +mapping machine registers back to interpreter stack. + +00:14:01.903 --> 00:14:04.067 +And also, speculation needs runtime info, + +00:14:04.068 --> 00:14:07.323 +which also costs us extra memory. + +00:14:07.423 --> 00:14:10.763 +Moreover, as is shown by some benchmarks above, + +00:14:10.863 --> 00:14:13.333 +there's some low-hanging fruits in nativecomp that + +00:14:13.334 --> 00:14:17.343 +might get us better performance with relatively lower effort. + +00:14:17.443 --> 00:14:22.163 +Compared to this, a JIT engine is a huge, huge undertaking. + +00:14:22.263 --> 00:14:26.123 +But, for Juicemacs, the JIT engine comes a lot cheaper, + +00:14:26.223 --> 00:14:29.067 +because, we are cheating by building on + +00:14:29.068 --> 00:14:33.443 +an existing compiler framework called Truffle. + +00:14:33.543 --> 00:14:35.883 +Truffle is a meta-compiler framework, + +00:14:35.983 --> 00:14:37.633 +which means that it lets you write + +00:14:37.634 --> 00:14:40.103 +an interpreter, add required annotations, + +00:14:40.203 --> 00:14:42.500 +and it will automatically turn the + +00:14:42.501 --> 00:14:45.643 +interpreter into a JIT runtime. + +00:14:45.743 --> 00:14:49.083 +So for example, here is a typical bytecode interpreter. + +00:14:49.183 --> 00:14:51.233 +After you add the required annotations, + +00:14:51.234 --> 00:14:52.523 +Truffle will know that, + +00:14:52.623 --> 00:14:55.533 +the bytecode here is constant, and it should + +00:14:55.534 --> 00:14:59.123 +unroll this loop here, to inline all those bytecode. + +00:14:59.223 --> 00:15:00.467 +And then, when Truffle + +00:15:00.468 --> 00:15:02.243 +compiles the code, it knows that: + +00:15:02.343 --> 00:15:05.233 +the first loop here does: x plus one, + +00:15:05.234 --> 00:15:07.723 +and the second does: return. + +00:15:07.823 --> 00:15:09.533 +And then it will compile all that into, + +00:15:09.534 --> 00:15:11.363 +return x plus 1, + +00:15:11.463 --> 00:15:14.067 +which is exactly what we would expect + +00:15:14.068 --> 00:15:17.683 +when compiling this pseudo code. + +00:15:17.783 --> 00:15:21.083 +Building on that, we can also easily implement speculation, + +00:15:21.183 --> 00:15:24.867 +by using this <i>transferToInterpreterAndInvalidate</i> function + +00:15:24.868 --> 00:15:26.123 +provided by Truffle. + +00:15:26.223 --> 00:15:28.533 +And Truffle will automatically turn that + +00:15:28.534 --> 00:15:30.683 +into deoptimization. + +00:15:30.783 --> 00:15:32.700 +Now, for example, when this add function + +00:15:32.701 --> 00:15:35.723 +is supplied with, two floating numbers. + +00:15:35.823 --> 00:15:38.243 +It will go through the slow path here, + +00:15:38.343 --> 00:15:40.960 +which might lead to a compiled slow path, + +00:15:40.961 --> 00:15:43.203 +or deoptimization. + +00:15:43.303 --> 00:15:45.733 +And going this deoptimization way, + +00:15:45.734 --> 00:15:48.223 +it can then update the runtime stats. + +00:15:48.323 --> 00:15:50.400 +And now, when the code is compiled again, + +00:15:50.401 --> 00:15:51.603 +Truffle will know, + +00:15:51.703 --> 00:15:54.100 +that these compilation stats, suggests that, + +00:15:54.101 --> 00:15:55.563 +we have floating numbers. + +00:15:55.663 --> 00:15:58.733 +And this floating point addition branch will + +00:15:58.734 --> 00:16:02.603 +then be incorporated into the fast path. + +00:16:02.703 --> 00:16:06.003 +To put it into Java code... + +00:16:06.103 --> 00:16:08.723 +Most operations are just as simple as this. + +00:16:08.823 --> 00:16:11.033 +And it supports fast paths for integers, + +00:16:11.034 --> 00:16:13.963 +floating numbers, and big integers. + +00:16:14.063 --> 00:16:17.133 +And the simplicity of this not only saves us work, + +00:16:17.134 --> 00:16:22.243 +but also enables Juicemacs to explore more things more rapidly. + +00:16:22.343 --> 00:16:26.483 +And actually, I have done some silly explorations. + +00:16:26.583 --> 00:16:30.203 +For example, I tried to constant-fold more things. + +00:16:30.303 --> 00:16:32.767 +Many of us have an Emacs config that stays + +00:16:32.768 --> 00:16:36.683 +largely unchanged, at least during one Emacs session. + +00:16:36.783 --> 00:16:39.667 +And that means many of the global variables + +00:16:39.668 --> 00:16:42.323 +in ELisp are constant. + +00:16:42.423 --> 00:16:44.600 +And with speculation, we can + +00:16:44.601 --> 00:16:46.683 +speculate about the stable ones, + +00:16:46.783 --> 00:16:49.563 +and try to inline them as constants. + +00:16:49.663 --> 00:16:51.733 +And this might improve performance, + +00:16:51.734 --> 00:16:53.083 +or maybe not? + +00:16:53.183 --> 00:16:55.367 +Because, we will need a full editor + +00:16:55.368 --> 00:16:58.123 +to get real world data. + +00:16:58.223 --> 00:17:01.733 +I also tried changing cons lists to be backed + +00:17:01.734 --> 00:17:05.243 +by some arrays, because, maybe arrays are faster, I guess? + +00:17:05.343 --> 00:17:09.033 +But in the end, <i>setcdr</i> requires some kind of indirection, + +00:17:09.034 --> 00:17:12.883 +and that actually makes the performance worse. + +00:17:12.983 --> 00:17:14.733 +And for regular expressions, + +00:17:14.734 --> 00:17:17.923 +I also tried borrowing techniques from PCRE JIT, + +00:17:18.023 --> 00:17:20.667 +which is quite fast in itself, but it is + +00:17:20.668 --> 00:17:24.163 +unfortunately unsupported by Java Truffle runtime. + +00:17:24.263 --> 00:17:27.333 +So, looking at these, well, + +00:17:27.334 --> 00:17:30.243 +explorations can fail, certainly. + +00:17:30.343 --> 00:17:32.800 +But, with Truffle and Java, these, + +00:17:32.801 --> 00:17:34.883 +for now, are not that hard to implement, + +00:17:34.983 --> 00:17:37.667 +and also very often, they teach us something + +00:17:37.668 --> 00:17:42.363 +in return, whether or not they fail. + +00:17:42.463 --> 00:17:45.333 +Finally, let's talk about some explorations + +00:17:45.334 --> 00:17:47.883 +that we might get into in the future. + +00:17:47.983 --> 00:17:49.683 +For the JIT engine, for example, + +00:17:49.783 --> 00:17:52.633 +currently I'm looking into the implementation of + +00:17:52.634 --> 00:17:56.883 +nativecomp to maybe reuse some of its optimizations. + +00:17:56.983 --> 00:18:01.323 +For the GUI, I'm very very slowly working on one. + +00:18:01.423 --> 00:18:03.733 +If it ever completes, I have one thing + +00:18:03.734 --> 00:18:06.603 +I'm really looking forward to implementing. + +00:18:06.703 --> 00:18:08.900 +That is, inlining widgets, or even + +00:18:08.901 --> 00:18:11.763 +other buffers, directly into a buffer. + +00:18:11.863 --> 00:18:13.967 +Well, it's because, people sometimes complain + +00:18:13.968 --> 00:18:16.003 +about Emacs's GUI capabilities, + +00:18:16.103 --> 00:18:19.767 +But I personally think that supporting inlining, + +00:18:19.768 --> 00:18:23.043 +like a whole buffer inside another buffer as a rectangle, + +00:18:23.143 --> 00:18:26.883 +could get us very far in layout abilities. + +00:18:26.983 --> 00:18:28.567 +And this approach should also + +00:18:28.568 --> 00:18:30.843 +be compatible with terminals. + +00:18:30.943 --> 00:18:32.933 +And I really want to see how this idea + +00:18:32.934 --> 00:18:36.003 +plays out with Juicemacs. + +00:18:36.103 --> 00:18:38.963 +And of course, there's Lisp concurrency. + +00:18:39.063 --> 00:18:42.167 +And currently i'm thinking of a JavaScript-like, + +00:18:42.168 --> 00:18:46.283 +transparent, single-thread model, using Java's virtual threads. + +00:18:46.383 --> 00:18:49.967 +But anyway, if you are interested in JIT compilation, + +00:18:49.968 --> 00:18:51.663 +Truffle, or anything above, + +00:18:51.763 --> 00:18:53.867 +or maybe you have your own ideas, + +00:18:53.868 --> 00:18:56.283 +you are very welcome to reach out! + +00:18:56.383 --> 00:19:00.033 +Juicemacs does need to implement many more built-in functions, + +00:19:00.034 --> 00:19:03.063 +and any help would be very appreciated. + +00:19:03.163 --> 00:19:05.800 +And I promise, it can be a very fun playground + +00:19:05.801 --> 00:19:08.343 +to learn about Emacs and do crazy things. + +00:19:08.443 --> 00:19:10.902 +Thank you! diff --git a/2025/captions/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--main--chapters.vtt b/2025/captions/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--main--chapters.vtt new file mode 100644 index 00000000..8b89b14a --- /dev/null +++ b/2025/captions/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--main--chapters.vtt @@ -0,0 +1,41 @@ +WEBVTT + + +00:00:00.000 --> 00:00:41.399 +Introduction + +00:00:41.400 --> 00:02:53.359 +Motivation + +00:02:53.360 --> 00:06:02.479 +Evolution + +00:06:02.480 --> 00:08:47.279 +What do you get from the feature branch? + +00:08:47.280 --> 00:11:59.079 +Behind the scenes: .dir-locals.el + +00:11:59.080 --> 00:15:21.079 +When fontspec is not enough + +00:15:21.080 --> 00:18:34.479 +Rationale behind my take at LaTeX font management + +00:18:34.480 --> 00:22:57.474 +Demonstrations + +00:22:57.475 --> 00:23:33.179 +Demo: Emoji + +00:23:33.180 --> 00:25:44.399 +Demo: Letter + +00:25:44.400 --> 00:28:12.599 +Demo: Side by side + +00:28:12.600 --> 00:29:47.119 +Thanks + +00:29:47.120 --> 00:32:34.599 +Q: What about video (mp4) support for ox-latex? diff --git a/2025/captions/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--main.vtt b/2025/captions/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--main.vtt new file mode 100644 index 00000000..5a734387 --- /dev/null +++ b/2025/captions/emacsconf-2025-latex--latex-export-in-orgmode-the-overhaul--pedro-a-aranda-gutirrez--main.vtt @@ -0,0 +1,1437 @@ +WEBVTT captioned by sachac + +NOTE Introduction + +00:00:00.140 --> 00:00:04.456 +Okay. Good afternoon, morning or evening, + +00:00:04.457 --> 00:00:06.519 +whatever it is in your time zone. + +00:00:06.520 --> 00:00:10.959 +I'm Pedro Aranda and I'm going to be talking about + +00:00:10.960 --> 00:00:12.959 +what I've been doing + +00:00:12.960 --> 00:00:16.999 +with the latest backend in Org Mode + +00:00:17.000 --> 00:00:24.719 +and the different... Sorry... and the way it treats fonts. + +00:00:24.720 --> 00:00:28.279 +Just a couple of words before + +00:00:28.280 --> 00:00:30.359 +I am going to go through motivation, + +00:00:30.360 --> 00:00:35.279 +the evolution and get you an idea of what you can get + +00:00:35.280 --> 00:00:38.079 +from the feature branch that I have started + +00:00:38.080 --> 00:00:41.399 +and give a couple of demos. + +NOTE Motivation + +00:00:41.400 --> 00:00:47.779 +Actually, my motivation is I was using ox-latex currently + +00:00:47.780 --> 00:00:51.439 +and ox-beamer for as a foundation for my activities, + +00:00:51.440 --> 00:00:54.399 +mainly for lecture notes and lecture slides + +00:00:54.400 --> 00:01:01.359 +so I came from pure LaTeX and beamers + +00:01:01.360 --> 00:01:04.519 +and for me the real cool use case, + +00:01:04.520 --> 00:01:05.959 +or I would say this was + +00:01:05.960 --> 00:01:07.959 +the killer use case for me was + +00:01:07.960 --> 00:01:09.239 +I have a programming lecture, + +00:01:09.240 --> 00:01:12.199 +which is sort of a Python 101, + +00:01:12.200 --> 00:01:14.199 +and when I'm live in the lecture, + +00:01:14.200 --> 00:01:18.279 +I can go, and if the pupils ask me, I can modify code, + +00:01:18.280 --> 00:01:21.079 +show modified code and results on the fly, + +00:01:21.080 --> 00:01:25.119 +and that's something that really impresses the kids + +00:01:25.120 --> 00:01:30.159 +and makes them understand what we are talking about. + +00:01:30.160 --> 00:01:34.399 +From my pro... subjective point of view, in some, + +00:01:34.400 --> 00:01:38.159 +mainly in ox-beamer, some of the things that I was missing + +00:01:38.160 --> 00:01:41.879 +is that emojis would really break the monotony + +00:01:41.880 --> 00:01:47.679 +and I missed the support for emojis and stock Beamer themes. + +00:01:47.680 --> 00:01:52.159 +And some fonts I also found were suboptimal + +00:01:52.160 --> 00:01:56.639 +or difficult to adapt in case they need an adaptation. + +00:01:56.640 --> 00:02:01.799 +So, for example, people who need special fonts + +00:02:01.800 --> 00:02:05.799 +because of their special capabilities, + +00:02:05.800 --> 00:02:11.159 +it's difficult to get those fonts from the stock themes + +00:02:11.160 --> 00:02:17.359 +and from the stock font implementations you have there. + +00:02:17.360 --> 00:02:21.479 +So, requirements from the Emacs side to do this is none, + +00:02:21.480 --> 00:02:24.999 +because basically, okay, the only thing I want + +00:02:25.000 --> 00:02:27.159 +is to work on a vanilla Emacs, + +00:02:27.160 --> 00:02:28.399 +which is more or less recent, + +00:02:28.400 --> 00:02:30.119 +because yes, I'm a bit of a freak + +00:02:30.120 --> 00:02:32.479 +and I compile it every two, three... + +00:02:32.480 --> 00:02:36.839 +I get it from master and compile it every two, three days. + +00:02:36.840 --> 00:02:40.599 +And yahoo, I had to change to a new Mac, + +00:02:40.600 --> 00:02:47.359 +and I'm able now to get my vanilla Emacs within four. + +00:02:47.360 --> 00:02:53.359 +So that was a big accomplishment in these last days. + +NOTE Evolution + +00:02:53.360 --> 00:02:55.119 +What is the evolution? + +00:02:55.120 --> 00:03:00.719 +I mean my personal evolution and my take of ox-latex + +00:03:00.720 --> 00:03:05.919 +was I put everything in a in a LaTeX file + +00:03:05.920 --> 00:03:09.959 +and I input it through the LaTeX header, and that's it. + +00:03:09.960 --> 00:03:12.319 +But that was not very beginner-friendly, + +00:03:12.320 --> 00:03:15.719 +and once I had some people interested in this, + +00:03:15.720 --> 00:03:19.159 +"oh wow, I can modify the code on the fly + +00:03:19.160 --> 00:03:21.119 +and see the results on the fly," + +00:03:21.120 --> 00:03:26.719 +it was more difficult for them to give it a go. + +00:03:26.720 --> 00:03:32.359 +So I just... Because they, + +00:03:32.360 --> 00:03:36.919 +there are people who have not that big, + +00:03:36.920 --> 00:03:41.159 +that much experience with LaTeX + +00:03:41.160 --> 00:03:44.919 +and it can even be a bridge to introduce people into LaTeX. + +00:03:44.920 --> 00:03:48.959 +So, in any case, it was not very beginner-friendly + +00:03:48.960 --> 00:03:52.799 +and I had complaints on that. + +00:03:52.800 --> 00:03:57.159 +So, what I think was, we can do better. + +00:03:57.160 --> 00:04:00.399 +My first attempt was something that was completely neutral + +00:04:00.400 --> 00:04:02.879 +to Babel or Polyglossia. + +00:04:02.880 --> 00:04:06.199 +and it was made basically for font LaTeX + +00:04:06.200 --> 00:04:08.839 +although some of the things can... for lualatex + +00:04:08.840 --> 00:04:14.279 +and some of the things can also be used with xelatex. + +00:04:14.280 --> 00:04:16.519 +So overriding template fonts + +00:04:16.520 --> 00:04:21.279 +and taking into account fallback fonts + +00:04:21.280 --> 00:04:23.839 +was something that I learned + +00:04:23.840 --> 00:04:27.959 +when we started this conversation, + +00:04:27.960 --> 00:04:29.839 +and the only problem with this + +00:04:29.840 --> 00:04:34.407 +is that fallback fonts only work for lualatex + +00:04:34.408 --> 00:04:36.307 +because xelatex doesn't support them. + +00:04:36.308 --> 00:04:40.540 +Actually, fallback fonts is a lua feature. + +00:04:40.541 --> 00:04:45.319 +There was already something in the list + +00:04:45.320 --> 00:04:48.399 +regarding script detection which helped me a lot. + +00:04:48.400 --> 00:04:52.399 +So big recognition to Juan M. Macias for that, + +00:04:52.400 --> 00:04:57.679 +and for his publishing the algorithm or the script + +00:04:57.680 --> 00:05:04.399 +in the org mode mailing list. + +00:05:04.400 --> 00:05:11.319 +And then came my sort of little nightmare, + +00:05:11.320 --> 00:05:14.174 +which was when we started talking + +00:05:14.175 --> 00:05:19.039 +about internationalization or localization. + +00:05:19.040 --> 00:05:21.599 +Looking back, I have a very strange feeling + +00:05:21.600 --> 00:05:22.919 +about a blurring target there. + +00:05:22.920 --> 00:05:29.679 +Because the reality, being very, very frank, did I need it? + +00:05:29.680 --> 00:05:34.919 +Really no, because I just needed + +00:05:34.920 --> 00:05:39.999 +to add Spanish with Babel and that was it. + +00:05:40.000 --> 00:05:43.199 +Well actually for me it still is + +00:05:43.200 --> 00:05:46.519 +and you can put the British, German or Italian + +00:05:46.520 --> 00:05:48.359 +it continues to be true for me, + +00:05:48.360 --> 00:05:51.839 +so I had personally, I had little interest in doing that, + +00:05:51.840 --> 00:05:55.319 +but I took it as a challenge + +00:05:55.320 --> 00:06:02.479 +which has shown to be really tough. + +NOTE What do you get from the feature branch? + +00:06:02.480 --> 00:06:04.955 +What do you get from the feature branch? + +00:06:04.956 --> 00:06:08.999 +The feature branch adds font management for fontspec, + +00:06:09.000 --> 00:06:10.839 +which is not strictly needed + +00:06:10.840 --> 00:06:14.919 +when you are on Latin, Cyrillic, and Greek scripts + +00:06:14.920 --> 00:06:18.579 +as long as the fonts in your template support them. + +00:06:18.580 --> 00:06:28.799 +But again, it's a nice way to get better support here. + +00:06:28.800 --> 00:06:33.039 +You don't need it if you're happy with the fonts you get + +00:06:33.040 --> 00:06:38.439 +from the templates that you use both for Beamer + +00:06:38.440 --> 00:06:40.359 +and the document classes in LaTeX. + +00:06:40.360 --> 00:06:43.639 +If you don't want to use alternative fonts, + +00:06:43.640 --> 00:06:47.999 +you don't need it, but you would need it. + +00:06:48.000 --> 00:06:50.639 +Of course, if you don't want things like, + +00:06:50.640 --> 00:06:55.719 +for example, emojis or need emojis, + +00:06:55.720 --> 00:06:59.359 +you really don't need fallback fonts. + +00:06:59.360 --> 00:07:05.319 +So my idea is that the next thing that you can add + +00:07:05.320 --> 00:07:07.319 +is Babel and Polyglossia here + +00:07:07.320 --> 00:07:13.079 +for enhanced localization and multilingual documents there. + +00:07:13.080 --> 00:07:17.799 +And at the end, my vision was that the keywords involved + +00:07:17.800 --> 00:07:19.799 +would be language, the main language. + +00:07:19.800 --> 00:07:23.039 +And then a nice idea from Ihor + +00:07:23.040 --> 00:07:27.199 +was to put all the secondary languages there too. + +00:07:27.200 --> 00:07:30.559 +Then specify the LaTeX compiler. + +00:07:30.560 --> 00:07:32.639 +Then what I've added is a keyword + +00:07:32.640 --> 00:07:34.279 +which is `#+LATEX_MULTI_LANG:` + +00:07:34.280 --> 00:07:37.879 +which can be fontspec or babel or polyglossia + +00:07:37.880 --> 00:07:40.319 +for localized documents. + +00:07:40.320 --> 00:07:45.359 +By default, this thing is nil and when it is nil, + +00:07:45.360 --> 00:07:51.719 +you get the behavior from Org Mode + +00:07:51.720 --> 00:07:56.559 +that you already are used to if you don't want to switch. + +00:07:56.560 --> 00:08:00.559 +Jing Huang was there and I was really, + +00:08:00.560 --> 00:08:03.479 +was chirped into the conversation + +00:08:03.480 --> 00:08:06.799 +and really helpful and a big thanks to him + +00:08:06.800 --> 00:08:10.974 +because he also had an easy idea + +00:08:10.975 --> 00:08:13.079 +to support Chinese and Japanese documents, + +00:08:13.080 --> 00:08:17.239 +so that the only thing that you need is to add the language + +00:08:17.240 --> 00:08:21.859 +that you're going to write your document in. + +00:08:21.860 --> 00:08:23.639 +Very, very big thank you for that, + +00:08:23.640 --> 00:08:25.399 +because that was really a challenge + +00:08:25.400 --> 00:08:29.279 +not being able to decipher + +00:08:29.280 --> 00:08:32.639 +what I was what I was coding there + +00:08:32.640 --> 00:08:34.439 +in terms of: I have a document, + +00:08:34.440 --> 00:08:37.519 +I copy and paste it from some place, + +00:08:37.520 --> 00:08:40.039 +and from there, I get my answer, I get my PDF, + +00:08:40.040 --> 00:08:47.279 +and I compare whether it is correct or not. + +NOTE Behind the scenes: .dir-locals.el + +00:08:47.280 --> 00:08:50.239 +So what is behind the scenes? + +00:08:50.240 --> 00:08:52.959 +I've always suggested that in order + +00:08:52.960 --> 00:08:55.239 +to use the feature branch efficiently, + +00:08:55.240 --> 00:08:59.919 +you create a file with the default values + +00:08:59.920 --> 00:09:02.439 +you need for your variables, + +00:09:02.440 --> 00:09:06.199 +and that's this famous .dir-locals.el files. + +00:09:06.200 --> 00:09:10.239 +What I do is, I have a generic one + +00:09:10.240 --> 00:09:12.079 +in my home documents directory, + +00:09:12.080 --> 00:09:16.599 +and this is used for all the org documents + +00:09:16.600 --> 00:09:20.559 +that are in subdirectories from there. + +00:09:20.560 --> 00:09:24.039 +Why? Because normally you will not be + +00:09:24.040 --> 00:09:26.599 +changing your fonts that often, + +00:09:26.600 --> 00:09:29.599 +and if you need, you can always go + +00:09:29.600 --> 00:09:33.479 +and have your configuration locally. + +00:09:33.480 --> 00:09:38.639 +So it's this point where I'm collecting + +00:09:38.640 --> 00:09:40.759 +my font configuration and + +00:09:40.760 --> 00:09:47.519 +for me, this gives me a very, very nice quick start + +00:09:47.520 --> 00:09:49.639 +for new documents and presentations. + +00:09:49.640 --> 00:09:54.239 +And there you can even configure a lot of compiler + +00:09:54.240 --> 00:09:56.839 +and font language management too, + +00:09:56.840 --> 00:10:00.919 +so you have everything in a file. + +00:10:00.920 --> 00:10:04.759 +And the other nice thing for that + +00:10:04.760 --> 00:10:08.479 +is that you can also include that in a subdirectory. + +00:10:08.480 --> 00:10:13.199 +And if this subdirectory is something that you're sharing + +00:10:13.200 --> 00:10:14.479 +in a project with other people, + +00:10:14.480 --> 00:10:17.759 +you are already configuring the, say, + +00:10:17.760 --> 00:10:23.559 +quote, unquote, corporate look and feel for your documents + +00:10:23.560 --> 00:10:26.079 +in that project for everyone + +00:10:26.080 --> 00:10:28.919 +and no one else has to care about + +00:10:28.920 --> 00:10:35.119 +how this document has to be configured. + +00:10:35.120 --> 00:10:38.679 +One of the things that I really like in this approach + +00:10:38.680 --> 00:10:40.439 +is that it is a grow-as-you-go. + +00:10:40.440 --> 00:10:44.079 +So, for example, you can start with something like that, + +00:10:44.080 --> 00:10:48.439 +which is I have my fonts, my basic fonts for main, + +00:10:48.440 --> 00:10:51.479 +which is the serif font, for sans, + +00:10:51.480 --> 00:10:54.079 +which is the sans serif font, for maths, + +00:10:54.080 --> 00:10:58.639 +and for the mono, with some features like to make them scale. + +00:10:58.640 --> 00:11:03.739 +This is something that is provided by you + +00:11:03.740 --> 00:11:05.359 +through the fontspec package, + +00:11:05.360 --> 00:11:08.959 +and you're happy with it, and you work with it, + +00:11:08.960 --> 00:11:11.919 +and in a given moment, + +00:11:11.920 --> 00:11:14.439 +you go and you have your own problems + +00:11:14.440 --> 00:11:15.779 +or your own challenge, + +00:11:15.780 --> 00:11:20.279 +and you need to have, for example, emojis for one of the fonts, + +00:11:20.280 --> 00:11:24.959 +and what you do is, in this case, you just add the emojis + +00:11:24.960 --> 00:11:31.239 +as a fallback font in the font that where you want to replace this. + +00:11:31.240 --> 00:11:37.339 +This is what I'm doing right now for this presentation, and you will see... + +00:11:37.340 --> 00:11:39.119 +You can always, as I've said, + +00:11:39.120 --> 00:11:42.359 +you can always have your dir-locals, + +00:11:42.360 --> 00:11:46.319 +and you can copy that into a working directory + +00:11:46.320 --> 00:11:49.439 +which needs special adaptations or has special needs, + +00:11:49.440 --> 00:11:54.119 +and from there, you have that directory + +00:11:54.120 --> 00:11:59.079 +with your modified or customized dir-locals.el file. + +NOTE When fontspec is not enough + +00:11:59.080 --> 00:12:05.439 +So, fontspec is normally enough, + +00:12:05.440 --> 00:12:09.379 +but sometimes, you can't control all the fonts + +00:12:09.380 --> 00:12:15.479 +with fontspec only, and there you have a polyglot here + +00:12:15.480 --> 00:12:19.319 +and babel coming to your help. + +00:12:19.320 --> 00:12:21.359 +This may also be the case + +00:12:21.360 --> 00:12:25.119 +that you are working in an intended language, + +00:12:25.120 --> 00:12:28.959 +I don't know which, but an intended language, and you found, + +00:12:28.960 --> 00:12:31.279 +and you wanted to see how that was configured, + +00:12:31.280 --> 00:12:34.999 +and you found the latest example + +00:12:35.000 --> 00:12:38.639 +that used Babel or Polyglossia. + +00:12:38.640 --> 00:12:42.559 +The exporter provides you variables + +00:12:42.560 --> 00:12:48.679 +to configure both fontspec, Polyglossia and Babel. + +00:12:48.680 --> 00:12:56.799 +So just as an example of how I picture this is, + +00:12:56.800 --> 00:12:59.359 +uh, you find it in the Internet, + +00:12:59.360 --> 00:13:01.679 +something like that, uh, something like this, + +00:13:01.680 --> 00:13:05.599 +because you have your document and you need Thai. + +00:13:05.600 --> 00:13:09.999 +So, and I found an example in the internet + +00:13:10.000 --> 00:13:13.359 +that tells me that I'm going to be using Babel. + +00:13:13.360 --> 00:13:15.079 +Main is going to be English. + +00:13:15.080 --> 00:13:20.339 +And I'm also going to have Thai. + +00:13:20.340 --> 00:13:23.840 +And then they tell me that, for English, + +00:13:23.841 --> 00:13:26.639 +I'm going to be using Noto Serif for the main, + +00:13:26.640 --> 00:13:30.082 +for the main of the serif font, + +00:13:30.083 --> 00:13:31.759 +Noto Sans for the sans font, + +00:13:31.760 --> 00:13:35.799 +and then when I'm writing things in Thai, + +00:13:35.800 --> 00:13:41.106 +I'm going to be using Noto Serif Thai and Noto Sans Thai. + +00:13:41.107 --> 00:13:42.399 +That's what I see in the Internet. + +00:13:42.400 --> 00:13:47.159 +So what you can always do, what you would do in this case, + +00:13:47.160 --> 00:13:54.279 +is I'm going to get and map the font configurations + +00:13:54.280 --> 00:13:59.239 +from the latest into this variable. + +00:13:59.240 --> 00:14:03.479 +Things that you have to take into account here + +00:14:03.480 --> 00:14:05.107 +is, for example, the language. + +00:14:05.108 --> 00:14:07.774 +The language here is Thai. You have the language + +00:14:07.775 --> 00:14:10.559 +that you're intending this font for is Thai. + +00:14:10.560 --> 00:14:16.319 +So this appears here. In case you don't have any language, + +00:14:16.320 --> 00:14:19.439 +like in the first two lines, + +00:14:19.440 --> 00:14:21.039 +you just say that the language is nil, + +00:14:21.040 --> 00:14:23.959 +which is the language for the default language. + +00:14:23.960 --> 00:14:26.799 +The other thing is in my example, + +00:14:26.800 --> 00:14:29.374 +in this example that I found in the Internet, + +00:14:29.375 --> 00:14:40.174 +I have my properties for the fonts in this part in LaTeX, + +00:14:40.175 --> 00:14:43.907 +and I put them as properties here. + +00:14:43.908 --> 00:14:53.519 +That's the whole idea behind the feature branch. + +00:14:53.520 --> 00:15:01.640 +The babelprovide part is generated or is also integrated + +00:15:01.641 --> 00:15:11.319 +from the Org header, mainly from the language line. + +00:15:11.320 --> 00:15:14.600 +We have a variable in case you need to tweak it, + +00:15:14.640 --> 00:15:21.079 +but normally the defaults provided by Org are good enough. + +NOTE Rationale behind my take at LaTeX font management + +00:15:21.080 --> 00:15:27.679 +So what is the rationale behind my take at LaTeX font management? + +00:15:27.680 --> 00:15:31.359 +That's something that might be something very personal. + +00:15:31.360 --> 00:15:33.759 +When am I using fontspec? + +00:15:33.760 --> 00:15:37.239 +I'm using fontspec when I'm with Lua- or xelatex, + +00:15:37.240 --> 00:15:40.279 +and I want fonts that are different + +00:15:40.280 --> 00:15:42.439 +from those specified in the LaTeX class. + +00:15:42.440 --> 00:15:49.279 +That's point number one. I will also go for fontspec + +00:15:49.280 --> 00:15:52.599 +when I need to support scripts, + +00:15:52.600 --> 00:15:54.559 +but I'm missing in the fonts I use, + +00:15:54.560 --> 00:15:59.479 +and I can use fallback fonts for that. I have two. + +00:15:59.480 --> 00:16:05.239 +The only limitation I have here is the following: + +00:16:05.240 --> 00:16:09.039 +all languages must be left to right. + +00:16:09.040 --> 00:16:12.799 +And if you don't say anything at all, + +00:16:12.800 --> 00:16:16.519 +the LaTeX backend assumes that you want the dates, + +00:16:16.520 --> 00:16:18.599 +standard names for the abstract and so on + +00:16:18.600 --> 00:16:21.039 +in American English, if you're using them. + +00:16:21.040 --> 00:16:24.759 +In many cases, you're not using any sort of + +00:16:24.760 --> 00:16:26.274 +abstract, table of contents, and so on, + +00:16:26.275 --> 00:16:27.879 +and you don't need that. + +00:16:27.880 --> 00:16:34.119 +The important thing is maybe date management. + +00:16:34.120 --> 00:16:36.199 +If you need dates, headings + +00:16:36.200 --> 00:16:40.359 +or anything in any other language or locale, + +00:16:40.360 --> 00:16:46.199 +then yes, then you need to use Babel or Polyglossia. + +00:16:46.200 --> 00:16:52.959 +Choice, Depends. Can use polyglossia here, + +00:16:52.960 --> 00:16:56.039 +or you can use Babel, whatever you want. + +00:16:56.040 --> 00:16:58.599 +Also, in some cases, it will depend + +00:16:58.600 --> 00:17:00.399 +if you've been researching a bit + +00:17:00.400 --> 00:17:02.439 +of how this is done with pure LaTeX, + +00:17:02.440 --> 00:17:05.639 +it will be also depending on, uh, + +00:17:05.640 --> 00:17:07.799 +on the examples that you get. + +00:17:07.800 --> 00:17:10.999 +So, what can you, when you are using + +00:17:11.000 --> 00:17:12.639 +Babel or Polyglossia here, what do you have? + +00:17:12.640 --> 00:17:16.919 +You have your dates, your headings, and so on. + +00:17:16.920 --> 00:17:20.999 +You might need to control the text + +00:17:21.000 --> 00:17:22.919 +in the sense that what passage + +00:17:22.920 --> 00:17:24.519 +is written in what language. + +00:17:24.520 --> 00:17:29.159 +For example, for things like hyphenation + +00:17:29.160 --> 00:17:37.119 +and some ways of writing the hyphens in a + +00:17:37.120 --> 00:17:42.519 +and direct speech and things like that. + +00:17:42.520 --> 00:17:45.519 +And the other place where you need + +00:17:45.520 --> 00:17:47.279 +other Babel or Polyglossia here, + +00:17:47.280 --> 00:17:50.439 +and you will see that, because all examples + +00:17:50.440 --> 00:17:53.319 +that you can get for later, in this case, + +00:17:53.320 --> 00:17:56.140 +is when you have a language + +00:17:56.141 --> 00:17:59.407 +that uses right to left alignment + +00:17:59.408 --> 00:18:06.439 +like Arabic, Hebrew and others. + +00:18:06.440 --> 00:18:14.479 +So one note of, I would say, care is you always use the, + +00:18:14.480 --> 00:18:16.639 +if you use Unicode fonts + +00:18:16.640 --> 00:18:19.719 +that includes the scripts as you need, + +00:18:19.720 --> 00:18:28.239 +you will have done, that will be a great leap for you + +00:18:28.240 --> 00:18:34.479 +because that simplifies the configuration a lot. + +NOTE Demonstrations + +00:18:34.480 --> 00:18:36.839 +Now, a couple of demos. + +00:18:36.840 --> 00:18:39.319 +I don't know if you've noticed + +00:18:39.320 --> 00:18:43.199 +first demo is that I'm using + +00:18:43.200 --> 00:18:47.519 +fonts that are not the official fonts + +00:18:47.520 --> 00:18:48.959 +in this Beamer template, + +00:18:48.960 --> 00:18:51.399 +which is by the way Boadilla. + +00:18:51.400 --> 00:18:53.959 +This would be the first thing. + +00:18:53.960 --> 00:18:56.599 +So I've been using other fonts, + +00:18:56.600 --> 00:19:01.679 +and they are, at least from what I get in class, + +00:19:01.680 --> 00:19:03.759 +they are more readable than the official... + +00:19:03.760 --> 00:19:06.279 +than the default fonts in Polyglossia, + +00:19:06.280 --> 00:19:12.239 +that you get in Babel for the Boadilla theme. + +00:19:12.240 --> 00:19:14.319 +Another thing is what I've told you, + +00:19:14.320 --> 00:19:18.959 +I have my own things like emojis. + +00:19:18.960 --> 00:19:22.799 +Now, if you allow me for a second, + +00:19:22.800 --> 00:19:26.999 +I'm going to switch to the Emacs + +00:19:27.000 --> 00:19:36.759 +which is running behind the scenes to show you what. + +00:19:36.760 --> 00:19:42.119 +Okay, fine. So, this is the presentation. + +00:19:42.120 --> 00:19:44.799 +that I have here, and as you see, + +00:19:44.800 --> 00:19:54.839 +I'm using Lua LaTeX and just fontspec, + +00:19:54.840 --> 00:19:59.440 +given I don't know why I would need this, + +00:19:59.480 --> 00:20:01.079 +this is an English presentation, + +00:20:01.080 --> 00:20:03.039 +but just to show you what you can do, + +00:20:03.040 --> 00:20:09.359 +if I go back here, and I go to the beginning of the presentation, + +00:20:09.360 --> 00:20:11.171 +and now what... + +00:20:11.172 --> 00:20:12.940 +[Ihor]: I don't think you're showing anything + +00:20:12.941 --> 00:20:18.479 +[Pedro]: Oh, thank you. + +00:20:18.480 --> 00:20:21.399 +Okay, this is the presentation, right? + +00:20:21.400 --> 00:20:23.540 +So what I'm going to do is, I'm going to go back + +00:20:23.541 --> 00:20:31.200 +and I'm going to show the full screen. + +00:20:31.201 --> 00:20:32.639 +And in this full screen, + +00:20:32.640 --> 00:20:34.759 +you see the presentation on one side + +00:20:34.760 --> 00:20:40.599 +and you see Emacs on the other side. Oh, still nothing. + +00:20:40.600 --> 00:20:44.319 +Yeah, we're not seeing your screen at the moment, sorry. + +00:20:44.320 --> 00:20:47.719 +Oh, thank you. Thank you for that. + +00:20:47.720 --> 00:20:52.879 +Now it's starting to come. Okay. Yay! Fine. + +00:20:52.880 --> 00:21:00.399 +So this presentation, I've done it with Lua LaTeX, + +00:21:00.400 --> 00:21:06.439 +and what I add here is fontspec and English language. + +00:21:06.440 --> 00:21:10.240 +Just to show you, but with the same configuration, + +00:21:10.280 --> 00:21:11.839 +with the same fontspec configuration, + +00:21:11.840 --> 00:21:20.473 +but adding Polyglossia. + +00:21:20.474 --> 00:21:23.159 +I just have enough with adding Polyglossia + +00:21:23.160 --> 00:21:28.799 +with the Spanish language to get my dates correctly, + +00:21:28.800 --> 00:21:32.559 +and this is something... I'm going to see the date in English, + +00:21:32.560 --> 00:21:46.719 +and if I now go and recompile it, in a couple of seconds, + +00:21:46.720 --> 00:21:48.999 +you will see that the date is in Spanish. + +00:21:49.000 --> 00:21:53.879 +We are using the same... Which I can show, by the way. + +00:21:53.880 --> 00:21:58.079 +I see just by adding polyglossia here, + +00:21:58.080 --> 00:22:02.339 +I can get my dates in Spanish. + +00:22:02.340 --> 00:22:09.559 +What... I have included the dir-locals + +00:22:09.560 --> 00:22:16.959 +in these lines, but just to discuss it a bit more. + +00:22:16.960 --> 00:22:19.439 +I have it for all the presentations. + +00:22:19.440 --> 00:22:24.319 +I think it was here. No. For the demo, + +00:22:24.320 --> 00:22:28.799 +for the presentations I use for Emacs conferences, + +00:22:28.800 --> 00:22:33.959 +I have it, and it's something like this. + +00:22:33.960 --> 00:22:37.359 +Actually, you don't need a fallback + +00:22:37.360 --> 00:22:40.107 +for the main font here + +00:22:40.108 --> 00:22:44.607 +because the presentations are done with the sans font, + +00:22:44.608 --> 00:22:46.559 +so the only thing that I would really need + +00:22:46.560 --> 00:22:48.199 +would be something like this. + +00:22:48.200 --> 00:22:53.919 +This can be commented, and the same happens here + +00:22:53.920 --> 00:22:57.474 +with the mono. This can be also commented. + +NOTE Demo: Emoji + +00:22:57.475 --> 00:23:00.399 +The only thing where I would really need + +00:23:00.400 --> 00:23:02.119 +a fallback font is here, + +00:23:02.120 --> 00:23:04.319 +and what this is telling me is that + +00:23:04.320 --> 00:23:07.079 +you have a fallback for the emoji, + +00:23:07.080 --> 00:23:09.799 +for the emoji script, + +00:23:09.800 --> 00:23:14.740 +and you need to use the Apple Color Emoji font + +00:23:14.741 --> 00:23:15.399 +with a modifier, + +00:23:15.400 --> 00:23:18.759 +which in this case is that you need + +00:23:18.760 --> 00:23:22.874 +to have the Harfbuzz renderer. + +00:23:22.875 --> 00:23:24.599 +That's the only thing that you really need. + +00:23:24.600 --> 00:23:26.679 +Where do I get all these things from? + +00:23:26.680 --> 00:23:29.039 +All these things I get from the different parts + +00:23:29.040 --> 00:23:33.179 +and from different scripts in the Internet. + +NOTE Demo: Letter + +00:23:33.180 --> 00:23:38.039 +I also have a couple of other things to show. + +00:23:38.040 --> 00:23:42.919 +For example, first of all, I do not need this. + +00:23:42.920 --> 00:23:44.749 +This is a letter that I've been writing this morning + +00:23:44.750 --> 00:23:55.640 +and I'm not using the feature branches at all, + +00:23:55.641 --> 00:23:58.119 +because I just needed a sans font, + +00:23:58.120 --> 00:24:02.119 +and it's going to be a letter that I'm writing in + +00:24:02.120 --> 00:24:06.119 +with the sans font, and the only thing I need + +00:24:06.120 --> 00:24:08.679 +was Spanish polyglossia for the date. + +00:24:08.680 --> 00:24:14.719 +Anyhow, how did... What was my first thing that I did + +00:24:14.720 --> 00:24:19.639 +with the back end? Back in I think it was April, + +00:24:19.640 --> 00:24:23.079 +we had a... this comes from the mailing list, + +00:24:23.080 --> 00:24:26.759 +we had someone who had this problem right, + +00:24:26.760 --> 00:24:29.559 +and he wanted to add emojis, + +00:24:29.560 --> 00:24:33.039 +and he had problems with the verbatim font, + +00:24:33.040 --> 00:24:35.279 +and that's how everything got started. + +00:24:35.280 --> 00:24:43.859 +If you now go and I get my LaTeX for that running. + +00:24:43.860 --> 00:24:50.559 +Well, I actually, all my LaTeX is supported for that. + +00:24:50.560 --> 00:24:58.119 +And this was what I showed in one of the Emacs, Org Mode meetups. + +00:24:58.120 --> 00:25:00.079 +And there you see that we have the emojis. + +00:25:00.080 --> 00:25:06.879 +We had the fonts for the different things. We had maps. + +00:25:06.880 --> 00:25:13.799 +And you could even go and add scripts + +00:25:13.800 --> 00:25:16.319 +and little passages and different scripts. + +00:25:16.320 --> 00:25:22.359 +And this was done with the same principles that I want. + +00:25:22.360 --> 00:25:25.439 +I have my main font. I have the emojis. + +00:25:25.440 --> 00:25:30.559 +and I want, I have my son's phone and I have the emojis, + +00:25:30.560 --> 00:25:32.959 +the Han for Japanese and the Kana for Japanese, + +00:25:32.960 --> 00:25:36.799 +so that these characters here, + +00:25:36.800 --> 00:25:40.679 +both in the sons and in the serif passages + +00:25:40.680 --> 00:25:44.399 +are included correctly in the PDF. + +NOTE Demo: Side by side + +00:25:44.400 --> 00:25:49.999 +And a third thing of what you can do... + +00:25:50.000 --> 00:25:53.439 +I've also shown this, so this is more + +00:25:53.440 --> 00:25:55.799 +for people who have not seen it. + +00:25:55.800 --> 00:26:01.399 +This is a side-by-side passage of... + +00:26:01.400 --> 00:26:04.919 +well, actually, the beginning of the analysis by Xenophon + +00:26:04.920 --> 00:26:12.919 +both in in Greek and in German, with some comments. + +00:26:12.920 --> 00:26:18.679 +And if I go... This is done with Polyglossia. + +00:26:18.680 --> 00:26:24.240 +If I go once again and produce + +00:26:24.241 --> 00:26:37.999 +the PDF for this... Just a second... + +00:26:38.000 --> 00:26:41.119 +Come on. There you are. You get this. + +00:26:41.120 --> 00:26:46.399 +And there you see different fonts. + +00:26:46.400 --> 00:26:48.239 +Which fonts am I using for this? + +00:26:48.240 --> 00:26:53.879 +I'm using for the main font for me is FreeSerif. + +00:26:53.880 --> 00:27:01.479 +This listing is produced with DejaVu Sans Mono. + +00:27:01.480 --> 00:27:12.899 +And using Polyglossia here, I'm able to go and define + +00:27:12.900 --> 00:27:15.799 +the Greek polyton for the variant, + +00:27:15.800 --> 00:27:18.799 +for the serif variant with the Noto Serif font, + +00:27:18.800 --> 00:27:26.199 +just to differentiate it from the German text. + +00:27:26.200 --> 00:27:30.279 +And nice thing is that both in the German text + +00:27:30.280 --> 00:27:37.359 +you see for example here, and with the Greek text, + +00:27:37.360 --> 00:27:40.879 +everything is scaled to match + +00:27:40.880 --> 00:27:44.119 +the lower case of the main font, which is FreeSerif. + +00:27:44.120 --> 00:27:45.879 +So that everything looks + +00:27:45.880 --> 00:27:49.359 +extremely uniform and nice to read. + +00:27:49.360 --> 00:27:53.759 +So that's what you want to do. + +00:27:53.760 --> 00:27:56.519 +That's what you can do with this. + +00:27:56.520 --> 00:28:12.599 +Just a couple of final words on this. + +NOTE Thanks + +00:28:12.600 --> 00:28:16.839 +I want to thank once again Juan Manuel Macias and Jing Huang + +00:28:16.840 --> 00:28:19.919 +for what they have shared. + +00:28:19.920 --> 00:28:24.079 +And I also want to thank everybody + +00:28:24.080 --> 00:28:26.479 +for productive contributions to the discussion. + +00:28:26.480 --> 00:28:32.159 +I'm saying this because I think I need a longer rest + +00:28:32.160 --> 00:28:37.039 +and I'm going to be leaving + +00:28:37.040 --> 00:28:39.607 +the feature font untouched for a couple of months + +00:28:39.608 --> 00:28:42.220 +so that people can take... the feature branch + +00:28:42.221 --> 00:28:43.519 +untouched for a couple of months + +00:28:43.520 --> 00:28:47.599 +to see if people want to use it, and how they want to use it, + +00:28:47.600 --> 00:28:49.919 +and then maybe in the future, we can discuss + +00:28:49.920 --> 00:28:52.559 +if we want to integrate it or not, + +00:28:52.560 --> 00:29:24.839 +or if people need it and all that. Now questions, comments? + +00:29:24.840 --> 00:29:39.240 +[Ihor]: I think there was one question on Etherpad for... + +00:29:39.241 --> 00:29:47.119 +[Pedro]: Beautiful. I think that goes beyond fonts right. + +NOTE Q: What about video (mp4) support for ox-latex? + +00:29:47.120 --> 00:29:52.839 +Someone is asking what about how is about video + +00:29:52.840 --> 00:29:56.319 +mainly MP4 support on ox-latex. + +00:29:56.320 --> 00:29:58.799 +"I started the presentations with many videos. + +00:29:58.800 --> 00:30:14.739 +This is something that really pushed me back using ox-latex." + +00:30:14.740 --> 00:30:18.799 +What I would say to this is, I mean this goes beyond + +00:30:18.800 --> 00:30:24.319 +what we're discussing here with fonts. + +00:30:24.320 --> 00:30:29.319 +I would advise you to go and get the same + +00:30:29.320 --> 00:30:35.239 +or have the same thing that I did, + +00:30:35.240 --> 00:30:42.279 +which was, first of all, try to write it in LaTeX, + +00:30:42.280 --> 00:30:49.599 +and then, once you have the minimal working examples, + +00:30:49.600 --> 00:30:53.159 +you can get the LaTeX parts + +00:30:53.160 --> 00:31:00.319 +integrated into your own presentation. + +00:31:00.320 --> 00:31:01.319 +That's what I've been doing. + +00:31:01.320 --> 00:31:04.519 +By the way, I still do it, for example, not in this, + +00:31:04.520 --> 00:31:06.079 +but for my lectures, + +00:31:06.080 --> 00:31:09.119 +I have a lot of... I'm using a lot of ticks + +00:31:09.120 --> 00:31:12.479 +to do graphs and animated graphs. + +00:31:12.480 --> 00:31:18.319 +And that's `#+begin_export latex` `#+end_export` LaTeX. + +00:31:18.320 --> 00:31:24.279 +That's what I'm doing. + +00:31:24.280 --> 00:31:27.274 +[Ihor]: Videos are generally a bit tricky because you cannot... + +00:31:27.275 --> 00:31:31.119 +Not every viewer will play them. + +00:31:31.120 --> 00:31:35.119 +so I think there is something called pdfpc that can, + +00:31:35.120 --> 00:31:37.399 +this provides a LaTeX package + +00:31:37.400 --> 00:31:39.079 +where you can include videos, + +00:31:39.080 --> 00:31:44.399 +and then they can be played through that specific program. + +00:31:44.400 --> 00:31:46.239 +And JavaScript embedding, + +00:31:46.240 --> 00:31:49.999 +that can only be done through Acrobat Reader, + +00:31:50.000 --> 00:31:54.519 +which is like also finicky. Sure, yes. + +00:31:54.520 --> 00:32:03.999 +[Pedro]: As you said, there are many things that need to be changed. + +00:32:04.000 --> 00:32:07.199 +But I mean it's always a thing of taking it + +00:32:07.200 --> 00:32:11.359 +and trying to see what you can do + +00:32:11.360 --> 00:32:13.319 +and what the specifics are. + +00:32:13.320 --> 00:32:17.079 +Maybe this can be done with Acrobat + +00:32:17.080 --> 00:32:23.959 +and with a couple of extra packages and who knows. + +00:32:23.960 --> 00:32:26.359 +And you can always keep it as as LaTeX + +00:32:26.360 --> 00:32:34.599 +as fragments inside Org, I think. Any other questions? diff --git a/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--answers.vtt b/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--answers.vtt new file mode 100644 index 00000000..f35c2d27 --- /dev/null +++ b/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--answers.vtt @@ -0,0 +1,1591 @@ +WEBVTT + +00:00:00.000 --> 00:00:01.759 +So let's, I'm just going to answer + +00:00:01.760 --> 00:00:04.399 +the questions as I see them on the pad. + +00:00:04.400 --> 00:00:07.079 +So yeah, this first question is really good. + +00:00:07.080 --> 00:00:09.919 +And I think it's actually this great thing + +00:00:09.920 --> 00:00:12.719 +that I did not mention is that like, + +00:00:12.720 --> 00:00:14.119 +if you have unsaved buffers, + +00:00:14.120 --> 00:00:17.679 +which is, you know, when you're actually doing editing, + +00:00:17.680 --> 00:00:21.999 +most buffers are unsaved. + +00:00:22.000 --> 00:00:25.959 +really you need something tightly integrated with Emacs + +00:00:25.960 --> 00:00:27.479 +to deal with that. + +00:00:27.480 --> 00:00:29.039 +So things like, you know, + +00:00:29.040 --> 00:00:30.239 +I demonstrated Copilot, + +00:00:30.240 --> 00:00:32.519 +I demonstrated Gptel, + +00:00:32.520 --> 00:00:35.439 +things like those things, things like Ellama, + +00:00:35.440 --> 00:00:38.719 +these things will all work with unsaved buffers + +00:00:38.720 --> 00:00:43.959 +because they work via, you know, the input is the buffer. + +00:00:43.960 --> 00:00:45.199 +as opposed to a file. + +00:00:45.200 --> 00:00:48.519 +Things like Claude Code, Gemini Code, et cetera, + +00:00:48.520 --> 00:00:49.519 +those are working with files. + +00:00:49.520 --> 00:00:51.639 +They have no idea what is going on with your buffers. + +00:00:51.640 --> 00:00:55.119 +And it could be that you can solve this problem + +00:00:55.120 --> 00:00:56.799 +by using this thing called MCP, + +00:00:56.800 --> 00:01:02.839 +which kind of gives the coding agent + +00:01:02.840 --> 00:01:05.119 +a way to see anything in particular. + +00:01:05.120 --> 00:01:06.799 +In this case, it would be Emacs + +00:01:06.800 --> 00:01:07.799 +and the state of your buffers. + +00:01:07.800 --> 00:01:11.319 +But I think that's not a particularly great solution + +00:01:11.320 --> 00:01:13.839 +if that's how you want to work. + +00:01:13.840 --> 00:01:15.719 +But I think that's kind of like + +00:01:15.720 --> 00:01:17.359 +if you're in the Claude Code + +00:01:17.360 --> 00:01:19.759 +that kind of world where you know things are happening, + +00:01:19.760 --> 00:01:24.679 +basically through a terminal. + +00:01:24.680 --> 00:01:26.399 +It's okay, like you typically + +00:01:26.400 --> 00:01:28.639 +would not be doing a mix of things. + +00:01:28.640 --> 00:01:30.119 +You would just be doing things either + +00:01:30.120 --> 00:01:32.399 +in one place or the other place. + +00:01:32.400 --> 00:01:33.599 +You know, it could be that you switch off + +00:01:33.600 --> 00:01:34.359 +from one place to another, + +00:01:34.360 --> 00:01:36.399 +but you wouldn't be doing both at the same time. + +00:01:36.400 --> 00:01:40.279 +And it's kind of a, you tend to just fall into one, + +00:01:40.280 --> 00:01:41.679 +you know, + +00:01:41.680 --> 00:01:44.759 +editing outside the editor or editing inside the editor. + +00:01:44.760 --> 00:01:47.039 +And I find myself switching between the two + +00:01:47.040 --> 00:01:48.959 +when I use those kinds of tools. + +00:01:48.960 --> 00:01:51.439 +So David, let me interrupt you for just one moment. + +00:01:51.440 --> 00:01:53.519 +I want to just take care to read out + +00:01:53.520 --> 00:01:55.079 +the question that we're answering. + +00:01:55.080 --> 00:01:58.999 +The question was, my biggest question with AI code editors + +00:01:59.000 --> 00:02:00.999 +trying to integrate with Emacs is, + +00:02:01.000 --> 00:02:04.599 +are the AI code editors able to read unsaved buffers + +00:02:04.600 --> 00:02:06.319 +and not just saved files? + +00:02:06.320 --> 00:02:11.719 +Sorry. Yes. Yeah. Thank you for reminding me to. + +00:02:11.720 --> 00:02:13.519 +I will read the questions from now on. + +00:02:13.520 --> 00:02:16.599 +But yes, that's what I think about. + +00:02:16.600 --> 00:02:20.319 +that interesting questions about unsaved buffers. + +00:02:20.320 --> 00:02:22.239 +The next question is, + +00:02:22.240 --> 00:02:23.799 +I don't agree with the comment you made + +00:02:23.800 --> 00:02:25.199 +about VS code usage dying out + +00:02:25.200 --> 00:02:26.719 +because I see companies and products + +00:02:26.720 --> 00:02:28.879 +pushing for tightly integrated agent + +00:02:28.880 --> 00:02:31.319 +and products like Windsurf. + +00:02:31.320 --> 00:02:33.239 +So thoughts on that? + +00:02:33.240 --> 00:02:35.879 +Yeah, I mean, it's really hard + +00:02:35.880 --> 00:02:36.999 +to be certain of anything, + +00:02:37.000 --> 00:02:38.439 +like things are changing very fast + +00:02:38.440 --> 00:02:40.639 +and it's very hard to predict the future. + +00:02:40.640 --> 00:02:47.839 +But the trend I see is that um, + +00:02:47.840 --> 00:02:50.919 +the sort of outside editing experience + +00:02:50.920 --> 00:02:53.519 +where you just kind of instruct a model, + +00:02:53.520 --> 00:02:56.759 +what to do is getting better. + +00:02:56.760 --> 00:02:58.679 +And as long as that keeps getting better, + +00:02:58.680 --> 00:03:00.839 +I think that's going to lessen the demand + +00:03:00.840 --> 00:03:04.879 +for these tightly integrated editing experiences. + +00:03:04.880 --> 00:03:10.839 +So it could be that, um, a lot of people, + +00:03:10.840 --> 00:03:12.839 +especially in, you know, corporate environments + +00:03:12.840 --> 00:03:14.279 +just start using, + +00:03:14.280 --> 00:03:15.599 +they're going to use whatever is + +00:03:15.600 --> 00:03:17.959 +going to make the most productive. + +00:03:17.960 --> 00:03:22.399 +And I think right now, it's not clear that that will be, + +00:03:22.400 --> 00:03:25.079 +you know, the very agent-based, you know, + +00:03:25.080 --> 00:03:27.359 +command line-centric way of doing things. + +00:03:27.360 --> 00:03:31.239 +But it certainly, the trend is, if that continues, + +00:03:31.240 --> 00:03:33.319 +I think it probably will be like that. + +00:03:33.320 --> 00:03:35.479 +So I think we'll have to see. + +00:03:35.480 --> 00:03:37.679 +I don't think your opinion is unreasonable. + +00:03:37.680 --> 00:03:40.319 +I guess I'm kind of cautiously saying + +00:03:40.320 --> 00:03:43.199 +I think it's gonna be the opposite, but I guess we'll see. + +00:03:43.200 --> 00:03:47.759 +Like, let's reconvene in a year and see what happens. + +00:03:47.760 --> 00:03:49.159 +Uh, the 3rd question answer, + +00:03:49.160 --> 00:03:55.319 +do you have any thoughts about the environmental costs + +00:03:55.320 --> 00:03:57.079 +of using either the training + +00:03:57.080 --> 00:03:59.799 +of the models are we can download or use locally + +00:03:59.800 --> 00:04:02.359 +or the larger commercial models used from the cloud. + +00:04:02.360 --> 00:04:09.839 +Um, I think. The, you know, I'm on social media, + +00:04:09.840 --> 00:04:13.039 +probably a little bit more than I should be. + +00:04:13.040 --> 00:04:15.719 +And I do see a lot of discussion there + +00:04:15.720 --> 00:04:18.639 +and a lot of concern about the environmental costs of using LLMs. + +00:04:18.640 --> 00:04:22.799 +I've looked into this as I'm also concerned + +00:04:22.800 --> 00:04:27.199 +about keeping my environmental footprint personally down. + +00:04:27.200 --> 00:04:29.199 +And I do this in many ways, + +00:04:29.200 --> 00:04:31.319 +but I certainly don't want to kind of like blow that all the water + +00:04:31.320 --> 00:04:35.039 +because I'm using LLMs so much. + +00:04:35.040 --> 00:04:38.359 +I think that the concerns are mostly overblown. + +00:04:38.360 --> 00:04:41.839 +There's a concern that, well, it uses a lot of energy. + +00:04:41.840 --> 00:04:46.599 +In aggregate, the total amount of energy + +00:04:46.600 --> 00:04:50.559 +used by the data centers in the US is a few percent. + +00:04:50.560 --> 00:04:53.839 +And this is a fraction. I think this is like LM's account + +00:04:53.840 --> 00:04:56.719 +for something like 20% now + +00:04:56.720 --> 00:05:02.479 +of all data center usage, which is a lot. + +00:05:02.480 --> 00:05:03.959 +But Those data centers are doing lots of things. + +00:05:03.960 --> 00:05:05.239 +They all need to be water cooled. + +00:05:05.240 --> 00:05:08.679 +Um, if you like per LLM prompt, + +00:05:08.680 --> 00:05:11.399 +the costs are relatively small + +00:05:11.400 --> 00:05:13.239 +and by relatively small, I mean, + +00:05:13.240 --> 00:05:14.999 +you know, people have said online, + +00:05:15.000 --> 00:05:17.879 +well, it's like a few bottles of water per prompt. + +00:05:17.880 --> 00:05:20.119 +That, that is not true. It is much, much less than that. + +00:05:20.120 --> 00:05:21.359 +It's a fraction of that. + +00:05:21.360 --> 00:05:25.119 +So, uh, I don't think the answer is nothing, + +00:05:25.120 --> 00:05:28.759 +but I would say it's, I would say you probably, + +00:05:28.760 --> 00:05:30.799 +if you want the most bang for your environmental buck, + +00:05:30.800 --> 00:05:32.879 +probably the best thing for you to do + +00:05:32.880 --> 00:05:35.799 +is take less flights and things like that. + +00:05:35.800 --> 00:05:37.319 +Like, yes, you can cut down on this, + +00:05:37.320 --> 00:05:40.559 +but I think it's pretty marginal at the moment. + +00:05:40.560 --> 00:05:43.079 +We do probably need to think about the total costs + +00:05:43.080 --> 00:05:44.599 +like of humanity using all of this. + +00:05:44.600 --> 00:05:46.519 +Like a lot of stuff you'll see + +00:05:46.520 --> 00:05:48.759 +corporations are using a lot of these things. + +00:05:48.760 --> 00:05:52.079 +And so like, just like if you look + +00:05:52.080 --> 00:05:54.359 +at water usage or energy uses in total, + +00:05:54.360 --> 00:05:56.639 +it's like really corporations that are using this. + +00:05:56.640 --> 00:05:58.519 +So there might, there's a lot of leverage there + +00:05:58.520 --> 00:06:01.399 +to make things more efficient as opposed to personal use. + +00:06:01.400 --> 00:06:06.119 +So I think it's wise to be cautious, + +00:06:06.120 --> 00:06:09.079 +but I think it's okay, I think, at least for personal use. + +00:06:09.080 --> 00:06:13.159 +The next question is another, + +00:06:13.160 --> 00:06:20.959 +yeah, this is also disagreeing with me about VS Code, + +00:06:20.960 --> 00:06:23.839 +but it says, I must say I liked your conclusion, + +00:06:23.840 --> 00:06:26.719 +but I differ insofar as you said that VS Code differs from Emacs + +00:06:26.720 --> 00:06:30.479 +because the former is not as easy to adapt as the latter. + +00:06:30.480 --> 00:06:33.559 +But why should Microsoft not adapt VS Code + +00:06:33.560 --> 00:06:35.759 +as we adapt Emacs for the new era of coding? + +00:06:35.760 --> 00:06:38.159 +And why would VS Code be harder hit? + +00:06:38.160 --> 00:06:43.599 +Could you please elaborate on this point? Yeah, thanks. + +00:06:43.600 --> 00:06:46.279 +This is a good question. + +00:06:46.280 --> 00:06:50.399 +I think maybe I wasn't as sharp on my point as I could be. + +00:06:50.400 --> 00:06:51.239 +Because I think the core + +00:06:51.240 --> 00:06:56.479 +of what I'm saying is like, there is a going to be a trend. + +00:06:56.480 --> 00:06:58.679 +I believe there will be a trend away from editing. + +00:06:58.680 --> 00:07:01.039 +And if we are going to be editing less, + +00:07:01.040 --> 00:07:04.559 +I think VS Code, like people will be in editors less. + +00:07:04.560 --> 00:07:06.919 +And that means people will be in VS Code less, + +00:07:06.920 --> 00:07:09.759 +people will probably be in Emacs less. + +00:07:09.760 --> 00:07:13.719 +And yes, I think you can, VS Code + +00:07:13.720 --> 00:07:15.399 +is to some degree extensible. + +00:07:15.400 --> 00:07:21.559 +but I think there's less of a community, or that is, + +00:07:21.560 --> 00:07:23.399 +I think the people using Emacs + +00:07:23.400 --> 00:07:25.319 +have used Emacs for a long time. + +00:07:25.320 --> 00:07:27.119 +They're going to continue to use Emacs. + +00:07:27.120 --> 00:07:28.279 +I speak for myself, but I know + +00:07:28.280 --> 00:07:30.119 +a lot of people here are kind of like this, + +00:07:30.120 --> 00:07:33.279 +and they're going to just, like, + +00:07:33.280 --> 00:07:37.759 +we have a lot of momentum to keep doing things in Emacs, + +00:07:37.760 --> 00:07:41.079 +and especially because we have a lot of things + +00:07:41.080 --> 00:07:42.799 +that we already do in Emacs. + +00:07:42.800 --> 00:07:45.079 +We do to-do lists and, you know, with org mode + +00:07:45.080 --> 00:07:47.479 +and some people read email + +00:07:47.480 --> 00:07:49.039 +and some people are using + +00:07:49.040 --> 00:07:50.959 +shells in Emacs and all these things, + +00:07:50.960 --> 00:07:53.959 +I think will make Emacs + +00:07:53.960 --> 00:07:55.559 +kind of a better environment + +00:07:55.560 --> 00:07:59.599 +if you want to do various editing like things in Emacs. + +00:07:59.600 --> 00:08:05.359 +In, you know, in an editing environment, + +00:08:05.360 --> 00:08:07.119 +because I think just emails can edit + +00:08:07.120 --> 00:08:09.239 +more types of things I think will naturally + +00:08:09.240 --> 00:08:10.959 +be a bit more useful than VS code, + +00:08:10.960 --> 00:08:14.079 +which people are really just using to edit code + +00:08:14.080 --> 00:08:16.799 +and if people find it less useful to edit code. + +00:08:16.800 --> 00:08:20.919 +I think it's VS code will be harder hit than emails + +00:08:20.920 --> 00:08:24.239 +because that's its whole like that's in the name + +00:08:24.240 --> 00:08:25.559 +like the whole reason for it + +00:08:25.560 --> 00:08:27.359 +to be doing things as to edit code. + +00:08:27.360 --> 00:08:30.839 +So I think that it's it's vulnerable + +00:08:30.840 --> 00:08:31.959 +in a way that Emacs isn't + +00:08:31.960 --> 00:08:34.519 +just because emacs is so very... + +00:08:34.520 --> 00:08:40.119 +you know, it's, it could do so many things + +00:08:40.120 --> 00:08:42.719 +and and people use it for so many different kinds of things + +00:08:42.720 --> 00:08:46.079 +that it's I think it's going to be + +00:08:46.080 --> 00:08:46.999 +a little bit more resilient. + +00:08:47.000 --> 00:08:48.879 +But as I said with the present. + +00:08:48.880 --> 00:08:52.639 +For those of us that are using Emacs, + +00:08:52.640 --> 00:08:55.159 +it's everywhere for us. + +00:08:55.160 --> 00:08:58.359 +Not necessarily everyone is an I live in Emacs person, + +00:08:58.360 --> 00:09:00.279 +but whatever you're using Emacs for, + +00:09:00.280 --> 00:09:02.999 +it is the thing you reach for to do that thing. + +00:09:03.000 --> 00:09:06.639 +Is that touching on the point? + +00:09:06.640 --> 00:09:09.079 +Yeah, that's a great way to say it. + +00:09:09.080 --> 00:09:12.439 +Thank you. Thank you, Colin. Yeah. + +00:09:12.440 --> 00:09:14.039 +Thank you. Thank you for that question. + +00:09:14.040 --> 00:09:18.759 +Do you think we're falling behind in productivity as Emacs users + +00:09:18.760 --> 00:09:19.959 +compared to all these VS code forks + +00:09:19.960 --> 00:09:21.799 +that have a thousand button and text boxes everywhere, + +00:09:21.800 --> 00:09:24.319 +which are basically much richer UIs, + +00:09:24.320 --> 00:09:25.719 +which are basically web pages? + +00:09:25.720 --> 00:09:28.799 +I do think Emacs is falling behind in some ways. + +00:09:28.800 --> 00:09:32.519 +I mean, it's definitely showing its age a little bit, + +00:09:32.520 --> 00:09:35.079 +especially you mentioned richer UIs + +00:09:35.080 --> 00:09:36.519 +that are basically web pages. + +00:09:36.520 --> 00:09:41.159 +I mean, this I think is one of the big problems Emacs has + +00:09:41.160 --> 00:09:46.479 +is that it uses a very, you know, a much more ancient way + +00:09:46.480 --> 00:09:49.799 +of kind of doing UIs that is not particularly flexible + +00:09:49.800 --> 00:09:55.959 +and not particularly comfortable for any modern UI coder. + +00:09:55.960 --> 00:09:58.639 +And I think if you look at the Emacs stuff out there, + +00:09:58.640 --> 00:10:01.959 +like, yes, you can do a few things with UIs. + +00:10:01.960 --> 00:10:04.759 +You can have some amount of UI richness, + +00:10:04.760 --> 00:10:06.279 +but it's pretty limited. + +00:10:06.280 --> 00:10:07.839 +And I kind of, if there's one thing + +00:10:07.840 --> 00:10:09.079 +I could wish for in Emacs, + +00:10:09.080 --> 00:10:12.519 +it's sort of like, I kind of wish Emacs could be on a, + +00:10:12.520 --> 00:10:18.199 +could be built on top of basically like Atom or something like that, + +00:10:18.200 --> 00:10:20.399 +where it's like a web framework + +00:10:20.400 --> 00:10:24.639 +that allows us to write actual rich pages, + +00:10:24.640 --> 00:10:29.639 +rich UIs in a modern style using things like CSS + +00:10:29.640 --> 00:10:33.599 +instead of the kinds of things Emacs lets you do. + +00:10:33.600 --> 00:10:37.199 +But that said, that is an advantage + +00:10:37.200 --> 00:10:38.959 +of VS Code and other editors like that. + +00:10:38.960 --> 00:10:45.079 +I think that Emacs does a good job + +00:10:45.080 --> 00:10:46.719 +of eventually catching up + +00:10:46.720 --> 00:10:49.759 +to all sorts of things people are doing in other editors. + +00:10:49.760 --> 00:10:52.599 +It's often that other editors get there first, + +00:10:52.600 --> 00:10:55.479 +but there's a lot of momentum + +00:10:55.480 --> 00:10:57.839 +to kind of keep Emacs fresh, keep it modern. + +00:10:57.840 --> 00:11:00.119 +And it's pretty easy to- I love that. + +00:11:00.120 --> 00:11:05.679 +I forgot about the lag. We do have a little bit of lag, + +00:11:05.680 --> 00:11:07.999 +but I just, I find that very captivating. + +00:11:08.000 --> 00:11:10.359 +We have with technologies + +00:11:10.360 --> 00:11:12.399 +like Apache Cassandra in the database world, + +00:11:12.400 --> 00:11:14.879 +we have this idea of eventual concurrency. + +00:11:14.880 --> 00:11:17.559 +And you make me think with Emacs, + +00:11:17.560 --> 00:11:21.279 +we have this idea of eventual feature parity, right? + +00:11:21.280 --> 00:11:23.919 +If a feature stays desirable long enough, + +00:11:23.920 --> 00:11:25.879 +Emacs will eventually grow it. + +00:11:25.880 --> 00:11:32.159 +I think that's a very contagious idea. Yeah, yeah, thanks. + +00:11:32.160 --> 00:11:35.839 +I hope that idea makes sense. And I hope it's correct, + +00:11:35.840 --> 00:11:39.919 +because I think that I do want Emacs to continue to succeed. + +00:11:39.920 --> 00:11:43.439 +And I personally, using Emacs, + +00:11:43.440 --> 00:11:46.479 +do not feel myself falling behind in productivity. + +00:11:46.480 --> 00:11:51.759 +That said, there's a lot of ways that Emacs can improve + +00:11:51.760 --> 00:11:53.519 +and should improve on this front. + +00:11:53.520 --> 00:11:56.599 +And a lot of these ways are pretty fundamental. + +00:11:56.600 --> 00:11:59.719 +So I kind of hope people pay a lot of attention + +00:11:59.720 --> 00:12:02.439 +to some of these more fundamental lower-level Emacs things + +00:12:02.440 --> 00:12:04.879 +that really allows the packages + +00:12:04.880 --> 00:12:07.599 +to do more richer and better things. + +00:12:07.600 --> 00:12:10.359 +Sorry, you have a ton of questions. + +00:12:10.360 --> 00:12:12.279 +I shouldn't be doing so much active listening. + +00:12:12.280 --> 00:12:17.479 +No, no, I appreciate your input. + +00:12:17.480 --> 00:12:23.079 +OK, next is I've been using Claude Code extensively. + +00:12:23.080 --> 00:12:25.519 +I recently switched to Agent Shell with Claude Code. + +00:12:25.520 --> 00:12:28.039 +Have you tried it? And what are your thoughts? + +00:12:28.040 --> 00:12:30.279 +I actually have tried Agent Shell. + +00:12:30.280 --> 00:12:34.719 +And currently, I recorded this video like three months ago. + +00:12:34.720 --> 00:12:38.119 +So Agent Shell did not exist then. + +00:12:38.120 --> 00:12:39.719 +If Agent Shell did exist, + +00:12:39.720 --> 00:12:41.239 +I probably would have demoed it as well. + +00:12:41.240 --> 00:12:45.359 +Agent Hell is great in the sense of it's + +00:12:45.360 --> 00:12:53.719 +It does use comment, which is the way that I think all Emacs users + +00:12:53.720 --> 00:12:57.039 +would prefer to interact with something like Claude Code, + +00:12:57.040 --> 00:13:00.199 +or any of those types of tools, which is like, I don't. + +00:13:00.200 --> 00:13:02.719 +Um, the other, + +00:13:02.720 --> 00:13:05.159 +but it's a trade-off it uses like on the back + +00:13:05.160 --> 00:13:06.959 +and it's, it has a common buffer. + +00:13:06.960 --> 00:13:08.759 +And then on the back end, it's using a protocol + +00:13:08.760 --> 00:13:11.759 +to talk to agent, uh, to Claude Code and other things. + +00:13:11.760 --> 00:13:15.399 +The problem is this has a lot of problems. + +00:13:15.400 --> 00:13:16.799 +For example, like you don't have + +00:13:16.800 --> 00:13:18.319 +completion of slash commands. + +00:13:18.320 --> 00:13:22.119 +You don't have, um, if you ask to see the, in Claude Code, + +00:13:22.120 --> 00:13:24.319 +you can get a visual representation of. the context window. + +00:13:24.320 --> 00:13:30.239 +But you can't do this. I mean, last time I tried, + +00:13:30.240 --> 00:13:31.719 +I couldn't do this in agent shell. + +00:13:31.720 --> 00:13:33.399 +It's progressing rapidly. + +00:13:33.400 --> 00:13:37.479 +But it's not as rich in functionality + +00:13:37.480 --> 00:13:40.119 +as using quad code directly. + +00:13:40.120 --> 00:13:44.839 +On the other hand, because it's letting Emacs be Emacs + +00:13:44.840 --> 00:13:49.239 +and using comment, it's a much better experience + +00:13:49.240 --> 00:13:50.919 +to actually give instructions. + +00:13:50.920 --> 00:13:56.519 +I think the maximum power, though, is, to me, + +00:13:56.520 --> 00:13:58.479 +the best way is still like, you know, + +00:13:58.480 --> 00:13:59.399 +do your editing in org mode, + +00:13:59.400 --> 00:14:02.359 +and then just tell, you could have, + +00:14:02.360 --> 00:14:06.959 +you know, the richer experience of using + +00:14:06.960 --> 00:14:13.639 +of using Claude Code in, in it's more like shell like form + +00:14:13.640 --> 00:14:15.559 +where everything is, it's much, you know, + +00:14:15.560 --> 00:14:17.079 +designed to be used in the terminal, + +00:14:17.080 --> 00:14:18.759 +but you don't have to type in that much + +00:14:18.760 --> 00:14:20.039 +because you're really doing your typing + +00:14:20.040 --> 00:14:21.439 +in order to me, I think there's + +00:14:21.440 --> 00:14:23.519 +kind of the sweet spot that I like. + +00:14:23.520 --> 00:14:26.639 +Um, but HHL is a great step forward + +00:14:26.640 --> 00:14:29.879 +and I think it's, uh, it's quite good to use. + +00:14:29.880 --> 00:14:32.119 +And I, I personally use it a lot. + +00:14:32.120 --> 00:14:40.479 +Um, OK, so in terms of, next question, + +00:14:40.480 --> 00:14:41.839 +in terms of agent selection, + +00:14:41.840 --> 00:14:44.639 +what has been your experience with different agents? + +00:14:44.640 --> 00:14:48.079 +And have you had any success with hosting your own models + +00:14:48.080 --> 00:14:49.439 +and using open weights? + +00:14:49.440 --> 00:14:54.159 +I think there's, you know, many people + +00:14:54.160 --> 00:14:56.519 +have many different opinions on this. + +00:14:56.520 --> 00:15:00.839 +I think Claude Code is, most people I know + +00:15:00.840 --> 00:15:03.479 +would say Claude Code is probably, + +00:15:03.480 --> 00:15:07.479 +sorry, Cloud is probably the best for coding right now. + +00:15:07.480 --> 00:15:09.919 +Gemini can be very hit and miss even with 3.0, + +00:15:09.920 --> 00:15:12.519 +but Claude is quite good. + +00:15:12.520 --> 00:15:16.119 +4.5 Opus is actually relatively cheap + +00:15:16.120 --> 00:15:21.119 +compared to the previous version of 4.1 Opus. + +00:15:21.120 --> 00:15:24.239 +There's other models out there, + +00:15:24.240 --> 00:15:29.159 +but I think most people just stick with Claude + +00:15:29.160 --> 00:15:33.999 +because it's very reliable, it's very good, + +00:15:34.000 --> 00:15:36.479 +and nothing is obviously better than that. + +00:15:36.480 --> 00:15:41.039 +And as far as DeepSeek is pretty good as well, + +00:15:41.040 --> 00:15:42.079 +and then much cheaper. + +00:15:42.080 --> 00:15:46.839 +I've had some good luck using that locally, + +00:15:46.840 --> 00:15:50.159 +but actually the problem is for my day-to-day machine, + +00:15:50.160 --> 00:15:53.079 +like my personal machine, + +00:15:53.080 --> 00:15:55.679 +it's not powerful enough to run anything locally. + +00:15:55.680 --> 00:15:58.479 +And my work machine, it is powerful enough, + +00:15:58.480 --> 00:16:02.079 +but I can spend my company's money at will + +00:16:02.080 --> 00:16:03.759 +on more powerful models. + +00:16:03.760 --> 00:16:05.519 +So there's really not a lot of incentive + +00:16:05.520 --> 00:16:06.439 +for me to run locally. + +00:16:06.440 --> 00:16:12.199 +I think, as far as I know, I haven't heard + +00:16:12.200 --> 00:16:14.359 +of local models being incredible, + +00:16:14.360 --> 00:16:16.879 +but I think you can get reasonable quality with them. + +00:16:16.880 --> 00:16:19.159 +That is, especially if you're doing + +00:16:19.160 --> 00:16:20.279 +relatively simple things, + +00:16:20.280 --> 00:16:25.679 +I think it's pretty reasonable to be using those. + +00:16:25.680 --> 00:16:29.959 +Also, they tend to be slower + +00:16:29.960 --> 00:16:33.279 +than the models that are elsewhere + +00:16:33.280 --> 00:16:36.319 +just because they just have more horsepower, + +00:16:36.320 --> 00:16:38.679 +they can churn through those tokens a little quicker. + +00:16:38.680 --> 00:16:44.719 +So, I'll just break in here to say, + +00:16:44.720 --> 00:16:46.239 +we've got about 7 minutes left + +00:16:46.240 --> 00:16:49.239 +before we're cutting over this great discussion so far. + +00:16:49.240 --> 00:16:50.839 +I'm very happy to keep going. + +00:16:50.840 --> 00:16:55.399 +There's no time limit, but at a certain point, + +00:16:55.400 --> 00:16:56.479 +I may have to leave + +00:16:56.480 --> 00:16:58.679 +to jump in and prep with the next speaker, + +00:16:58.680 --> 00:17:00.359 +but you'll be able to keep going + +00:17:00.360 --> 00:17:02.599 +as long as you have the steam for it. + +00:17:02.600 --> 00:17:06.159 +Yeah, I think we have 3 questions. Yeah, thanks. + +00:17:06.160 --> 00:17:08.239 +I think we have 3 questions. + +00:17:08.240 --> 00:17:09.719 +Let's see if we can get through them + +00:17:09.720 --> 00:17:17.359 +all in that time period. OK, this one is interesting talk. + +00:17:17.360 --> 00:17:20.439 +I'll start by asking it for everything, but is it editing? + +00:17:20.440 --> 00:17:23.239 +I think there's more of a comment than a question. + +00:17:23.240 --> 00:17:29.719 +So yes, let us all ask, but is it editing? + +00:17:29.720 --> 00:17:33.439 +All right. I can move on to the comment area. + +00:17:33.440 --> 00:17:40.319 +I'm reading angst in your thinking about AI editing. + +00:17:40.320 --> 00:17:41.839 +I think that's true. + +00:17:41.840 --> 00:17:44.119 +It says, and the question continues with, + +00:17:44.120 --> 00:17:45.159 +what are you excited about? + +00:17:45.160 --> 00:17:48.719 +Wow, that's an interesting question. + +00:17:48.720 --> 00:17:53.799 +I mean, I think there are possibilities. + +00:17:53.800 --> 00:17:58.719 +Like, yes, people are going in sort of a relatively obvious direction + +00:17:58.720 --> 00:18:01.439 +with LLMs right now. + +00:18:01.440 --> 00:18:04.599 +And I think there's lots of opportunities, + +00:18:04.600 --> 00:18:07.839 +clever opportunities to do things + +00:18:07.840 --> 00:18:11.079 +we couldn't have thought of Things that are useful, + +00:18:11.080 --> 00:18:14.919 +but in ways that are not super obvious to us, + +00:18:14.920 --> 00:18:18.519 +and I think I'm still excited + +00:18:18.520 --> 00:18:23.839 +about the possibilities of using them in ways that are super helpful + +00:18:23.840 --> 00:18:29.319 +and different than. normal. I'll give you an example. + +00:18:29.320 --> 00:18:33.199 +This is something that I intend to, I think, + +00:18:33.200 --> 00:18:36.479 +post on Reddit in a few days, + +00:18:36.480 --> 00:18:39.399 +but I have a extension to eshell + +00:18:39.400 --> 00:18:43.439 +where you can prefix a command with at, + +00:18:43.440 --> 00:18:45.199 +and then just tell it what you want to do, + +00:18:45.200 --> 00:18:46.919 +and it will substitute the command + +00:18:46.920 --> 00:18:51.919 +that you are thinking of. Because often, I do not remember. + +00:18:51.920 --> 00:18:56.919 +I never remember, like, how do you find a file in a directory tree, + +00:18:56.920 --> 00:19:00.159 +you know, recursing? Who can remember how to do that? + +00:19:00.160 --> 00:19:04.799 +It's like a find, and there's like a dash print there somewhere. + +00:19:04.800 --> 00:19:10.159 +Yes. There are some smart people who remember this + +00:19:10.160 --> 00:19:11.199 +but I am not one of them. + +00:19:11.200 --> 00:19:13.639 +And so I think like something like this is like you just type out, + +00:19:13.640 --> 00:19:17.279 +find me this file, and it will substitute + +00:19:17.280 --> 00:19:18.879 +the correct command. + +00:19:18.880 --> 00:19:20.999 +I think this is, there's a lot of little, + +00:19:21.000 --> 00:19:24.319 +little tweaks you could do like, you know, if you want the AI, + +00:19:24.320 --> 00:19:26.679 +it could be there for you. And it will help you. + +00:19:26.680 --> 00:19:27.559 +And if you don't want it, + +00:19:27.560 --> 00:19:28.919 +it's not going to get in your way. + +00:19:28.920 --> 00:19:30.639 +And I think this is where eMath can really shine. + +00:19:30.640 --> 00:19:33.079 +It can really take advantage of LLMs, + +00:19:33.080 --> 00:19:35.799 +but still remain true to its kind of editing experience, + +00:19:35.800 --> 00:19:39.319 +because it's not forcing you to use LLMs all the time. + +00:19:39.320 --> 00:19:43.919 +So thank you for that great question. + +00:19:43.920 --> 00:19:47.919 +And then the final question. Yep. + +00:19:47.920 --> 00:19:50.839 +This final question is, why does it matter to have a richer UI? + +00:19:50.840 --> 00:19:53.439 +All this left is basically running and getting the results. + +00:19:53.440 --> 00:19:56.119 +I think maybe this is a response to me complaining + +00:19:56.120 --> 00:19:58.479 +about Emacs not having a richer UI before, + +00:19:58.480 --> 00:20:03.159 +but I think it does matter a lot for all sorts of things. + +00:20:03.160 --> 00:20:07.159 +It's hard to kind of explain succinctly + +00:20:07.160 --> 00:20:08.519 +because I'm talking about UI + +00:20:08.520 --> 00:20:09.759 +and I'd have to show you things. + +00:20:09.760 --> 00:20:14.599 +But it should be just something like oh I have an error + +00:20:14.600 --> 00:20:15.799 +and I'm using flymake and I'm, + +00:20:15.800 --> 00:20:17.759 +I'm using the you know I have options + +00:20:17.760 --> 00:20:19.839 +where it'll show me the error in line + +00:20:19.840 --> 00:20:22.639 +by like underlining things and having a little message, + +00:20:22.640 --> 00:20:24.079 +but like, you know what that message + +00:20:24.080 --> 00:20:26.399 +doesn't appear quite right, a lot of the times, + +00:20:26.400 --> 00:20:30.159 +or here's another one like. I program in Python a lot. + +00:20:30.160 --> 00:20:33.479 +And Python, it's super hard to program in + +00:20:33.480 --> 00:20:35.279 +unless you have these little vertical lines + +00:20:35.280 --> 00:20:37.599 +that shows you what the indents are. At least I find it. + +00:20:37.600 --> 00:20:40.479 +There are two packages that do that. + +00:20:40.480 --> 00:20:43.039 +None of them do it particularly well, + +00:20:43.040 --> 00:20:44.599 +just because Emacs at its base + +00:20:44.600 --> 00:20:45.919 +does not allow you to do this. + +00:20:45.920 --> 00:20:47.759 +And so you kind of have to hack it in. + +00:20:47.760 --> 00:20:49.479 +And there's lots of ways to mess it up. + +00:20:49.480 --> 00:20:52.799 +And when editing, you'll find yourself messing this thing up. + +00:20:52.800 --> 00:20:57.159 +regularly. So it doesn't look quite clean. + +00:20:57.160 --> 00:20:59.079 +And like, there's little artifacts, + +00:20:59.080 --> 00:21:01.039 +or, you know, there's little ways that it, + +00:21:01.040 --> 00:21:02.359 +it kind of gets things wrong, + +00:21:02.360 --> 00:21:06.279 +or you can, you can get things wrong with it. + +00:21:06.280 --> 00:21:10.039 +So I think that, like, + +00:21:10.040 --> 00:21:11.879 +there's a lot of issues with that sort of thing. + +00:21:11.880 --> 00:21:15.759 +And, and also, like, you know, + +00:21:15.760 --> 00:21:17.719 +what if you want to do something like play a video inline, + +00:21:17.720 --> 00:21:19.559 +like, I don't know, you might should be able to do that, + +00:21:19.560 --> 00:21:20.839 +you might should be able to do anything. + +00:21:20.840 --> 00:21:23.799 +But right now it just can't and I think + +00:21:23.800 --> 00:21:24.999 +a lot of the reason as well + +00:21:25.000 --> 00:21:26.519 +we you know we wanted to be compatible + +00:21:26.520 --> 00:21:29.919 +with you know TRS 80 machines or something like that + +00:21:29.920 --> 00:21:33.159 +and it's this is important this really is important, + +00:21:33.160 --> 00:21:34.719 +but I hope there's some way + +00:21:34.720 --> 00:21:36.079 +that we can kind of eventually figure out + +00:21:36.080 --> 00:21:39.279 +how to get the best of you know both compatibility and. + +00:21:39.280 --> 00:21:44.879 +more modern UIs. So, you know, we can have more modern UIs + +00:21:44.880 --> 00:21:49.839 +for people that have modern machines and other people + +00:21:49.840 --> 00:21:51.959 +either do without that functionality + +00:21:51.960 --> 00:21:54.319 +or sort of fall back to some reasonable default. + +00:21:54.320 --> 00:21:59.079 +So we have about 30 seconds or a minute. + +00:21:59.080 --> 00:22:00.679 +I know there's one more question. + +00:22:00.680 --> 00:22:01.559 +I'd love for you to get to it. + +00:22:01.560 --> 00:22:02.839 +I just want to make sure that + +00:22:02.840 --> 00:22:04.239 +while we're still live on stream, + +00:22:04.240 --> 00:22:05.519 +you get a chance to share + +00:22:05.520 --> 00:22:06.799 +any closing remarks you might have. + +00:22:06.800 --> 00:22:10.879 +Thank you for that. Um, yes. + +00:22:10.880 --> 00:22:14.519 +So first of all, I want to thank everyone involved for listening. + +00:22:14.520 --> 00:22:18.919 +And I want to thank the core when I think thanks for moderating this. + +00:22:18.920 --> 00:22:21.279 +And Sacha, thank you for putting that together. + +00:22:21.280 --> 00:22:21.919 +And I know there's more people + +00:22:21.920 --> 00:22:23.319 +that are working behind the scenes. + +00:22:23.320 --> 00:22:25.079 +So thank you all for putting this together. + +00:22:25.080 --> 00:22:29.199 +I'm so happy that we all are here. We care about Emacs. + +00:22:29.200 --> 00:22:31.199 +We're pushing Emacs forward. + +00:22:31.200 --> 00:22:35.959 +We are I think Emacs remains + +00:22:35.960 --> 00:22:37.279 +this really remarkable achievement. + +00:22:37.280 --> 00:22:41.799 +Like it's amazing that it exists. It continues to exist. + +00:22:41.800 --> 00:22:42.999 +It hasn't got, it's hard. + +00:22:43.000 --> 00:22:45.159 +It's like, really, there's a lot of work to go into it. + +00:22:45.160 --> 00:22:47.559 +So I think let's all just appreciate everyone who, + +00:22:47.560 --> 00:22:50.679 +who like contributes and makes all of this possible. + +00:22:50.680 --> 00:22:52.159 +Cause it's, if you ever read + +00:22:52.160 --> 00:22:53.279 +the Emacs Develop mailing list, + +00:22:53.280 --> 00:22:55.479 +it's a lot of work, a lot of deep thinking, + +00:22:55.480 --> 00:22:56.679 +a lot of careful thinking. + +00:22:56.680 --> 00:22:58.599 +And I think this is really important. + +00:22:58.600 --> 00:23:02.039 +So thank you, especially to the maintainers of Emacs + +00:23:02.040 --> 00:23:04.199 +and everyone who's contributing to the core experience, + +00:23:04.200 --> 00:23:07.759 +all the libraries, all the LLM stuff we mentioned before. + +00:23:07.760 --> 00:23:09.839 +You're all doing such a fantastic job. + +00:23:09.840 --> 00:23:13.799 +It's exciting to be here. Thank you for your talk, Andrew. + +00:23:13.800 --> 00:23:16.159 +It's been just fascinating. + +00:23:16.160 --> 00:23:19.759 +If you don't mind, I'd love to jump + +00:23:19.760 --> 00:23:23.879 +right over to the last question. OK, let's do that. + +00:23:23.880 --> 00:23:27.599 +It says, I have 45 plus years editing programming. + +00:23:27.600 --> 00:23:29.239 +I'm not sure I can think about things + +00:23:29.240 --> 00:23:31.039 +without thinking of buffers, editors, et cetera. + +00:23:31.040 --> 00:23:31.959 +Is this the handicap? + +00:23:31.960 --> 00:23:34.239 +Should we have people with no experience + +00:23:34.240 --> 00:23:35.319 +with code learning to prompt? + +00:23:35.320 --> 00:23:38.799 +Well, this is something I do have a strong opinion about. + +00:23:38.800 --> 00:23:42.159 +I feel like I do not want to see people that have no experience + +00:23:42.160 --> 00:23:44.119 +with code learning to prompt. I think it's very limited + +00:23:44.120 --> 00:23:46.039 +what you could do right now with that. + +00:23:46.040 --> 00:23:48.439 +Like you could do, if you could sort of one-shot it, + +00:23:48.440 --> 00:23:51.999 +that is like, I have something that's relatively easy, + +00:23:52.000 --> 00:23:54.879 +And it could do it, and I'm going to tell it to do it, + +00:23:54.880 --> 00:23:56.039 +and then I'm going to give feedback. + +00:23:56.040 --> 00:24:00.039 +OK, as long as this is for relatively short-lived things, + +00:24:00.040 --> 00:24:02.599 +I think that works well. But for people who really care + +00:24:02.600 --> 00:24:04.279 +about the longevity of their code, + +00:24:04.280 --> 00:24:06.599 +really care about software engineering, + +00:24:06.600 --> 00:24:09.879 +which is software engineering is very different than just writing code. + +00:24:09.880 --> 00:24:11.879 +Software engineering is about maintainability. + +00:24:11.880 --> 00:24:15.119 +Software engineering is making sure everything is scalable + +00:24:15.120 --> 00:24:19.599 +and all sorts of things that it's unlikely, + +00:24:19.600 --> 00:24:21.759 +I think, that an LM is going to get right. + +00:24:21.760 --> 00:24:25.279 +And I've seen a lot of bad cases + +00:24:25.280 --> 00:24:27.199 +where people who don't understand code + +00:24:27.200 --> 00:24:31.159 +are doing things and it's not working well + +00:24:31.160 --> 00:24:33.239 +because they don't understand + +00:24:33.240 --> 00:24:35.279 +some of the some of the complexities + +00:24:35.280 --> 00:24:36.959 +or some of the concerns that that you might have + +00:24:36.960 --> 00:24:43.279 +in maintaining a piece of code. + +00:24:43.280 --> 00:24:45.759 +So I think those people who have lots of experience + +00:24:45.760 --> 00:24:46.959 +are the best people to use this. + +00:24:46.960 --> 00:24:48.119 +And I think that's what we're seeing + +00:24:48.120 --> 00:24:49.079 +in the industry as well, + +00:24:49.080 --> 00:24:51.639 +where more senior people are doing quite well + +00:24:51.640 --> 00:24:54.599 +because they're able to use LLMs + +00:24:54.600 --> 00:24:56.559 +more effectively than junior people. + +00:24:56.560 --> 00:25:00.999 +That may all even out because LLMs get even better, + +00:25:01.000 --> 00:25:03.079 +but for now hasn't happened. + +00:25:03.080 --> 00:25:06.319 +So I think, you know, I also have a ton of experience, + +00:25:06.320 --> 00:25:13.079 +not 45 years, but a lot. And, and I think that it's those, + +00:25:13.080 --> 00:25:14.839 +those years of experience will only help you. + +00:25:14.840 --> 00:25:16.919 +And I think it's, it's, it's a great, + +00:25:16.920 --> 00:25:19.639 +it's great to kind of dip your toes in the water + +00:25:19.640 --> 00:25:20.732 +and see what you can do. diff --git a/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt b/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt new file mode 100644 index 00000000..ea969e1e --- /dev/null +++ b/2025/captions/emacsconf-2025-llm--emacs-editors-and-llm-driven-workflows--andrew-hyatt--main.vtt @@ -0,0 +1,1069 @@ +WEBVTT captioned by amitav + +NOTE Introduction + +00:00:01.040 --> 00:00:03.079 +Hi, I'm Andrew Hyatt. + +00:00:03.080 --> 00:00:09.399 +I'm going to talk to you today about Emacs and AI, + +00:00:09.400 --> 00:00:10.879 +and where things are right now + +00:00:10.880 --> 00:00:12.119 +in the world of Emacs and AI, + +00:00:12.120 --> 00:00:14.159 +via large language models, + +00:00:14.160 --> 00:00:16.999 +and where things might be going, + +00:00:17.000 --> 00:00:22.699 +and what it means for the future of Emacs. + +00:00:22.700 --> 00:00:27.279 +I think what we're seeing with Emacs is interesting. + +00:00:27.280 --> 00:00:29.399 +We've seen a lot of different things + +00:00:29.400 --> 00:00:31.559 +come around in the past year, + +00:00:31.560 --> 00:00:33.119 +in the past several years. + +00:00:33.120 --> 00:00:35.079 +There's lots of different solutions. + +00:00:35.080 --> 00:00:36.759 +But in the past year, things have been very interesting. + +00:00:36.760 --> 00:00:39.679 +I think there's new and interesting questions + +00:00:39.680 --> 00:00:43.279 +about what does it mean to use Emacs? + +00:00:43.280 --> 00:00:45.479 +What does it mean to use any editor? + +00:00:45.480 --> 00:00:47.279 +I'm going to be talking about Emacs, + +00:00:47.280 --> 00:00:50.359 +and I'm going to show you various Emacs packages + +00:00:50.360 --> 00:00:53.079 +as demonstrations of these ideas. + +00:00:53.080 --> 00:00:59.839 +But there's the general question of + +00:00:59.840 --> 00:01:03.719 +what does it mean to use any editor, not just Emacs? + +00:01:03.720 --> 00:01:06.239 +What does it mean to do work? + +00:01:06.240 --> 00:01:10.719 +And I think the industry in general is facing these challenges + +00:01:10.720 --> 00:01:13.279 +of we don't really know where things are going to end up, + +00:01:13.280 --> 00:01:16.919 +but we do know the direction they're going. + +00:01:16.920 --> 00:01:20.039 +Emacs is a reflection of that. + +00:01:20.040 --> 00:01:23.239 +I think the answer for Emacs might be + +00:01:23.240 --> 00:01:25.719 +a little bit different than everything else, + +00:01:25.720 --> 00:01:28.599 +but I do want to show you what's out there + +00:01:28.600 --> 00:01:33.319 +so we can explore what are the possibilities + +00:01:33.320 --> 00:01:41.119 +of Emacs, AI, and generally how we get things done. + +00:01:41.120 --> 00:01:44.719 +Thanks. Let's dive right into it. + +NOTE Copilot + +00:01:44.720 --> 00:01:48.079 +We're going to start by showing you + +00:01:48.080 --> 00:01:51.039 +some things that are pretty well integrated, + +00:01:51.040 --> 00:01:55.279 +that look a lot like what you see in Emacs + +00:01:55.280 --> 00:01:58.679 +and fit in with the kinds of editing + +00:01:58.680 --> 00:02:02.639 +that you normally do in Emacs. + +00:02:02.640 --> 00:02:06.579 +So this is just kind of like, it's well integrated. + +00:02:06.580 --> 00:02:08.779 +So we're going to talk about Copilot and Semext. + +00:02:08.780 --> 00:02:12.679 +Copilot is by Microsoft via GitHub, + +00:02:12.680 --> 00:02:14.759 +and Semext is just my personal demo, + +00:02:14.760 --> 00:02:18.039 +but they're both showing you, you know, + +00:02:18.040 --> 00:02:24.399 +this kind of thing. Let's start with Copilot. + +00:02:24.400 --> 00:02:31.919 +Let's try out Copilot on just a standard bit of Elisp. + +00:02:31.920 --> 00:02:38.439 +We're going to write a Fibonacci function. + +00:02:38.440 --> 00:02:43.079 +Let's try out Emacs on a standard bit of Elisp. + +00:02:43.080 --> 00:02:49.279 +We're going to write a Fibonacci function. + +00:02:49.280 --> 00:02:53.159 +And you can see like as soon as we even start typing it, + +00:02:53.160 --> 00:02:56.339 +we get everything as a completion. + +00:02:56.340 --> 00:02:59.879 +So you can just press Tab here, + +00:02:59.880 --> 00:03:02.159 +and you've just completed + +00:03:02.160 --> 00:03:06.799 +a significant bunch of Emacs Lisp code. + +00:03:06.800 --> 00:03:09.919 +It will do this no matter where you are. + +00:03:09.920 --> 00:03:14.799 +So, pretty useful. It will just keep suggesting things. + +00:03:14.800 --> 00:03:16.439 +Do you want to do this? + +00:03:16.440 --> 00:03:17.479 +I'm not sure. + +00:03:17.480 --> 00:03:22.839 +But it usually is offering pretty reasonable things. + +00:03:22.840 --> 00:03:29.299 +So you could do this with code, + +00:03:29.300 --> 00:03:32.119 +of course, any code. + +00:03:32.120 --> 00:03:33.919 +You don't really even have to have a mode for it, right? + +00:03:33.920 --> 00:03:36.679 +That's kind of the beauty of AI is that + +00:03:36.680 --> 00:03:38.519 +you don't need any Emacs functionality for this, + +00:03:38.520 --> 00:03:39.519 +except for Copilot. + +00:03:39.520 --> 00:03:41.679 +It doesn't need to know the structure of your code. + +00:03:41.680 --> 00:03:45.279 +It doesn't need anything except for the text itself + +00:03:45.280 --> 00:03:51.239 +and whatever AI integration that this is. + +00:03:51.240 --> 00:03:53.739 +We can look at, you can do the same thing with Org-mode. + +00:03:53.740 --> 00:03:57.999 +So we could say create, no, + +00:03:58.000 --> 00:04:02.919 +how about let's, let's do, you know, spring cleaning. + +00:04:02.920 --> 00:04:10.839 +It's actually the fall, but still we'll say spring cleaning. + +00:04:10.840 --> 00:04:12.767 +And it'll start suggesting things that, you know, + +00:04:12.768 --> 00:04:15.439 +maybe at first, it doesn't really know what to do to + +00:04:15.440 --> 00:04:16.433 +clean up all code. + +00:04:16.434 --> 00:04:18.400 +It thinks I need to clean up code, but no, + +00:04:18.401 --> 00:04:21.839 +this is going to be actual, you know, + +00:04:21.840 --> 00:04:31.567 +clean hood over range. Clean out pantry. + +00:04:31.568 --> 00:04:33.879 +These are all really reasonable suggestions. + +00:04:33.880 --> 00:04:38.319 +You just keep going here. + +NOTE Semext + +00:04:38.320 --> 00:04:40.559 +I'm going to demonstrate Semext, + +00:04:40.560 --> 00:04:43.879 +which is a package I have on GNU Elpa, + +00:04:43.880 --> 00:04:48.719 +that is designed to integrate AI in a very Emacs-like way. + +00:04:48.720 --> 00:04:50.999 +And so what you could do is you could do a + +00:04:51.000 --> 00:04:54.799 +semext-search-forward. + +00:04:54.800 --> 00:04:58.719 +The UI looks just like other Emacs commands, + +00:04:58.720 --> 00:05:02.379 +but you can search for anything. + +00:05:02.380 --> 00:05:06.279 +There's really no way to express what I'm about to, + +00:05:06.280 --> 00:05:08.679 +what I'm trying to demonstrate + +00:05:08.680 --> 00:05:12.359 +in Emacs's normal search commands. + +00:05:12.360 --> 00:05:15.399 +You could really ask for anything. + +00:05:15.400 --> 00:05:18.759 +And it takes a little while, which is not Emacs-like, + +00:05:18.760 --> 00:05:20.033 +but everything else is sort of like + +00:05:20.034 --> 00:05:21.719 +it's designed to be like Emacs, + +00:05:21.720 --> 00:05:23.519 +except way more powerful. + +00:05:23.520 --> 00:05:27.119 +You don't need any mode to be active for this. + +00:05:27.120 --> 00:05:32.039 +You just need the library + +00:05:32.040 --> 00:05:34.759 +and an AI provider of some sort, either locally + +00:05:34.760 --> 00:05:41.199 +or, you know, your favorite cloud provider. + +NOTE Integrated AI experiences: gptel, ellama, chatgpt-shell, etc. + +00:05:41.200 --> 00:05:43.679 +Now we're going to move on to a different way + +00:05:43.680 --> 00:05:46.399 +of interacting with AI and Emacs. + +00:05:46.400 --> 00:05:52.319 +This way is less like the normal editing experience. + +00:05:52.320 --> 00:05:56.999 +So you lose some familiarity. However, in exchange, + +00:05:57.000 --> 00:05:58.079 +it is a lot more powerful. + +00:05:58.080 --> 00:06:00.119 +And there's a whole suite of these tools. + +00:06:00.120 --> 00:06:02.479 +I'm going to demonstrate gptel, + +00:06:02.480 --> 00:06:05.779 +which is the most popular one. + +00:06:05.780 --> 00:06:06.399 +But there are many. + +00:06:06.400 --> 00:06:08.479 +And I think different people have + +00:06:08.480 --> 00:06:11.759 +their own preferences of what they like to use. + +00:06:11.760 --> 00:06:12.999 +We're going to try now something + +00:06:13.000 --> 00:06:15.079 +that is a step away from just editing. + +00:06:15.080 --> 00:06:19.839 +And we're going to, I'm actually using gptel. + +00:06:19.840 --> 00:06:22.799 +There are several packages that are going to be + +00:06:22.800 --> 00:06:25.959 +doing the same sort of thing as I'm going to show you. + +00:06:25.960 --> 00:06:29.999 +gptel has sort of become the most popular one. + +00:06:30.000 --> 00:06:32.199 +So that's why I'm showing that to you. + +00:06:32.200 --> 00:06:39.319 +But let's just highlight everything and say gptel rewrite. + +00:06:39.320 --> 00:06:42.399 +And gptel basically just has a few things. + +00:06:42.400 --> 00:06:45.119 +There's different ways of thinking about this. + +00:06:45.120 --> 00:06:49.999 +With just a few very configurable menus, + +00:06:50.000 --> 00:06:53.959 +you can do a large variety of things. + +00:06:53.960 --> 00:06:59.819 +So let's give rewrite instructions. + +00:06:59.820 --> 00:07:06.600 +"Turn this into an iterative program + +00:07:06.601 --> 00:07:12.199 +instead of a recursive program." + +00:07:12.200 --> 00:07:17.799 +In Elisp, you really should not be using recursion. + +00:07:17.800 --> 00:07:20.359 +So we could say "return to be ready". + +00:07:20.360 --> 00:07:21.119 +Do we accept it? + +00:07:21.120 --> 00:07:24.519 +Yes, we accept it. Or we could iterate and say, no, no, + +00:07:24.520 --> 00:07:26.799 +that's not what we meant. We meant something else. + +00:07:26.800 --> 00:07:29.159 +Or you did something a little something wrong. + +00:07:29.160 --> 00:07:29.879 +Please fix it. + +00:07:29.880 --> 00:07:31.879 +So this is all very powerful. + +00:07:31.880 --> 00:07:33.799 +Is this editing? + +00:07:33.800 --> 00:07:40.279 +Well, it's in the editor. + +00:07:40.280 --> 00:07:42.759 +You could do this while editing, while deleting, + +00:07:42.760 --> 00:07:44.959 +you could be doing some sort of traditional editing. + +00:07:44.960 --> 00:07:47.679 +And then this, which is editing + +00:07:47.680 --> 00:07:48.919 +in the sense that it's in your editor, + +00:07:48.920 --> 00:07:51.039 +you might have to highlight + +00:07:51.040 --> 00:07:52.799 +some parts of the file and do things, + +00:07:52.800 --> 00:07:54.719 +but generally you don't even need to, + +00:07:54.720 --> 00:07:59.879 +or you go to a spot and you say, put code at this spot. + +00:07:59.880 --> 00:08:01.959 +It's kind of like editing. + +00:08:01.960 --> 00:08:05.839 +I would say it's not exactly editing, + +00:08:05.840 --> 00:08:10.159 +but it's at least something that must happen in an editor + +00:08:10.160 --> 00:08:12.359 +and it's well integrated into Emacs. + +00:08:12.360 --> 00:08:14.759 +As you can tell, it used very sort of + +00:08:14.760 --> 00:08:18.239 +modern standard Emacs UI paradigms + +00:08:18.240 --> 00:08:20.759 +and it's all written in Elisp. + +00:08:20.760 --> 00:08:23.779 +Everything is happening in Elisp here. + +00:08:23.780 --> 00:08:25.959 +So this is just very much an Emacs experience. + +00:08:25.960 --> 00:08:27.679 +It's just not exactly editing + +00:08:27.680 --> 00:08:29.879 +because the thing doing the editing + +00:08:29.880 --> 00:08:32.519 +is the AI and not you. + +00:08:32.520 --> 00:08:36.039 +You're just kind of telling it what to do. + +NOTE Outside the editor + +00:08:36.040 --> 00:08:41.119 +Now we're going to go and look at a way of interaction + +00:08:41.120 --> 00:08:43.239 +that's even more powerful + +00:08:43.240 --> 00:08:46.279 +and even more disconnected from the normal editing experience. + +00:08:46.280 --> 00:08:47.919 +In fact, it's so disconnected + +00:08:47.920 --> 00:08:52.399 +that most people are using this without an editor. + +00:08:52.400 --> 00:08:57.879 +These are things like Claude Code + +00:08:57.880 --> 00:09:01.079 +or the sort of open source equivalent, Aider. + +00:09:01.080 --> 00:09:05.039 +There's a few other things that follow this pattern as well. + +00:09:05.040 --> 00:09:07.479 +But it's very interesting in the sense + +00:09:07.480 --> 00:09:09.839 +that while you can integrate these with the editors, + +00:09:09.840 --> 00:09:12.039 +and I'm going to show you an Emacs integration, + +00:09:12.040 --> 00:09:13.519 +you don't need to. + +00:09:13.520 --> 00:09:16.939 +And that's not the way most people are using them. + +00:09:16.940 --> 00:09:19.759 +And I find it very interesting that sort of + +00:09:19.760 --> 00:09:23.719 +we're going back kind of full circle where, you know, + +00:09:23.720 --> 00:09:31.959 +in the 1960s or 70s, we were using Ed from the terminal + +00:09:31.960 --> 00:09:35.639 +to edit files, but then we created editors, + +00:09:35.640 --> 00:09:37.959 +and that was a really good idea. + +00:09:37.960 --> 00:09:40.167 +It is a lot easier to edit files + +00:09:40.168 --> 00:09:42.499 +when you have an actual UI. + +00:09:42.500 --> 00:09:46.879 +But now it's 2025, and we're back in the terminal, + +00:09:46.880 --> 00:09:50.799 +and we're editing files through the terminal, + +00:09:50.800 --> 00:09:53.599 +and you know what, it's great, + +00:09:53.600 --> 00:09:56.899 +but I think it's even better with Emacs. + +00:09:56.900 --> 00:10:00.279 +On the other hand, it comes with some trade-offs, + +00:10:00.280 --> 00:10:04.733 +as you can see, as we will see. + +NOTE Outside Experiences: claude-code.el, aidermacs, eca + +00:10:04.734 --> 00:10:07.467 +Okay, we're going to look at + +00:10:07.468 --> 00:10:20.320 +[audio glitch] Claude Code IDE, aidermacs, ECA. + +00:10:20.321 --> 00:10:22.639 +Last time, I didn't show you all the variants. + +00:10:22.640 --> 00:10:26.839 +I do want to show you eca, which points to, + +00:10:26.840 --> 00:10:29.799 +it is a very similar tool in what it does, + +00:10:29.800 --> 00:10:32.739 +but does have a different + +00:10:32.740 --> 00:10:37.239 +and I think better type of Emacs integration. + +00:10:37.240 --> 00:10:42.599 +All right, we're going to demonstrate Claude Code IDE, + +00:10:42.600 --> 00:10:46.839 +which is one of three Claude Code packages. + +00:10:46.840 --> 00:10:47.719 +It's a bit confusing. + +00:10:47.720 --> 00:10:52.039 +One of them will be demoed by another presenter + +00:10:52.040 --> 00:10:54.639 +at the Emacs conference, so stay tuned for that. + +00:10:54.640 --> 00:10:56.439 +Here I'm just going to give you a little taste + +00:10:56.440 --> 00:10:58.759 +of what these packages look like. + +00:10:58.760 --> 00:11:03.339 +So if we say Claude Code IDE, + +00:11:03.340 --> 00:11:06.839 +it presents us with basically + +00:11:06.840 --> 00:11:09.039 +almost exactly what you would get + +00:11:09.040 --> 00:11:11.519 +when you're running this in the terminal. + +00:11:11.520 --> 00:11:13.933 +And essentially there's a terminal interface. + +00:11:13.934 --> 00:11:16.659 +You can see that there's a vterm. + +00:11:16.660 --> 00:11:20.699 +But here we're going to say, "In scratch.el"... + +00:11:20.700 --> 00:11:23.400 +let's say what we want to happen. + +00:11:23.401 --> 00:11:32.133 +[In scratch.el, there is a fibonacci function. + +00:11:32.134 --> 00:11:39.567 +Can you add all normal elisp headers + +00:11:39.568 --> 00:11:43.859 +and footers to this file?] + +00:11:43.860 --> 00:11:45.840 +So, we just say what's going to happen, + +00:11:45.841 --> 00:11:48.399 +and this is going to do things in the background. + +00:11:48.400 --> 00:11:50.979 +It's not going to do things through Emacs. + +00:11:50.980 --> 00:11:54.079 +That said, there is an integration with Emacs, + +00:11:54.080 --> 00:12:00.659 +so that it can do things like show you these nice ediffs. + +00:12:00.660 --> 00:12:03.199 +My screen is not really wide enough + +00:12:03.200 --> 00:12:04.699 +to show you a really great ediff here, + +00:12:04.700 --> 00:12:06.239 +but you can kind of see what it's doing, + +00:12:06.240 --> 00:12:09.079 +and you can see, yeah, that looks good, + +00:12:09.080 --> 00:12:14.120 +so you could say yes, yes, accept the changes, + +00:12:14.121 --> 00:12:25.299 +and if we... Just need to revert the buffer. + +00:12:25.300 --> 00:12:28.459 +We can quit the printout of this. + +00:12:28.460 --> 00:12:33.019 +We see that it just did everything I asked it to. + +00:12:33.020 --> 00:12:36.139 +Is everything exactly right? + +00:12:36.140 --> 00:12:39.159 +Probably not. It's reasonable for a start though. + +00:12:39.160 --> 00:12:40.959 +But you could ask it to do anything. + +00:12:40.960 --> 00:12:45.339 +You could say, write unit tests for this, and it will. + +00:12:45.340 --> 00:12:49.019 +You could say, write me a suite of functions + +00:12:49.020 --> 00:12:52.579 +like Fibonacci, and it'll probably do something reasonable. + +00:12:52.580 --> 00:12:54.900 +But you can see this is not editing. + +00:12:54.901 --> 00:12:58.659 +There's nothing editing-like about this. + +00:12:58.660 --> 00:13:07.159 +That said, there is something that is editing. + +00:13:07.160 --> 00:13:08.599 +You need to give it instructions. + +00:13:08.600 --> 00:13:10.959 +You need to tell it what to do. + +NOTE Org files + +00:13:10.960 --> 00:13:19.619 +And what you could do is... You could have a project.org, + +00:13:19.620 --> 00:13:23.899 +and what you could do is you could have functions. + +00:13:23.900 --> 00:13:26.659 +The way I've done things often is .... + +00:13:26.660 --> 00:13:28.439 +You could say something like, + +00:13:28.440 --> 00:13:36.199 +unit tests for Fibonacci. How do you spell Fibonacci? + +00:13:36.200 --> 00:13:40.479 +I don't remember. But then you could say that this is, + +00:13:40.480 --> 00:13:47.159 +you could clock it, basically. org-clock. + +00:13:47.160 --> 00:13:48.879 +What I've done is... + +00:13:48.880 --> 00:13:50.399 +You could add custom commands to Claude Code, + +00:13:50.400 --> 00:13:53.119 +and you could just say, look, here's my Org file, + +00:13:53.120 --> 00:13:57.879 +read it and do the thing that I'm clocked in as. + +00:13:57.880 --> 00:14:01.159 +And then you can write a bunch of instructions here, like, + +00:14:01.160 --> 00:14:07.039 +I like to use ert for tests. Tests should, like, whatever. + +00:14:07.040 --> 00:14:08.639 +You should just say... everything + +00:14:08.640 --> 00:14:10.999 +you need to kind of specify. + +00:14:11.000 --> 00:14:13.199 +As you get to more complicated tasks, + +00:14:13.200 --> 00:14:16.679 +it's harder and harder to give it all the context + +00:14:16.680 --> 00:14:17.799 +it needs for a task, + +00:14:17.800 --> 00:14:22.299 +and Org Mode is actually a pretty good way to do this. + +00:14:22.300 --> 00:14:24.079 +I find that this works pretty well, + +00:14:24.080 --> 00:14:26.699 +and you can even have it instruct Claude + +00:14:26.700 --> 00:14:29.333 +to just mark things done in your Org file + +00:14:29.334 --> 00:14:30.679 +when they're done. + +00:14:30.680 --> 00:14:32.867 +And it knows how to do this, of course. + +00:14:32.868 --> 00:14:37.959 +So, let's just clock out. + +00:14:37.960 --> 00:14:45.239 +That's one way to do things. + +NOTE ECA + +00:14:45.240 --> 00:14:49.499 +So one other thing I'd like to show you is eca, + +00:14:49.500 --> 00:14:52.879 +which, compared to Claude Code, ECA is open source. + +00:14:52.880 --> 00:14:54.239 +It's very nice in that respect. + +00:14:54.240 --> 00:14:57.839 +It doesn't have to use Anthropic's models. + +00:14:57.840 --> 00:15:00.279 +You can use local models, + +00:15:00.280 --> 00:15:07.619 +but it has the advantage of integrating very well with Emacs. + +00:15:07.620 --> 00:15:08.559 +I'm not going to demonstrate it, + +00:15:08.560 --> 00:15:11.159 +because it works essentially the same thing you could do + +00:15:11.160 --> 00:15:14.119 +approximately the same kinds of things + +00:15:14.120 --> 00:15:15.479 +you could do with Claude Code. + +00:15:15.480 --> 00:15:17.439 +You just write what you want to happen + +00:15:17.440 --> 00:15:18.639 +and it will make it happen. + +00:15:18.640 --> 00:15:21.879 +It again does not do this through Emacs, + +00:15:21.880 --> 00:15:23.039 +but what it does do is + +00:15:23.040 --> 00:15:25.119 +it gives you a much better Emacs interface + +00:15:25.120 --> 00:15:26.919 +that's not terminal-based, + +00:15:26.920 --> 00:15:29.639 +because you're not using it through the terminal, + +00:15:29.640 --> 00:15:31.239 +or not even through comint, + +00:15:31.240 --> 00:15:35.599 +you are using it through a backend + +00:15:35.600 --> 00:15:37.499 +that is exchanging structured information + +00:15:37.500 --> 00:15:40.999 +with this process that is doing all the work. + +00:15:41.000 --> 00:15:41.900 +But other than that, + +00:15:41.901 --> 00:15:44.519 +it's the same model as Claude Code + +00:15:44.520 --> 00:15:52.059 +and projects of that nature. + +NOTE Editing + +00:15:52.060 --> 00:15:56.159 +We've seen in the demos that I gave + +00:15:56.160 --> 00:15:58.639 +that there are AI experiences + +00:15:58.640 --> 00:16:01.279 +that are very natural in the world of editing. + +00:16:01.280 --> 00:16:05.339 +because they, like Copilot, just offers completion, + +00:16:05.340 --> 00:16:09.479 +it fits very well with what we all do in Emacs. + +00:16:09.480 --> 00:16:14.279 +And it's truly, yes, it's kind of a cheat in a sense + +00:16:14.280 --> 00:16:15.639 +for editing experiences, + +00:16:15.640 --> 00:16:20.159 +because it can do so much, but it's just editing. + +00:16:20.160 --> 00:16:25.259 +Whereas things like gptel and those kinds of tools, + +00:16:25.260 --> 00:16:29.799 +they are clearly in an editor and using editor, + +00:16:29.800 --> 00:16:35.319 +they're using Emacs, but they represent sort of like, well, + +00:16:35.320 --> 00:16:37.759 +you can edit for a while, then you could use these tools + +00:16:37.760 --> 00:16:39.479 +to do something that is not editing, + +00:16:39.480 --> 00:16:45.899 +this AI just changing the buffer for you. And that's fine. + +00:16:45.900 --> 00:16:48.399 +It's still... It may not be editing, + +00:16:48.400 --> 00:16:52.033 +but it's still clearly something that + +00:16:52.034 --> 00:16:55.567 +is useful to do in Emacs + +00:16:55.568 --> 00:16:57.039 +and belongs in Emacs. + +00:16:57.040 --> 00:17:01.859 +But the new tools like Claude Code and things like that + +00:17:01.860 --> 00:17:02.639 +are kind of different. + +00:17:02.640 --> 00:17:06.639 +Yes, they will get better integrated with Emacs, + +00:17:06.640 --> 00:17:11.639 +but it's not clear that they really need to. + +00:17:11.640 --> 00:17:15.479 +They can do a lot of things without editing. + +00:17:15.480 --> 00:17:19.239 +In a sense, editing is obsolete in some sense. + +00:17:19.240 --> 00:17:23.459 +For as many tasks, you don't need to edit anymore. + +00:17:23.460 --> 00:17:26.439 +And that's a nice thing. + +00:17:26.440 --> 00:17:30.579 +No one really knows when all this will end, + +00:17:30.580 --> 00:17:36.879 +how far things will go. It could be that in a decade or so, + +00:17:36.880 --> 00:17:41.039 +no one's really editing for work anymore. + +00:17:41.040 --> 00:17:43.159 +Maybe you're just writing instructions. + +00:17:43.160 --> 00:17:44.319 +You could do that with anything. + +00:17:44.320 --> 00:17:47.439 +You don't need Emacs or any special editor. + +00:17:47.440 --> 00:17:50.439 +We could all be using Notepad. That would be bad. + +00:17:50.440 --> 00:17:58.039 +But... I think it could go that far, + +00:17:58.040 --> 00:18:01.839 +but it could be that, well, for many specialized things, + +00:18:01.840 --> 00:18:04.359 +people are still using editing for certain tasks, + +00:18:04.360 --> 00:18:07.000 +but most tasks are getting fed to just... + +00:18:07.001 --> 00:18:08.839 +AI is just doing those things. + +00:18:08.840 --> 00:18:15.759 +In any case, I think it's clear that editing is diminishing, + +00:18:15.760 --> 00:18:17.959 +the need for editing itself is diminishing. + +00:18:17.960 --> 00:18:21.879 +And in such a world, It's interesting to think + +00:18:21.880 --> 00:18:24.799 +where Emacs is headed, especially in relation to + +00:18:24.800 --> 00:18:26.359 +all the other editors. + +00:18:26.360 --> 00:18:28.599 +I think people will use Emacs less. + +00:18:28.600 --> 00:18:31.639 +But I think other editors, like VS Code, + +00:18:31.640 --> 00:18:37.999 +may simply disappear or be a relatively fringe tool. + +00:18:38.000 --> 00:18:42.719 +And Emacs is going to follow its own path. + +00:18:42.720 --> 00:18:44.679 +It's very extensible. It could do anything. + +00:18:44.680 --> 00:18:47.919 +If there's one thing Emacs can do, it's adapt. + +00:18:47.920 --> 00:18:51.679 +Emacs has been around for a long time. + +00:18:51.680 --> 00:18:54.799 +It's pretty clear that Emacs will be around for a long time. + +00:18:54.800 --> 00:18:58.879 +It might be that in the future, + +00:18:58.880 --> 00:19:04.339 +editing is some sort of like an artisanal activity that we do. + +00:19:04.340 --> 00:19:05.599 +It's kind of weird to think about it. + +00:19:05.600 --> 00:19:07.679 +It's not like baking bread. + +00:19:07.680 --> 00:19:10.079 +But it is the sense that AI might be + +00:19:10.080 --> 00:19:12.399 +churning out code in the way, you know, + +00:19:12.400 --> 00:19:14.199 +the factories are turning out bread, + +00:19:14.200 --> 00:19:17.139 +but if you really want the good stuff, + +00:19:17.140 --> 00:19:20.999 +you'll have to do it yourself. + +00:19:21.000 --> 00:19:23.959 +I don't know if it'll be exactly like that, + +00:19:23.960 --> 00:19:29.519 +but it could be that Emacs survives and thrives + +00:19:29.520 --> 00:19:33.559 +in a very kind of specialized ecosystem of people + +00:19:33.560 --> 00:19:35.599 +who contribute and use it in the way + +00:19:35.600 --> 00:19:39.539 +it has survived and thrive right now. + +00:19:39.540 --> 00:19:46.139 +And I think that's a really nice way for all this to end up. + +00:19:46.140 --> 00:19:48.719 +There's the whole sense of how society will end up + +00:19:48.720 --> 00:19:50.759 +if all this happens. I don't know, + +00:19:50.760 --> 00:19:54.639 +but Emacs will be there for us when whatever happens. + +00:19:54.640 --> 00:20:00.079 +So thank you, and let's help make Emacs the best it can be + +00:20:00.080 --> 00:20:04.880 +to survive and thrive in the next decade. diff --git a/2025/captions/emacsconf-2025-modern--some-problems-of-modernizing-emacs--eduardo-ochs--main.vtt b/2025/captions/emacsconf-2025-modern--some-problems-of-modernizing-emacs--eduardo-ochs--main.vtt new file mode 100644 index 00000000..e461b1f1 --- /dev/null +++ b/2025/captions/emacsconf-2025-modern--some-problems-of-modernizing-emacs--eduardo-ochs--main.vtt @@ -0,0 +1,727 @@ +WEBVTT +Kind: captions +Language: en-GB + +00:00:54.000 --> 00:00:55.000 + + +00:00:55.000 --> 00:00:57.000 +Hi! My name is Eduardo Ochs. I'm the + +00:00:57.000 --> 00:01:00.000 +author of an Emacs package called eev and + +00:01:00.000 --> 00:01:03.000 +the title of this video is + +00:01:03.000 --> 00:01:05.000 +"Some problems of modernizing Emacs". + +00:01:05.000 --> 00:01:08.000 +Here is a summary of the main themes + +00:01:08.000 --> 00:01:10.000 +of this video. I'm going to talk mainly + +00:01:10.000 --> 00:01:12.000 +about these four things here. The first + +00:01:12.000 --> 00:01:15.000 +one is that Emacs has changed a lot in its + +00:01:15.000 --> 00:01:18.000 +recent versions, and now it has lots of + +00:01:18.000 --> 00:01:21.000 +types... so if we want to look under the + +00:01:21.000 --> 00:01:24.000 +hood and to understand what Emacs + +00:01:24.000 --> 00:01:27.000 +really does we are going to stumble on + +00:01:27.000 --> 00:01:30.000 +lots of types... and the + +00:01:30.000 --> 00:01:34.000 +current tree of classes and types + +00:01:34.000 --> 00:01:37.000 +looks like this... that is, + +00:01:37.000 --> 00:01:46.000 +is quite big. + +00:01:46.000 --> 00:01:49.000 +The second theme is that people used + +00:01:49.000 --> 00:01:53.000 +to say things like "Anyone can learn Lisp + +00:01:53.000 --> 00:01:56.000 +in one day"... I'm going to explain + +00:01:56.000 --> 00:02:01.000 +this quote, and I'm also going to show + +00:02:01.000 --> 00:02:04.000 +that now this is gone... anyway. This is a + +00:02:04.000 --> 00:02:08.000 +very short summary... details soon. + +00:02:08.000 --> 00:02:10.000 +I will also show how to display + +00:02:10.000 --> 00:02:13.000 +better "inner views" of Emacs objects... + +00:02:13.000 --> 00:02:16.000 +I'm going to Define what is an inner view, + +00:02:16.000 --> 00:02:18.000 +of course. + +00:02:18.000 --> 00:02:20.000 +The main trick is that we are going + +00:02:20.000 --> 00:02:24.000 +to use one of the ways of displaying + +00:02:24.000 --> 00:02:29.000 +internal objects, that is the `cl-print' + +00:02:29.000 --> 00:02:32.000 +family of functions, for example, + +00:02:32.000 --> 00:02:35.000 +`cl-prin1-to-string', and here are some + +00:02:35.000 --> 00:02:37.000 +examples of the kind of output that we + +00:02:37.000 --> 00:02:38.000 +are going to see... + +00:02:38.000 --> 00:02:44.000 +for example, if we run these two lines + +00:02:44.000 --> 00:02:47.000 +here the first line defines a function `foo' + +00:02:47.000 --> 00:02:52.000 +and the second line sets `o' to the + +00:02:52.000 --> 00:02:54.000 +internal view of the definition of `foo'. + +00:02:54.000 --> 00:02:59.000 +In older Emacses `o' would be just a + +00:02:59.000 --> 00:03:02.000 +list that looks... that would look very + +00:03:02.000 --> 00:03:05.000 +similar to this line here... but in newer + +00:03:05.000 --> 00:03:09.000 +Emacses the result of this - I mean, the + +00:03:09.000 --> 00:03:12.000 +the contents of `o' is this thing here, + +00:03:12.000 --> 00:03:15.000 +that looks quite different + +00:03:15.000 --> 00:03:18.000 +from this definition. + +00:03:18.000 --> 00:03:21.000 +So, in older Emacses + +00:03:21.000 --> 00:03:25.000 +the contents of the + +00:03:25.000 --> 00:03:28.000 +function cell of `o'... + +00:03:28.000 --> 00:03:30.000 +sorry, of the function cell of `foo', + +00:03:30.000 --> 00:03:32.000 +would be an "old-style lambda", + +00:03:32.000 --> 00:03:35.000 +that would be just a list like this... + +00:03:35.000 --> 00:03:39.000 +and in newer Emacses uh the contents of O would + +00:03:39.000 --> 00:03:42.000 +be a "vector-like lambda"... look for the + +00:03:42.000 --> 00:03:44.000 +square brackets here - this is a + +00:03:44.000 --> 00:03:47.000 +vector, but it is preceded by a hash sign. + +00:03:47.000 --> 00:03:49.000 +So this is what we call + +00:03:49.000 --> 00:03:51.000 +a "vector-like lambda", + +00:03:51.000 --> 00:03:53.000 +and vector-like lambas do not + +00:03:53.000 --> 00:03:55.000 +have a canonical printed representation - + +00:03:55.000 --> 00:03:57.000 +they have at least two semicanonical + +00:03:57.000 --> 00:03:59.000 +printed representations... + +00:03:59.000 --> 00:04:01.000 +The first semicanonical + +00:04:01.000 --> 00:04:04.000 +printed representation is this one, that is + +00:04:04.000 --> 00:04:07.000 +generated by a family of functions with + +00:04:07.000 --> 00:04:09.000 +names like `prin1'... + +00:04:09.000 --> 00:04:13.000 +and the second semicanonical printed + +00:04:13.000 --> 00:04:17.000 +representation is like this - + +00:04:17.000 --> 00:04:20.000 +it looks like a list... + +00:04:20.000 --> 00:04:23.000 +it looks somewhat like this definition + +00:04:23.000 --> 00:04:27.000 +of `foo' here, but it has this + +00:04:27.000 --> 00:04:29.000 +`:dynbind' symbol here... + +00:04:29.000 --> 00:04:32.000 +and it turns out that when we use + +00:04:32.000 --> 00:04:35.000 +the `cl-print' family of functions we can + +00:04:35.000 --> 00:04:37.000 +reconfigure how things are printed... + +00:04:37.000 --> 00:04:40.000 +and I'm going to show several interesting + +00:04:40.000 --> 00:04:47.000 +ways of reconfiguring how lambdas are printed, + +00:04:47.000 --> 00:04:49.000 +and one of the ways is going to + +00:04:49.000 --> 00:04:52.000 +be like this. + +00:04:52.000 --> 00:04:56.000 +We can also use the `cl-print' + +00:04:56.000 --> 00:04:59.000 +functions with my indentation tricks to + +00:04:59.000 --> 00:05:04.000 +to display how types, or classes, are + +00:05:04.000 --> 00:05:07.000 +viewed internally by Emacs, and this is a + +00:05:07.000 --> 00:05:10.000 +big example... + +00:05:10.000 --> 00:05:14.000 +This is what Emacs considers as being + +00:05:14.000 --> 00:05:16.000 +the definition of the type + +00:05:16.000 --> 00:05:18.000 +`cl-structure-class', + +00:05:18.000 --> 00:05:21.000 +class and it is this big thing here. + +00:05:21.000 --> 00:05:24.000 +I edited it very lightly... + +00:05:24.000 --> 00:05:30.000 +I just uh deleted some line breaks here. + +00:05:30.000 --> 00:05:33.000 +And another thing that I want to to + +00:05:33.000 --> 00:05:35.000 +explain is that Emacs + +00:05:35.000 --> 00:05:37.000 +has some help functions that + +00:05:37.000 --> 00:05:39.000 +I have never liked... + +00:05:39.000 --> 00:05:41.000 +for most people they are good enough, + +00:05:41.000 --> 00:05:44.000 +but for me they aren't... they... + +00:05:44.000 --> 00:05:48.000 +uh, well - I'm going to say + +00:05:48.000 --> 00:05:50.000 +more about this later... + +00:05:50.000 --> 00:05:52.000 +and, for example, + +00:05:52.000 --> 00:05:54.000 +if we want a description of what is + +00:05:54.000 --> 00:05:58.000 +this type here, that we just saw in + +00:05:58.000 --> 00:06:00.000 +its internal view here... + +00:06:00.000 --> 00:06:02.000 +we can run either `describe-type' + +00:06:02.000 --> 00:06:04.000 +or my variant of `describe-type', + +00:06:04.000 --> 00:06:07.000 +and we get a help buffer + +00:06:07.000 --> 00:06:10.000 +that looks like this, in which + +00:06:10.000 --> 00:06:13.000 +these blue things that are underlined + +00:06:13.000 --> 00:06:15.000 +are "buttons", in the classical sense... + +00:06:15.000 --> 00:06:17.000 +you can click on these buttons, or type + +00:06:17.000 --> 00:06:19.000 +RET on these buttons, and you will be + +00:06:19.000 --> 00:06:22.000 +taken to another help page, that is + +00:06:22.000 --> 00:06:24.000 +generated dynamically... + +00:06:24.000 --> 00:06:28.000 +and you can navigate back and forth... + +00:06:28.000 --> 00:06:30.000 +and well, whatever... + +00:06:30.000 --> 00:06:33.000 +and I'm going to explain my + +00:06:33.000 --> 00:06:35.000 +problems with these kinds of help buffers + +00:06:35.000 --> 00:06:37.000 +and what I'm trying to do to + +00:06:37.000 --> 00:06:41.000 +overcome these problems... + +00:06:41.000 --> 00:06:43.000 +One of my slogans in this video + +00:06:43.000 --> 00:06:43.000 +is going to be this one: + +00:06:43.000 --> 00:06:45.000 +"Anyone can learn Lisp in one day". + +00:06:45.000 --> 00:06:49.000 +this is a part of a bigger quote + +00:06:49.000 --> 00:06:51.000 +that I took from a keynote presentation + +00:06:51.000 --> 00:06:54.000 +by Abelson and Sussman, who + +00:06:54.000 --> 00:06:58.000 +are two dinosaurs of Computer Science... + +00:06:58.000 --> 00:07:00.000 +Here is the full quote: + +00:07:00.000 --> 00:07:04.000 +"Anyone can learn Lisp in one day - + +00:07:04.000 --> 00:07:06.000 +except that if they already know Fortran + +00:07:06.000 --> 00:07:11.000 +then it would take three days." + +00:07:11.000 --> 00:07:24.000 +This is a frame of the video... + +00:07:24.000 --> 00:07:28.000 +By the way I am going to to add + +00:07:28.000 --> 00:07:32.000 +this... "and if the person is starting + +00:07:32.000 --> 00:07:34.000 +with Doom Emacs then it would take 5 years." + +00:07:34.000 --> 00:07:39.000 +why? I'm going to explain why. + +00:07:39.000 --> 00:07:43.000 +This is how Emacs used to be. + +00:07:43.000 --> 00:07:46.000 +If we execute these two expressions here + +00:07:46.000 --> 00:07:51.000 +the first one... sorry, each symbol can + +00:07:51.000 --> 00:07:53.000 +have two "values", + +00:07:53.000 --> 00:07:54.000 +one is its "value as a variable" + +00:07:54.000 --> 00:07:58.000 +and another one is its "value as a function"... + +00:07:58.000 --> 00:08:02.000 +and if we run this we store 42 + +00:08:02.000 --> 00:08:07.000 +in the "value cell" of the symbol `foo', and + +00:08:07.000 --> 00:08:11.000 +if we run this defun here it stores a + +00:08:11.000 --> 00:08:14.000 +certain anonymous function in the + +00:08:14.000 --> 00:08:18.000 +"function cell" of the symbol `foo'... + +00:08:18.000 --> 00:08:22.000 +and in Emacs, until some time ago + +00:08:22.000 --> 00:08:27.000 +if we did that and and if we ran + +00:08:27.000 --> 00:08:30.000 +this expression here the result + +00:08:30.000 --> 00:08:31.000 +would be 42, + +00:08:31.000 --> 00:08:35.000 +because of this line here, and if we + +00:08:35.000 --> 00:08:37.000 +ran this line here the result would be + +00:08:37.000 --> 00:08:40.000 +the anonymous function corresponding to + +00:08:40.000 --> 00:08:41.000 +this defun here... + +00:08:41.000 --> 00:08:45.000 +but now this has changed... + +00:08:45.000 --> 00:08:48.000 +the result of this thing here is this + +00:08:48.000 --> 00:08:51.000 +vector-like lambda here - but that doesn't + +00:08:51.000 --> 00:08:54.000 +matter much now... + +00:08:54.000 --> 00:08:56.000 +So, until some time ago + +00:08:56.000 --> 00:08:58.000 +if we did that and if we ran + +00:08:58.000 --> 00:09:01.000 +this expression here, (foo foo)... + +00:09:01.000 --> 00:09:04.000 +Emacs would do this: it would + +00:09:04.000 --> 00:09:06.000 +replace the first `foo' by this + +00:09:06.000 --> 00:09:09.000 +anonymous function here, it would replace + +00:09:09.000 --> 00:09:11.000 +the second `foo' by the value of `foo' as a + +00:09:11.000 --> 00:09:13.000 +variable, that is 42, + +00:09:13.000 --> 00:09:16.000 +and it would evaluate this, and the + +00:09:16.000 --> 00:09:20.000 +result would be 420. + +00:09:20.000 --> 00:09:23.000 +So, again, we used to have this slogan + +00:09:23.000 --> 00:09:26.000 +here, "anyone can learn Lisp in one day"... + +00:09:26.000 --> 00:09:28.000 +but now this is gone. + +00:09:28.000 --> 00:09:30.000 +Let me show... let me talk + +00:09:30.000 --> 00:09:34.000 +a bit more about why... + +00:09:34.000 --> 00:09:36.000 +the title of this slide is + +00:09:36.000 --> 00:09:38.000 +"Lambdas for beginners broken"... + +00:09:38.000 --> 00:09:41.000 +if we run this, as I've shown + +00:09:41.000 --> 00:09:43.000 +in the previous slide... + +00:09:43.000 --> 00:09:45.000 +in the old style, in old Emacses, + +00:09:45.000 --> 00:09:47.000 +the result of (symbol-function 'foo) + +00:09:47.000 --> 00:09:49.000 +would be this anonymous function here... + +00:09:49.000 --> 00:09:54.000 +and now we get this strange thing here. + +00:09:54.000 --> 00:09:58.000 +So, this is an "old-style lambda", + +00:09:58.000 --> 00:10:02.000 +this is a "vector-like lambda", + +00:10:02.000 --> 00:10:05.000 +and until the middle of 2024 + +00:10:05.000 --> 00:10:08.000 +beginners could learn a lot of Lisp + +00:10:08.000 --> 00:10:11.000 +by thinking only in terms of + +00:10:11.000 --> 00:10:13.000 +objects like these... + +00:10:13.000 --> 00:10:15.000 +this is a function and this + +00:10:15.000 --> 00:10:17.000 +is an anonymous function, and + +00:10:17.000 --> 00:10:20.000 +they would learn how to draw cons cell + +00:10:20.000 --> 00:10:23.000 +diagrams like this thing here and this + +00:10:23.000 --> 00:10:25.000 +thing here... + +00:10:25.000 --> 00:10:27.000 +they would think on lists as + +00:10:27.000 --> 00:10:29.000 +being these trees here, and they + +00:10:29.000 --> 00:10:32.000 +would be able to understand a lot of + +00:10:32.000 --> 00:10:35.000 +Lisp just by thinking in these terms... + +00:10:35.000 --> 00:10:39.000 +and then vector-like lambdas started + +00:10:39.000 --> 00:10:43.000 +to appear in many places... and if we use + +00:10:43.000 --> 00:10:46.000 +"vector-like lambdas" in a wide sense, + +00:10:46.000 --> 00:10:50.000 +to mean all the new objects, + +00:10:50.000 --> 00:10:54.000 +these new objects, that are + +00:10:54.000 --> 00:10:56.000 +difficult to visualize... they also started + +00:10:56.000 --> 00:10:58.000 +to appear in many places. + +00:10:58.000 --> 00:11:01.000 +This is a continuation of the + +00:11:01.000 --> 00:11:04.000 +previous slide - this part here is a copy + +00:11:04.000 --> 00:11:06.000 +of things that were in the previous slide... + +00:11:06.000 --> 00:11:12.000 +before 2024 beginners could + +00:11:12.000 --> 00:11:17.000 +open black boxes like this... + +00:11:17.000 --> 00:11:20.000 +they could try to see what was in the + +00:11:20.000 --> 00:11:24.000 +function cell of the symbol `foo'... + +00:11:24.000 --> 00:11:27.000 +and they would see something elegant and + +00:11:27.000 --> 00:11:29.000 +mind-blowing... and they would start to love + +00:11:29.000 --> 00:11:31.000 +Lisp immediately. + +00:11:31.000 --> 00:11:33.000 +Now what they get - what they see - + +00:11:33.000 --> 00:11:35.000 +is a tiny part of a very complex structure + +00:11:35.000 --> 00:11:39.000 +that is very powerful but that is + +00:11:39.000 --> 00:11:41.000 +very difficult to understand... + +00:11:41.000 --> 00:11:44.000 +and now our beginners are overwhelmed + +00:11:44.000 --> 00:11:46.000 +instead of mind-blown. + +00:11:46.000 --> 00:11:48.000 +Note that I said "black box" here. + +00:11:48.000 --> 00:11:52.000 +Let me explain the term. + +00:11:52.000 --> 00:11:57.000 +We can open what's inside of `foo'... + +00:11:57.000 --> 00:11:59.000 +we can open `foo' to see the contents of + +00:11:59.000 --> 00:12:02.000 +the symbol `foo', and we can try to see + +00:12:02.000 --> 00:12:06.000 +what's in the function cell of the + +00:12:06.000 --> 00:12:08.000 +symbol `foo'... + +00:12:08.000 --> 00:12:10.000 +so we can open the box, but what we get + +00:12:10.000 --> 00:12:13.000 +is something very difficult to understand, + +00:12:13.000 --> 00:12:17.000 +and so I'm going to say that + +00:12:17.000 --> 00:12:21.000 +when this happens that box is black. + +00:12:21.000 --> 00:12:23.000 +It is not totally black - we can open open it - + +00:12:23.000 --> 00:12:26.000 +but we don't understand what is going on there, + +00:12:26.000 --> 00:12:30.000 +so we declare that that is black. + +00:12:30.000 --> 00:12:33.000 +And... when these things started to happen + +00:12:33.000 --> 00:12:38.000 +_I_ was overwhelmed - + +00:12:38.000 --> 00:12:40.000 +and in this video I'm going to pretend + +00:12:40.000 --> 00:12:44.000 +that I was not the only person + +00:12:44.000 --> 00:12:46.000 +that was overwhelmed + +00:12:46.000 --> 00:12:50.000 +by these new structures + +00:12:50.000 --> 00:12:52.000 +that are not so elegant + +00:12:52.000 --> 00:12:54.000 +as the ones that we had before. + +00:12:54.000 --> 00:12:56.000 +Anyway... + +00:12:56.000 --> 00:20:38.000 + + diff --git a/2025/captions/emacsconf-2025-open-mic--open-session--participants--main.vtt b/2025/captions/emacsconf-2025-open-mic--open-session--participants--main.vtt new file mode 100644 index 00000000..04d1a62b --- /dev/null +++ b/2025/captions/emacsconf-2025-open-mic--open-session--participants--main.vtt @@ -0,0 +1,3058 @@ +WEBVTT + +00:00:00.000 --> 00:00:03.599 +All right, so yes, we have a little bit of time + +00:00:03.600 --> 00:00:05.719 +while we are waiting for the dev track to finish, + +00:00:05.720 --> 00:00:08.319 +and we could just declare this as a break, + +00:00:08.320 --> 00:00:12.039 +or if anyone's got any interesting last-minute stuff, + +00:00:12.040 --> 00:00:17.239 +you can come and share it here, + +00:00:17.240 --> 00:00:20.879 +where Karthik is also hanging out. + +00:00:20.880 --> 00:00:23.279 +I think every time I read one of your long blog posts, + +00:00:23.280 --> 00:00:25.559 +Karthik, I'm like, mm, life goals. + +00:00:25.560 --> 00:00:28.399 +Someday I want to write something with nice diagrams + +00:00:28.400 --> 00:00:31.279 +and, you know, deep Emacs interestingness. + +00:00:31.280 --> 00:00:34.919 +I have not yet gotten the hang of even using avy + +00:00:34.920 --> 00:00:38.119 +to nearly the extent that you do. + +00:00:38.120 --> 00:00:40.119 +But yes, I have, I have always looked + +00:00:40.120 --> 00:00:42.319 +at your diagrams very longingly + +00:00:42.320 --> 00:00:44.679 +and wondered how you make them. + +00:00:44.680 --> 00:00:51.239 +With a lot of sweat and cursing, unfortunately. + +00:00:51.240 --> 00:00:54.199 +It's all very nice. Yeah. + +00:00:54.200 --> 00:00:58.319 +And I, I, I've seen your interactive SVGs, + +00:00:58.320 --> 00:01:02.319 +which is just wizardry. I have no idea how you do that. + +00:01:02.320 --> 00:01:06.959 +You can hover over different elements in the SVG + +00:01:06.960 --> 00:01:08.759 +and do interesting things. + +00:01:08.760 --> 00:01:11.799 +Yeah, so it turns out if you just think of them as XML, + +00:01:11.800 --> 00:01:13.079 +which Emacs will let you + +00:01:13.080 --> 00:01:15.159 +because you can just control C, control C, + +00:01:15.160 --> 00:01:16.759 +and it'll switch back to text mode, right? + +00:01:16.760 --> 00:01:19.999 +Then you can be like, oh, yeah, I can work with this + +00:01:20.000 --> 00:01:23.559 +using the DOM Emacs list library. + +00:01:23.560 --> 00:01:28.479 +And then you can add title elements to it to get the hovers, + +00:01:28.480 --> 00:01:31.079 +or you can add hyperlinks. + +00:01:31.080 --> 00:01:35.039 +So in fact, the emacs-conf schedule + +00:01:35.040 --> 00:01:41.199 +is very naturally generated from emacs-lisp itself, + +00:01:41.200 --> 00:01:43.399 +because there was no way I was going to handle + +00:01:43.400 --> 00:01:45.719 +two track schedules by hand. + +00:01:45.720 --> 00:01:49.799 +And that's just SVG so that you can then have the hovers. + +00:01:49.800 --> 00:01:53.119 +The important thing is that when you're exporting it to HTML, + +00:01:53.120 --> 00:01:57.919 +it has to be an inline SVG to get the fancy behaviors. + +00:01:57.920 --> 00:02:02.799 +If you're linking it in as an image, then it doesn't work. + +00:02:02.800 --> 00:02:09.279 +It has to be inline. So for example, for my org mode, + +00:02:09.280 --> 00:02:14.079 +I have my exports for images checked first if it's an SVG. + +00:02:14.080 --> 00:02:15.959 +And unless I have an attribute + +00:02:15.960 --> 00:02:20.359 +on it that says, no, just link to it because it's large and not interactive, + +00:02:20.360 --> 00:02:22.759 +it actually inlines all of that markup + +00:02:22.760 --> 00:02:26.879 +into the exported HTML, if that makes sense. + +00:02:26.880 --> 00:02:34.279 +That does, that does make sense. + +00:02:34.280 --> 00:02:36.559 +It's a little less mysterious now. + +00:02:36.560 --> 00:02:40.319 +On the plus side, once it is in there as inline HTML, + +00:02:40.320 --> 00:02:42.519 +well, inline, you know, it's an inline markup, + +00:02:42.520 --> 00:02:44.359 +you can actually play around with it + +00:02:44.360 --> 00:03:01.919 +using JavaScript or CSS. That's really neat. + +00:03:01.920 --> 00:03:07.679 +I had a question about some other SVG wizardry I've seen you do. + +00:03:07.680 --> 00:03:09.759 +You have these SVGs that grow, right? + +00:03:09.760 --> 00:03:15.959 +Like they accumulate elements, almost like a slideshow. + +00:03:15.960 --> 00:03:20.199 +Am I remembering that correctly? Yeah, yeah, yeah. + +00:03:20.200 --> 00:03:22.399 +I started using that for one + +00:03:22.400 --> 00:03:24.519 +of the EmacsConf presentations. + +00:03:24.520 --> 00:03:26.559 +Well, the one EmacsConf presentation + +00:03:26.560 --> 00:03:27.919 +I've done in recent history, + +00:03:27.920 --> 00:03:31.639 +because it's nice to be able to add things gradually, right? + +00:03:31.640 --> 00:03:35.799 +Especially as you're giving a presentation. + +00:03:35.800 --> 00:03:38.719 +And that's also done with Emacs Lisp. + +00:03:38.720 --> 00:03:43.599 +What I do is, first I make the image, and then in Inkscape, + +00:03:43.600 --> 00:03:46.519 +I can group together the elements + +00:03:46.520 --> 00:03:49.639 +that I want to appear at the same time. + +00:03:49.640 --> 00:03:54.639 +And then I can use Emacs to, I think I just changed the, + +00:03:54.640 --> 00:04:01.039 +I just add some CSS to them to make them dimmer. + +00:04:01.040 --> 00:04:04.759 +and you just iterate through the different groups in that level, + +00:04:04.760 --> 00:04:09.839 +and you write out the intermediate SVG files, + +00:04:09.840 --> 00:04:12.279 +and then you can use Inkscape + +00:04:12.280 --> 00:04:14.839 +to convert them into PNGs if you want, + +00:04:14.840 --> 00:04:16.079 +like images of each step + +00:04:16.080 --> 00:04:18.719 +that are in PNG format instead of SVG. + +00:04:18.720 --> 00:04:20.359 +But the basic idea is you group + +00:04:20.360 --> 00:04:24.159 +the elements together that you want in one step, + +00:04:24.160 --> 00:04:25.879 +and then you can manipulate it + +00:04:25.880 --> 00:04:30.159 +using the Emacs DOM.EL library, + +00:04:30.160 --> 00:04:32.879 +because it's just an XML document. + +00:04:32.880 --> 00:04:38.719 +So you can say, all right, hide everything or have everything visible + +00:04:38.720 --> 00:04:43.159 +and then remove the last one or something like that, you know, iterated. + +00:04:43.160 --> 00:04:50.679 +Show them one at a time and then write your resulting document object model + +00:04:50.680 --> 00:05:05.919 +to a new file each step. Do you have, that makes sense. + +00:05:05.920 --> 00:05:09.159 +So do you just write the e-list, + +00:05:09.160 --> 00:05:12.079 +like is this on a case-by-case basis? + +00:05:12.080 --> 00:05:13.519 +Like every time you need to do this, + +00:05:13.520 --> 00:05:18.519 +do you write fresh e-list to step through the SVG this way? + +00:05:18.520 --> 00:05:22.479 +Or do you have some kind of package + +00:05:22.480 --> 00:05:27.159 +or library to do this more? + +00:05:27.160 --> 00:05:32.999 +Let me go see if this is the one. + +00:05:33.000 --> 00:05:39.839 +It's probably just buried in my config. + +00:05:39.840 --> 00:05:46.719 +If I do it again, I'm sure I will find another thing + +00:05:46.720 --> 00:05:51.159 +that I've completely forgotten about + +00:05:51.160 --> 00:05:56.399 +and therefore have to recode or fix or whatever. + +00:05:56.400 --> 00:06:03.199 +But let me go see. Can you see my screen? Yep. OK. + +00:06:03.200 --> 00:06:07.559 +So, oh, yeah, yeah, this one. Nice, I remember that one. + +00:06:07.560 --> 00:06:13.719 +OK, so we get this SVG, and then this animateSVGPaths + +00:06:13.720 --> 00:06:16.959 +is just a function I have. It takes the file name. + +00:06:16.960 --> 00:06:22.039 +It makes an output there. It adds one path back at a time. + +00:06:22.040 --> 00:06:25.839 +And it just creates a lot of these numbered frames. + +00:06:25.840 --> 00:06:27.639 +So as you can see here, + +00:06:27.640 --> 00:06:30.039 +I'm just saying, OK, take the whole thing. + +00:06:30.040 --> 00:06:34.479 +And then I think, yeah, maybe I said it like, + +00:06:34.480 --> 00:06:36.999 +you know, take the whole thing, + +00:06:37.000 --> 00:06:40.199 +make everything transparent, + +00:06:40.200 --> 00:06:45.079 +and then one at a time, make them opaque + +00:06:45.080 --> 00:06:50.079 +and save that, save that to the frame, to the image. + +00:06:50.080 --> 00:06:54.319 +So this theoretically is a somewhat reusable function + +00:06:54.320 --> 00:07:01.039 +that takes the SVG and just fills the directory with it. + +00:07:01.040 --> 00:07:03.399 +What's the order in which it reveals things? + +00:07:03.400 --> 00:07:12.919 +Top to bottom or bottom to top, it's whatever the SVG has. + +00:07:12.920 --> 00:07:15.959 +And so if you're grouping things together, + +00:07:15.960 --> 00:07:17.599 +you can rearrange things in Inkscape. + +00:07:17.600 --> 00:07:22.039 +If you've given them IDs, + +00:07:22.040 --> 00:07:25.119 +which I have another function for in Emacs list + +00:07:25.120 --> 00:07:26.919 +that just highlights something + +00:07:26.920 --> 00:07:28.439 +and lets me put an ID for it, + +00:07:28.440 --> 00:07:30.879 +then you can rearrange them yourself + +00:07:30.880 --> 00:07:32.319 +by looking at the markup, I guess. + +00:07:32.320 --> 00:07:35.319 +Or I think I actually have some code also + +00:07:35.320 --> 00:07:37.039 +that will rearrange the path + +00:07:37.040 --> 00:07:39.279 +based on a list of IDs that I give it. + +00:07:39.280 --> 00:07:42.759 +and sequence so this one is animating + +00:07:42.760 --> 00:07:44.319 +one element at a time here + +00:07:44.320 --> 00:07:47.319 +um it's kind of like interesting effect + +00:07:47.320 --> 00:07:49.039 +but for larger things like for this one + +00:07:49.040 --> 00:07:52.039 +i can split this up into groups + +00:07:52.040 --> 00:07:59.599 +because i don't want to necessarily animate them letter by letter and that one + +00:07:59.600 --> 00:08:03.319 +Oh yes, this is the function that I have + +00:08:03.320 --> 00:08:05.319 +for identifying the paths + +00:08:05.320 --> 00:08:08.959 +and it highlights it and then it asks me for a name. + +00:08:08.960 --> 00:08:11.359 +And this is the one that reorders it. + +00:08:11.360 --> 00:08:14.559 +So I can say, this is the sequence + +00:08:14.560 --> 00:08:19.279 +that I want it animated in. And it will, yeah, good. + +00:08:19.280 --> 00:08:23.399 +So you don't actually need Inkscape at all, right? + +00:08:23.400 --> 00:08:24.999 +Because you have an elisp function + +00:08:25.000 --> 00:08:28.399 +that will let you assign the order interactively. + +00:08:28.400 --> 00:08:34.599 +Yeah, so if you're doing just all the elements one after the other, + +00:08:34.600 --> 00:08:39.279 +Inkscape is helpful for combining the different shapes, + +00:08:39.280 --> 00:08:41.399 +well, breaking it apart, + +00:08:41.400 --> 00:08:44.719 +because when I get the PDF and I convert it, + +00:08:44.720 --> 00:08:48.559 +it's like one big element that has a very complex path. + +00:08:48.560 --> 00:08:52.479 +And if I want to animate it element by element, + +00:08:52.480 --> 00:08:53.959 +I have to break it apart + +00:08:53.960 --> 00:08:59.759 +and then recombine it so that, you know, so that this O looks like it's hollow + +00:08:59.760 --> 00:09:01.079 +instead of like a circle. + +00:09:01.080 --> 00:09:02.959 +So there's a little bit of Inkscape + +00:09:02.960 --> 00:09:04.879 +cleaning up before then, + +00:09:04.880 --> 00:09:08.439 +but I really dislike the mouse heavy stuff of Inkscape + +00:09:08.440 --> 00:09:12.119 +for assigning IDs and things like that. + +00:09:12.120 --> 00:09:13.999 +I haven't quite gotten the hang of it. + +00:09:14.000 --> 00:09:16.119 +So this is what it looks like + +00:09:16.120 --> 00:09:17.919 +before you group the elements together + +00:09:17.920 --> 00:09:20.039 +and you combine paths, + +00:09:20.040 --> 00:09:22.079 +which is what you have to do Inkscape for, + +00:09:22.080 --> 00:09:24.879 +because I can't make sense of the numbers in Emacs someday. + +00:09:24.880 --> 00:09:30.319 +So just combine, combine, combine. But once it's there, + +00:09:30.320 --> 00:09:32.719 +I don't like having to set the ID in this + +00:09:32.720 --> 00:09:34.879 +object properties on the right side, + +00:09:34.880 --> 00:09:36.959 +because there's a lot of clicking. + +00:09:36.960 --> 00:09:40.559 +press escape and tab and tab, it's not reliable. + +00:09:40.560 --> 00:09:42.599 +So that's why I have this function + +00:09:42.600 --> 00:09:46.559 +and it lets me identify the paths and animate them + +00:09:46.560 --> 00:09:50.999 +from within Emacs, because Emacs is a text editor. + +00:09:51.000 --> 00:09:55.279 +Yeah, in name only, but anyway. + +00:09:55.280 --> 00:10:02.679 +So the groups, if you've already assigned groups in Inkscape, + +00:10:02.680 --> 00:10:06.519 +Then when you run it through this function in Emacs, + +00:10:06.520 --> 00:10:09.159 +you can assign an ordering to the groups, + +00:10:09.160 --> 00:10:10.599 +the order in which it will be revealed. + +00:10:10.600 --> 00:10:15.039 +Yeah. What I did was I gave it all IDs. + +00:10:15.040 --> 00:10:17.599 +So I gave each group an ID. + +00:10:17.600 --> 00:10:25.999 +And then when I have the ID, I can say, you know, maybe when I group it, + +00:10:26.000 --> 00:10:28.319 +I'm doing it in a bit of a haphazard way, + +00:10:28.320 --> 00:10:30.279 +not grouping the first thing first, + +00:10:30.280 --> 00:10:32.279 +and then the second thing, and the third thing. + +00:10:32.280 --> 00:10:34.399 +So it's a bit of a mess. + +00:10:34.400 --> 00:10:38.119 +And this one just resorts it by, I think, + +00:10:38.120 --> 00:10:41.479 +just looking everything up, storing it, + +00:10:41.480 --> 00:10:45.039 +and then putting it back in order. + +00:10:45.040 --> 00:10:49.159 +I probably have the code for this somewhere, + +00:10:49.160 --> 00:10:52.039 +and if it's not, it's in the source code. + +00:10:52.040 --> 00:10:53.039 +There should be a source. + +00:10:53.040 --> 00:10:57.599 +Yes, so this is an org source for this post, + +00:10:57.600 --> 00:11:01.279 +and if it's not in there, then it should be in my config, + +00:11:01.280 --> 00:11:03.679 +the definition of this function. + +00:11:03.680 --> 00:11:11.439 +We are to pass. Here we are. Yeah, there you go. + +00:11:11.440 --> 00:11:17.639 +So there, it just, it takes it, it looks for it, + +00:11:17.640 --> 00:11:19.719 +and it adds it to the first layer. + +00:11:19.720 --> 00:11:29.399 +Okay, you've just explained the magic, + +00:11:29.400 --> 00:11:31.159 +which makes it less magical, + +00:11:31.160 --> 00:11:36.279 +but also something I could try. Yeah, this is interesting. + +00:11:36.280 --> 00:11:41.759 +Yeah, S2G is surprisingly powerful. Yeah, I know. + +00:11:41.760 --> 00:11:43.679 +I know it can do a lot more + +00:11:43.680 --> 00:11:46.559 +than what we typically use it for. + +00:11:46.560 --> 00:11:53.039 +So you also had this feature where, I think you used CSS, + +00:11:53.040 --> 00:11:56.599 +where if you mouse over something in the SVG, + +00:11:56.600 --> 00:11:58.839 +something is highlighted in your webpage. + +00:11:58.840 --> 00:12:04.799 +Oh yeah, yeah, yeah. Like in the organizer's notebook. + +00:12:04.800 --> 00:12:07.959 +So I have a draft schedule here. + +00:12:07.960 --> 00:12:10.679 +Yeah, we've been doing all this stuff live, that schedule, + +00:12:10.680 --> 00:12:16.239 +where if you have, let's pick someone's talk. + +00:12:16.240 --> 00:12:22.119 +Oh, yeah, highlight. + +00:12:22.120 --> 00:12:26.159 +I think, oh, maybe it's the other way around. + +00:12:26.160 --> 00:12:30.839 +I need to put this stuff here first. Oh yeah, okay. + +00:12:30.840 --> 00:12:33.959 +So you'll notice here how if I add some JavaScript, + +00:12:33.960 --> 00:12:35.999 +it takes a look at what's in the URL. + +00:12:36.000 --> 00:12:38.439 +And if so, then it can highlight a specific thing + +00:12:38.440 --> 00:12:41.679 +using just, maybe CSS might be it. + +00:12:41.680 --> 00:12:47.879 +Actually, I think it's JavaScript setting the CSS style on it. + +00:12:47.880 --> 00:12:51.279 +But yeah, you can play around with CSS. + +00:12:51.280 --> 00:12:53.639 +See, this one has a slightly darker, + +00:12:53.640 --> 00:12:59.519 +slightly thicker background. So SVGs are great for that. + +00:12:59.520 --> 00:13:01.479 +And if you inspect it, + +00:13:01.480 --> 00:13:03.199 +which I don't think I have shared here, + +00:13:03.200 --> 00:13:07.559 +but if you inspect it, I will share my inspect. + +00:13:07.560 --> 00:13:10.719 +I have too many windows open, + +00:13:10.720 --> 00:13:12.079 +so I don't want to share my whole thing. + +00:13:12.080 --> 00:13:19.074 +But one of these, oh, I don't even know which, how do I find, okay, + +00:13:19.075 --> 00:13:20.366 +it's the developer tools window. + +00:13:20.367 --> 00:13:25.324 +Do I even have developer tools? Oh, I can't see it. OK. + +00:13:25.325 --> 00:13:29.491 +If you inspect the page on the developer thingy, + +00:13:29.492 --> 00:13:38.116 +then it will show the SVG element. Yeah. + +00:13:38.117 --> 00:13:41.240 +And unfortunately, I can't share it easily right now. + +00:13:41.241 --> 00:13:46.616 +Maybe just say inspect. Oh, this is actually, I think, + +00:13:46.617 --> 00:13:55.116 +how also the individual talks have current ones, right? + +00:13:55.117 --> 00:14:00.439 +So I just have this image over here, + +00:14:00.440 --> 00:14:01.719 +and then you just have that one, + +00:14:01.720 --> 00:14:05.999 +that specific talk styled differently. + +00:14:06.000 --> 00:14:13.159 +How did you generate this SVG, + +00:14:13.160 --> 00:14:14.639 +the one showing the schedule? + +00:14:14.640 --> 00:14:24.439 +Oh, okay, okay. Emacs. Book, book, book, book. + +00:14:24.440 --> 00:14:29.599 +Emacs publish, I think. Let me share it. Emacs conf pub. + +00:14:29.600 --> 00:14:36.119 +One of these windows. Okay, let's see. + +00:14:36.120 --> 00:14:39.199 +Slow down, look at all the windows. + +00:14:39.200 --> 00:14:40.639 +Okay, I'm just gonna share the whole screen. + +00:14:40.640 --> 00:14:50.519 +Screen two, no, screen one. All right, and okay. + +00:14:50.520 --> 00:15:05.759 +I think this is the one. Is it sharing my screen? + +00:15:05.760 --> 00:15:08.079 +It is not sharing my screen. I'm going to try this again. + +00:15:08.080 --> 00:15:23.119 +Okay. All right. So, the schedule. The schedule. + +00:15:23.120 --> 00:15:24.559 +This is the actual function + +00:15:24.560 --> 00:15:28.319 +that creates the SVG rectangles for the talks. + +00:15:28.320 --> 00:15:35.279 +Oops. My screen share ended. Let me do that again. + +00:15:35.280 --> 00:15:41.239 +All right, and as you can see, + +00:15:41.240 --> 00:15:45.039 +it's just a little bit of math for the X, the Y, + +00:15:45.040 --> 00:15:48.199 +we color it differently + +00:15:48.200 --> 00:15:52.839 +depending on whether I'm making the schedule for the public view. + +00:15:52.840 --> 00:15:58.439 +So we just, you know, do we do developer, development talk + +00:15:58.440 --> 00:15:59.919 +or general talk as colors, + +00:15:59.920 --> 00:16:02.639 +or if I want to color it for the backstage view, + +00:16:02.640 --> 00:16:04.719 +I can keep track of the talk's status. + +00:16:04.720 --> 00:16:07.799 +Anyway, so SDG track takes the track + +00:16:07.800 --> 00:16:09.239 +and all the talk information, + +00:16:09.240 --> 00:16:11.559 +and it makes all the little rectangles. + +00:16:11.560 --> 00:16:15.599 +And this is the thing that adds a little hover + +00:16:15.600 --> 00:16:17.919 +for the times and titles as well. + +00:16:17.920 --> 00:16:22.639 +So, Emacs's API for dealing with this is actually pretty good. + +00:16:22.640 --> 00:16:27.559 +Oh, and of course, I have a hook here that modifies it. + +00:16:27.560 --> 00:16:30.119 +You can just run through a different function, + +00:16:30.120 --> 00:16:32.519 +different functions to tweak it. + +00:16:32.520 --> 00:16:36.399 +So I could say, okay, color it in case my time constraints are, + +00:16:36.400 --> 00:16:37.839 +you know, not being met. + +00:16:37.840 --> 00:16:40.959 +And then I can paint about this somewhere. + +00:16:40.960 --> 00:16:51.119 +And the nice thing about this + +00:16:51.120 --> 00:17:06.719 +is it's actually, it's, you can, hang on a second, let me do this carefully. + +00:17:06.720 --> 00:17:07.999 +All right, here you go. + +00:17:08.000 --> 00:17:13.479 +It's super nice to be able to refer to it within Emacs itself + +00:17:13.480 --> 00:17:15.839 +because Emacs has SVG support. + +00:17:15.840 --> 00:17:19.679 +So this is, for example, the organizer view + +00:17:19.680 --> 00:17:24.039 +inside an org mode file. And it just has all those SVGs. + +00:17:24.040 --> 00:17:25.599 +It don't have the hover things, + +00:17:25.600 --> 00:17:27.399 +because it's just an image in it. + +00:17:27.400 --> 00:17:37.759 +But yeah, SVGs, Emacs, awesome. Oh, that's very cool. + +00:17:37.760 --> 00:17:40.719 +You're actually drawing the rectangles from scratch. + +00:17:40.720 --> 00:17:44.999 +It took a little bit of figuring out, + +00:17:45.000 --> 00:17:46.959 +especially since I realized + +00:17:46.960 --> 00:17:49.679 +I wanted horizontal on the wiki pages + +00:17:49.680 --> 00:17:51.359 +so that it fits on people's screens, + +00:17:51.360 --> 00:17:56.039 +but I wanted vertical in my organized review + +00:17:56.040 --> 00:18:09.199 +so that I don't have to keep tilting my head sideways. + +00:18:09.200 --> 00:18:12.359 +and this is the code for that. + +00:18:12.360 --> 00:18:19.439 +See, I'm just directly adding G nodes for groups + +00:18:19.440 --> 00:18:23.199 +or A nodes for the hyperlinks and rep as well. + +00:18:23.200 --> 00:18:27.319 +I think the SVG library also has functions + +00:18:27.320 --> 00:18:31.079 +for adding rectangles and things like that, + +00:18:31.080 --> 00:18:32.359 +but sometimes I vaguely remember + +00:18:32.360 --> 00:18:34.999 +sometimes you can't return the node that I'm expecting. + +00:18:35.000 --> 00:18:40.559 +So, it's okay to just use the DOM functions directly. + +00:18:40.560 --> 00:18:46.079 +And then the whole thing gets SVG printed afterwards. + +00:18:46.080 --> 00:18:54.079 +So I can just say SVG printed, and then it's good to go. + +00:18:54.080 --> 00:18:57.719 +Let me see. Actually, do I have SVG? + +00:18:57.720 --> 00:19:05.679 +Let's schedule for track SVG. + +00:19:05.680 --> 00:19:08.799 +It's a shame that you can't visually interact + +00:19:08.800 --> 00:19:11.559 +with parts of an SVG in Emacs the way you can in Emacs. + +00:19:11.560 --> 00:19:16.799 +Oh, some people have some interesting experiments with that. + +00:19:16.800 --> 00:19:18.839 +I haven't dug into it much, + +00:19:18.840 --> 00:19:21.639 +but people have figured out how to use the mouse events + +00:19:21.640 --> 00:19:26.199 +and then figure out what the, like there's LEC draw, right? + +00:19:26.200 --> 00:19:30.159 +So lecdraw is a package that lets you draw SVGs + +00:19:30.160 --> 00:19:33.039 +and you can drag things and whatever. So that's very cool. + +00:19:33.040 --> 00:19:37.159 +And there's also an org related package + +00:19:37.160 --> 00:19:43.439 +that lets you visualize your schedule as boxes. + +00:19:43.440 --> 00:19:45.639 +I'd like, yeah, that's a thing also. + +00:19:45.640 --> 00:19:46.919 +So people have experimented + +00:19:46.920 --> 00:19:49.439 +with mouse interaction and it's cool, + +00:19:49.440 --> 00:19:51.919 +but I haven't had the brain space to do that yet, + +00:19:51.920 --> 00:19:55.479 +but it would be nice. Yeah, you're right. + +00:19:55.480 --> 00:19:58.079 +I remember using easy draw + +00:19:58.080 --> 00:20:01.999 +and being surprised at what it can do. + +00:20:02.000 --> 00:20:05.119 +The only thing I think I discovered + +00:20:05.120 --> 00:20:10.279 +is that it ends up creating lots of new SVGs, + +00:20:10.280 --> 00:20:13.079 +kind of the way that you do + +00:20:13.080 --> 00:20:14.959 +when you show elements one by one, + +00:20:14.960 --> 00:20:19.079 +you are essentially creating one SVG for each state, + +00:20:19.080 --> 00:20:24.439 +one full SVG for each intermediate state of the presentation, let's say. + +00:20:24.440 --> 00:20:26.479 +That's kind of what ELEasyDraw does. + +00:20:26.480 --> 00:20:30.839 +And I thought that's not good for performance. + +00:20:30.840 --> 00:20:33.039 +And it is kind of on the slow side, + +00:20:33.040 --> 00:20:37.359 +if you compare it to like Inkscape or anything else. + +00:20:37.360 --> 00:20:40.959 +But yeah, what it can do is pretty amazing. + +00:20:40.960 --> 00:20:44.559 +you can dynamically modify an SVG object, + +00:20:44.560 --> 00:20:48.399 +and it will automatically get updated in Emacs, + +00:20:48.400 --> 00:20:52.519 +which is a technique that I use a lot in FFNS in subbed. + +00:20:52.520 --> 00:20:57.559 +So for example, if I have waveform show all in this, + +00:20:57.560 --> 00:21:03.239 +it will, like, it's very easy to just move one element, for example, + +00:21:03.240 --> 00:21:08.519 +or make an element larger or smaller. + +00:21:08.520 --> 00:21:13.279 +And that's the... It might be pretty efficient, I don't know, + +00:21:13.280 --> 00:21:20.199 +but I'm certainly not like writing it to disk each time and reloading it. + +00:21:20.200 --> 00:21:25.519 +Eric and I demoed in 2020 EmacsConf for Dungeon Mode Works, + +00:21:25.520 --> 00:21:29.399 +where we demonstrated, you know, showing parts of the map + +00:21:29.400 --> 00:21:31.649 +and then, you know, different characters + +00:21:31.650 --> 00:21:33.839 +have different abilities that show, + +00:21:33.840 --> 00:21:36.599 +that allow you to see different dungeon features. + +00:21:36.600 --> 00:21:38.799 +And then if your last character, + +00:21:38.800 --> 00:21:42.719 +you know, of that class or race dies, + +00:21:42.720 --> 00:21:44.479 +then you suddenly can't see + +00:21:44.480 --> 00:21:46.759 +secret doors or whatever anymore. + +00:21:46.760 --> 00:21:48.719 +And so just make that disappear + +00:21:48.720 --> 00:21:50.559 +between one turn and the next + +00:21:50.560 --> 00:21:54.919 +is just working with just simply update the SVG + +00:21:54.920 --> 00:21:57.679 +and there goes the screen. No, no, no bus, no bus. + +00:21:57.680 --> 00:22:01.559 +It's pretty awesome. So this is an example + +00:22:01.560 --> 00:22:07.159 +of how I'm using it to kind of show where we are in the, in the track. + +00:22:07.160 --> 00:22:09.639 +And then here's mouse, mouse interaction, right? + +00:22:09.640 --> 00:22:21.359 +I can change my timestamp right from there. Which is fine. + +00:22:21.360 --> 00:22:28.079 +So, I'm curious how this works exactly. + +00:22:28.080 --> 00:22:31.799 +To effect any kind of change in the SVG, + +00:22:31.800 --> 00:22:36.239 +you have to use the DOM library, right? Yes. + +00:22:36.240 --> 00:22:39.319 +Okay, so, but that means that it's going to be, + +00:22:39.320 --> 00:22:43.639 +anytime you make a change, it's going to read in the XML, + +00:22:43.640 --> 00:22:47.999 +convert it to an Elisp DOM, right? + +00:22:48.000 --> 00:22:50.919 +And then you modify that tree. + +00:22:50.920 --> 00:22:55.839 +Yeah, you keep the DOM, like, well, in this case, for example, + +00:22:55.840 --> 00:23:00.879 +I'm actually constructing it using Emacs list objects directly. + +00:23:00.880 --> 00:23:02.959 +If you were working with an external SVG, + +00:23:02.960 --> 00:23:05.199 +you would parse it first, yes, + +00:23:05.200 --> 00:23:07.919 +using XML parse file or something like that. + +00:23:07.920 --> 00:23:11.999 +and then you would have it in memory. + +00:23:12.000 --> 00:23:14.559 +When you insert the image, + +00:23:14.560 --> 00:23:18.519 +you insert the list document object model that you have, + +00:23:18.520 --> 00:23:21.199 +and then any changes you make to that document object model + +00:23:21.200 --> 00:23:25.519 +automatically get updated in the image somehow. + +00:23:25.520 --> 00:23:33.559 +Oh, that's fantastic. Yeah. Yeah. I'll show you the code. Yeah. + +00:23:33.560 --> 00:23:38.079 +So I was under the impression + +00:23:38.080 --> 00:23:40.096 +that there's a round trip to XML involved + +00:23:40.097 --> 00:23:42.298 +to do anything like to go from displayed + +00:23:42.299 --> 00:23:46.079 +to in-memory to in-memory modified back + +00:23:46.080 --> 00:23:47.839 +to display all around trip. + +00:23:47.840 --> 00:23:52.959 +Yeah. So let me see where's my thing that changes it. + +00:23:52.960 --> 00:23:59.079 +So when it's the time. + +00:23:59.080 --> 00:24:06.999 +It's probably some kind of hook that I'm listening to here. + +00:24:07.000 --> 00:24:12.879 +Playback position hook. Oh, it's this update current bar. + +00:24:12.880 --> 00:24:15.999 +All right, so what update current bar does + +00:24:16.000 --> 00:24:19.319 +is it moves the bar to the right place. + +00:24:19.320 --> 00:24:21.159 +And you see here how this SVG, + +00:24:21.160 --> 00:24:24.719 +I'm actually just reading it off the text property + +00:24:24.720 --> 00:24:28.279 +so that I know which one is the current one in the overlay. + +00:24:28.280 --> 00:24:31.399 +I remove the old one, just the element. + +00:24:31.400 --> 00:24:34.279 +I don't have to mess around with the image. + +00:24:34.280 --> 00:24:35.599 +I removed the old one for some reason, + +00:24:35.600 --> 00:24:36.839 +just to make sure, I guess. + +00:24:36.840 --> 00:24:38.879 +You can actually just update the attribute on it. + +00:24:38.880 --> 00:24:42.919 +Oh, I think this is just so that I don't have to worry + +00:24:42.920 --> 00:24:45.519 +about whether there is one or there isn't. + +00:24:45.520 --> 00:24:47.959 +And then I add a bar at the right position + +00:24:47.960 --> 00:24:52.519 +and then it makes that little animated sweeping thingy. + +00:24:52.520 --> 00:24:55.959 +So you see how I'm not recreating the SVG at this point. + +00:24:55.960 --> 00:25:02.559 +I'm just getting it from the overlay. + +00:25:02.560 --> 00:25:07.479 +Yeah, that's very interesting. I wonder what it's doing. + +00:25:07.480 --> 00:25:09.919 +what it's actually doing under the hood when you run SVG removal. + +00:25:09.920 --> 00:25:19.439 +Yeah, I don't know, too. I think it's RSVG is tied + +00:25:19.440 --> 00:25:32.039 +into the display engine, so to speak. Yeah, that it is. + +00:25:32.040 --> 00:25:33.919 +But RSVG, the library, + +00:25:33.920 --> 00:25:39.199 +can only deal with actual SVGs, right, like XML SVGs, + +00:25:39.200 --> 00:25:43.119 +but we're dealing with the ELISP DOM of an SVG. + +00:25:43.120 --> 00:25:47.559 +So the display engine can re-enter the LISP. + +00:25:47.560 --> 00:25:49.519 +I do know that the display engine + +00:25:49.520 --> 00:25:51.839 +can re-enter the LISP engine, + +00:25:51.840 --> 00:25:53.599 +so I think that may be the answer. + +00:25:53.600 --> 00:25:58.759 +Yeah, you can just SVG insert image the object itself. + +00:25:58.760 --> 00:26:01.879 +So here, for example, SVG create just creates, + +00:26:01.880 --> 00:26:04.239 +it actually just creates a DOM model. + +00:26:04.240 --> 00:26:06.599 +So this is Lisp, and it's not, + +00:26:06.600 --> 00:26:09.079 +it doesn't get printed to string representation or anything. + +00:26:09.080 --> 00:26:13.239 +And then you can SVG insert image, + +00:26:13.240 --> 00:26:15.159 +or you can set the display and, you know, + +00:26:15.160 --> 00:26:20.719 +and use pass it like as an SVG image. + +00:26:20.720 --> 00:26:22.599 +SVG image gives you an image object + +00:26:22.600 --> 00:26:24.679 +if you want to do the like the regular + +00:26:24.680 --> 00:26:31.199 +sort of display thingy. Actually, that one says it turns it + +00:26:31.200 --> 00:26:34.399 +into a string representation. + +00:26:34.400 --> 00:26:36.719 +Or at least maybe that's just how it gets retrained. + +00:26:36.720 --> 00:26:38.559 +Anyhow, some kind of magic happens, + +00:26:38.560 --> 00:26:39.919 +but I don't have to worry about it. + +00:26:39.920 --> 00:26:44.119 +It just stays on my side. Yeah, but I was thinking about it + +00:26:44.120 --> 00:26:49.599 +because I expect that if it's converting to XML all the time, every time you make a change, + +00:26:49.600 --> 00:26:52.119 +then that's going to be the bottleneck + +00:26:52.120 --> 00:26:58.119 +for any kind of heavy interactive SVG editing or modification in Emacs. + +00:26:58.120 --> 00:27:01.199 +The kind that ELEasyDraw does. + +00:27:01.200 --> 00:27:03.839 +But maybe if we make it compelling enough, + +00:27:03.840 --> 00:27:07.279 +then the folks upstream can say, all right, + +00:27:07.280 --> 00:27:10.239 +like the way that JSON got a lot faster. + +00:27:10.240 --> 00:27:13.359 +Who knows? Maybe we can get that to be faster too. Yeah. + +00:27:13.360 --> 00:27:19.199 +I see a lot of potential for better UIs in Emacs + +00:27:19.200 --> 00:27:22.719 +with using SVGs. Yeah. + +00:27:22.720 --> 00:27:26.319 +Nicolas Rougier has all those experiments, right? + +00:27:26.320 --> 00:27:30.159 +Yeah, but all of those, I think, are bound by the limitations + +00:27:30.160 --> 00:27:33.599 +of how deeply SVGs are embedded in the display engine, + +00:27:33.600 --> 00:27:36.359 +because that's kind of what we're discussing. + +00:27:36.360 --> 00:27:38.479 +We want to avoid going to XML, + +00:27:38.480 --> 00:27:41.479 +I mean, going from XML to Elisp DOM + +00:27:41.480 --> 00:27:44.839 +to modified Elisp DOM back to XML. + +00:27:44.840 --> 00:27:50.079 +We want to avoid that round trip. Yeah, for sure. + +00:27:50.080 --> 00:28:04.799 +Or make that as fast as possible, yeah. + +00:28:04.800 --> 00:28:11.919 +Does anyone else have anything they want to share? + +00:28:11.920 --> 00:28:13.919 +I've always got stuff I can share, + +00:28:13.920 --> 00:28:17.639 +but I pretty happily defer. I've already seen what I made. + +00:28:17.640 --> 00:28:28.759 +Karthik? Oh, I'm a fly on a wall here. I'm not. + +00:28:28.760 --> 00:28:32.199 +Okay. I didn't come in with the intent to share anything. + +00:28:32.200 --> 00:28:34.239 +Yeah. How about you, Sacha? + +00:28:34.240 --> 00:28:37.999 +Do you have other stuff you haven't shown off recently? + +00:28:38.000 --> 00:28:39.839 +Aside from all the panicking + +00:28:39.840 --> 00:28:42.599 +about getting EmacsConf together this year? + +00:28:42.600 --> 00:28:45.399 +I just wanted to bring it up. + +00:28:45.400 --> 00:28:50.359 +Yeah, let's see, what do I have in my recent, like, fiddled with? + +00:28:50.360 --> 00:28:53.999 +So I have a project called... + +00:28:54.000 --> 00:28:56.879 +I have a project called Ufta, which is a little bit fun. + +00:28:56.880 --> 00:29:00.159 +Let me pull it up here before I share. + +00:29:00.160 --> 00:29:08.959 +You can see my messy, messy desktop. Okay, there it is. + +00:29:08.960 --> 00:29:21.519 +And that's supposed to want a shell. Probably that one. + +00:29:21.520 --> 00:29:29.119 +And we'll just bootroot. keeping in mind that graphics + +00:29:29.120 --> 00:29:33.399 +is going to end in about five minutes. Ooh, perfect. + +00:29:33.400 --> 00:29:38.959 +That'll keep me from from being my normal long-winded self. + +00:29:38.960 --> 00:29:47.239 +Have you already made contact with Emmanuel? I was not. + +00:29:47.240 --> 00:29:50.159 +Okay, I'm going to quickly do a check in. + +00:29:50.160 --> 00:30:00.119 +Okay, sounds good. Did you hear back from him? + +00:30:00.120 --> 00:30:01.039 +Assume that's a yes. + +00:30:01.040 --> 00:30:04.399 +All right, I'll go ahead and share screen here + +00:30:04.400 --> 00:30:08.879 +and just take a look, a very brief look at this. + +00:30:08.880 --> 00:30:16.719 +Assuming I can present. I had a question for Sacha. + +00:30:16.720 --> 00:30:22.399 +I had a question for Sacha and you, Corbin. + +00:30:22.400 --> 00:30:28.759 +Hello. Yeah, you're good. Go for it. Yeah, yeah. + +00:30:28.760 --> 00:30:33.319 +So in past years, in the EmacsConf, + +00:30:33.320 --> 00:30:36.799 +there was a talk by someone, + +00:30:36.800 --> 00:30:40.999 +usually John Wheatley, or I think Philip last year, + +00:30:41.000 --> 00:30:44.079 +about new developments in Emacs. + +00:30:44.080 --> 00:30:48.679 +Yes, and that is kind of at the whim + +00:30:48.680 --> 00:30:50.079 +of the Emacs developers, + +00:30:50.080 --> 00:30:56.919 +whether that is included in the in the conference. + +00:30:56.920 --> 00:30:59.679 +It's kind of up to the, you know, how busy folks are + +00:30:59.680 --> 00:31:02.879 +and whether somebody can follow up the time to prepare it. + +00:31:02.880 --> 00:31:07.119 +I see. Yeah, I noticed that there wasn't one for this year. + +00:31:07.120 --> 00:31:09.999 +And I know of at least one improvement + +00:31:10.000 --> 00:31:12.359 +or one change to Emacs. + +00:31:12.360 --> 00:31:17.559 +It's small, but I'm guessing it's very crucial + +00:31:17.560 --> 00:31:20.359 +for a certain class of Emacs users. + +00:31:20.360 --> 00:31:24.239 +And I can talk about that, just that one thing. + +00:31:24.240 --> 00:31:29.719 +But you can, you can, you can go right. + +00:31:29.720 --> 00:31:32.599 +So I can't share anything and we've got about one minute. + +00:31:32.600 --> 00:31:39.719 +So have that. Okay. Um, so the change is that, uh, + +00:31:39.720 --> 00:31:41.919 +in the development version of Emacs, + +00:31:41.920 --> 00:31:46.919 +sorry, child frames are now supported + +00:31:46.920 --> 00:31:53.679 +in terminal in the terminal. + +00:31:53.680 --> 00:31:56.519 +And I suspect that not many people know about it yet, + +00:31:56.520 --> 00:32:03.839 +but basically this means something like Corfu is going to work fine + +00:32:03.840 --> 00:32:05.479 +when you're running Emacs in a terminal, + +00:32:05.480 --> 00:32:14.159 +as well as pause frames or anything that shows like a little pop-up window + +00:32:14.160 --> 00:32:19.159 +that previously did not work in Terminal Emacs. + +00:32:19.160 --> 00:32:27.519 +That's it. That's the update. Cool. + +00:32:27.520 --> 00:32:29.359 +Okay, there I have a share screen button. + +00:32:29.360 --> 00:32:31.999 +We'll see if I think we're just about to cut away, + +00:32:32.000 --> 00:32:34.919 +but I'll go ahead and see if I can get this going. + +00:32:34.920 --> 00:32:36.679 +I'll just share my whole screen + +00:32:36.680 --> 00:32:39.599 +and this will be a little ugly as it comes in. + +00:32:39.600 --> 00:32:44.359 +So this is a project that I think is a little bit fun. + +00:32:44.360 --> 00:32:47.519 +It's called Oopda. And basically what this does, + +00:32:47.520 --> 00:32:49.759 +you can see it on my source site, + +00:32:49.760 --> 00:32:55.159 +that's sr.ht tilde mplscorewin slash Oopda. + +00:32:55.160 --> 00:32:59.599 +O-F-D-A, and this is a very simple approach + +00:32:59.600 --> 00:33:04.639 +to using an org file as a replacement for SQLite. + +00:33:04.640 --> 00:33:12.239 +It's very simple, but it does support like a dot style path and notation. + +00:33:12.240 --> 00:33:16.319 +So you can get at deeply nested data + +00:33:16.320 --> 00:33:19.159 +and just gives a little, + +00:33:19.160 --> 00:33:24.159 +there's a shell script wrapper that comes with it. + +00:33:24.160 --> 00:33:26.319 +All right. + +00:33:26.320 --> 00:33:32.759 +Theoretically, this is the Q&A for the graphics talk. + +00:33:32.760 --> 00:33:38.079 +Oops, I have to unmute over here. Sorry. + +00:33:38.080 --> 00:33:52.999 +All right, I had a little audio bleed through, + +00:33:53.000 --> 00:34:02.399 +my apologies, can you still hear me? + +00:34:02.400 --> 00:34:03.719 +All right, I'm gonna guess, + +00:34:03.720 --> 00:34:05.759 +because I still see us live on the screen + +00:34:05.760 --> 00:34:12.839 +that we're still live. All right, so I'll just press on. + +00:34:12.840 --> 00:34:18.599 +So what we're looking at here is a project called Upta. + +00:34:18.600 --> 00:34:21.239 +Here's the Emacs Lisp source port. + +00:34:21.240 --> 00:34:23.199 +You can see it's not real impressive + +00:34:23.200 --> 00:34:24.759 +even with all of its boilerplate. + +00:34:24.760 --> 00:34:27.399 +It's under 200 lines of code. + +00:34:27.400 --> 00:34:30.599 +And this is kind of a proof of concept, + +00:34:30.600 --> 00:34:34.999 +giving us the ability to use a org.org file + +00:34:35.000 --> 00:34:38.279 +as a flat file database. The intention here is to get + +00:34:38.280 --> 00:34:40.439 +a kind of transition from SQLite, + +00:34:40.440 --> 00:34:44.239 +which is using a flat text file as a database, + +00:34:44.240 --> 00:34:48.879 +to being able to have more of a literate database + +00:34:48.880 --> 00:34:52.759 +where we can intermix documentation about the data + +00:34:52.760 --> 00:34:54.119 +with the data itself, + +00:34:54.120 --> 00:34:57.599 +and then by giving a path on the command line. + +00:34:57.600 --> 00:35:02.199 +I'll go back to the README, just take a look at that. + +00:35:02.200 --> 00:35:05.239 +And you can see there's a couple of kind of examples here + +00:35:05.240 --> 00:35:11.319 +where we're, here we would be querying a path. + +00:35:11.320 --> 00:35:15.479 +We can also provide a value + +00:35:15.480 --> 00:35:20.039 +and that'll set data into the file. + +00:35:20.040 --> 00:35:23.119 +It also has an optional first parameter + +00:35:23.120 --> 00:35:26.319 +to specify the specific org file by default. + +00:35:26.320 --> 00:35:29.399 +It looks for a file called data.org. + +00:35:29.400 --> 00:35:34.279 +And of course that can be used inside Emacs as well, + +00:35:34.280 --> 00:35:37.799 +although the value of that may be a little bit limited + +00:35:37.800 --> 00:35:39.799 +compared to more sophisticated + +00:35:39.800 --> 00:35:41.799 +technologies like org-element. + +00:35:41.800 --> 00:35:43.839 +This is not an implementation + +00:35:43.840 --> 00:35:47.159 +that mirrors all of org-element + +00:35:47.160 --> 00:35:50.079 +or any of the more complex functionality of org. + +00:35:50.080 --> 00:35:52.919 +It's really as simple as possible proof of concept + +00:35:52.920 --> 00:35:57.679 +to just to be able to kind of work + +00:35:57.680 --> 00:35:59.559 +with the data inside an org file + +00:35:59.560 --> 00:36:01.679 +and get it back out on the command line. + +00:36:01.680 --> 00:36:07.839 +So we'll see if we can make it work here. + +00:36:07.840 --> 00:36:13.479 +Corwin, could you increase the font size? + +00:36:13.480 --> 00:36:27.199 +I surely will. All right. How's that? + +00:36:27.200 --> 00:36:30.999 +That's my picture. Yeah. Okay. Cool. + +00:36:31.000 --> 00:36:39.159 +So, let's see if we do have a, well, we can probably make it. + +00:36:39.160 --> 00:37:00.839 +Let's do this. + +00:37:00.840 --> 00:37:05.159 +All right, and then in theory, this just works. + +00:37:05.160 --> 00:37:42.199 +So we'll cut. + +00:37:42.200 --> 00:37:45.840 +So we'll just create a data file called data.org. + +00:37:45.880 --> 00:37:50.239 +Make sure that works. Looks reasonable. + +00:37:50.240 --> 00:38:13.079 +Let's try adding some data to it. Hmm, not so happy. + +00:38:13.080 --> 00:38:17.559 +Okay, let's try it the hard way. + +00:38:17.560 --> 00:38:21.079 +I'll come back over here to my usage + +00:38:21.080 --> 00:38:23.199 +and we'll just try running it. + +00:38:23.200 --> 00:38:37.319 +Is Emacs, is finding Emacs really the issue? + +00:38:37.320 --> 00:38:41.199 +It seems to me it's not, it's not liking my path. + +00:38:41.200 --> 00:38:44.079 +It's not finding out that I do EO and PWD. + +00:38:44.080 --> 00:38:49.519 +It wants it to be on the log. I see. + +00:38:49.520 --> 00:38:54.119 +So I may have to even mess with that further, + +00:38:54.120 --> 00:38:55.359 +but we'll just try it. + +00:38:55.360 --> 00:39:04.839 +So this should retrieve the value if it works. + +00:39:04.840 --> 00:39:17.119 +Oh, and let's take a take a simple + +00:39:17.120 --> 00:39:47.319 +Yeah, add-to-list takes a symbol. + +00:39:47.320 --> 00:39:52.639 +We're going to have issues with bash quoting, + +00:39:52.640 --> 00:39:58.559 +so you should escape the quoting side. + +00:39:58.560 --> 00:40:27.719 +Gotcha. You're kidding. + +00:40:27.720 --> 00:40:36.560 +I'm not letting go. Whoa. That might work. + +00:40:36.600 --> 00:41:02.159 +I got my parents right. Never demo live. How exciting. OK. + +00:41:02.160 --> 00:41:13.079 +Without batch, though, we may not get our output. OK. + +00:41:13.080 --> 00:41:20.320 +Well, that's as far as I'm going to take it. + +00:41:20.400 --> 00:41:21.959 +I should have prepped a demo environment. + +00:41:21.960 --> 00:41:26.879 +I wasn't really prepared to demo. No worries. + +00:41:26.880 --> 00:41:30.719 +Couple of questions about this feature. + +00:41:30.720 --> 00:41:37.799 +The first question is, do you use it? I do use it, yeah. + +00:41:37.800 --> 00:41:41.279 +I should have gotten onto the environment + +00:41:41.280 --> 00:41:45.599 +where I'm using it. It's a little messy. + +00:41:45.600 --> 00:41:47.079 +It gets into another project + +00:41:47.080 --> 00:41:48.839 +that's way too complicated to get into. + +00:41:48.840 --> 00:41:53.079 +Yeah, but what kinds of things do you use it for? + +00:41:53.080 --> 00:41:56.999 +It's sort of hard to answer + +00:41:57.000 --> 00:41:59.159 +that without getting into my other project, + +00:41:59.160 --> 00:42:02.919 +but essentially I've got a web development tool chain + +00:42:02.920 --> 00:42:05.759 +that is kind of a web-based REPL + +00:42:05.760 --> 00:42:10.919 +that is kind of a literate compute environment, if you will, + +00:42:10.920 --> 00:42:13.119 +allowing me to use a bunch of virtual machines + +00:42:13.120 --> 00:42:19.079 +as one big computer. That project is called Ghost Wheel. + +00:42:19.080 --> 00:42:23.719 +And so in order to show off the homepage, + +00:42:23.720 --> 00:42:30.359 +So on this page, you can see the list of machines, + +00:42:30.360 --> 00:42:34.759 +and then you'll also see there's these state indicators. + +00:42:34.760 --> 00:42:38.439 +And right now, as a matter of fact, + +00:42:38.440 --> 00:42:41.239 +what I've been hacking on + +00:42:41.240 --> 00:42:44.879 +is trying to get support for org tables. + +00:42:44.880 --> 00:42:48.759 +Right now, I support only changing all of the data + +00:42:48.760 --> 00:42:51.959 +within some heading, subheading, or whatever. + +00:42:51.960 --> 00:42:55.079 +What I'd like to be able to do is specify, + +00:42:55.080 --> 00:43:01.079 +using org table fm syntax, the particular row column. + +00:43:01.080 --> 00:43:03.839 +So find a particular named table, + +00:43:03.840 --> 00:43:06.559 +find a particular row, you know, + +00:43:06.560 --> 00:43:08.639 +column one, you know, row two, column one, + +00:43:08.640 --> 00:43:11.919 +and then set the value from the command. + +00:43:11.920 --> 00:43:18.359 +Currently, I just use it for very simple stuff. + +00:43:18.360 --> 00:43:20.519 +I don't really want to show that off. + +00:43:20.520 --> 00:43:23.599 +I've got another page that lists all of the DNS names + +00:43:23.600 --> 00:43:26.159 +that are associated that are hosted on Ghostwheel. + +00:43:26.160 --> 00:43:29.319 +And so I use that to add items to the list. + +00:43:29.320 --> 00:43:40.439 +Does it make sense? Yeah, it sounds useful. + +00:43:40.440 --> 00:43:47.279 +So one thing that I would like, + +00:43:47.280 --> 00:43:51.479 +I guess it's easy enough to write, + +00:43:51.480 --> 00:43:58.799 +but is a tool exactly like this + +00:43:58.800 --> 00:44:03.839 +where I can query my org files from the command line? + +00:44:03.840 --> 00:44:06.879 +Yeah, that's exactly what it says. + +00:44:06.880 --> 00:44:14.599 +Yeah, but it's going to be more + +00:44:14.600 --> 00:44:23.319 +like a database query where, you know, I say select, select all headings where, you know, + +00:44:23.320 --> 00:44:27.279 +that contain this string or that have this tag, right? + +00:44:27.280 --> 00:44:38.519 +The kinds of things that you can do with org-ql from outside, from inside Emacs, right? + +00:44:38.520 --> 00:44:41.119 +To be able to do those from the command line with, + +00:44:41.120 --> 00:44:48.279 +I'm going to invoke SQL here, like SQL SELECT statements, + +00:44:48.280 --> 00:44:50.519 +but it doesn't have to be that syntax, right? + +00:44:50.520 --> 00:44:52.519 +Just that capability. + +00:44:52.520 --> 00:44:57.079 +Yeah, I can see that being useful as a command line tool. + +00:44:57.080 --> 00:44:59.399 +And I don't even care about write, + +00:44:59.400 --> 00:45:02.399 +like the ability to write or manipulate the file. + +00:45:02.400 --> 00:45:11.799 +Just query. the command line that sounds yeah yeah exactly + +00:45:11.800 --> 00:45:15.159 +to be able to dig a piece of data out of an org file as well + +00:45:15.160 --> 00:45:18.359 +for my purpose it's very useful to be able to replace it + +00:45:18.360 --> 00:45:20.999 +because then i can deal with submit the form you know + +00:45:21.000 --> 00:45:23.999 +and that might be like a sign up form + +00:45:24.000 --> 00:45:29.159 +and then i just add the user add up an entry into the org file + +00:45:29.160 --> 00:45:35.239 +for that user right what it doesn't do is a relational data + +00:45:35.240 --> 00:45:40.559 +So everything, it's essentially a document data store. + +00:45:40.560 --> 00:45:53.959 +Like a Mongo kind of. True. So over on IRC, ScrewLisp asks, + +00:45:53.960 --> 00:45:57.279 +what does it mean to query an ARC file? + +00:45:57.280 --> 00:46:01.679 +Is the data in a table? Is it in an ELISP nested list view + +00:46:01.680 --> 00:46:06.559 +of a table that has a name in ARC? + +00:46:06.560 --> 00:46:10.639 +And my answer to that is that if you ever used RQL, + +00:46:10.640 --> 00:46:14.199 +written by Alpha Papa, + +00:46:14.200 --> 00:46:18.039 +then that's the kind of thing I'm talking about. + +00:46:18.040 --> 00:46:23.119 +So, you query based on one of a set of attributes. + +00:46:23.120 --> 00:46:30.599 +And these attributes are anything that's recognized by ARC. + +00:46:30.600 --> 00:46:35.239 +For example, the to-do status, the dates, + +00:46:35.240 --> 00:46:40.399 +the outline path, the headings, a full text search. + +00:46:40.400 --> 00:46:43.479 +There are several more. + +00:46:43.480 --> 00:46:46.079 +The presence or absence of certain properties. + +00:46:46.080 --> 00:46:50.879 +using any combination of those if you want to dig down + +00:46:50.880 --> 00:46:52.759 +and find some data in an art file. + +00:46:52.760 --> 00:46:56.079 +That's the kind of query I'm talking about. + +00:46:56.080 --> 00:46:58.239 +It is somewhat equivalent + +00:46:58.240 --> 00:47:02.359 +to being able to write SQL queries + +00:47:02.360 --> 00:47:09.719 +where you match on things just for your art files. + +00:47:09.720 --> 00:47:21.199 +Okay. I think we might have figured out our problem. + +00:47:21.200 --> 00:47:38.839 +It was DOS encoding. See if that works. + +00:47:38.840 --> 00:47:47.879 +I switched the development track over + +00:47:47.880 --> 00:47:53.559 +to just watching the gen track since I couldn't find it. + +00:47:53.560 --> 00:47:57.359 +Also, Eludo wants to mention + +00:47:57.360 --> 00:48:00.799 +the Emacs Carnival theme for December. + +00:48:00.800 --> 00:48:02.359 +Yes, the people of Emacs, + +00:48:02.360 --> 00:48:04.119 +of which you are all very awesome. + +00:48:04.120 --> 00:48:05.519 +Thank you so much for your patience. + +00:48:05.520 --> 00:48:08.159 +Today has been very interesting. + +00:48:08.160 --> 00:48:13.359 +But yes, at some point we can show that too. + +00:48:13.360 --> 00:48:17.199 +And we can basically wrap up anytime we like + +00:48:17.200 --> 00:48:19.279 +or hang out for as much time as we like also. + +00:48:19.280 --> 00:48:23.279 +okay so this is okay at least i got + +00:48:23.280 --> 00:48:24.519 +as far as a working demo here + +00:48:24.520 --> 00:48:26.439 +so now you can kind of see what's going on um + +00:48:26.440 --> 00:48:31.599 +and i'll just wrap that into uh + +00:48:31.600 --> 00:48:40.959 +into a little prettier output + +00:48:40.960 --> 00:48:53.159 +And you can see that it modified the value. + +00:48:53.160 --> 00:48:59.479 +So it's pretty darn simple. + +00:48:59.480 --> 00:49:06.159 +Again, all it's doing is completely replacing all of this content + +00:49:06.160 --> 00:49:11.679 +with whatever new value is given as its final argument + +00:49:11.680 --> 00:49:14.879 +after naming the data path. + +00:49:14.880 --> 00:49:23.439 +So the one refinement we can do just to get a little more complex example going. + +00:49:23.440 --> 00:49:32.759 +We'll deepen our structure a little bit. And try that. + +00:49:32.760 --> 00:49:38.799 +So here now we'll say test two. + +00:49:38.800 --> 00:49:47.639 +And we can take a look at the data file + +00:49:47.640 --> 00:49:51.599 +and see that it has adjusted that + +00:49:51.600 --> 00:49:55.959 +because test2 was completely unique, that worked fine. + +00:49:55.960 --> 00:50:00.519 +If that were not the case, + +00:50:00.520 --> 00:50:02.599 +we would have had to specify the path + +00:50:02.600 --> 00:50:17.679 +using dot notation like this. And that's pretty much it. + +00:50:17.680 --> 00:50:20.759 +It took me much longer to figure out + +00:50:20.760 --> 00:50:23.759 +why it wasn't just working than it did to demo it. + +00:50:23.760 --> 00:50:29.239 +And again, what I really like about this program, + +00:50:29.240 --> 00:50:31.639 +besides the fact that I find it quite useful + +00:50:31.640 --> 00:50:34.639 +to just be able to stuff values into an org file + +00:50:34.640 --> 00:50:36.439 +from the command line using shell script, + +00:50:36.440 --> 00:50:41.279 +is what I really like about this + +00:50:41.280 --> 00:50:45.999 +is that it's a whopping 190 lines of code, + +00:50:46.000 --> 00:50:47.919 +including all the boilerplate. + +00:50:47.920 --> 00:50:55.759 +And I will share the project into the chat. + +00:50:55.760 --> 00:51:02.199 +So, Corwin, you're not using org-element for this, are you? + +00:51:02.200 --> 00:51:06.799 +No. Yeah, that's a great question. + +00:51:06.800 --> 00:51:10.839 +Let's just dig a little into the code here. + +00:51:10.840 --> 00:51:21.039 +Or maybe it would be more fun to actually + +00:51:21.040 --> 00:51:26.719 +So the only real requires here, I do use cl-lib mostly. + +00:51:26.720 --> 00:51:33.159 +I'm directly using the macros from org. + +00:51:33.160 --> 00:51:36.879 +Particularly, I'm extremely fond of this function. + +00:51:36.880 --> 00:51:41.279 +I'd love to see this just promoted to promoted + +00:51:41.280 --> 00:51:43.559 +somewhere deeper into Emacs proper, + +00:51:43.560 --> 00:51:47.639 +so that I don't have to load all of the org macros + +00:51:47.640 --> 00:51:50.239 +to get to this particularly useful one, + +00:51:50.240 --> 00:51:54.679 +which just tells me whether ignoring whitespace + +00:51:54.680 --> 00:51:59.639 +a string has any characters, has greater than zero length. + +00:51:59.640 --> 00:52:04.439 +Isn't that just string blank B? + +00:52:04.440 --> 00:52:08.999 +So this is a little different. + +00:52:09.000 --> 00:52:14.799 +This deals with... I may struggle to remember the details, + +00:52:14.800 --> 00:52:20.999 +and it's possible that the non-org specific version + +00:52:21.000 --> 00:52:23.519 +has even been improved or I didn't use it correctly, + +00:52:23.520 --> 00:52:29.479 +but I believe my experience was it didn't handle new lines, for example, quite the same way. + +00:52:29.480 --> 00:52:38.519 +So getting into what this actually does, + +00:52:38.520 --> 00:52:43.879 +most of the program is finding the relevant part of the file. + +00:52:43.880 --> 00:52:49.079 +You'll see that we start out by doing a depth-based search, + +00:52:49.080 --> 00:52:51.959 +capture the value that we're looking for. + +00:52:51.960 --> 00:52:58.119 +And then finally, we widen the buffer + +00:52:58.120 --> 00:53:01.799 +and keep handling the case where we might be being called + +00:53:01.800 --> 00:53:05.839 +from within Emacs in a narrowed buffer. + +00:53:05.840 --> 00:53:11.079 +This is another what should be documented at the top. + +00:53:11.080 --> 00:53:13.919 +So that is obviously going to load org. + +00:53:13.920 --> 00:53:21.399 +Just double-check that. Yeah, it is going to load org. + +00:53:21.400 --> 00:53:30.039 +And we can see that because it didn't find the function. + +00:53:30.040 --> 00:53:40.399 +until I loaded Org and then it did when I did C-h f + +00:53:40.400 --> 00:53:44.999 +to get definition of a function. + +00:53:45.000 --> 00:53:51.719 +So, widen the buffer and then I just start looking for the search. + +00:53:51.720 --> 00:53:55.399 +You can see I'm doing simple regular expression based searches here. + +00:53:55.400 --> 00:54:01.719 +Looking for lines, ultimately, that start with a star. + +00:54:01.720 --> 00:54:05.119 +That was a little simpler format + +00:54:05.120 --> 00:54:07.759 +that didn't quite work out. + +00:54:07.760 --> 00:54:25.719 +So I'm searching for, here this is a little tricky, + +00:54:25.720 --> 00:54:28.839 +but I'm searching for a number of stars + +00:54:28.840 --> 00:54:30.839 +equal to the depth that I want. + +00:54:30.840 --> 00:54:33.439 +The depth that I want being calculated + +00:54:33.440 --> 00:54:38.039 +based on the number of dots that were in the query string. + +00:54:38.040 --> 00:54:47.159 +from there, you know, kind of skipping some stuff, right? + +00:54:47.160 --> 00:54:49.599 +Once we find our starting position, + +00:54:49.600 --> 00:54:53.239 +then we're going to have to find the end of that, + +00:54:53.240 --> 00:54:57.679 +the section that we're going to read or replace. + +00:54:57.680 --> 00:55:12.959 +Text a tiny bit smaller. So I checked org-string nwp, + +00:55:12.960 --> 00:55:20.079 +and it's the same as string blank p. + +00:55:20.080 --> 00:55:26.319 +exactly the same code or the same result? + +00:55:26.320 --> 00:55:30.399 +No, it's the same result. Well, it's the same check, + +00:55:30.400 --> 00:55:34.519 +but string blank p will return a match object, + +00:55:34.520 --> 00:55:35.999 +like a string match object, + +00:55:36.000 --> 00:55:39.119 +whereas the org version will return the string itself + +00:55:39.120 --> 00:55:46.159 +if it finds a match, as in if it's blank. + +00:55:46.160 --> 00:55:48.319 +I don't remember that. + +00:55:48.320 --> 00:55:51.079 +As a Boolean check, they are the same. + +00:55:51.080 --> 00:55:54.159 +If you use it as, you know, is it blank or not. + +00:55:54.160 --> 00:56:02.679 +So, um, yeah, I've talked for way longer. + +00:56:02.680 --> 00:56:04.119 +I thought I literally thought + +00:56:04.120 --> 00:56:05.319 +this would be a five minute thing. + +00:56:05.320 --> 00:56:08.399 +I'm not sure if there are any questions on it, + +00:56:08.400 --> 00:56:10.239 +but just to simply answer your question. + +00:56:10.240 --> 00:56:11.719 +No, it doesn't use org element. + +00:56:11.720 --> 00:56:23.759 +This is pure regex based work. + +00:56:23.760 --> 00:56:26.919 +So, the advantage of not using... Right. + +00:56:26.920 --> 00:56:32.679 +So, the advantage of not using arg element + +00:56:32.680 --> 00:56:37.439 +is that you don't have to load arg or arg element, right? + +00:56:37.440 --> 00:56:39.039 +And so, it's going to be faster. + +00:56:39.040 --> 00:56:45.359 +And it's going to be faster both because you don't have to load arg element + +00:56:45.360 --> 00:56:51.079 +and because you don't have to run arg element, like the arg parser. + +00:56:51.080 --> 00:56:52.879 +But on the other hand, + +00:56:52.880 --> 00:56:58.439 +you end up loading all of org anyway. + +00:56:58.440 --> 00:57:02.679 +So at that point, it might just be better + +00:57:02.680 --> 00:57:05.039 +to use org element because it's more robust. + +00:57:05.040 --> 00:57:07.919 +For example, if you have a bunch of leading stars + +00:57:07.920 --> 00:57:09.959 +inside a source block or something, + +00:57:09.960 --> 00:57:11.599 +you don't want to misclassify that. + +00:57:11.600 --> 00:57:16.639 +Matter of fact, I believe I had to do some flossing with it + +00:57:16.640 --> 00:57:18.879 +to deal with not just that, + +00:57:18.880 --> 00:57:21.439 +but drawers and things like that. + +00:57:21.440 --> 00:57:25.879 +right yeah so at the end of the day + +00:57:25.880 --> 00:57:28.039 +that was just an extra 10 or 20 characters + +00:57:28.040 --> 00:57:31.039 +in the regular expression so i just shrugged and wrote them + +00:57:31.040 --> 00:57:36.799 +you can see there are a number of i + +00:57:36.800 --> 00:57:40.279 +i happen to like writing regular expressions + +00:57:40.280 --> 00:57:42.479 +and find them relatively readable so + +00:57:42.480 --> 00:57:46.719 +So it didn't bother me doing that. + +00:57:46.720 --> 00:57:49.239 +I've also done a bunch of work with org-element + +00:57:49.240 --> 00:57:51.439 +with the dungeon project, + +00:57:51.440 --> 00:57:53.759 +which of course uses that extensively + +00:57:53.760 --> 00:57:57.079 +to pull data out of tables and so on. + +00:57:57.080 --> 00:58:01.319 +And indeed, I think that may ultimately be my solution. + +00:58:01.320 --> 00:58:06.199 +I've been kind of distracted on a side quest + +00:58:06.200 --> 00:58:09.959 +to improve the org-table-fm parser. + +00:58:09.960 --> 00:58:14.279 +There's a post on my blog about the work that I've done there, + +00:58:14.280 --> 00:58:19.359 +and recently started talking to Ihor, + +00:58:19.360 --> 00:58:20.839 +the new org maintainer, + +00:58:20.840 --> 00:58:27.579 +who took over in the last year or so from Bastien. + +00:58:27.580 --> 00:58:32.159 +Just about what it would take to pick that up, + +00:58:32.160 --> 00:58:34.279 +or at least get it to a point + +00:58:34.280 --> 00:58:35.679 +where somebody else could work on it. + +00:58:35.680 --> 00:58:39.599 +It's pretty dense right now. + +00:58:39.600 --> 00:58:59.919 +So this thing is a bit of a monster, + +00:58:59.920 --> 00:59:01.799 +but at the end of the day, + +00:59:01.800 --> 00:59:06.919 +our goal is to extend the syntax, + +00:59:06.920 --> 00:59:12.519 +is to be able to use this Org Table FM syntax + +00:59:12.520 --> 00:59:14.439 +in other contexts. + +00:59:14.440 --> 00:59:18.519 +So if you haven't looked at board table FM, + +00:59:18.520 --> 00:59:21.399 +these I bar or these I markers + +00:59:21.400 --> 00:59:26.039 +are telling us to look for the table separator. + +00:59:26.040 --> 00:59:29.759 +So positioning based on the location of a table separator. + +00:59:29.760 --> 00:59:34.439 +I find that a little bit brittle + +00:59:34.440 --> 00:59:38.679 +just because it's really easy to go in and decide, + +00:59:38.680 --> 00:59:42.919 +oh, it'll look better with an additional line separator in there. + +00:59:42.920 --> 00:59:48.039 +And then all of these formulas break everywhere. + +00:59:48.040 --> 00:59:49.919 +So it would be a little more fun + +00:59:49.920 --> 00:59:53.399 +to have at least variables in there. + +00:59:53.400 --> 00:59:56.159 +And that's kind of part of the scope. + +00:59:56.160 --> 01:00:04.119 +If we look, and here you get kind of a hint + +01:00:04.120 --> 01:00:06.639 +of the new syntax I'd like to support, + +01:00:06.640 --> 01:00:12.559 +things like $star, $underscore. + +01:00:12.560 --> 01:00:17.559 +Keyword it's it's probably a half-hour talk + +01:00:17.560 --> 01:00:20.879 +just to get into what every single one of these would do + +01:00:20.880 --> 01:00:26.319 +But this post does does give some some context of that + +01:00:26.320 --> 01:00:35.679 +And more importantly there is a as a complete test program that + +01:00:35.680 --> 01:00:39.159 +Worked the last time I was playing with it + +01:00:39.160 --> 01:00:43.959 +And this gives you complete examples + +01:00:43.960 --> 01:00:48.479 +of all the syntax that the work in progress does currently support. + +01:00:48.480 --> 01:00:52.799 +You'll see some of these items are commented out. + +01:00:52.800 --> 01:00:54.359 +Those aren't supported yet + +01:00:54.360 --> 01:00:56.119 +and before I would implement them now, + +01:00:56.120 --> 01:01:04.359 +especially now that we're talking in terms of trying to take org itself this direction, you know, + +01:01:04.360 --> 01:01:13.539 +of kind of beefing up the the TableFM format parsing + +01:01:13.540 --> 01:01:16.999 +so that it could be used in other contexts besides + +01:01:17.000 --> 01:01:19.640 +specifically within a formula. + +01:01:19.640 --> 01:01:26.839 +I wouldn't want to add features + +01:01:26.840 --> 01:01:33.399 +to it without discussing those. + +01:01:33.400 --> 01:01:37.639 +So this is just a simple, basically a literate test file + +01:01:37.640 --> 01:01:40.439 +if you want to call it that. + +01:01:40.440 --> 01:01:43.239 +The perhaps key improvement here + +01:01:43.240 --> 01:01:49.799 +is naming all of the different capture groups. + +01:01:49.800 --> 01:01:52.119 +which just, if you're working + +01:01:52.120 --> 01:01:55.919 +with really huge regular expressions, which this is, + +01:01:55.920 --> 01:01:58.839 +let me just make sure the whole pagex is right in here + +01:01:58.840 --> 01:02:00.599 +so we can see it, yeah. + +01:02:00.600 --> 01:02:05.959 +So here's the actual rewrite, scale it a little bit, + +01:02:05.960 --> 01:02:14.479 +so you can see it's kind of a monster. + +01:02:14.480 --> 01:02:27.639 +And that's all using Rx. + +01:02:27.640 --> 01:02:29.519 +So hopefully that looks pretty familiar. + +01:02:29.520 --> 01:02:35.039 +Dollars for specifying a column, at sign to specify a row. + +01:02:35.040 --> 01:02:43.959 +And we also have the keys. + +01:02:43.960 --> 01:02:58.559 +Anybody else want to show and tell? + +01:02:58.560 --> 01:03:01.399 +We're going to cut over to the automated introduction + +01:03:01.400 --> 01:03:07.799 +for the Saturday closing remarks in like four minutes. + +01:03:07.800 --> 01:03:15.599 +Oh, but quick, quick, quick mention of the Emacs Carnival. + +01:03:15.600 --> 01:03:20.559 +So the Emacs Carnival is a shared blogging theme. + +01:03:20.560 --> 01:03:25.079 +where lots of people write about a specific theme, + +01:03:25.080 --> 01:03:26.119 +and then if you write about it, + +01:03:26.120 --> 01:03:28.239 +you can send your link to whoever's hosting the carnival. + +01:03:28.240 --> 01:03:31.679 +And it's a great way to discover other people's cool stuff. + +01:03:31.680 --> 01:03:35.679 +So if I take presenter, hang on a second, take presenter. + +01:03:35.680 --> 01:03:39.519 +Oh, actually, haha, I know, + +01:03:39.520 --> 01:03:41.959 +I'm going to make Elladom present it. + +01:03:41.960 --> 01:03:47.199 +Haha, you are now in charge. Okay, take it away. + +01:03:47.200 --> 01:03:49.959 +So I've been using Emacs for like 46 years now, + +01:03:49.960 --> 01:03:53.359 +back to TECO Emacs. And as I just said in the chat, + +01:03:53.360 --> 01:03:56.319 +I've found that the people who use Emacs + +01:03:56.320 --> 01:03:59.400 +tend to be interesting people in many different ways. + +01:03:59.440 --> 01:04:03.199 +And so this month, I'm just saying, let's give a shout out + +01:04:03.200 --> 01:04:06.399 +to some of the interesting people we've met along the way. + +01:04:06.400 --> 01:04:09.239 +And including some of the people + +01:04:09.240 --> 01:04:10.159 +that are putting on this conference + +01:04:10.160 --> 01:04:11.959 +are some of the most interesting + +01:04:11.960 --> 01:04:13.439 +and helpful people I've ever met. + +01:04:13.440 --> 01:04:27.919 +So thank you. You're very kind. Thank you. + +01:04:27.920 --> 01:04:30.679 +I'll say more than that. Maybe I will. + +01:04:30.680 --> 01:04:34.279 +I completely agree with you and I couldn't agree more. + +01:04:34.280 --> 01:04:38.839 +I think that's how Sacha and Amin and Leo + +01:04:38.840 --> 01:04:40.559 +really dragged me into this, + +01:04:40.560 --> 01:04:42.319 +you know, into being a volunteer. + +01:04:42.320 --> 01:04:44.599 +And I really, I'm sure we'll talk + +01:04:44.600 --> 01:04:46.039 +about this in the closing remarks, + +01:04:46.040 --> 01:04:50.199 +but I can't recommend volunteering for this project enough. + +01:04:50.200 --> 01:04:54.319 +It's just so fun to talk backstage + +01:04:54.320 --> 01:05:00.679 +with the presenters I don't know. + +01:05:00.680 --> 01:05:11.439 +It's an extremely engaging community. + +01:05:11.440 --> 01:05:12.759 +It's really thoughtful. + +01:05:12.760 --> 01:05:15.039 +I like the way y'all are so patient and awesome + +01:05:15.040 --> 01:05:19.439 +and I can be just quietly having my little freak out here + +01:05:19.440 --> 01:05:20.679 +and everyone's fine + +01:05:20.680 --> 01:05:23.879 +and will even help debug things live as needed. + +01:05:23.880 --> 01:05:45.499 +So this is all good. + +01:05:45.500 --> 01:05:48.119 +Anyway, so if people want to participate, + +01:05:48.120 --> 01:05:49.919 +you basically write a blog post. + +01:05:49.920 --> 01:05:53.159 +If you don't have a blog yet, + +01:05:53.160 --> 01:05:56.959 +there are any number of packages in Emacs, + +01:05:56.960 --> 01:05:58.479 +as well as web-based services, + +01:05:58.480 --> 01:06:02.039 +but really, you can get something going with Emacs. + +01:06:02.040 --> 01:06:05.839 +or exporting to HTML and maybe even figure out RSS, + +01:06:05.840 --> 01:06:08.279 +or you can use a static site generator like Hugo, + +01:06:08.280 --> 01:06:10.999 +or you can find, if you can set up WordPress, + +01:06:11.000 --> 01:06:12.119 +that's another way to do it. + +01:06:12.120 --> 01:06:15.079 +Or you can email me your thing and I'll post it on my blog + +01:06:15.080 --> 01:06:20.239 +and let me know how you want to be credited for it. + +01:06:20.240 --> 01:06:23.559 +Anyway, so you can share your story + +01:06:23.560 --> 01:06:26.879 +or share your story about somebody else's story + +01:06:26.880 --> 01:06:35.319 +and celebrate Emacs community. + +01:06:35.320 --> 01:06:39.079 +And we can send it to George also. + +01:06:39.080 --> 01:06:48.399 +We'll then make links in that blog post. + +01:06:48.400 --> 01:06:50.199 +And on the subject of community, + +01:06:50.200 --> 01:06:53.439 +I also heartily recommend the IRC community on Emacs. + +01:06:53.440 --> 01:06:55.919 +Pound Emacs is another one of those things + +01:06:55.920 --> 01:06:58.279 +that I just personally can't get enough of, + +01:06:58.280 --> 01:07:05.079 +and I hear a lot of stories about just how it's helped people. + +01:07:05.080 --> 01:07:09.119 +All right, we are now having the automated introduction + +01:07:09.120 --> 01:07:12.759 +and then it's going to rejoin over here very soon. + +01:07:12.760 --> 01:07:22.439 +Hang on a second. Wow, that's going. + +01:07:22.440 --> 01:07:34.399 +Saturday close and let's arrange our screen nicely. + +01:07:34.400 --> 01:07:38.279 +All right, we made it to the end of the first day! Woohoo! + +01:07:38.280 --> 01:07:40.399 +Thank you for joining us + +01:07:40.400 --> 01:07:42.959 +for the first day of EmacsConf 2025. + +01:07:42.960 --> 01:07:44.919 +Feel free to spread the word + +01:07:44.920 --> 01:07:48.479 +because there is still another day of fun talks tomorrow. + +01:07:48.480 --> 01:07:51.399 +So hashtag EmacsConf and hashtag Emacs. + +01:07:51.400 --> 01:07:54.239 +If you do hashtag Emacs on Mastodon + +01:07:54.240 --> 01:07:58.239 +or Blue Sky or other places, we'll probably find it. + +01:07:58.240 --> 01:08:01.759 +Or if I don't, you can just let me know also. + +01:08:01.760 --> 01:08:04.039 +The prerecorded talks should be up + +01:08:04.040 --> 01:08:05.639 +on the talk pages already. + +01:08:05.640 --> 01:08:09.119 +The live talks, we'll probably actually get them up + +01:08:09.120 --> 01:08:11.079 +within the next week or two. + +01:08:11.080 --> 01:08:13.359 +I think they've already started processing, + +01:08:13.360 --> 01:08:15.479 +so I just had to sit down and then work with + +01:08:15.480 --> 01:08:18.399 +our wonderful army of volunteer captioners + +01:08:18.400 --> 01:08:20.119 +to get them all nicely captioned. + +01:08:20.120 --> 01:08:22.439 +But anyway, so the prerecorded talks + +01:08:22.440 --> 01:08:23.759 +are also up on YouTube, + +01:08:23.760 --> 01:08:25.719 +and I will eventually also upload them + +01:08:25.720 --> 01:08:29.239 +to ToobNix, which is a PeerTube instance. + +01:08:29.240 --> 01:08:31.239 +We will work on extracting live talks. + +01:08:31.240 --> 01:08:32.119 +If you'd like updates, + +01:08:32.120 --> 01:08:35.319 +please subscribe to the EmacsConf Discuss mailing list. + +01:08:35.320 --> 01:08:37.279 +If you've got ideas for making things better, + +01:08:37.280 --> 01:08:39.479 +we have so many ideas. I always end up with a very long + +01:08:39.480 --> 01:08:43.359 +to-do list after these things. Please add them to the pad. + +01:08:43.360 --> 01:08:46.919 +I'd love to hear from you on how we can make it even smoother next year. + +01:08:46.920 --> 01:08:49.359 +There are about 100 people watching in gen + +01:08:49.360 --> 01:08:52.159 +and 100 people watching in devs, which is really awesome. + +01:08:52.160 --> 01:08:54.119 +It's amazing to think that we can have + +01:08:54.120 --> 01:08:56.959 +an Emacs party for a lot of people. + +01:08:56.960 --> 01:09:00.399 +And we can only do this because of all the wonderful speakers, + +01:09:00.400 --> 01:09:02.279 +volunteers, participants, + +01:09:02.280 --> 01:09:04.359 +and very patient people in our lives + +01:09:04.360 --> 01:09:07.079 +who make it possible through all the time and support. + +01:09:07.080 --> 01:09:10.039 +So this year, Corwin did most of the hosting. + +01:09:10.040 --> 01:09:13.439 +I mean, also dropped by earlier, so that's great. + +01:09:13.440 --> 01:09:17.919 +I hope Leo is okay. You know, we managed. + +01:09:17.920 --> 01:09:22.439 +And I'm Sasha, by the way. I was running around backstage + +01:09:22.440 --> 01:09:26.559 +and occasionally dropping in to go on the stream. + +01:09:26.560 --> 01:09:29.359 +There are lots of other volunteers who are not on air. + +01:09:29.360 --> 01:09:32.719 +So, for example, during the proposal review process, + +01:09:32.720 --> 01:09:34.319 +we got a lot of wonderful comments + +01:09:34.320 --> 01:09:37.759 +from J.C. Helary, Triko, and James Endres Howell, + +01:09:37.760 --> 01:09:41.039 +captions from Amitav and Rodion and other people + +01:09:41.040 --> 01:09:42.879 +have actually started also helping + +01:09:42.880 --> 01:09:45.079 +with the captions as well. + +01:09:45.080 --> 01:09:49.399 +So jay_bird just sent in some stuff today too. + +01:09:49.400 --> 01:09:52.959 +We are slowly working on getting a mirror in the EU set up + +01:09:52.960 --> 01:09:55.639 +so it'll be a little faster for people. + +01:09:55.640 --> 01:09:58.079 +So thanks to Yang3 for lending us a server. + +01:09:58.080 --> 01:10:00.879 +Babin and Michael and Ian and Jamie + +01:10:00.880 --> 01:10:06.119 +and Eeyore and Floyd Coulter have also helped out as well. + +01:10:06.120 --> 01:10:08.959 +Thanks to the Free Software Foundation + +01:10:08.960 --> 01:10:12.679 +for the mailing list, the media server, and of course, GNU Emacs itself, + +01:10:12.680 --> 01:10:15.439 +for which an astonishing amount + +01:10:15.440 --> 01:10:19.319 +of the scripting is done in Emacs. It's great. + +01:10:19.320 --> 01:10:23.279 +Thanks to Ry P for the server that we're using for OBS + +01:10:23.280 --> 01:10:27.639 +so that we can just VNC into it and I can manage two tracks + +01:10:27.640 --> 01:10:30.799 +without making my computer melt. It's great. + +01:10:30.800 --> 01:10:32.879 +And of course, to all the users + +01:10:32.880 --> 01:10:33.999 +and contributors and project teams + +01:10:34.000 --> 01:10:36.119 +that work on all the free software + +01:10:36.120 --> 01:10:37.279 +that this stuff is built on. + +01:10:37.280 --> 01:10:43.639 +Emacs, Org Mode, ERC, Tramp, Magit, BigBlueButton, + +01:10:43.640 --> 01:10:48.239 +Etherpad, IkiWiki, IceCast, OBS, The Lounge, + +01:10:48.240 --> 01:10:52.959 +LiberaChat, FFmpeg, OpenAI Whisper, WhisperX, + +01:10:52.960 --> 01:10:55.039 +the Aeneas forced alignment tool, + +01:10:55.040 --> 01:11:00.279 +PsiTransfer, SubEd, SubSeg, Mozilla Firefox, MPV, and Tampermonkey, + +01:11:00.280 --> 01:11:02.199 +and other things I probably forgot to mention. + +01:11:02.200 --> 01:11:04.599 +Thanks to Shoshin for the music, + +01:11:04.600 --> 01:11:06.799 +and thanks to people also who've donated + +01:11:06.800 --> 01:11:08.679 +through the Working Together program, + +01:11:08.680 --> 01:11:12.559 +like Scott and Jonathan and other anonymous donors. + +01:11:12.560 --> 01:11:15.919 +So that's a quick thanks. There's more tomorrow, + +01:11:15.920 --> 01:11:18.359 +but Corwin, do you have any parting words? + +01:11:18.360 --> 01:11:23.559 +You know, my parting words, Sacha are a thanks to you + +01:11:23.560 --> 01:11:25.759 +and not just a thanks + +01:11:25.760 --> 01:11:27.279 +for the hundreds of hours that you put + +01:11:27.280 --> 01:11:29.399 +into preparing this conference, + +01:11:29.400 --> 01:11:32.159 +you know, over the years and probably just this year, + +01:11:32.160 --> 01:11:35.999 +but also for all that you do for the community you are. + +01:11:36.000 --> 01:11:38.759 +You are a real unsung hero, + +01:11:38.760 --> 01:11:42.319 +even though I do hear your praises sung. + +01:11:42.320 --> 01:11:43.759 +They really can't be sung enough. + +01:11:43.760 --> 01:11:45.879 +In fact, I just this last week + +01:11:45.880 --> 01:11:48.039 +recommended to two different people your blog + +01:11:48.040 --> 01:11:51.599 +as a place to get a first introduction to Emacs. + +01:11:51.600 --> 01:11:54.799 +Your Emacs news is an incredible contribution, + +01:11:54.800 --> 01:11:57.959 +and just I want you to hear us thanking you. + +01:11:57.960 --> 01:12:04.879 +Thank you, Sacha. Emacs is a lot of fun, + +01:12:04.880 --> 01:12:07.519 +and Emacs people are a lot of fun, + +01:12:07.520 --> 01:12:10.879 +so it's all very wonderful. Yeah, we can wrap up here. + +01:12:10.880 --> 01:12:15.079 +People can keep hanging out if they want. + +01:12:15.080 --> 01:12:21.119 +I have a kiddo who is probably going to be back home soon + +01:12:21.120 --> 01:12:23.559 +and will pounce on me for more hugs, + +01:12:23.560 --> 01:12:25.599 +so I will see y'all tomorrow. + +01:12:25.600 --> 01:12:29.919 +uh, for more probably the same kind of stuff. + +01:12:29.920 --> 01:12:32.679 +Shut it down, save our energy for tomorrow. + +01:12:32.680 --> 01:12:36.319 +Uh, we do like to run into like hours long closing tomorrow. + +01:12:36.320 --> 01:12:38.319 +So we'll work on resisting that. + +01:12:38.320 --> 01:12:41.559 +Um, I suggest we, we look, we go get some rest + +01:12:41.560 --> 01:12:43.839 +and come, come back at it fresh tomorrow. + +01:12:43.840 --> 01:12:47.799 +Anybody else, any concerns with that or shall we go for it? + +01:12:47.800 --> 01:12:50.479 +Sounds good to me. + +01:12:50.480 --> 01:12:53.599 +If you've got ideas, pop them into the etherpad. + +01:12:53.600 --> 01:12:56.600 +And thank you so much for sharing this time with us. + +01:12:56.640 --> 01:13:23.800 +See you tomorrow. diff --git a/2025/captions/emacsconf-2025-org-babel--making-orgbabel-reactive--abhinav-tushar--main--chapters.vtt b/2025/captions/emacsconf-2025-org-babel--making-orgbabel-reactive--abhinav-tushar--main--chapters.vtt new file mode 100644 index 00000000..fb1e557c --- /dev/null +++ b/2025/captions/emacsconf-2025-org-babel--making-orgbabel-reactive--abhinav-tushar--main--chapters.vtt @@ -0,0 +1,26 @@ +WEBVTT + + +00:00:01.120 --> 00:00:49.041 +What are reactive notebooks? + +00:00:49.042 --> 00:02:38.498 +Reactivity demo + +00:02:38.499 --> 00:03:21.079 +Org-Babel + +00:03:21.080 --> 00:03:51.900 +Running the whole buffer + +00:03:51.901 --> 00:04:21.660 +Caching + +00:04:21.760 --> 00:06:04.533 +Computation dependencies + +00:06:04.534 --> 00:07:29.965 +Making this even better + +00:07:29.966 --> 00:08:08.240 +Wrapping up diff --git a/2025/captions/emacsconf-2025-org-babel--making-orgbabel-reactive--abhinav-tushar--main.vtt b/2025/captions/emacsconf-2025-org-babel--making-orgbabel-reactive--abhinav-tushar--main.vtt new file mode 100644 index 00000000..22373ce6 --- /dev/null +++ b/2025/captions/emacsconf-2025-org-babel--making-orgbabel-reactive--abhinav-tushar--main.vtt @@ -0,0 +1,614 @@ +WEBVTT captioned by abhinav + +NOTE What are reactive notebooks? + +00:00:01.120 --> 00:00:03.033 +Hello, everyone. My name is Abhinav, + +00:00:03.034 --> 00:00:03.900 +and I'm going to talk about + +00:00:03.901 --> 00:00:07.140 +how to make Org Babel reactive. So reactivity here + +00:00:07.240 --> 00:00:10.000 +means reactivity in the sense of reactive notebooks. + +00:00:10.001 --> 00:00:11.600 +So if you used Org Babel, + +00:00:11.601 --> 00:00:13.933 +you might also have used Jupyter notebooks, + +00:00:13.934 --> 00:00:16.100 +which are basically notebooks primarily for + +00:00:16.200 --> 00:00:16.933 +Python programming, + +00:00:16.934 --> 00:00:20.100 +where you have these text and code blocks interleaved, + +00:00:20.101 --> 00:00:23.157 +and then you can execute every code block independently, + +00:00:23.158 --> 00:00:25.858 +and then you control the order of execution manually, + +00:00:25.859 --> 00:00:27.199 +or you can just run the code blocks + +00:00:27.200 --> 00:00:29.699 +from top to bottom. But with reactive notebooks, + +00:00:29.700 --> 00:00:32.927 +what happens is that there's another way of running + +00:00:32.928 --> 00:00:35.329 +which is basically by having all these + +00:00:35.330 --> 00:00:36.900 +dependent code blocks automatically get + +00:00:37.000 --> 00:00:38.900 +executed whenever you make a change. + +00:00:38.901 --> 00:00:40.774 +So for example, if you change a variable, + +00:00:40.775 --> 00:00:42.060 +everything else that's dependent on + +00:00:42.160 --> 00:00:44.433 +that variable will be executed automatically. + +00:00:44.434 --> 00:00:49.041 +I'll show you an example of what that looks like. + +NOTE Reactivity demo + +00:00:49.042 --> 00:00:51.762 +Right, here's an example reactive Notebook. + +00:00:51.763 --> 00:00:53.460 +So this is called Observable. + +00:00:53.560 --> 00:00:54.863 +Observable is this tool made by + +00:00:54.864 --> 00:00:57.679 +the creator of d3.js which is + +00:00:57.680 --> 00:01:01.499 +a famous JavaScript charting library. So here, the + +00:01:01.500 --> 00:01:03.667 +interface is very similar to Jupyter Notebook. + +00:01:03.668 --> 00:01:06.407 +You basically are having these cells + +00:01:06.408 --> 00:01:08.508 +and each cell could be a text cell, like here, + +00:01:08.509 --> 00:01:09.588 +this is a Markdown cell + +00:01:09.589 --> 00:01:11.609 +and then there are these code blocks. + +00:01:11.610 --> 00:01:15.250 +Now each code cell is basically defining a variable. + +00:01:15.251 --> 00:01:17.740 +This is important in reactive notebooks because + +00:01:17.840 --> 00:01:21.140 +each cell is connected to other cell via this variable + +00:01:21.240 --> 00:01:23.552 +usage. So here data is defined, + +00:01:23.553 --> 00:01:25.012 +then there is filtered which is defined + +00:01:25.013 --> 00:01:27.620 +which is dependent on data, and then this plot is + +00:01:27.720 --> 00:01:29.133 +dependent on filtered. + +00:01:29.134 --> 00:01:31.153 +So now, in a classical notebook, what I will do is + +00:01:31.154 --> 00:01:34.394 +if I change something here, let's say from 1 to 2, + +00:01:34.395 --> 00:01:34.854 +I will have to run this, and then run this plot block again + +00:01:34.855 --> 00:01:40.335 +to make the change be visible. + +00:01:40.336 --> 00:01:42.055 +But in a reactive notebook, what happens is + +00:01:42.056 --> 00:01:44.396 +I can just change this from some value + +00:01:44.397 --> 00:01:46.256 +to some value, and then execute, + +00:01:46.257 --> 00:01:48.817 +and then every descendant is also executed, + +00:01:48.818 --> 00:01:50.940 +because that's how the reactivity works. + +00:01:51.040 --> 00:01:51.937 +You change this variable, + +00:01:51.938 --> 00:01:53.080 +so this should also be changed, + +00:01:53.081 --> 00:01:55.238 +because this is dependent on this variable. + +00:01:55.239 --> 00:01:56.858 +Now this is really helpful + +00:01:56.859 --> 00:01:58.900 +if you have a very complex and messy notebook + +00:01:59.000 --> 00:02:01.199 +which is what actually happens in reality. + +00:02:01.200 --> 00:02:03.480 +You end up doing an exploratory analysis, + +00:02:03.481 --> 00:02:05.959 +and you have these code blocks lying here and there. + +00:02:05.960 --> 00:02:07.101 +Then you change something + +00:02:07.102 --> 00:02:09.281 +and then you have to keep something in your mind + +00:02:09.282 --> 00:02:11.362 +that if I change this, I need to run + +00:02:11.363 --> 00:02:13.023 +these five code blocks again + +00:02:13.024 --> 00:02:15.604 +to finally get to the result that I want to see. + +00:02:15.605 --> 00:02:20.467 +Stale state causes a lot of issues in Jupyter Notebooks. + +00:02:20.468 --> 00:02:23.788 +So this is really good for reactivity, sorry reproducibility, + +00:02:23.789 --> 00:02:26.630 +but this is also really good for + +00:02:26.631 --> 00:02:28.599 +just having this exploration + +00:02:28.600 --> 00:02:30.117 +that you're trying to do. For example, + +00:02:30.118 --> 00:02:31.761 +you're changing something and it's really easy + +00:02:31.762 --> 00:02:34.887 +to just see that change happening in real time + +00:02:34.888 --> 00:02:38.498 +in your outcome variables, right? + +NOTE Org-Babel + +00:02:38.499 --> 00:02:41.920 +So I was wondering how to introduce this reactivity in Org Mode. + +00:02:41.921 --> 00:02:43.200 +And here's how it will look like. + +00:02:43.201 --> 00:02:46.302 +So this is a demo Org Mode file. + +00:02:46.303 --> 00:02:48.603 +There are many Org Babel blocks here. + +00:02:48.604 --> 00:02:49.563 +So you start from here. + +00:02:49.564 --> 00:02:52.085 +Let's say this is a code block. It has a name. + +00:02:52.086 --> 00:02:53.665 +And then there's another code block, + +00:02:53.666 --> 00:02:55.426 +which is dependent on the previous one, + +00:02:55.427 --> 00:02:57.807 +as you can see here, and so on. + +00:02:57.808 --> 00:02:59.368 +And then finally, there's a plot here, + +00:02:59.369 --> 00:03:00.889 +which is a gnuplot code. + +00:03:00.890 --> 00:03:02.550 +And you can see the image here. + +00:03:02.551 --> 00:03:04.131 +Now, what happens usually is that + +00:03:04.132 --> 00:03:05.196 +if I change this value from, + +00:03:05.197 --> 00:03:09.199 +let's say, 113 to 112, nothing happens on its own right? + +00:03:09.200 --> 00:03:12.199 +There's an extra step of execution that I will have to do + +00:03:12.200 --> 00:03:15.079 +so I will do that, and then the value is changed. + +00:03:15.080 --> 00:03:17.699 +Now the problem is that only this value is changed and + +00:03:17.700 --> 00:03:21.079 +if I go down and see the image, nothing will have changed. + +NOTE Running the whole buffer + +00:03:21.080 --> 00:03:23.079 +So what I can do is basically, + +00:03:23.080 --> 00:03:24.818 +a really simple thing is that, + +00:03:24.819 --> 00:03:26.500 +a simple trick is to basically + +00:03:26.600 --> 00:03:29.445 +enable a hook, like, add a hook + +00:03:29.446 --> 00:03:30.525 +whenever you're saving the buffer, + +00:03:30.526 --> 00:03:31.866 +you just run the full buffer again, + +00:03:31.867 --> 00:03:34.287 +like run all the code blocks automatically. + +00:03:34.288 --> 00:03:36.849 +Now if you do that, you can basically make a change somewhere + +00:03:36.850 --> 00:03:37.889 +and then you can, you know, + +00:03:37.890 --> 00:03:41.071 +see how everything else is changing + +00:03:41.072 --> 00:03:42.712 +which gives you some sort of reactivity, + +00:03:42.713 --> 00:03:43.972 +but there's still a lot of computation + +00:03:43.973 --> 00:03:45.973 +that's being wasted. + +00:03:45.974 --> 00:03:49.595 +You might not want to change or run this code block again + +00:03:49.596 --> 00:03:51.900 +when something down there is changing. + +NOTE Caching + +00:03:51.901 --> 00:03:54.567 +So to counter that, you can actually add caching. + +00:03:54.568 --> 00:03:57.133 +So if you add caching to any code block, + +00:03:57.134 --> 00:03:59.800 +that code block will only be executed again + +00:03:59.801 --> 00:04:02.300 +if that code has changed or + +00:04:02.400 --> 00:04:04.755 +the input variables have changed. + +00:04:04.756 --> 00:04:06.336 +But the other problem is that + +00:04:06.337 --> 00:04:08.659 +you don't want caching to be enabled for a lot of cases + +00:04:08.660 --> 00:04:10.840 +where the code block is actually dependent on + +00:04:10.841 --> 00:04:12.722 +external state, like for example, + +00:04:12.723 --> 00:04:15.024 +some sort of randomness or time. + +00:04:15.025 --> 00:04:17.433 +So caching also is, you know, kind of, + +00:04:17.434 --> 00:04:18.967 +it's, like, an important thing to use, + +00:04:18.968 --> 00:04:21.660 +but it's probably not giving you the complete answer. + +NOTE Computation dependencies + +00:04:21.760 --> 00:04:25.973 +So what we can instead do is basically figure out + +00:04:25.974 --> 00:04:28.554 +the whole computation dependencies here. + +00:04:28.555 --> 00:04:31.275 +So let's say if I look at this buffer, + +00:04:31.276 --> 00:04:35.076 +here's how all the blocks are connected. + +00:04:35.077 --> 00:04:37.656 +So as you can see the plot code block + +00:04:37.657 --> 00:04:40.117 +is dependent on c and then legendpg, + +00:04:40.118 --> 00:04:43.918 +and they themselves are dependent on these other nodes. + +00:04:43.919 --> 00:04:47.279 +So when I make a change in b, I only want b to run + +00:04:47.280 --> 00:04:50.844 +and then c and then plot. I don't want anything else to run. + +00:04:50.845 --> 00:04:54.267 +So what I did was I wrote a small minor mode for Org Mode + +00:04:54.268 --> 00:04:55.368 +which does exactly this. + +00:04:55.369 --> 00:04:57.769 +So whenever you are in a code block + +00:04:57.770 --> 00:04:59.871 +and you are making a change and then you save it, + +00:04:59.872 --> 00:05:01.913 +it will just follow the trail from that code block + +00:05:01.914 --> 00:05:05.355 +to every other descendant which is going to be impacted, + +00:05:05.356 --> 00:05:09.719 +and it just runs all of them, and nothing else gets executed. + +00:05:09.720 --> 00:05:13.119 +So to see it in action, I will just enable that mode. + +00:05:13.120 --> 00:05:17.021 +Yeah, right. So now here, if I change this 113 to 112 + +00:05:17.022 --> 00:05:21.243 +and I save, this code, this variable gets changed. + +00:05:21.244 --> 00:05:23.744 +It's the same value because I did not update it again. + +00:05:23.745 --> 00:05:25.719 +And you can also see b also got changed + +00:05:25.720 --> 00:05:29.667 +because it's just following all the execution order and so on. + +00:05:29.668 --> 00:05:31.727 +The plot also got updated. + +00:05:31.728 --> 00:05:34.068 +We will be able to see more clearly + +00:05:34.069 --> 00:05:36.402 +once I change something more substantial. + +00:05:36.402 --> 00:05:36.402 +So here's another variable. + +00:05:36.403 --> 00:05:41.332 +So I added a small toggle button here, + +00:05:41.333 --> 00:05:43.468 +which is again part of the minor mode. + +00:05:43.469 --> 00:05:45.209 +So since this is nil, if I toggle it, + +00:05:45.210 --> 00:05:49.300 +it will become true. And this variable dictates whether + +00:05:49.400 --> 00:05:51.174 +the plot will have the legend or not. + +00:05:51.175 --> 00:05:54.457 +So if I toggle it to be t, now it's t + +00:05:54.458 --> 00:05:57.900 +and you can see that the plot has legend that's visible. + +00:05:57.901 --> 00:06:03.139 +If I toggle it back again to nil, the legend is gone. + +00:06:03.140 --> 00:06:04.533 +Now this is nice, this... + +NOTE Making this even better + +00:06:04.534 --> 00:06:06.380 +This is already pretty helpful for me + +00:06:06.480 --> 00:06:10.179 +but what we can do is we can make it even better. + +00:06:10.180 --> 00:06:11.400 +So one of the nicer ideas + +00:06:11.401 --> 00:06:13.015 +from these reactive notebooks + +00:06:13.016 --> 00:06:16.078 +is this idea of having an infinite canvas + +00:06:16.079 --> 00:06:19.022 +where you don't look at the document model, + +00:06:19.023 --> 00:06:20.623 +you look at the whole document + +00:06:20.624 --> 00:06:25.008 +as a canvas of multiple connected documents. + +00:06:25.009 --> 00:06:26.589 +One good thing that happens there is that + +00:06:26.590 --> 00:06:29.550 +you can basically have a piece of code somewhere + +00:06:29.551 --> 00:06:30.410 +and then piece of code + +00:06:30.411 --> 00:06:32.499 +somewhere very different position in the document, + +00:06:32.500 --> 00:06:34.732 +but you can put them together in the canvas + +00:06:34.733 --> 00:06:36.933 +and then see them side by side. + +00:06:36.934 --> 00:06:38.294 +So here also, let's say + +00:06:38.295 --> 00:06:41.996 +if I want to just have this image shown up at the top, + +00:06:41.997 --> 00:06:45.857 +what I can do is like I can pop this out, + +00:06:45.858 --> 00:06:49.938 +which opens a child frame, and then I can just go here. + +00:06:49.939 --> 00:06:52.460 +This child frame is showing the same image. + +00:06:52.461 --> 00:06:55.502 +So there's no change. So if I toggle this variable here, + +00:06:55.503 --> 00:06:58.423 +you can see that the image is updated. + +00:06:58.424 --> 00:07:02.199 +If I toggle it back to nil, the image, the legend is gone. + +00:07:02.200 --> 00:07:03.367 +And you can obviously, you know, + +00:07:03.368 --> 00:07:08.690 +you can make a lot of things come up as child frames. + +00:07:08.691 --> 00:07:09.430 +This is the same image. + +00:07:09.431 --> 00:07:11.291 +So even if you go down to the document, + +00:07:11.292 --> 00:07:13.810 +you will see the same image. + +00:07:13.811 --> 00:07:18.174 +So yeah, this is what I have right now. + +00:07:18.175 --> 00:07:21.956 +I'm definitely looking forward to making it more useful, + +00:07:21.957 --> 00:07:25.599 +probably including more kinds of child frames, + +00:07:25.600 --> 00:07:29.965 +maybe like making the whole document an infinite canvas. + +NOTE Wrapping up + +00:07:29.966 --> 00:07:32.099 +Alright, so that's the talk. + +00:07:32.100 --> 00:07:33.346 +If you're interested in the codebase, + +00:07:33.347 --> 00:07:34.446 +here's the homepage + +00:07:34.447 --> 00:07:35.546 +for the project [https://dev.lepisma.xyz/git/ob-rx]. + +00:07:35.547 --> 00:07:37.566 +So the next steps for me are basically + +00:07:37.567 --> 00:07:40.647 +making my workflow easier in matplotlib, + +00:07:40.648 --> 00:07:42.587 +which is a Python-based library, + +00:07:42.588 --> 00:07:45.348 +and d3.js, which is for JavaScript. + +00:07:45.349 --> 00:07:47.888 +For the JS thing, I might have to add + +00:07:47.889 --> 00:07:49.540 +the interactive JS child frames, + +00:07:49.640 --> 00:07:51.829 +and I am also looking forward to building something + +00:07:51.830 --> 00:07:53.969 +which can replicate the work + +00:07:53.970 --> 00:07:56.750 +of the Observable's infinite canvas, + +00:07:56.751 --> 00:07:57.490 +because that's something + +00:07:57.491 --> 00:08:00.619 +which I found really useful in my work with + +00:08:00.620 --> 00:08:02.240 +just JS visualizations. + +00:08:02.340 --> 00:08:05.540 +So yeah, happy to take questions on Etherpad + +00:08:05.560 --> 00:08:08.240 +and thank you for your time. diff --git a/2025/captions/emacsconf-2025-private-ai--emacs-and-private-ai-a-great-match--aaron-grothe--main.vtt b/2025/captions/emacsconf-2025-private-ai--emacs-and-private-ai-a-great-match--aaron-grothe--main.vtt new file mode 100644 index 00000000..a8e76986 --- /dev/null +++ b/2025/captions/emacsconf-2025-private-ai--emacs-and-private-ai-a-great-match--aaron-grothe--main.vtt @@ -0,0 +1,2602 @@ +WEBVTT + +00:00:00.000 --> 00:00:04.859 +Hey, everybody. Welcome from frigid Omaha, Nebraska. + +00:00:04.860 --> 00:00:06.619 +I'm just going to kick off my talk here, + +00:00:06.620 --> 00:00:23.899 +and we'll see how it all goes. Thanks for attending. + +00:00:23.900 --> 00:00:26.939 +So the slides will be available on my site, growthy.us, + +00:00:26.940 --> 00:00:29.899 +in the presentation section tonight or tomorrow. + +00:00:29.900 --> 00:00:33.099 +This is a quick intro to one way to do private AI in Emacs. + +00:00:33.100 --> 00:00:35.299 +There are a lot of other ways to do it. + +00:00:35.300 --> 00:00:38.899 +This one is really just more or less the easiest way to do it. + +00:00:38.900 --> 00:00:40.379 +It's a minimal viable product + +00:00:40.380 --> 00:00:42.379 +to get you an idea of how to get started with it + +00:00:42.380 --> 00:00:43.859 +and how to give it a spin. + +00:00:43.860 --> 00:00:45.819 +Really hope some of you give it a shot + +00:00:45.820 --> 00:00:48.179 +and learn something along the way. + +00:00:48.180 --> 00:00:50.379 +So the overview of the talk. + +00:00:50.380 --> 00:00:54.939 +broke down these basic bullet points of why private AI, + +00:00:54.940 --> 00:00:58.939 +what do I need to do private AI, Emacs and private AI, + +00:00:58.940 --> 00:01:02.739 +pieces for an AI Emacs solution, + +00:01:02.740 --> 00:01:08.059 +a demo of a minimal viable product, and the summary. + +00:01:08.060 --> 00:01:10.779 +Why private AI? This is pretty simple. + +00:01:10.780 --> 00:01:12.099 +Just read the terms and conditions + +00:01:12.100 --> 00:01:14.819 +for any AI system you're currently using. + +00:01:14.820 --> 00:01:17.019 +If you're using the free tiers, your queries, + +00:01:17.020 --> 00:01:18.619 +code uploaded information + +00:01:18.620 --> 00:01:20.699 +is being used to train the models. + +00:01:20.700 --> 00:01:22.939 +In some cases, you are giving the company + +00:01:22.940 --> 00:01:25.419 +a perpetual license to your data. + +00:01:25.420 --> 00:01:27.059 +You have no control over this, + +00:01:27.060 --> 00:01:29.219 +except for not using the engine. + +00:01:29.220 --> 00:01:30.699 +And keep in mind, the terms + +00:01:30.700 --> 00:01:32.179 +are changing all the time on that, + +00:01:32.180 --> 00:01:34.139 +and they're not normally changing for our benefit. + +00:01:34.140 --> 00:01:38.259 +So that's not necessarily a good thing. + +00:01:38.260 --> 00:01:40.339 +If you're using the paid tiers, + +00:01:40.340 --> 00:01:43.459 +you may be able to opt out of the data collection. + +00:01:43.460 --> 00:01:45.539 +But keep in mind, this can change, + +00:01:45.540 --> 00:01:48.619 +or they may start charging for that option. + +00:01:48.620 --> 00:01:51.419 +Every AI company wants more and more data. + +00:01:51.420 --> 00:01:53.779 +They need more and more data to train their models. + +00:01:53.780 --> 00:01:56.019 +It is just the way it is. + +00:01:56.020 --> 00:01:57.899 +They need more and more information + +00:01:57.900 --> 00:02:00.459 +to get it more and more accurate to keep it up to date. + +00:02:00.460 --> 00:02:03.219 +There's been a story about Stack Overflow. + +00:02:03.220 --> 00:02:05.819 +It has like half the number of queries they had a year ago + +00:02:05.820 --> 00:02:07.379 +because people are using AI. + +00:02:07.380 --> 00:02:08.579 +The problem with that is now + +00:02:08.580 --> 00:02:10.379 +there's less data going to Stack Overflow + +00:02:10.380 --> 00:02:12.979 +for the AI to get. vicious cycle, + +00:02:12.980 --> 00:02:14.619 +especially when you start looking at + +00:02:14.620 --> 00:02:16.579 +newer language like Ruby and stuff like that. + +00:02:16.580 --> 00:02:21.419 +So it comes down to being an interesting time. + +00:02:21.420 --> 00:02:24.739 +Another reason why to go private AI is your costs are going to vary. + +00:02:24.740 --> 00:02:27.019 +Right now, these services are being heavily subsidized. + +00:02:27.020 --> 00:02:29.419 +If you're paying Claude $20 a month, + +00:02:29.420 --> 00:02:32.579 +it is not costing Claude, those guys $20 a month + +00:02:32.580 --> 00:02:34.099 +to host all the infrastructure + +00:02:34.100 --> 00:02:35.619 +to build all these data centers. + +00:02:35.620 --> 00:02:38.779 +They are severely subsidizing that + +00:02:38.780 --> 00:02:41.259 +at a very much a loss right now. + +00:02:41.260 --> 00:02:43.659 +When they start charging the real costs plus a profit, + +00:02:43.660 --> 00:02:45.499 +it's going to change. + +00:02:45.500 --> 00:02:48.019 +Right now, I use a bunch of different services. + +00:02:48.020 --> 00:02:50.019 +I've played with Grok and a bunch of other ones. + +00:02:50.020 --> 00:02:52.459 +But Grok right now is like $30 a month + +00:02:52.460 --> 00:02:54.139 +for a regular Super Grok. + +00:02:54.140 --> 00:02:56.419 +When they start charging the real cost of that, + +00:02:56.420 --> 00:02:59.819 +it's going to go from $30 to something a great deal more, + +00:02:59.820 --> 00:03:02.379 +perhaps, I think, $100 or $200 + +00:03:02.380 --> 00:03:04.459 +or whatever really turns out to be the cost + +00:03:04.460 --> 00:03:06.059 +when you figure everything into it. + +00:03:06.060 --> 00:03:07.539 +When you start adding that cost into that, + +00:03:07.540 --> 00:03:10.179 +a lot of people are using public AI right now + +00:03:10.180 --> 00:03:11.899 +are going to have no option but to move to private AI + +00:03:11.900 --> 00:03:16.019 +or give up on AI overall. + +00:03:16.020 --> 00:03:18.659 +What do you need to be able to do private AI? + +00:03:18.660 --> 00:03:21.179 +If you're going to run your own AI, + +00:03:21.180 --> 00:03:23.579 +you're going to need a system with either some cores, + +00:03:23.580 --> 00:03:25.699 +a graphics processor unit, + +00:03:25.700 --> 00:03:28.339 +or a neural processing unit, a GPU or an NPU. + +00:03:28.340 --> 00:03:29.819 +I currently have four systems + +00:03:29.820 --> 00:03:32.979 +I'm experimenting with and playing around with on a daily basis. + +00:03:32.980 --> 00:03:37.979 +I have a System76 Pangolin AMD Ryzen 7 78040U + +00:03:37.980 --> 00:03:41.099 +with a Radeon 7080M integrated graphics card. + +00:03:41.100 --> 00:03:42.539 +It's got 32 gigs of RAM. + +00:03:42.540 --> 00:03:45.259 +It's a beautiful piece of hardware. I really do like it. + +00:03:45.260 --> 00:03:46.499 +I have my main workstation, + +00:03:46.500 --> 00:03:50.579 +it's an HP Z620 with dual Intel Xeons + +00:03:50.580 --> 00:03:53.179 +with four NVIDIA K2200 graphics cards in it. + +00:03:53.180 --> 00:03:56.699 +Why the four NVIDIA K2200 graphics card on it? + +00:03:56.700 --> 00:03:59.739 +Because I could buy four of them on eBay for $100 + +00:03:59.740 --> 00:04:02.379 +and it was still supported by the NVIDIA drivers for Debian. + +00:04:02.380 --> 00:04:08.179 +So that's why that is. A MacBook Air with an M1 processor, + +00:04:08.180 --> 00:04:10.939 +a very nice piece of kit I picked up a couple years ago, + +00:04:10.940 --> 00:04:14.139 +very cheap, but it runs AI surprisingly well, + +00:04:14.140 --> 00:04:18.099 +and an Acer Aspire 1 with an AMD Ryzen 5700H in it. + +00:04:18.100 --> 00:04:22.099 +This was my old laptop. It was a sturdy beast. + +00:04:22.100 --> 00:04:24.379 +It was able to do enough AI to do demos and stuff, + +00:04:24.380 --> 00:04:25.859 +and I liked it quite a bit for that. + +00:04:25.860 --> 00:04:28.339 +I'm using the Pangolin for this demonstration + +00:04:28.340 --> 00:04:30.979 +because it's just better. + +00:04:30.980 --> 00:04:37.219 +Apple's M4 chip has 38 teraflops of MPU performance. + +00:04:37.220 --> 00:04:40.099 +The Microsoft co-pilots are now requiring + +00:04:40.100 --> 00:04:41.459 +45 teraflops of MPU + +00:04:41.460 --> 00:04:43.939 +to be able to have the co-pilot badge on it. + +00:04:43.940 --> 00:04:48.299 +And Raspberry Pi's new AI top is about 18 teraflops + +00:04:48.300 --> 00:04:51.219 +and is $70 on top of the cost of Raspberry Pi 5. + +00:04:51.220 --> 00:04:56.059 +Keep in mind Raspberry recently + +00:04:56.060 --> 00:04:59.499 +raised the cost of their Pi 5s because of RAM pricing, + +00:04:59.500 --> 00:05:00.379 +which is going to be affecting + +00:05:00.380 --> 00:05:02.459 +a lot of these types of solutions in the near future. + +00:05:02.460 --> 00:05:05.299 +But there's going to be a lot of + +00:05:05.300 --> 00:05:06.699 +local power available in the future. + +00:05:06.700 --> 00:05:08.219 +That's what it really comes down to. + +00:05:08.220 --> 00:05:11.179 +A lot of people are going to have PCs on their desks. + +00:05:11.180 --> 00:05:13.459 +They're going to run a decent private AI + +00:05:13.460 --> 00:05:18.059 +without much issue. So for Emacs and private AI, + +00:05:18.060 --> 00:05:20.139 +there's a couple popular solutions. + +00:05:20.140 --> 00:05:22.099 +Gptel, which is the one we're going to talk about. + +00:05:22.100 --> 00:05:24.739 +It's a simple interface. It's a minimal interface. + +00:05:24.740 --> 00:05:26.579 +It integrates easily into your workflow. + +00:05:26.580 --> 00:05:29.019 +It's just, quite honestly, chef's kiss, + +00:05:29.020 --> 00:05:31.059 +just a beautifully well-done piece of software. + +00:05:31.060 --> 00:05:33.859 +OllamaBuddy has more features, + +00:05:33.860 --> 00:05:36.259 +a menu interface, has quick access + +00:05:36.260 --> 00:05:37.499 +for things like code refactoring, + +00:05:37.500 --> 00:05:38.979 +text-free formatting, et cetera. + +00:05:38.980 --> 00:05:41.979 +This is the one that you spend a little more time with, + +00:05:41.980 --> 00:05:43.939 +but you also get a little bit more back from it. + +00:05:43.940 --> 00:05:49.419 +Elama is another one, has some really good features to it, + +00:05:49.420 --> 00:05:51.059 +more different capabilities, + +00:05:51.060 --> 00:05:54.979 +but it's a different set of rules and capabilities to it. + +00:05:54.980 --> 00:05:59.179 +Itermac, which is programming with your AI and Emacs. + +00:05:59.180 --> 00:06:01.219 +The closest thing I can come up + +00:06:01.220 --> 00:06:04.139 +to comparing this to is Cursor, except it's an Emacs. + +00:06:04.140 --> 00:06:05.659 +It's really quite well done. + +00:06:05.660 --> 00:06:07.299 +These are all really quite well done. + +00:06:07.300 --> 00:06:08.499 +There's a bunch of other projects out there. + +00:06:08.500 --> 00:06:10.819 +If you go out to GitHub, type Emacs AI, + +00:06:10.820 --> 00:06:13.219 +you'll find a lot of different options. + +00:06:13.220 --> 00:06:18.459 +So what is a minimal viable product that can be done? + +00:06:18.460 --> 00:06:23.379 +A minimal viable product to show what an AI Emacs solution is + +00:06:23.380 --> 00:06:27.179 +can be done with only needing two pieces of software. + +00:06:27.180 --> 00:06:31.179 +Llamafile, this is an amazing piece of software. + +00:06:31.180 --> 00:06:32.899 +This is a whole LLM contained in one file. + +00:06:32.900 --> 00:06:36.059 +And the same file runs on Mac OS X, + +00:06:36.060 --> 00:06:39.379 +Linux, Windows, and the BSDs. + +00:06:39.380 --> 00:06:42.179 +It's a wonderful piece of kit + +00:06:42.180 --> 00:06:44.179 +based on these people who created + +00:06:44.180 --> 00:06:45.899 +this thing called Cosmopolitan + +00:06:45.900 --> 00:06:46.779 +that lets you create and execute + +00:06:46.780 --> 00:06:48.699 +while it runs on a bunch of different systems. + +00:06:48.700 --> 00:06:51.299 +And Gptel, which is an easy plug-in for Emacs, + +00:06:51.300 --> 00:06:54.979 +which we talked about in the last slide a bit. + +00:06:54.980 --> 00:07:00.179 +So setting up the LLM, you have to just go out + +00:07:00.180 --> 00:07:01.699 +and just hit the a page for it + +00:07:01.700 --> 00:07:05.099 +and go out and do a wget of it. + +00:07:05.100 --> 00:07:07.099 +That's all it takes there. + +00:07:07.100 --> 00:07:10.259 +Chmodding it so you can actually execute the executable. + +00:07:10.260 --> 00:07:12.939 +And then just go ahead and actually running it. + +00:07:12.940 --> 00:07:16.939 +And let's go ahead and do that. + +00:07:16.940 --> 00:07:18.899 +I've already downloaded it because I don't want to wait. + +00:07:18.900 --> 00:07:21.259 +And let's just take a look at it. + +00:07:21.260 --> 00:07:22.899 +I've actually downloaded several of them, + +00:07:22.900 --> 00:07:25.699 +but let's go ahead and just run lava 3.2b + +00:07:25.700 --> 00:07:31.179 +with the 3 billion instructions. And that's it firing up. + +00:07:31.180 --> 00:07:33.899 +And it is nice enough to actually be listening in port 8080, + +00:07:33.900 --> 00:07:35.339 +which we'll need in a minute. + +00:07:35.340 --> 00:07:43.139 +So once you do that, you have to install gptel and emacs. + +00:07:43.140 --> 00:07:45.659 +That's as simple as firing up emacs, + +00:07:45.660 --> 00:07:48.339 +doing the meta x install package, + +00:07:48.340 --> 00:07:49.779 +and then just typing gptel + +00:07:49.780 --> 00:07:51.499 +if you have your repository set up right, + +00:07:51.500 --> 00:07:52.299 +which hopefully you do. + +00:07:52.300 --> 00:07:54.499 +And then you just go ahead and have it. + +00:07:54.500 --> 00:07:58.139 +You also have to set up a config file. + +00:07:58.140 --> 00:08:01.739 +Here's my example config file as it currently set up, + +00:08:01.740 --> 00:08:04.019 +requiring ensuring Gptel is loaded, + +00:08:04.020 --> 00:08:05.899 +defining the Llamafile backend. + +00:08:05.900 --> 00:08:07.779 +You can put multiple backends into it, + +00:08:07.780 --> 00:08:09.859 +but I just have the one defined on this example. + +00:08:09.860 --> 00:08:12.059 +But it's pretty straightforward. + +00:08:12.060 --> 00:08:16.739 +Llama local file, name for it, stream, protocol HTTP. + +00:08:16.740 --> 00:08:20.859 +If you have HTTPS set up, that's obviously preferable, + +00:08:20.860 --> 00:08:22.779 +but a lot of people don't for their home labs. + +00:08:22.780 --> 00:08:26.379 +Host is just 127.0.0.1 port 8080. + +00:08:26.380 --> 00:08:30.099 +Keep in mind, some of the AIs run on a different port, + +00:08:30.100 --> 00:08:31.499 +so you may be 8081 + +00:08:31.500 --> 00:08:34.619 +if you're running OpenWebView at the same time. The key, + +00:08:34.620 --> 00:08:37.019 +we don't need an API key because it's a local server. + +00:08:37.020 --> 00:08:40.259 +And the models just, uh, we can put multiple models + +00:08:40.260 --> 00:08:41.339 +on there if we want to. + +00:08:41.340 --> 00:08:43.699 +So if we create one with additional stuff + +00:08:43.700 --> 00:08:45.379 +or like rag and stuff like that, + +00:08:45.380 --> 00:08:47.459 +we can actually name those models by their domain, + +00:08:47.460 --> 00:08:48.699 +which is really kind of cool. + +00:08:48.700 --> 00:08:52.099 +But, uh, that's all that takes. + +00:08:52.100 --> 00:09:03.779 +So let's go ahead and go to a quick test of it. + +00:09:03.780 --> 00:09:11.019 +Oops. Alt-X, gptel. And we're going to just choose + +00:09:11.020 --> 00:09:12.499 +the default buffer to make things easier. + +00:09:12.500 --> 00:09:15.339 +Going to resize it up a bit. + +00:09:15.340 --> 00:09:19.859 +And usually the go-to question I go to is, who was David Bowie? + +00:09:19.860 --> 00:09:24.499 +This one is actually a question + +00:09:24.500 --> 00:09:26.219 +that's turned out to be really good + +00:09:26.220 --> 00:09:28.019 +for figuring out whether or not AI is complete. + +00:09:28.020 --> 00:09:31.139 +This is one that some engines do well on, other ones don't. + +00:09:31.140 --> 00:09:33.739 +And we can just do, we can either do + +00:09:33.740 --> 00:09:36.059 +the alt X and send the gptel-send, + +00:09:36.060 --> 00:09:37.979 +or we can just do control C and hit enter. + +00:09:37.980 --> 00:09:39.139 +We'll just do control C and enter. + +00:09:39.140 --> 00:09:43.659 +And now it's going ahead and hitting our local AI system + +00:09:43.660 --> 00:09:46.659 +running on port 8080. And that looks pretty good, + +00:09:46.660 --> 00:09:50.739 +but let's go ahead and say, hey, it's set to terse mode right now. + +00:09:50.740 --> 00:10:03.859 +Please expand upon this. And there we go. + +00:10:03.860 --> 00:10:05.379 +We're getting a full description + +00:10:05.380 --> 00:10:08.739 +of the majority of, uh, about David Bowie's life + +00:10:08.740 --> 00:10:10.139 +and other information about him. + +00:10:10.140 --> 00:10:21.699 +So very, very happy with that. + +00:10:21.700 --> 00:10:23.539 +One thing to keep in mind is you look at things + +00:10:23.540 --> 00:10:24.699 +when you're looking for hallucinations, + +00:10:24.700 --> 00:10:26.899 +how accurate AI is, how it's compressed + +00:10:26.900 --> 00:10:29.259 +is it will tend to screw up on things like + +00:10:29.260 --> 00:10:30.859 +how many children he had and stuff like that. + +00:10:30.860 --> 00:10:32.459 +Let me see if it gets to that real quick. + +00:10:32.460 --> 00:10:39.739 +Is it not actually on this one? + +00:10:39.740 --> 00:10:42.179 +Alright, so that's the first question I always ask one. + +00:10:42.180 --> 00:10:44.659 +The next one is what are sea monkeys? + +00:10:44.660 --> 00:10:48.979 +It gives you an idea of the breadth of the system. + +00:10:48.980 --> 00:11:10.619 +It's querying right now. Pulls it back correctly. Yes. + +00:11:10.620 --> 00:11:12.339 +And it's smart enough to actually detect David Bowie + +00:11:12.340 --> 00:11:15.019 +even referenced see monkeys in the song sea of love, + +00:11:15.020 --> 00:11:16.179 +which came at hit single. + +00:11:16.180 --> 00:11:18.859 +So it's actually keeping the context alive + +00:11:18.860 --> 00:11:20.419 +and that which is very cool feature. + +00:11:20.420 --> 00:11:21.459 +I did not see that coming. + +00:11:21.460 --> 00:11:24.139 +Here's one that some people say is a really good one + +00:11:24.140 --> 00:11:25.739 +to ask ours in strawberry. + +00:11:25.740 --> 00:11:46.179 +All right, now she's going off the reservation. + +00:11:46.180 --> 00:11:48.139 +She's going in a different direction. + +00:11:48.140 --> 00:11:49.979 +Let me go ahead and reopen that again, + +00:11:49.980 --> 00:11:52.979 +because it's went down a bad hole there for a second. + +00:11:52.980 --> 00:11:58.419 +Let me ask it to do write hello world in Emacs list. + +00:11:58.420 --> 00:12:10.419 +Yep, that works. So the point being here, + +00:12:10.420 --> 00:12:14.939 +that was like two minutes of setup. + +00:12:14.940 --> 00:12:18.019 +And now we have a small AI embedded inside the system. + +00:12:18.020 --> 00:12:20.539 +So that gives you an idea just how easy it can be. + +00:12:20.540 --> 00:12:22.299 +And it's just running locally on the system. + +00:12:22.300 --> 00:12:25.259 +We also have the default system here as well. + +00:12:25.260 --> 00:12:32.579 +So not that bad. + +00:12:32.580 --> 00:12:35.379 +That's a basic solution, that's a basic setup + +00:12:35.380 --> 00:12:37.059 +that will get you to the point where you can go like, + +00:12:37.060 --> 00:12:39.859 +it's a party trick, but it's a very cool party trick. + +00:12:39.860 --> 00:12:42.859 +The way that Gptel works is it puts it into buffers, + +00:12:42.860 --> 00:12:45.099 +it doesn't interfere with your flow that much, + +00:12:45.100 --> 00:12:47.179 +it's just an additional window you can pop open + +00:12:47.180 --> 00:12:49.019 +to ask questions and get information for, + +00:12:49.020 --> 00:12:51.459 +dump code into it and have it refactored. + +00:12:51.460 --> 00:12:53.339 +Gptel has a lot of additional options + +00:12:53.340 --> 00:12:55.699 +for things that are really cool for that. + +00:12:55.700 --> 00:12:57.099 +But if you want a better solution, + +00:12:57.100 --> 00:12:59.939 +I recommend Ollama or LM Studio. + +00:12:59.940 --> 00:13:01.899 +They're both more capable than llama file. + +00:13:01.900 --> 00:13:03.859 +They can accept a lot of different models. + +00:13:03.860 --> 00:13:05.739 +You can do things like RAG. + +00:13:05.740 --> 00:13:09.219 +You can do loading of things onto the GPU more explicitly. + +00:13:09.220 --> 00:13:10.379 +It can speed stuff up. + +00:13:10.380 --> 00:13:13.059 +One of the things about the retrieval augmentation is + +00:13:13.060 --> 00:13:15.539 +it will let you put your data into the system + +00:13:15.540 --> 00:13:17.779 +so you can start uploading your code, your information, + +00:13:17.780 --> 00:13:20.139 +and actually being able to do analysis of it. + +00:13:20.140 --> 00:13:23.539 +OpenWebUI provides more capabilities. + +00:13:23.540 --> 00:13:24.859 +It provides an interface that's similar + +00:13:24.860 --> 00:13:25.899 +to what you're used to seeing + +00:13:25.900 --> 00:13:28.179 +for chat, GPT, and the other systems. + +00:13:28.180 --> 00:13:29.419 +It's really quite well done. + +00:13:29.420 --> 00:13:32.539 +And once again, gptel, I have to mention that + +00:13:32.540 --> 00:13:34.779 +because that's the one I really kind of like. + +00:13:34.780 --> 00:13:36.899 +And OlamaBuddy is also another really nice one. + +00:13:36.900 --> 00:13:41.019 +So what about the licensing of these models? + +00:13:41.020 --> 00:13:42.299 +Since I'm going out pulling down + +00:13:42.300 --> 00:13:43.579 +a model and doing this stuff. + +00:13:43.580 --> 00:13:46.579 +Let's take a look at a couple of highlights + +00:13:46.580 --> 00:13:49.379 +from the MetaLlama 3 community license scale. + +00:13:49.380 --> 00:13:52.579 +If your service exceeds 700 million monthly users, + +00:13:52.580 --> 00:13:54.099 +you need additional licensing. + +00:13:54.100 --> 00:13:56.099 +Probably not going to be a problem for most of us. + +00:13:56.100 --> 00:13:58.379 +There's a competition restriction. + +00:13:58.380 --> 00:14:00.899 +You can't use this model to enhance competing models. + +00:14:00.900 --> 00:14:04.219 +And there's some limitations on using the Meta trademarks. + +00:14:04.220 --> 00:14:05.939 +Not that big a deal. + +00:14:05.940 --> 00:14:09.139 +And the other ones are it's a permissive one + +00:14:09.140 --> 00:14:10.939 +designed to encourage innovation, + +00:14:10.940 --> 00:14:13.779 +open development, commercial use is allowed, + +00:14:13.780 --> 00:14:15.219 +but there are some restrictions on it. + +00:14:15.220 --> 00:14:17.259 +Yeah, you can modify the model, + +00:14:17.260 --> 00:14:20.419 +but you have to rely on the license terms. + +00:14:20.420 --> 00:14:22.339 +And you can distribute the model with derivatives. + +00:14:22.340 --> 00:14:24.059 +And there are some very cool ones out there. + +00:14:24.060 --> 00:14:25.259 +There's people who've done things + +00:14:25.260 --> 00:14:29.579 +to try and make the llama bee less, what's the phrase, + +00:14:29.580 --> 00:14:31.939 +ethical if you're doing penetration testing research + +00:14:31.940 --> 00:14:32.619 +and stuff like that. + +00:14:32.620 --> 00:14:34.459 +It has some very nice value there. + +00:14:34.460 --> 00:14:37.739 +Keep in mind licenses also vary + +00:14:37.740 --> 00:14:39.619 +depending on the model you're using. + +00:14:39.620 --> 00:14:42.419 +Mistral AI has the non-production license. + +00:14:42.420 --> 00:14:45.219 +It's designed to keep it to research and development. + +00:14:45.220 --> 00:14:46.739 +You can't use it commercially. + +00:14:46.740 --> 00:14:50.419 +So it's designed to clearly delineate + +00:14:50.420 --> 00:14:52.939 +between research and development + +00:14:52.940 --> 00:14:54.259 +and somebody trying to actually build + +00:14:54.260 --> 00:14:55.379 +something on top of it. + +00:14:55.380 --> 00:14:57.979 +And another question I get asked is, + +00:14:57.980 --> 00:14:59.899 +are there open source data model options? + +00:14:59.900 --> 00:15:02.819 +Yeah, but most of them are small or specialized currently. + +00:15:02.820 --> 00:15:05.499 +MoMo is a whole family of them, + +00:15:05.500 --> 00:15:07.339 +but there tend to be more specialized, + +00:15:07.340 --> 00:15:09.019 +but it's very cool to see where it's going. + +00:15:09.020 --> 00:15:11.339 +And it's another thing that's just going forward. + +00:15:11.340 --> 00:15:13.379 +It's under the MIT license. + +00:15:13.380 --> 00:15:15.819 +Some things to know to help you + +00:15:15.820 --> 00:15:17.499 +have a better experience with this. + +00:15:17.500 --> 00:15:21.059 +Get a Llama and OpenWebUI working by themselves, + +00:15:21.060 --> 00:15:22.659 +then set up your config file. + +00:15:22.660 --> 00:15:24.819 +I was fighting both at the same time, + +00:15:24.820 --> 00:15:26.699 +and it turned out I had a problem with my LLAMA. + +00:15:26.700 --> 00:15:28.899 +I had a conflict, so that was what my problem is. + +00:15:28.900 --> 00:15:32.819 +Llamafile, gptel is a great way to start experimenting + +00:15:32.820 --> 00:15:34.299 +just to get you an idea of how it works + +00:15:34.300 --> 00:15:36.939 +and figure out how the interfaces work. Tremendous. + +00:15:36.940 --> 00:15:40.739 +RAG loading documents into it is really easy with open web UI. + +00:15:40.740 --> 00:15:43.019 +You can create models, you can put things like + +00:15:43.020 --> 00:15:46.419 +help desk developers and stuff like that, breaking it out. + +00:15:46.420 --> 00:15:51.019 +The Hacker News has a how to build a $300 AI computer. + +00:15:51.020 --> 00:15:52.859 +This is for March 2024, + +00:15:52.860 --> 00:15:55.099 +but it still has a lot of great information + +00:15:55.100 --> 00:15:56.819 +on how to benchmark the environments, + +00:15:56.820 --> 00:16:01.339 +what some values are like the Ryzen 5700U + +00:16:01.340 --> 00:16:02.579 +inside my Acer Aspire, + +00:16:02.580 --> 00:16:04.419 +that's where I got the idea doing that. + +00:16:04.420 --> 00:16:06.739 +Make sure you do the RockM stuff correctly + +00:16:06.740 --> 00:16:09.899 +to get the GUI extensions. But it's just really good stuff. + +00:16:09.900 --> 00:16:13.059 +You don't need a great GPU or CPU to get started. + +00:16:13.060 --> 00:16:14.819 +Smaller models like Tiny Llama + +00:16:14.820 --> 00:16:16.179 +can run on very small systems. + +00:16:16.180 --> 00:16:18.499 +It gets you the ability to start playing with it + +00:16:18.500 --> 00:16:21.619 +and start experimenting and figure out if that's for you + +00:16:21.620 --> 00:16:23.379 +and to move forward with it. + +00:16:23.380 --> 00:16:29.219 +The AMD Ryzen AI Max 395 plus is a mini PC + +00:16:29.220 --> 00:16:31.179 +makes it really nice dedicated host. + +00:16:31.180 --> 00:16:34.619 +You used to be able to buy these for about $1200 now + +00:16:34.620 --> 00:16:35.579 +with the RAM price increase, + +00:16:35.580 --> 00:16:38.779 +you want to get 120 gig when you're pushing two brands so. + +00:16:38.780 --> 00:16:40.739 +It gets a little tighter. + +00:16:40.740 --> 00:16:44.099 +Macs work remarkably well with AI. + +00:16:44.100 --> 00:16:47.659 +My MacBook Air was one of my go-tos for a while, + +00:16:47.660 --> 00:16:49.779 +but once I started doing anything AI, + +00:16:49.780 --> 00:16:50.779 +I had a five-minute window + +00:16:50.780 --> 00:16:52.619 +before the thermal throttling became an issue. + +00:16:52.620 --> 00:16:54.619 +Keep in mind that's a MacBook Air, + +00:16:54.620 --> 00:16:56.659 +so it doesn't have the greatest ventilation. + +00:16:56.660 --> 00:16:58.339 +If you get the MacBook Pros and stuff, + +00:16:58.340 --> 00:17:00.139 +they tend to have more ventilation, + +00:17:00.140 --> 00:17:02.499 +but still you're going to be pushing against that. + +00:17:02.500 --> 00:17:04.939 +So Mac Minis and the Mac Ultras and stuff like that + +00:17:04.940 --> 00:17:06.099 +tend to work really well for that. + +00:17:06.100 --> 00:17:09.779 +Alex Ziskin on YouTube has a channel. + +00:17:09.780 --> 00:17:11.899 +He does a lot of AI performance benchmarking, + +00:17:11.900 --> 00:17:14.819 +like I load a 70 billion parameter model + +00:17:14.820 --> 00:17:16.699 +on this mini PC and stuff like that. + +00:17:16.700 --> 00:17:19.019 +It's a lot of fun and interesting stuff there. + +00:17:19.020 --> 00:17:21.219 +And it's influencing my decision + +00:17:21.220 --> 00:17:22.979 +to buy my next AI style PC. + +00:17:22.980 --> 00:17:27.619 +Small domain specific LLMs are happening. + +00:17:27.620 --> 00:17:29.939 +An LLM that has all your code and information, + +00:17:29.940 --> 00:17:31.659 +it sounds like a really cool idea. + +00:17:31.660 --> 00:17:34.299 +It gives you capabilities to start training stuff + +00:17:34.300 --> 00:17:35.899 +that you couldn't do with like the big ones. + +00:17:35.900 --> 00:17:38.059 +Even with in terms of fine tuning and stuff, + +00:17:38.060 --> 00:17:40.539 +it's remarkable to see where that space is coming along + +00:17:40.540 --> 00:17:41.739 +in the next year or so. + +00:17:41.740 --> 00:17:46.219 +Hugging Face Co has pointers to tons of AI models. + +00:17:46.220 --> 00:17:49.259 +You'll find the one that works for you, hopefully there. + +00:17:49.260 --> 00:17:50.539 +If you're doing cybersecurity, + +00:17:50.540 --> 00:17:52.059 +there's a whole bunch out there for that, + +00:17:52.060 --> 00:17:54.619 +that have certain training on it, information. + +00:17:54.620 --> 00:17:56.139 +It's really good. + +00:17:56.140 --> 00:18:00.099 +One last thing to keep in mind is hallucinations are real. + +00:18:00.100 --> 00:18:02.779 +You will get BS back from the AI occasionally, + +00:18:02.780 --> 00:18:05.179 +so do validate everything you get from it. + +00:18:05.180 --> 00:18:08.459 +Don't be using it for court cases like some people have + +00:18:08.460 --> 00:18:14.539 +and run into those problems. So, That is my talk. + +00:18:14.540 --> 00:18:17.219 +What I would like you to get out of that is, + +00:18:17.220 --> 00:18:21.859 +if you haven't tried it, give GPTEL and LlamaFile a shot. + +00:18:21.860 --> 00:18:23.979 +Fire up a little small AI instance, + +00:18:23.980 --> 00:18:27.339 +play around with a little bit inside your Emacs, + +00:18:27.340 --> 00:18:30.139 +and see if it makes your life better. Hopefully it will. + +00:18:30.140 --> 00:18:32.139 +And I really hope you guys + +00:18:32.140 --> 00:18:34.659 +learned something from this talk. And thanks for listening. + +00:18:34.660 --> 00:18:38.979 +And the links are at the end of the talk, if you have any questions. + +00:18:38.980 --> 00:18:42.739 +Let me see if we got anything you want, Pat. You do. + +00:18:42.740 --> 00:18:43.899 +You've got a few questions. + +00:18:43.900 --> 00:18:48.059 +Hey, this is Corwin. Thank you so much. Thank you, Aaron. + +00:18:48.060 --> 00:18:50.339 +What an awesome talk this was, actually. + +00:18:50.340 --> 00:18:52.179 +If you don't have a camera, + +00:18:52.180 --> 00:18:54.339 +I can get away with not having one too. + +00:18:54.340 --> 00:18:56.299 +I've got, I'll turn the camera on. + +00:18:56.300 --> 00:19:01.499 +Okay. All right. I'll turn mine back on. Here I come. + +00:19:01.500 --> 00:19:03.139 +Yeah, so there are a few questions, + +00:19:03.140 --> 00:19:04.579 +but first let me say thank you + +00:19:04.580 --> 00:19:06.339 +for a really captivating talk. + +00:19:06.340 --> 00:19:10.939 +I think a lot of people will be empowered from this + +00:19:10.940 --> 00:19:15.259 +to try to do more with less, especially locally. + +00:19:15.260 --> 00:19:20.179 +concerned about the data center footprint, + +00:19:20.180 --> 00:19:23.659 +environmentally concerned + +00:19:23.660 --> 00:19:26.979 +about the footprint of LLM inside data centers. + +00:19:26.980 --> 00:19:28.219 +So just thinking about how we can + +00:19:28.220 --> 00:19:32.419 +put infrastructure we have at home to use + +00:19:32.420 --> 00:19:34.019 +and get more done with less. + +00:19:34.020 --> 00:19:37.499 +Yeah, the data center impact's interesting + +00:19:37.500 --> 00:19:39.979 +because there was a study a while ago. + +00:19:39.980 --> 00:19:42.099 +Someone said every time you do a Gemini query, + +00:19:42.100 --> 00:19:45.019 +it's like boiling a cup of water. + +00:19:45.020 --> 00:19:48.619 +Yeah, I've heard that one too. So do you want to, you know, + +00:19:48.620 --> 00:19:51.699 +I don't know how much direction you want. + +00:19:51.700 --> 00:19:53.859 +I'd be very happy to read out the questions for you. + +00:19:53.860 --> 00:19:55.219 +Yeah, that would be great. + +00:19:55.220 --> 00:19:57.619 +I'm having trouble getting to that tab. + +00:19:57.620 --> 00:20:02.779 +Okay, I'm there, so I'll put it into our chat too, + +00:20:02.780 --> 00:20:07.419 +so you can follow along if you'd like. + +00:20:07.420 --> 00:20:11.219 +The first question was, why is the David Bowie question + +00:20:11.220 --> 00:20:12.219 +a good one to start with? + +00:20:12.220 --> 00:20:14.419 +Does it have interesting failure conditions + +00:20:14.420 --> 00:20:17.299 +or what made you choose that? + +00:20:17.300 --> 00:20:21.979 +First off, huge fan of David Bowie. + +00:20:21.980 --> 00:20:24.499 +But I came down to it really taught me a few things + +00:20:24.500 --> 00:20:26.299 +about how old the models work + +00:20:26.300 --> 00:20:28.819 +in terms of things like how many kids he had, + +00:20:28.820 --> 00:20:31.779 +because deep seek, which is a very popular Chinese model + +00:20:31.780 --> 00:20:33.179 +that a lot of people are using now, + +00:20:33.180 --> 00:20:35.619 +misidentifies him having three daughters, + +00:20:35.620 --> 00:20:38.459 +and he has like one son and one, one, I think, + +00:20:38.460 --> 00:20:40.899 +two sons and a daughter or something like that. + +00:20:40.900 --> 00:20:43.659 +so there's differences on that and it just goes over + +00:20:43.660 --> 00:20:45.299 +there's a whole lot of stuff + +00:20:45.300 --> 00:20:47.779 +because his story spans like 60 years + +00:20:47.780 --> 00:20:49.659 +so it gives a good good feedback + +00:20:49.660 --> 00:20:51.539 +that's the real main reason I asked that question + +00:20:51.540 --> 00:20:53.699 +because I just needed one that sea monkeys I just picked + +00:20:53.700 --> 00:20:56.579 +because it was obscure and just always have right + +00:20:56.580 --> 00:20:58.939 +I used to have it right hello world and forth + +00:20:58.940 --> 00:21:01.019 +because I thought was an interesting one as well so + +00:21:01.020 --> 00:21:03.899 +It's just picking random ones like that. + +00:21:03.900 --> 00:21:06.499 +One question asked, sorry, a lot of models is, + +00:21:06.500 --> 00:21:09.419 +what is the closest star to the Earth? + +00:21:09.420 --> 00:21:12.019 +Because most of them will say Alpha Centauri + +00:21:12.020 --> 00:21:13.739 +or Proxima Centauri and not the sun. + +00:21:13.740 --> 00:21:15.899 +And I have a whole nother talk + +00:21:15.900 --> 00:21:17.899 +where I just argue with the LLM + +00:21:17.900 --> 00:21:20.019 +trying to say, hey, the sun is a star. + +00:21:20.020 --> 00:21:26.579 +And he just wouldn't accept it, so. What? + +00:21:26.580 --> 00:21:28.419 +Oh, I can hear that. + +00:21:28.420 --> 00:21:34.379 +So what specific tasks do you like to use your local AI? + +00:21:34.380 --> 00:21:37.459 +I like to load a lot of my code into + +00:21:37.460 --> 00:21:39.739 +and actually have it do analysis of it. + +00:21:39.740 --> 00:21:42.339 +I was actually going through some code + +00:21:42.340 --> 00:21:45.619 +I have for some pen testing, and I was having it modified + +00:21:45.620 --> 00:21:47.259 +to update it for the newer version, + +00:21:47.260 --> 00:21:48.459 +because I hate to say this, + +00:21:48.460 --> 00:21:49.859 +but it was written for Python 2, + +00:21:49.860 --> 00:21:51.459 +and I needed to update it for Python 3. + +00:21:51.460 --> 00:21:53.859 +And the 2 to 3 tool did not do all of it, + +00:21:53.860 --> 00:21:56.659 +but the actual tool was able to do the refactoring. + +00:21:56.660 --> 00:21:58.499 +It's part of my laziness. + +00:21:58.500 --> 00:22:01.459 +But I use that for anything I don't want to hit the web. + +00:22:01.460 --> 00:22:03.259 +And that's a lot of stuff when you start thinking about + +00:22:03.260 --> 00:22:04.979 +if you're doing cyber security researching. + +00:22:04.980 --> 00:22:06.819 +and you have your white papers + +00:22:06.820 --> 00:22:10.779 +and stuff like that and stuff in there. + +00:22:10.780 --> 00:22:13.979 +I've got a lot of that loaded into RAG + +00:22:13.980 --> 00:22:15.659 +in one model on my OpenWebUI system. + +00:22:15.660 --> 00:22:21.059 +Neat. Have you used have you used + +00:22:21.060 --> 00:22:25.739 +any small domain specific LLMs? What kind of tasks? + +00:22:25.740 --> 00:22:30.419 +If so, what kind of tasks that they specialize in? + +00:22:30.420 --> 00:22:32.139 +And you know, how? + +00:22:32.140 --> 00:22:34.979 +Not to be honest, but there are some out there like once again, + +00:22:34.980 --> 00:22:36.779 +for cybersecurity and stuff like that, + +00:22:36.780 --> 00:22:39.739 +that I really need to dig into that's on my to do list. + +00:22:39.740 --> 00:22:41.699 +I've got a couple weeks off at the end of the year. + +00:22:41.700 --> 00:22:43.779 +And that's a big part of my plan for that. + +00:22:43.780 --> 00:22:49.379 +Are the various models updated pretty regularly? + +00:22:49.380 --> 00:22:52.059 +Can you add your own data to the pre-built models? + +00:22:52.060 --> 00:22:56.699 +Yes. The models are updated pretty reasonably. + +00:22:56.700 --> 00:22:59.699 +You can add data to a model in a couple of different ways. + +00:22:59.700 --> 00:23:01.099 +You can do something called fine-tuning, + +00:23:01.100 --> 00:23:03.819 +which requires a really nice GPU and a lot of CPU time. + +00:23:03.820 --> 00:23:05.499 +Probably not going to do that. + +00:23:05.500 --> 00:23:07.419 +You can do retrieval augmentation generation, + +00:23:07.420 --> 00:23:09.499 +which is you load your data on top of the system + +00:23:09.500 --> 00:23:11.299 +and puts inside a database + +00:23:11.300 --> 00:23:12.859 +and you can actually scan that and stuff. + +00:23:12.860 --> 00:23:14.619 +I have another talk where I go through + +00:23:14.620 --> 00:23:16.219 +and I start asking questions about, + +00:23:16.220 --> 00:23:18.579 +I load the talk into the engine + +00:23:18.580 --> 00:23:20.099 +and I ask questions against that. + +00:23:20.100 --> 00:23:22.179 +I would have one more time would have done that + +00:23:22.180 --> 00:23:26.499 +but it comes down to how many That's that's rag rag + +00:23:26.500 --> 00:23:29.419 +is pretty easy to do through open web UI or LM studio + +00:23:29.420 --> 00:23:31.419 +It's a great way you just like point a folder + +00:23:31.420 --> 00:23:34.099 +point it to a folder and it just sucks all that state into + +00:23:34.100 --> 00:23:35.499 +and it'll hit that data first + +00:23:35.500 --> 00:23:36.859 +you have like helpdesk and stuff and + +00:23:36.860 --> 00:23:39.619 +The other options there's vector databases, + +00:23:39.620 --> 00:23:41.819 +which is like if you use PostgreSQL. + +00:23:41.820 --> 00:23:43.699 +It has a PG vector I can do a lot of that stuff. + +00:23:43.700 --> 00:23:44.739 +I've not dug into that yet, + +00:23:44.740 --> 00:23:46.099 +but that is also on that to-do list + +00:23:46.100 --> 00:23:48.459 +I've got a lot of stuff planned for Cool. + +00:23:48.460 --> 00:23:51.819 +So what are your experience with rags? + +00:23:51.820 --> 00:23:54.339 +I don't even know what that means. + +00:23:54.340 --> 00:23:57.419 +Do you know what that means? + +00:23:57.420 --> 00:23:59.619 +Do you remember this question again? + +00:23:59.620 --> 00:24:03.979 +What is your experience with RAGs? RAGs is great. + +00:24:03.980 --> 00:24:07.459 +That's Retrieval Augmentation Generation. + +00:24:07.460 --> 00:24:09.739 +That loads your data first, and it hits yours, + +00:24:09.740 --> 00:24:11.499 +and it'll actually cite it and stuff. + +00:24:11.500 --> 00:24:14.659 +There's a guy who wrote a RAG in 100 lines of Python, + +00:24:14.660 --> 00:24:16.899 +and it's an impressive piece of software. + +00:24:16.900 --> 00:24:18.779 +I think if you hit one of my site, + +00:24:18.780 --> 00:24:22.099 +I've got a private AI talk where I actually refer to that. + +00:24:22.100 --> 00:24:25.219 +But retrieval augmentation, it's easy, it's fast, + +00:24:25.220 --> 00:24:26.699 +it puts your data into the system, + +00:24:26.700 --> 00:24:31.339 +Yeah, start with that and go then iterate on top of that. + +00:24:31.340 --> 00:24:32.659 +That's one of the great things about AI, + +00:24:32.660 --> 00:24:33.619 +especially private AI, + +00:24:33.620 --> 00:24:37.739 +is you can do whatever you want to with it + +00:24:37.740 --> 00:24:43.179 +and build up with it as you get more experience. + +00:24:43.180 --> 00:24:44.219 +Any thoughts on running things + +00:24:44.220 --> 00:24:49.179 +on AWS, DigitalOcean, and so on? + +00:24:49.180 --> 00:24:50.619 +AWS is not bad. + +00:24:50.620 --> 00:24:52.659 +The DigitalOcean, they have some of their GPUs. + +00:24:52.660 --> 00:24:54.379 +I still don't like having the data + +00:24:54.380 --> 00:24:57.419 +leave my house, to be honest, or at work, + +00:24:57.420 --> 00:24:59.019 +because I tend to do some stuff + +00:24:59.020 --> 00:25:01.259 +that I don't want it even hitting that situation. + +00:25:01.260 --> 00:25:03.699 +But they have pretty good stuff. + +00:25:03.700 --> 00:25:05.579 +Another one to consider is Oracle Cloud. + +00:25:05.580 --> 00:25:09.059 +Oracle has their AI infrastructure that's really well done. + +00:25:09.060 --> 00:25:12.379 +But I mean, once again, then you start looking at potential + +00:25:12.380 --> 00:25:13.779 +is saying your data is private, + +00:25:13.780 --> 00:25:14.819 +I don't necessarily trust it. + +00:25:14.820 --> 00:25:17.859 +But they do have good stuff, both DigitalOcean, AWS, + +00:25:17.860 --> 00:25:20.339 +Oracle Cloud has the free service, which isn't too bad, + +00:25:20.340 --> 00:25:21.339 +usually a certain number of stuff. + +00:25:21.340 --> 00:25:23.179 +And Google's also has it, + +00:25:23.180 --> 00:25:26.739 +but I still tend to keep more stuff on local PCs, + +00:25:26.740 --> 00:25:33.299 +because I just paranoid that way. Gotcha. + +00:25:33.300 --> 00:25:35.579 +What has your experience been using AI? + +00:25:35.580 --> 00:25:40.139 +Do you want to get into that, using AI for cybersecurity? + +00:25:40.140 --> 00:25:42.019 +You might have already touched on this. + +00:25:42.020 --> 00:25:44.379 +Yeah, really, for cybersecurity, + +00:25:44.380 --> 00:25:46.259 +what I've had to do is I've dumped logs + +00:25:46.260 --> 00:25:47.299 +to have a due correlation. + +00:25:47.300 --> 00:25:49.859 +Keep in mind, the size of that LLAMA file we were using + +00:25:49.860 --> 00:25:52.059 +for figuring out David Bowie, writing the hello world, + +00:25:52.060 --> 00:25:54.179 +all that stuff, is like six gig. + +00:25:54.180 --> 00:25:56.859 +How does it get the entire world in six gig? + +00:25:56.860 --> 00:25:59.739 +I still haven't figured that out in terms of quantization. + +00:25:59.740 --> 00:26:02.499 +So I'm really interested in seeing the ability + +00:26:02.500 --> 00:26:05.139 +to take all this stuff out of all my logs, + +00:26:05.140 --> 00:26:06.339 +dump it all in there, + +00:26:06.340 --> 00:26:08.459 +and actually be able to do intelligent queries against that. + +00:26:08.460 --> 00:26:10.899 +Microsoft has a project called Security Copilot, + +00:26:10.900 --> 00:26:12.819 +which is trying to do that in the Cloud. + +00:26:12.820 --> 00:26:15.299 +But I want to work on something to do that more locally + +00:26:15.300 --> 00:26:19.019 +and be able to actually drive this stuff over that. + +00:26:19.020 --> 00:26:21.979 +That's one also on the long-term goals. + +00:26:21.980 --> 00:26:26.059 +So we got any other questions or? + +00:26:26.060 --> 00:26:29.099 +Those are the questions that I see. + +00:26:29.100 --> 00:26:31.179 +I want to just read out a couple of comments + +00:26:31.180 --> 00:26:33.419 +that I saw in IRC though. + +00:26:33.420 --> 00:26:36.699 +Jay Rutabaga says, it went very well + +00:26:36.700 --> 00:26:39.259 +from an audience perspective. + +00:26:39.260 --> 00:26:43.619 +And G Gundam says, respect your commitment to privacy. + +00:26:43.620 --> 00:26:45.619 +And then somebody is telling us + +00:26:45.620 --> 00:26:46.779 +we might have skipped a question. + +00:26:46.780 --> 00:26:50.019 +So I'm just going to run back to my list. + +00:26:50.020 --> 00:26:52.819 +Updated regularly experience. + +00:26:52.820 --> 00:26:57.659 +I just didn't type in the answer here's + +00:26:57.660 --> 00:26:59.659 +and there's a couple more questions coming in so + +00:26:59.660 --> 00:27:04.699 +Is there a disparity where you go to paid models + +00:27:04.700 --> 00:27:08.619 +because they are better and what problems? + +00:27:08.620 --> 00:27:14.019 +You know what would drive you to? That's a good question. + +00:27:14.020 --> 00:27:17.819 +Paid models, I don't mind them. I think they're good, + +00:27:17.820 --> 00:27:21.299 +but I don't think they're actually economically sustainable + +00:27:21.300 --> 00:27:22.659 +under their current system. + +00:27:22.660 --> 00:27:24.299 +Because right now, if you're paying + +00:27:24.300 --> 00:27:26.899 +20 bucks a month for Copilot and that goes up to 200 bucks, + +00:27:26.900 --> 00:27:28.499 +I'm not going to be as likely to use it. + +00:27:28.500 --> 00:27:29.579 +You know what I mean? + +00:27:29.580 --> 00:27:33.059 +But it does do some things in a way that I did not expect. + +00:27:33.060 --> 00:27:35.459 +For example, Grok was refactoring + +00:27:35.460 --> 00:27:38.019 +some of my code in the comments and dropped an F-bomb. + +00:27:38.020 --> 00:27:39.979 +which I did not see coming, + +00:27:39.980 --> 00:27:41.619 +but the other code before + +00:27:41.620 --> 00:27:43.219 +that I had gotten off GitHub + +00:27:43.220 --> 00:27:44.059 +had F bombs in it. + +00:27:44.060 --> 00:27:45.899 +So it was just emulating the style, + +00:27:45.900 --> 00:27:47.779 +but would that be something + +00:27:47.780 --> 00:27:49.979 +I'd want to turn in a pull request? I don't know. + +00:27:49.980 --> 00:27:52.139 +But, uh, there's, there's a lot of money + +00:27:52.140 --> 00:27:53.899 +going into these AIs and stuff, + +00:27:53.900 --> 00:27:56.219 +but in terms of the ability to get a decent one, + +00:27:56.220 --> 00:27:57.979 +like the llama, llama three, two, + +00:27:57.980 --> 00:28:01.699 +and load your data into it, you can be pretty competitive. + +00:28:01.700 --> 00:28:04.779 +You're not going to get all the benefits, + +00:28:04.780 --> 00:28:07.299 +but you have more control over it. + +00:28:07.300 --> 00:28:11.819 +So it's, it's a, this and that it's a, + +00:28:11.820 --> 00:28:13.139 +it's a balancing act. + +00:28:13.140 --> 00:28:15.539 +Okay, and I think I see a couple more questions coming in. + +00:28:15.540 --> 00:28:19.619 +What is the largest parameter size for local models + +00:28:19.620 --> 00:28:22.459 +that you've been able to successfully run locally + +00:28:22.460 --> 00:28:26.059 +and do run into issues with limited context window size? + +00:28:26.060 --> 00:28:29.659 +The top eight models will tend to have a larger ceiling. + +00:28:29.660 --> 00:28:32.859 +Yes, yes, yes, yes, yes. + +00:28:32.860 --> 00:28:37.019 +By default, the context size is I think 1024. + +00:28:37.020 --> 00:28:44.619 +But I've upped it to 8192 on the on this box, the Pangolin + +00:28:44.620 --> 00:28:46.939 +because it seems to be some reason + +00:28:46.940 --> 00:28:49.459 +it's just a very working quite well. + +00:28:49.460 --> 00:28:52.219 +But the largest ones I've loaded have been in + +00:28:52.220 --> 00:28:54.059 +the have not been that huge. + +00:28:54.060 --> 00:28:55.699 +I've loaded this the last biggest one I've done. + +00:28:55.700 --> 00:28:57.459 +That's the reason why I'm planning + +00:28:57.460 --> 00:29:01.339 +on breaking down and buying a Ryzen. + +00:29:01.340 --> 00:29:03.619 +Actually, I'm going to buy + +00:29:03.620 --> 00:29:06.979 +an Intel i285H with 96 gig of RAM. + +00:29:06.980 --> 00:29:08.379 +Then I should be able to load + +00:29:08.380 --> 00:29:12.059 +a 70 billion parameter model in that. How fast will it run? + +00:29:12.060 --> 00:29:13.819 +It's going to run slow as dog, + +00:29:13.820 --> 00:29:15.819 +but it's going to be cool to be able to do it. + +00:29:15.820 --> 00:29:17.379 +It's an AI bragging rights thing, + +00:29:17.380 --> 00:29:20.019 +but I mostly stick with the smaller size models + +00:29:20.020 --> 00:29:22.819 +and the ones that are more quantitized + +00:29:22.820 --> 00:29:26.619 +because it just tends to work better for me. + +00:29:26.620 --> 00:29:29.179 +We've still got over 10 minutes before we're cutting away, + +00:29:29.180 --> 00:29:30.179 +but I'm just anticipating + +00:29:30.180 --> 00:29:32.859 +that we're going to be going strong at the 10 minute mark. + +00:29:32.860 --> 00:29:34.899 +So I'm just, just letting, you know, + +00:29:34.900 --> 00:29:37.379 +we can go as long as we like here at a certain point. + +00:29:37.380 --> 00:29:41.059 +I may have to jump away and check in with the next speaker, + +00:29:41.060 --> 00:29:44.419 +but we'll post the entirety of this, + +00:29:44.420 --> 00:29:47.979 +even if we aren't able to stay with it all. + +00:29:47.980 --> 00:29:49.739 +Okay. And we've got 10 minutes + +00:29:49.740 --> 00:29:52.379 +where we're still going to stay live. + +00:29:52.380 --> 00:30:00.139 +So next question coming in, I see, are there free as in freedom, + +00:30:00.140 --> 00:30:05.739 +free as in FSF issues with the data? + +00:30:05.740 --> 00:30:11.699 +Yes, where's the data coming from is a huge question with AI. + +00:30:11.700 --> 00:30:13.739 +It's astonishing you can ask questions + +00:30:13.740 --> 00:30:16.899 +to models that you don't know where it's coming from. + +00:30:16.900 --> 00:30:19.979 +That is gonna be one of the big issues long-term. + +00:30:19.980 --> 00:30:21.499 +There are people who are working + +00:30:21.500 --> 00:30:22.979 +on trying to figure out that stuff, + +00:30:22.980 --> 00:30:25.259 +but it's, I mean, if you look at, God, + +00:30:25.260 --> 00:30:27.059 +I can't remember who it was. + +00:30:27.060 --> 00:30:28.659 +Somebody was actually out torrenting books + +00:30:28.660 --> 00:30:30.939 +just to be able to build into their AI system. + +00:30:30.940 --> 00:30:32.339 +I think it might've been Meta. + +00:30:32.340 --> 00:30:34.819 +So there's a lot of that going on. + +00:30:34.820 --> 00:30:38.139 +The open source of the stuff is going to be tough. + +00:30:38.140 --> 00:30:39.459 +There's going to be there's some models + +00:30:39.460 --> 00:30:41.419 +like the mobile guys have got their own license, + +00:30:41.420 --> 00:30:42.739 +but where they're getting their data from, + +00:30:42.740 --> 00:30:45.499 +I'm not sure on so that that's a huge question. + +00:30:45.500 --> 00:30:47.979 +That's a that's a talk in itself. + +00:30:47.980 --> 00:30:51.979 +But yeah, but you if you train on your RAG and your data, + +00:30:51.980 --> 00:30:53.499 +you know what it's come, you know, + +00:30:53.500 --> 00:30:54.379 +you have a license that + +00:30:54.380 --> 00:30:55.139 +but the other stuff is just + +00:30:55.140 --> 00:30:56.739 +more lines of supplement + +00:30:56.740 --> 00:31:01.379 +if you're using a smaller model, + +00:31:01.380 --> 00:31:05.419 +but the comment online, I see a couple of them. + +00:31:05.420 --> 00:31:08.339 +I'll read them out in order here. Really interesting stuff. + +00:31:08.340 --> 00:31:11.659 +Thank you for your talk. Given that large AI companies + +00:31:11.660 --> 00:31:14.899 +are openly stealing intellectual property and copyright + +00:31:14.900 --> 00:31:18.939 +and therefore eroding the authority of such laws + +00:31:18.940 --> 00:31:21.579 +and maybe obscuring the truth itself, + +00:31:21.580 --> 00:31:26.579 +can you see a future where IP and copyright flaw become untenable? + +00:31:26.580 --> 00:31:29.619 +I think that's a great question. + +00:31:29.620 --> 00:31:34.979 +I'm not a lawyer, but it is really getting complicated. + +00:31:34.980 --> 00:31:37.859 +It is getting to the point, I asked a question from, + +00:31:37.860 --> 00:31:41.179 +I played with Sora a little bit, and it generated someone, + +00:31:41.180 --> 00:31:42.819 +you can go like, oh, that's Jon Hamm, + +00:31:42.820 --> 00:31:44.099 +that's Christopher Walken, + +00:31:44.100 --> 00:31:45.379 +you start figuring out who the people + +00:31:45.380 --> 00:31:47.019 +they're modeling stuff after. + +00:31:47.020 --> 00:31:48.979 +There is an apocalypse, something + +00:31:48.980 --> 00:31:52.459 +going to happen right now. + +00:31:52.460 --> 00:31:53.579 +There is, but this is once again, + +00:31:53.580 --> 00:31:56.059 +my personal opinion, and I'm not a lawyer, + +00:31:56.060 --> 00:31:57.459 +and I do not have money. + +00:31:57.460 --> 00:31:58.859 +So don't sue me, is there's going to be + +00:31:58.860 --> 00:32:02.899 +the current administration tends is very AI pro AI. + +00:32:02.900 --> 00:32:05.499 +And there's very a great deal of lobbying by those groups. + +00:32:05.500 --> 00:32:07.139 +And it's on both sides. + +00:32:07.140 --> 00:32:09.699 +And it's going to be, it's gonna be interesting to see + +00:32:09.700 --> 00:32:11.699 +what happens to copyright the next 510 years. + +00:32:11.700 --> 00:32:13.339 +I just don't know how it keeps up + +00:32:13.340 --> 00:32:16.059 +without there being some adjustments and stuff. + +00:32:16.060 --> 00:32:20.419 +Okay, and then another comment I saw, + +00:32:20.420 --> 00:32:23.219 +file size is not going to be a bottleneck. + +00:32:23.220 --> 00:32:25.819 +RAM is. You'll need 16 gigabytes of RAM + +00:32:25.820 --> 00:32:28.259 +to run the smallest local models + +00:32:28.260 --> 00:32:31.979 +and 512 gigabytes of RAM to run the larger ones. + +00:32:31.980 --> 00:32:35.059 +You'll need a GPU with that much memory + +00:32:35.060 --> 00:32:39.099 +if you want it to run quickly. Yeah. Oh no. + +00:32:39.100 --> 00:32:41.259 +It also depends upon how your memory is laid out. + +00:32:41.260 --> 00:32:45.699 +Like example being the Ultra i285H + +00:32:45.700 --> 00:32:47.899 +I plan to buy, that has 96 gig of memory. + +00:32:47.900 --> 00:32:50.499 +It's unified between the GPU and the CPU share it, + +00:32:50.500 --> 00:32:52.739 +but they go over the same bus. + +00:32:52.740 --> 00:32:55.779 +So the overall bandwidth of it tends to be a bit less, + +00:32:55.780 --> 00:32:57.579 +but you're able to load more of it into memory. + +00:32:57.580 --> 00:32:59.419 +So it's able to do some additional stuff with it + +00:32:59.420 --> 00:33:00.819 +as opposed to come off disk. + +00:33:00.820 --> 00:33:03.699 +It's all balancing act. If you hit Zyskin's website, + +00:33:03.700 --> 00:33:05.819 +that guy's done some great work on it. + +00:33:05.820 --> 00:33:07.499 +I'm trying to figure out how big a model you can do, + +00:33:07.500 --> 00:33:08.619 +what you can do with it. + +00:33:08.620 --> 00:33:12.699 +And some of the stuff seems to be not obvious, + +00:33:12.700 --> 00:33:15.299 +because like example, being that MacBook Air, + +00:33:15.300 --> 00:33:17.619 +for the five minutes I can run the model, + +00:33:17.620 --> 00:33:19.379 +it runs it faster than a lot of other things + +00:33:19.380 --> 00:33:21.339 +that should be able to run it faster, + +00:33:21.340 --> 00:33:24.619 +just because of the way the ARM cores and the unified memory work on it. + +00:33:24.620 --> 00:33:26.019 +So it's a learning process. + +00:33:26.020 --> 00:33:29.579 +But if you want to, Network Chuck had a great video + +00:33:29.580 --> 00:33:30.939 +talking about building his own system + +00:33:30.940 --> 00:33:34.379 +with a couple really powerful NVIDIA cards + +00:33:34.380 --> 00:33:35.379 +and stuff like that in it. + +00:33:35.380 --> 00:33:38.859 +And just actually setting up on his system as a node + +00:33:38.860 --> 00:33:41.459 +and using a web UI on it. So there's a lot of stuff there, + +00:33:41.460 --> 00:33:43.899 +but it is a process of learning how big your data is, + +00:33:43.900 --> 00:33:44.899 +which models you want to use, + +00:33:44.900 --> 00:33:46.219 +how much information you need, + +00:33:46.220 --> 00:33:48.019 +but it's part of the learning. + +00:33:48.020 --> 00:33:52.899 +And you can run models, even as a Raspberry PI fives, + +00:33:52.900 --> 00:33:54.499 +if you want to, they'll run slow. + +00:33:54.500 --> 00:33:56.459 +Don't get me wrong, but they're possible. + +00:33:56.460 --> 00:34:02.179 +Okay, and I think there's other questions coming in too, + +00:34:02.180 --> 00:34:04.019 +so I'll just bam for another second. + +00:34:04.020 --> 00:34:06.299 +We've got about five minutes before we'll, + +00:34:06.300 --> 00:34:09.739 +before we'll be cutting over, + +00:34:09.740 --> 00:34:13.179 +but I just want to say in case we get close for time here, + +00:34:13.180 --> 00:34:14.859 +how much I appreciate your talk. + +00:34:14.860 --> 00:34:15.979 +This is another one that I'm going to + +00:34:15.980 --> 00:34:18.339 +have to study after the conference. + +00:34:18.340 --> 00:34:21.099 +We greatly appreciate, all of us appreciate + +00:34:21.100 --> 00:34:22.459 +you guys putting on the conference. + +00:34:22.460 --> 00:34:26.299 +It's a great conference. It's well done. + +00:34:26.300 --> 00:34:28.019 +It's an honor to be on the stage + +00:34:28.020 --> 00:34:30.899 +with the brains of the project, which is you. + +00:34:30.900 --> 00:34:34.699 +So what else we got? Question wise. + +00:34:34.700 --> 00:34:39.499 +Okay, so just scanning here. + +00:34:39.500 --> 00:34:50.699 +Have you used local models capable of tool calling? + +00:34:50.700 --> 00:34:54.779 +I'm, I'm scared of agentic. + +00:34:54.780 --> 00:34:58.739 +I, I am, I'm going to be a slow adopter of that. + +00:34:58.740 --> 00:35:02.459 +I want to do it, but I just don't have the, uh, + +00:35:02.460 --> 00:35:04.339 +four decimal fortitude right now to do it. + +00:35:04.340 --> 00:35:07.179 +I, I, I've had to give me the commands, + +00:35:07.180 --> 00:35:08.739 +but I still run the commands by hand. + +00:35:08.740 --> 00:35:10.539 +I'm looking into it and it's on once again, + +00:35:10.540 --> 00:35:14.139 +it's on that list, but I just, that's a big step for me. + +00:35:14.140 --> 00:35:23.139 +So. Awesome. All right. + +00:35:23.140 --> 00:35:27.179 +Well, maybe it's, let me just scroll through + +00:35:27.180 --> 00:35:31.539 +because we might have missed one question. Oh, I see. + +00:35:31.540 --> 00:35:36.899 +Here was the piggyback question. + +00:35:36.900 --> 00:35:38.419 +Now I see the question that I missed. + +00:35:38.420 --> 00:35:41.139 +So this was piggybacking on the question + +00:35:41.140 --> 00:35:44.859 +about model updates and adding data. + +00:35:44.860 --> 00:35:46.579 +And will models reach out to the web + +00:35:46.580 --> 00:35:47.819 +if they need more info? + +00:35:47.820 --> 00:35:51.779 +Or have you worked with any models that work that way? + +00:35:51.780 --> 00:35:55.259 +No, I've not seen any models to do that + +00:35:55.260 --> 00:35:57.739 +There's there was like a group + +00:35:57.740 --> 00:35:59.899 +working on something like a package updater + +00:35:59.900 --> 00:36:02.499 +that would do different diffs on it, + +00:36:02.500 --> 00:36:03.939 +but it's so Models change so much + +00:36:03.940 --> 00:36:05.739 +even who make minor changes and fine-tuning. + +00:36:05.740 --> 00:36:07.659 +It's hard just to update them in place + +00:36:07.660 --> 00:36:10.099 +So I haven't seen one, but that doesn't mean + +00:36:10.100 --> 00:36:16.259 +they're not out there. I'm curious topic though Awesome + +00:36:16.260 --> 00:36:19.539 +Well, it's probably pretty good timing. + +00:36:19.540 --> 00:36:21.299 +Let me just scroll and make sure. + +00:36:21.300 --> 00:36:23.499 +And of course, before I can say that, + +00:36:23.500 --> 00:36:25.899 +there's one more question. So let's go ahead and have that. + +00:36:25.900 --> 00:36:28.299 +I want to make sure while we're still live, though, + +00:36:28.300 --> 00:36:31.299 +I give you a chance to offer any closing thoughts. + +00:36:31.300 --> 00:36:35.779 +So what scares you most about the agentic tools? + +00:36:35.780 --> 00:36:38.419 +How would you think about putting a sandbox around that + +00:36:38.420 --> 00:36:42.139 +if you did adopt an agentic workflow? + +00:36:42.140 --> 00:36:42.899 +That is a great question. + +00:36:42.900 --> 00:36:45.939 +In terms of that, I would just control + +00:36:45.940 --> 00:36:48.099 +what it's able to talk to, what machines, + +00:36:48.100 --> 00:36:50.059 +I would actually have it be air gap. + +00:36:50.060 --> 00:36:52.099 +I work for a defense contractor, + +00:36:52.100 --> 00:36:53.819 +and we spend a lot of time dealing with air gap systems, + +00:36:53.820 --> 00:36:55.979 +because that's just kind of the way it works out for us. + +00:36:55.980 --> 00:36:58.499 +So agentic, it's just going to take a while to get trust. + +00:36:58.500 --> 00:37:01.059 +I want to want to see more stuff happening. + +00:37:01.060 --> 00:37:02.819 +Humans screw up stuff enough. + +00:37:02.820 --> 00:37:04.819 +The last thing we need is to multiply that by 1000. + +00:37:04.820 --> 00:37:09.419 +So in terms of that, I would be restricting what it can do. + +00:37:09.420 --> 00:37:10.859 +If you look at the capabilities, + +00:37:10.860 --> 00:37:13.579 +if I created a user and gave it permissions, + +00:37:13.580 --> 00:37:15.299 +I would have a lockdown through sudo, + +00:37:15.300 --> 00:37:17.379 +what it's able to do, what the account's able to do. + +00:37:17.380 --> 00:37:18.899 +I would do those kind of things, + +00:37:18.900 --> 00:37:20.859 +but it's going to be, it's happening. + +00:37:20.860 --> 00:37:25.819 +It's just, I'm going to be one of the laggards on that one. + +00:37:25.820 --> 00:37:29.259 +So airgab, jail, extremely locked down environments, + +00:37:29.260 --> 00:37:34.899 +like we're talking about separate physicals, not Docker. + +00:37:34.900 --> 00:37:37.499 +Yeah, hopefully. Right, fair. + +00:37:37.500 --> 00:37:39.899 +So tool calling can be read-only, + +00:37:39.900 --> 00:37:42.539 +such as giving models the ability to search the web + +00:37:42.540 --> 00:37:43.979 +before answering your question, + +00:37:43.980 --> 00:37:46.219 +you know, write access, execute access. + +00:37:46.220 --> 00:37:49.219 +I'm interested to know if local models + +00:37:49.220 --> 00:37:51.419 +are any good at that. + +00:37:51.420 --> 00:37:55.579 +Yes, local models can do a lot of that stuff. + +00:37:55.580 --> 00:37:56.819 +It's their capabilities. + +00:37:56.820 --> 00:37:59.019 +If you load LM studio, you can do a lot of wonderful stuff + +00:37:59.020 --> 00:38:02.419 +with that or with open web UI with a llama. + +00:38:02.420 --> 00:38:05.739 +It's a lot of capabilities. It's amazing. + +00:38:05.740 --> 00:38:08.139 +Open web UI is actually what a lot of companies are using now + +00:38:08.140 --> 00:38:10.259 +to put their data behind that. + +00:38:10.260 --> 00:38:12.139 +They're curated data and stuff like that. So works well. + +00:38:12.140 --> 00:38:15.819 +I can confirm that from my own professional experience. + +00:38:15.820 --> 00:38:19.659 +Excellent. Okay, well, our timing should be just perfect + +00:38:19.660 --> 00:38:22.659 +if you want to give us like a 30-second, 45-second wrap-up. + +00:38:22.660 --> 00:38:24.419 +Aaron, let me squeeze in mine. + +00:38:24.420 --> 00:38:26.779 +Thank you again so much for preparing this talk + +00:38:26.780 --> 00:38:30.499 +and for entertaining all of our questions. + +00:38:30.500 --> 00:38:33.299 +Yeah, let me just thank you guys for the conference again. + +00:38:33.300 --> 00:38:35.179 +This is a great one. I've enjoyed a lot of it. + +00:38:35.180 --> 00:38:37.339 +I've only had a couple of talks so far, + +00:38:37.340 --> 00:38:41.659 +but I'm looking forward to hitting the ones after this and tomorrow. + +00:38:41.660 --> 00:38:44.739 +But the AI stuff is coming. Get on board. + +00:38:44.740 --> 00:38:46.939 +Definitely recommend it. If you want to just try it out + +00:38:46.940 --> 00:38:48.419 +and get a little taste of it, + +00:38:48.420 --> 00:38:49.779 +what my minimal viable product + +00:38:49.780 --> 00:38:51.619 +with just LlamaFile and GPTEL + +00:38:51.620 --> 00:38:53.139 +will get you to the point where you start figuring out. + +00:38:53.140 --> 00:38:55.579 +Gptel is an amazing thing. It just gets out of your way, + +00:38:55.580 --> 00:39:00.459 +but it works solo with Emacs. Design because it takes + +00:39:00.460 --> 00:39:01.699 +doesn't take your hands off the keyboard. + +00:39:01.700 --> 00:39:02.499 +It's just another buffer + +00:39:02.500 --> 00:39:04.059 +and you just put information in there. + +00:39:04.060 --> 00:39:06.979 +It's quite quite a wonderful It's a wonderful time. + +00:39:06.980 --> 00:39:10.819 +Let's put that way That's all I got Thank you + +00:39:10.820 --> 00:39:14.339 +so much for once again, and we're we're just cut away. + +00:39:14.340 --> 00:39:15.779 +So I'll stop the recording + +00:39:15.780 --> 00:39:18.259 +and you're on your own recognizance + +00:39:18.260 --> 00:39:19.699 +Well, I'm gonna punch out + +00:39:19.700 --> 00:39:21.059 +if anybody has any questions or anything + +00:39:21.060 --> 00:39:24.699 +my email address is ajgrothe@yahoo.com or at gmail and + +00:39:24.700 --> 00:39:26.779 +Thank you all for attending + +00:39:26.780 --> 00:39:29.939 +and thanks again for the conference + +00:39:29.940 --> 00:39:32.579 +Okay, I'm gonna go ahead and end the room there, thank you. + +00:39:32.580 --> 00:39:34.100 +Excellent, thanks, bye. diff --git a/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--answers.vtt b/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--answers.vtt new file mode 100644 index 00000000..676fa744 --- /dev/null +++ b/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--answers.vtt @@ -0,0 +1,859 @@ +WEBVTT + +00:00:00.000 --> 00:00:02.839 +So as we wait for people to drop + +00:00:02.840 --> 00:00:04.279 +in their questions and so on, + +00:00:04.280 --> 00:00:08.719 +I'll just kind of add a couple of thoughts. + +00:00:08.720 --> 00:00:12.039 +I'm not personally much of a Python developer, + +00:00:12.040 --> 00:00:17.759 +so I'm just curious as to your thoughts on using Emacs + +00:00:17.760 --> 00:00:24.319 +and kind of the development methodology you showed + +00:00:24.320 --> 00:00:26.519 +as a way to learn Python. + +00:00:26.520 --> 00:00:29.239 +Yeah, I think Emacs is perfect for it. + +00:00:29.240 --> 00:00:31.759 +If you're already an Emacs user + +00:00:31.760 --> 00:00:35.599 +and you have the keyboard commands + +00:00:35.600 --> 00:00:38.719 +and everything uploaded in your brain, + +00:00:38.720 --> 00:00:42.599 +then learning Python shouldn't be too difficult, + +00:00:42.600 --> 00:00:44.839 +because there's a lot of good packages. + +00:00:44.840 --> 00:00:51.319 +For Python, I'm using a thing called elpy, + +00:00:51.320 --> 00:00:55.679 +which is really good. for Python development. + +00:00:55.680 --> 00:01:00.039 +So you have this connection to a running backend, + +00:01:00.040 --> 00:01:06.039 +the Jedi Python backend that will give you autocomplete + +00:01:06.040 --> 00:01:09.039 +and some refactoring and things like that. + +00:01:09.040 --> 00:01:14.439 +So I think Emacs is really good for Python development. + +00:01:14.440 --> 00:01:16.679 +So what are some other... + +00:01:16.680 --> 00:01:18.319 +How long have you been using Emacs? + +00:01:18.320 --> 00:01:19.599 +Kind of a general question. + +00:01:19.600 --> 00:01:23.599 +Sorry if you covered this and I missed it. + +00:01:23.600 --> 00:01:26.599 +It's not that long actually. + +00:01:26.600 --> 00:01:31.599 +I think it was in 2019 or 2020. + +00:01:31.600 --> 00:01:34.799 +It's when I started to, I was really fortunate enough + +00:01:34.800 --> 00:01:38.039 +to join a team that had chosen to + +00:01:38.040 --> 00:01:42.919 +develop an app in Lisp, in Clojure. + +00:01:42.920 --> 00:01:45.039 +yeah and i didn't know anything about it + +00:01:45.040 --> 00:01:47.359 +i didn't know lisp at all so it was like brand new + +00:01:47.360 --> 00:01:50.639 +so i really had struggling to to learn it + +00:01:50.640 --> 00:01:53.559 +but at the same time i was looking for okay + +00:01:53.560 --> 00:01:55.279 +which editor should i pick to to do this + +00:01:55.280 --> 00:02:00.239 +and i was before that and like an ide person + +00:02:00.240 --> 00:02:02.919 +so i do use this big ideas + +00:02:02.920 --> 00:02:07.839 +and this time i figured maybe i should try something different. + +00:02:07.840 --> 00:02:10.239 +And I read this book about Clojure development + +00:02:10.240 --> 00:02:13.239 +and the author was really into Emacs + +00:02:13.240 --> 00:02:17.159 +and he was like, Clojure is really good for, + +00:02:17.160 --> 00:02:19.159 +Emacs is really good for Clojure development. + +00:02:19.160 --> 00:02:20.759 +So that's how I started. + +00:02:20.760 --> 00:02:24.479 +So I like to learn, rewired my brain + +00:02:24.480 --> 00:02:27.639 +to learn all how Emacs works + +00:02:27.640 --> 00:02:30.959 +as opposed to like the mainstream editors out there. + +00:02:30.960 --> 00:02:33.519 +So that's how it started. So like five years ago, maybe. + +00:02:33.520 --> 00:02:39.519 +Cool. Um, so did you, what were some other, + +00:02:39.520 --> 00:02:43.999 +what, what, what editor were you primarily using before you? + +00:02:44.000 --> 00:02:49.399 +Um, um, back, back then it was like, + +00:02:49.400 --> 00:02:52.719 +I think it was like Sublime Text. + +00:02:52.720 --> 00:02:57.719 +And also some IntelliJ, sorry, JetBrains, their tools. + +00:02:57.720 --> 00:03:04.599 +And before that, I was in the Microsoft world, + +00:03:04.600 --> 00:03:08.199 +so it's like Microsoft toolings basically. + +00:03:08.200 --> 00:03:10.879 +So I moved towards open source tooling + +00:03:10.880 --> 00:03:16.679 +and also open source development. Very cool. + +00:03:16.680 --> 00:03:19.119 +So I see we've got a couple people + +00:03:19.120 --> 00:03:23.479 +that have joined on the BBB here with us + +00:03:23.480 --> 00:03:24.959 +for the live question. + +00:03:24.960 --> 00:03:29.199 +You're welcome to just throw your question in this chat, + +00:03:29.200 --> 00:03:32.039 +or if you've got a microphone connected, + +00:03:32.040 --> 00:03:34.599 +you're welcome to come off mute + +00:03:34.600 --> 00:03:36.759 +and throw a question in that way as well. + +00:03:36.760 --> 00:03:40.359 +You can join on liberachat IRC. + +00:03:40.360 --> 00:03:44.119 +You can join pound emacs comp hyphen dev, + +00:03:44.120 --> 00:03:47.279 +and we would happily take your questions there. + +00:03:47.280 --> 00:03:49.479 +Meanwhile, I've got a question + +00:03:49.480 --> 00:03:52.719 +coming in on the pad right now, so take that next. + +00:03:52.720 --> 00:03:55.239 +I'll just read it out. + +00:03:55.240 --> 00:03:58.239 +I don't quite see how your setup works with IPython. + +00:03:58.240 --> 00:04:00.279 +Sorry if you already answered this. + +00:04:00.280 --> 00:04:03.519 +Do you have your Emacs connect to the IPython kernel + +00:04:03.520 --> 00:04:11.919 +over XMPP socket that IPython sets up? Oh, good question. + +00:04:11.920 --> 00:04:18.039 +So what I've done is I have two different connections. + +00:04:18.040 --> 00:04:21.359 +Like if I'm going to do this regular day-to-day Python work + +00:04:21.360 --> 00:04:24.399 +when I want to evaluate code + +00:04:24.400 --> 00:04:29.959 +without thinking about the external connection, + +00:04:29.960 --> 00:04:31.559 +then I just use IPython + +00:04:31.560 --> 00:04:36.799 +and I have my I'm using the LP Python package + +00:04:36.800 --> 00:04:39.839 +so that you can set up which of the REPLs + +00:04:39.840 --> 00:04:42.799 +you want to start when you evaluate code. + +00:04:42.800 --> 00:04:46.759 +So that's IPython. But in the second part of the talk + +00:04:46.760 --> 00:04:50.919 +where I connect to an externally running app, + +00:04:50.920 --> 00:04:55.839 +then I have set up the same configuration + +00:04:55.840 --> 00:05:00.959 +but to start Jupyter, the Jupyter console instead. + +00:05:00.960 --> 00:05:04.959 +And when I start it up, it's going to, it's like a dialogue + +00:05:04.960 --> 00:05:09.599 +that will ask for the ID of a running kernel. + +00:05:09.600 --> 00:05:10.839 +Because if you start a kernel, + +00:05:10.840 --> 00:05:12.919 +if you start something in a kernel, + +00:05:12.920 --> 00:05:17.079 +you will get this unique ID so you can connect to it. + +00:05:17.080 --> 00:05:19.679 +So that's kind of the difference. + +00:05:19.680 --> 00:05:21.639 +So I have two different ways + +00:05:21.640 --> 00:05:26.599 +of starting up the Python kernel. REPLs, either PyPython, + +00:05:26.600 --> 00:05:29.559 +which I do for most of my daily work, + +00:05:29.560 --> 00:05:32.239 +or if I want this connection to a running app, + +00:05:32.240 --> 00:05:38.479 +I'm using the Jupyter console, basically. + +00:05:38.480 --> 00:05:45.199 +Have you explored Org Babel at all? + +00:05:45.200 --> 00:05:48.199 +Can you talk about your approach + +00:05:48.200 --> 00:05:52.279 +compared to the Babel workflow? Oh, interesting. + +00:05:52.280 --> 00:05:54.879 +No, I haven't actually, I haven't done that, + +00:05:54.880 --> 00:05:59.119 +but I think it's similar to Jupyter notebooks, + +00:05:59.120 --> 00:06:02.359 +so you can do some interactive, you can run Python there, + +00:06:02.360 --> 00:06:03.279 +but I haven't, + +00:06:03.280 --> 00:06:08.119 +I have too little knowledge about it to elaborate on that. + +00:06:08.120 --> 00:06:24.159 +Sorry. Very good. All right. + +00:06:24.160 --> 00:06:26.999 +I'm just going to peek over to the other chats + +00:06:27.000 --> 00:06:28.839 +and make sure I'm not missing questions. + +00:06:28.840 --> 00:06:35.519 +Sorry, I got a lot of screens. A little dance here. + +00:06:35.520 --> 00:06:41.239 +All right, and I do see a few people in the chat. + +00:06:41.240 --> 00:06:44.559 +I'll just say again, if you've joined us on the BBB, + +00:06:44.560 --> 00:06:46.999 +you're more than welcome to jump in with your questions + +00:06:47.000 --> 00:06:50.119 +or put questions into the chat here. + +00:06:50.120 --> 00:06:52.879 +I'm not a big Python person, + +00:06:52.880 --> 00:06:57.599 +so I can't get into the really interesting questions + +00:06:57.600 --> 00:07:01.639 +that are probably more relevant, + +00:07:01.640 --> 00:07:05.799 +just because a lot of it's kind of over my head. + +00:07:05.800 --> 00:07:12.879 +Have you seen the miramo.io notebooks? + +00:07:12.880 --> 00:07:15.279 +These use standard Python? + +00:07:15.280 --> 00:07:18.119 +Oh, yes, I've seen, I haven't tried it myself, + +00:07:18.120 --> 00:07:19.359 +but I've seen it. + +00:07:19.360 --> 00:07:22.639 +It's very, I think it's a very interesting approach + +00:07:22.640 --> 00:07:26.279 +that probably will solve a lot of these things + +00:07:26.280 --> 00:07:28.839 +with interactive development in general, + +00:07:28.840 --> 00:07:31.839 +but because I think it's basically Python files + +00:07:31.840 --> 00:07:36.439 +and not the, not this other file format that you have + +00:07:36.440 --> 00:07:40.799 +for the regular notebook setup. + +00:07:40.800 --> 00:07:45.559 +So I have that in my list of things to try out in future, + +00:07:45.560 --> 00:08:00.719 +but it looks really, really cool. Awesome. + +00:08:00.720 --> 00:08:06.719 +Yeah, I'm hesitant to just ask you really boilerplate questions. + +00:08:06.720 --> 00:08:11.239 +You get an expert, a souffle chef, + +00:08:11.240 --> 00:08:16.599 +and you ask about making pasta or some other sort of thing. + +00:08:16.600 --> 00:08:20.559 +No, go ahead. Go ahead. I'm glad to ask any questions. + +00:08:20.560 --> 00:08:25.679 +So just generally about Emacs as a coding developer, + +00:08:25.680 --> 00:08:26.999 +what are the features + +00:08:27.000 --> 00:08:28.479 +that you tend to lean on more heavily? + +00:08:28.480 --> 00:08:34.319 +you know completion or you know what what have you + +00:08:34.320 --> 00:08:36.199 +maybe I could put it better + +00:08:36.200 --> 00:08:40.079 +as what have you spent more time configuring for Emacs + +00:08:40.080 --> 00:08:45.439 +to facilitate development? + +00:08:45.440 --> 00:08:49.639 +Yes initially it was basically taking away + +00:08:49.640 --> 00:08:51.319 +some of the UI features + +00:08:51.320 --> 00:08:56.599 +basically disabling it and and but fairly quickly + +00:08:56.600 --> 00:08:58.919 +for for both closure development + +00:08:58.920 --> 00:09:04.599 +where i was using cider which is like a really good uh good tool um + +00:09:04.600 --> 00:09:08.159 +and for python when i quickly found lp elp + +00:09:08.160 --> 00:09:10.599 +i'm not sure how to pronounce it + +00:09:10.600 --> 00:09:16.039 +but you you get so much uh good things from these tools + +00:09:16.040 --> 00:09:21.719 +so what i've done additionally is like theme + +00:09:21.720 --> 00:09:27.159 +and maybe having this environment + +00:09:27.160 --> 00:09:31.479 +that is without disturbance. + +00:09:31.480 --> 00:09:34.839 +So I really like the code to have my full attention. + +00:09:34.840 --> 00:09:41.239 +So I rarely have, maybe I have like a preview sometimes, + +00:09:41.240 --> 00:09:45.359 +but mostly it's the window or the buffer where I have my code + +00:09:45.360 --> 00:09:49.879 +and I've minimized the running REPL buffer. + +00:09:49.880 --> 00:09:53.439 +So sometimes it's, I'm hiding it, but it's still active. + +00:09:53.440 --> 00:09:57.679 +So basically that's how I configured, + +00:09:57.680 --> 00:10:00.279 +spent my configuration doing that. + +00:10:00.280 --> 00:10:04.799 +And also lately, trying out some LLM tools. + +00:10:04.800 --> 00:10:09.279 +So I think I have two packages + +00:10:09.280 --> 00:10:12.239 +that I'm using actively today. + +00:10:12.240 --> 00:10:15.799 +And my favorite is a tool called ECA, + +00:10:15.800 --> 00:10:20.199 +which is a LLM chat assistant, which is really good. + +00:10:20.200 --> 00:10:24.399 +The developer is also an Emacs enthusiast. + +00:10:24.400 --> 00:10:33.639 +So are you the type of person that tends to work with + +00:10:33.640 --> 00:10:37.039 +like a master builder, build your own Emacs? + +00:10:37.040 --> 00:10:40.799 +Are you using the system packages? + +00:10:40.800 --> 00:10:43.615 +What's your approach to just get Emacs + +00:10:43.616 --> 00:10:45.368 +up and off the ground for yourself? + +00:10:45.369 --> 00:10:52.519 +I'm not there yet with doing my own builds. + +00:10:52.520 --> 00:10:55.599 +Currently, I'm on macOS, + +00:10:55.600 --> 00:11:00.039 +so I'm installing Emacs through broom basically, homebrew. + +00:11:00.040 --> 00:11:04.919 +I've yet so much Emacs things to learn + +00:11:04.920 --> 00:11:07.739 +because I'm not even using org yet. + +00:11:07.740 --> 00:11:11.559 +I'm exploring the this editor. + +00:11:11.560 --> 00:11:14.799 +So I feel like I'm very much a beginner. + +00:11:14.800 --> 00:11:17.919 +I'm not using Emacs to its full potential yet. + +00:11:17.920 --> 00:11:23.279 +So I'm counting on that I will be more and more using Emacs + +00:11:23.280 --> 00:11:29.119 +for more and more different tasks basically. + +00:11:29.120 --> 00:11:32.559 +And I'm just seeing a comment. + +00:11:32.560 --> 00:11:35.799 +Ed Stallthroat says, thank you + +00:11:35.800 --> 00:11:40.839 +for publishing your configuration and offers a link. + +00:11:40.840 --> 00:11:41.879 +Oh, great. Great. + +00:11:41.880 --> 00:11:46.359 +Yes, those things that I showed in my talk, + +00:11:46.360 --> 00:11:49.319 +I haven't made any, I haven't packaged it yet, + +00:11:49.320 --> 00:11:51.199 +but everything is on my GitHub, + +00:11:51.200 --> 00:11:57.079 +and I've tried to separate each feature + +00:11:57.080 --> 00:11:59.639 +in separate LSP files. + +00:11:59.640 --> 00:12:04.319 +So it should be, I hope that it's fairly straightforward + +00:12:04.320 --> 00:12:08.959 +to understand how it's set up. Very good. + +00:12:08.960 --> 00:12:11.119 +Let me just scroll down, + +00:12:11.120 --> 00:12:12.999 +make sure I'm not missing questions here. + +00:12:13.000 --> 00:12:16.959 +Okay, I think those are the questions that we have. + +00:12:16.960 --> 00:12:20.879 +We can take a couple more minutes if you're open to that, + +00:12:20.880 --> 00:12:24.039 +just for people to consider. + +00:12:24.040 --> 00:12:26.119 +I know we're coming up on the lunch hour, + +00:12:26.120 --> 00:12:31.679 +so it may be that people are jogging off to get some food. + +00:12:31.680 --> 00:12:36.599 +Yeah, in Sweden, it's dinner time. + +00:12:36.600 --> 00:12:40.079 +It's like 6 p.m. soon. That fits. + +00:12:40.080 --> 00:12:46.439 +So are you involved with local Emacs meetups? + +00:12:46.440 --> 00:12:49.079 +I know that your part of the world + +00:12:49.080 --> 00:12:51.799 +has a really brisk community, + +00:12:51.800 --> 00:12:55.279 +you know, a lot of, just a lot going on. + +00:12:55.280 --> 00:12:58.799 +I'm always seeing in Sacha's Emacs News, + +00:12:58.800 --> 00:13:02.319 +all of the different meetups and so on. + +00:13:02.320 --> 00:13:03.519 +I'm curious if you're plugged + +00:13:03.520 --> 00:13:08.719 +into a local community there at all, No, I haven't. + +00:13:08.720 --> 00:13:10.759 +Not in any community. I haven't done that yet, + +00:13:10.760 --> 00:13:15.679 +but we are like friends that I've gotten to know + +00:13:15.680 --> 00:13:23.439 +through work and through like open source work that also use Emacs. + +00:13:23.440 --> 00:13:28.959 +We talk and share our conflicts + +00:13:28.960 --> 00:13:30.799 +basically on a regular basis, + +00:13:30.800 --> 00:13:35.999 +because we are, at least in the Python community, + +00:13:36.000 --> 00:13:37.399 +we're like a minority, + +00:13:37.400 --> 00:13:39.799 +like other editors are like the standards. + +00:13:39.800 --> 00:13:45.879 +And at work, I'm sharing what I'm doing, + +00:13:45.880 --> 00:13:48.679 +just like my talk here to my fellow co-workers + +00:13:48.680 --> 00:13:53.999 +that are not on Emacs, but I hope to get their interest up. + +00:13:54.000 --> 00:13:58.999 +So many of us Emacs users are Emacs evangelists. + +00:13:59.000 --> 00:14:06.201 +Yeah. It's the Venn diagram of Emacs user + +00:14:06.202 --> 00:14:08.868 +and Emacs evangelist is a circle, I think. + +00:14:08.869 --> 00:14:11.035 +Yeah, I think so too. + +00:14:11.036 --> 00:14:16.559 +Well, David, I super appreciate your talk + +00:14:16.560 --> 00:14:18.759 +and thank you so much also for... + +00:14:18.760 --> 00:14:24.639 +I'm sorry, I saw another question here. Let me cover that. + +00:14:24.640 --> 00:14:27.959 +Can you repeat the name of the LLM + +00:14:27.960 --> 00:14:30.319 +that you specifically mentioned there? + +00:14:30.320 --> 00:14:36.784 +Oh, it's a tool called ECA, E-C-A. + +00:14:36.785 --> 00:14:44.076 +It's basically a server and clients, + +00:14:44.077 --> 00:14:49.160 +and it's not only Emacs. It has support for other editors, + +00:14:49.161 --> 00:14:53.119 +but I think the primary support is for, + +00:14:53.120 --> 00:14:57.599 +at least the developer who does it is an Emacs user, + +00:14:57.600 --> 00:15:01.039 +and so it's like Emacs first, basically. + +00:15:01.040 --> 00:15:04.959 +And his name is Eric Dallo. + +00:15:04.960 --> 00:15:09.679 +He's a great developer in the Clojure community. + +00:15:09.680 --> 00:15:13.159 +He has done some LSP work in the Clojure world, too. + +00:15:13.160 --> 00:15:17.159 +What was the last name? What was Eric's last name? + +00:15:17.160 --> 00:15:23.919 +Eric Dallo, D-A-L-L-O. Yeah. + +00:15:23.920 --> 00:15:31.879 +So I think that's a great tool, but I also use another tool + +00:15:31.880 --> 00:15:38.919 +that for some reason I forgot to have this interactive way of, + +00:15:38.920 --> 00:15:43.599 +because I think they are developing that feature too, + +00:15:43.600 --> 00:15:46.439 +but I have another LLM that has support + +00:15:46.440 --> 00:15:50.599 +for requests and callbacks basically. + +00:15:50.600 --> 00:15:53.799 +So you can do something programmatically. + +00:15:53.800 --> 00:15:55.919 +So that's how I've solved my LLM thing + +00:15:55.920 --> 00:16:00.759 +where I select some Python variables + +00:16:00.760 --> 00:16:05.599 +and tell the LLM to populate it with some fake data + +00:16:05.600 --> 00:16:08.879 +so I can send that to the REPL. + +00:16:08.880 --> 00:16:11.479 +But for some reason, I forgot the name of it. + +00:16:11.480 --> 00:16:25.159 +I can look it up. Just give me one minute, sorry. + +00:16:25.160 --> 00:16:35.559 +oh yeah gptel gptel that's that's the name of the other tool + +00:16:35.560 --> 00:16:37.879 +which is uh also a good tool yeah + +00:16:37.880 --> 00:16:41.279 +but ECA is more like a more chat companion + +00:16:41.280 --> 00:16:46.679 +and this you can also you can tell it to write code and things like that + +00:16:46.680 --> 00:16:51.679 +but i mostly use it for reviews and research + +00:16:51.680 --> 00:16:54.599 +and like asking questions + +00:16:54.600 --> 00:17:00.279 +because i want to my I don't have a problem with typing code. + +00:17:00.280 --> 00:17:01.919 +I don't think that slows me down, + +00:17:01.920 --> 00:17:05.639 +but maybe getting some quick feedback + +00:17:05.640 --> 00:17:07.479 +on the actual work that I'm doing, + +00:17:07.480 --> 00:17:08.999 +that's what I'm using LLM for, + +00:17:09.000 --> 00:17:13.519 +on LLM for two, mostly today. That really hits for me. + +00:17:13.520 --> 00:17:15.199 +I don't mind typing either. + +00:17:15.200 --> 00:17:18.479 +I think somehow having things be so simple + +00:17:18.480 --> 00:17:20.879 +and in many cases just automated, + +00:17:20.880 --> 00:17:22.719 +Emacs just does the right thing. + +00:17:22.720 --> 00:17:26.519 +It makes me hungry to type. I want to type more. + +00:17:26.520 --> 00:17:28.559 +It feels like every keystroke does a little more. + +00:17:28.560 --> 00:17:33.519 +Speaking of evangelism, thank you. Thank you + +00:17:33.520 --> 00:17:35.599 +pop up for the for the question. + +00:17:35.600 --> 00:17:39.439 +I'm just going to peek one more time through + +00:17:39.440 --> 00:17:41.159 +and I don't see a backlog. + +00:17:41.160 --> 00:17:44.519 +There are a couple more comments here + +00:17:44.520 --> 00:17:49.319 +linking linking to the ECA Emacs and gptel. + +00:17:49.320 --> 00:17:52.239 +Comment also saying very cool setup. + +00:17:52.240 --> 00:17:56.959 +So I suppose I'll I'll hand it over to you + +00:17:56.960 --> 00:17:59.319 +if you have kind of final thoughts or. + +00:17:59.320 --> 00:18:02.079 +additional wisdoms you want to share + +00:18:02.080 --> 00:18:05.399 +I really appreciate your taking the time to prepare this presentation + +00:18:05.400 --> 00:18:11.079 +especially to do the live Q&A with us. Thank you + +00:18:11.080 --> 00:18:13.919 +and I haven't anything more than that I will + +00:18:13.920 --> 00:18:19.479 +of course I will continue like have evolving my setup + +00:18:19.480 --> 00:18:21.359 +because there's like new tools + +00:18:21.360 --> 00:18:24.759 +and maybe new ideas also coming up + +00:18:24.760 --> 00:18:28.719 +and my What I'm aiming for in Python development + +00:18:28.720 --> 00:18:30.479 +is the great developer experience + +00:18:30.480 --> 00:18:34.519 +of what's called Lisp programming, basically. + +00:18:34.520 --> 00:18:41.699 +So that's what I'm aiming at for Python 2. + +00:18:41.700 --> 00:18:44.359 +Thank you. Thank you so much. diff --git a/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt b/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt new file mode 100644 index 00000000..d63a36c8 --- /dev/null +++ b/2025/captions/emacsconf-2025-python--interactive-python-programming-in-emacs--david-vujic--main.vtt @@ -0,0 +1,731 @@ +WEBVTT captioned by sachac + +00:00:00.000 --> 00:00:04.439 +Okay, so welcome to this session about interactive Python + +00:00:04.440 --> 00:00:09.679 +programming. My name is David Vujic and I live and work in + +00:00:09.680 --> 00:00:15.319 +Stockholm, Sweden. a developer and today I focus + +00:00:15.320 --> 00:00:20.439 +mainly on Python software development. So I do this at work + +00:00:20.440 --> 00:00:25.999 +and I also do this on my spare time in my open source projects. + +00:00:26.000 --> 00:00:30.479 +Before that, I've been part of the Lisp community. I've + +00:00:30.480 --> 00:00:33.700 +been a Clojure developer, and also, like, way back, + +00:00:33.701 --> 00:00:40.279 +I was in the Microsoft world and developed C# and .NET stuff. + +00:00:40.280 --> 00:00:45.999 +What I've been doing lately is to try to improve the + +00:00:46.000 --> 00:00:52.399 +developer experience when you write Python code. So what I + +00:00:52.400 --> 00:00:56.159 +want to talk about is this, but also I want to begin with + +00:00:56.160 --> 00:01:00.839 +feedback loops because I think it's very related to this + +00:01:00.840 --> 00:01:05.359 +interactive programming style, like having this nice + +00:01:05.360 --> 00:01:07.067 +feedback when you write code. + +00:01:07.068 --> 00:01:10.533 +So I'm going to begin with that. + +NOTE Feedback loops + +00:01:10.534 --> 00:01:14.199 +So this image, you know, this circle is supposed to be a + +00:01:14.200 --> 00:01:19.879 +visualization of a feedback loop. Let's say we write our + +00:01:19.880 --> 00:01:25.239 +code and then we deploy it to production. Then when it's + +00:01:25.240 --> 00:01:29.639 +running there, we can check if things work, or if maybe someone + +00:01:29.640 --> 00:01:35.319 +else will let us know. Maybe our customers will let us know. + +00:01:35.320 --> 00:01:39.639 +That's a pretty slow feedback loop with potential risks of + +00:01:39.640 --> 00:01:41.867 +damaging your business or whatever. + +00:01:41.868 --> 00:01:44.167 +This is obvious, of course. + +00:01:44.168 --> 00:01:50.000 +So a faster feedback loop probably is to have + +00:01:50.001 --> 00:01:54.066 +some kind of automation when you do commits + +00:01:54.067 --> 00:01:59.733 +or maybe you have this pull request things and even reviews. + +00:01:59.734 --> 00:02:02.933 +So maybe not always as fast as deploy, + +00:02:02.934 --> 00:02:05.839 +don't deploy directly to production, but + +00:02:05.840 --> 00:02:10.539 +it's probably safer and often you get this automated + +00:02:10.540 --> 00:02:16.199 +feedback faster anyway. But it's still kind of slow. You + +00:02:16.200 --> 00:02:20.239 +have to wait. You have to push things to GitHub maybe and + +00:02:20.240 --> 00:02:24.279 +wait. So there's faster ways for sure to get feedback. + +00:02:24.280 --> 00:02:27.967 +So a much faster way is to write code, + +00:02:27.968 --> 00:02:31.367 +and write some unit tests, and run those unit tests. + +00:02:31.368 --> 00:02:33.467 +So then you do everything on your local machine + +00:02:33.468 --> 00:02:39.039 +and you will fairly quickly learn if your code does + +00:02:39.040 --> 00:02:47.159 +what you think it does or if it doesn't. I want to zoom in to + +00:02:47.160 --> 00:02:55.999 +this test write code and test flow a bit. Let's do that. + +NOTE Test-driven development + +00:02:56.000 --> 00:02:59.759 +As a developer, I have used a thing called test-driven + +00:02:59.760 --> 00:03:05.999 +development for quite some time. I find that this way of + +00:03:06.000 --> 00:03:11.259 +working is very fast when it comes to getting feedback on + +00:03:11.260 --> 00:03:14.519 +what your code does and how you should continue the + +00:03:14.520 --> 00:03:19.980 +development. So, test-driven development, + +00:03:19.981 --> 00:03:24.220 +basically that you start writing a test for + +00:03:24.221 --> 00:03:27.020 +something that you want to develop, and then you continue + +00:03:27.021 --> 00:03:31.019 +developing that, and then you go back to the test, and modify + +00:03:31.020 --> 00:03:35.079 +and modify the code, and you go back and forth between the + +00:03:35.080 --> 00:03:36.959 +tests and the code. + +00:03:36.960 --> 00:03:44.419 +It's sort of like a ping-pong game. I find this very + +00:03:44.420 --> 00:03:50.519 +effective when you want to get feedback and to know how to + +00:03:50.520 --> 00:03:57.233 +continue the development. The most important thing + +00:03:57.234 --> 00:04:01.700 +that I feel is that you know what the code does. + +00:04:01.701 --> 00:04:05.559 +You learn very quickly. + +NOTE REPL-driven development + +00:04:05.560 --> 00:04:12.199 +Let's zoom into this TDD flow a little bit. The last couple of + +00:04:12.200 --> 00:04:17.379 +years, I've been doing a slightly different thing which is + +00:04:17.380 --> 00:04:21.979 +called REPL-driven development. REPL-driven + +00:04:21.980 --> 00:04:25.719 +development is very similar to test-driven development, + +00:04:25.720 --> 00:04:31.159 +but I find it even quicker. You get feedback even quicker + +00:04:31.160 --> 00:04:34.979 +than with a regular TDD setup. So REPL-driven development + +00:04:34.980 --> 00:04:41.199 +is about writing and evaluating code in a REPL basically. + +00:04:41.200 --> 00:04:46.839 +And you can do experiments and you can refactor and + +00:04:46.840 --> 00:04:51.699 +re-evaluate and you get instant feedback on what the code + +00:04:51.700 --> 00:04:54.799 +does and what you need to change. So I think that's even + +00:04:54.800 --> 00:04:59.519 +faster than test-driven development. + +00:04:59.520 --> 00:05:02.899 +Okay, REPL driven development. Let's go back. What's the + +00:05:02.900 --> 00:05:10.759 +REPL? Most of developers know what a REPL is. The most common + +00:05:10.760 --> 00:05:16.399 +setup is you open this shell and you use the REPL for your + +00:05:16.400 --> 00:05:19.359 +programming language. In this case I'm using the Python + +00:05:19.360 --> 00:05:25.619 +REPL or the IPython REPL which is an enhanced REPL for Python + +00:05:25.620 --> 00:05:30.679 +development. So what happens here is that we start a REPL + +00:05:30.680 --> 00:05:34.919 +session in isolation. So this session knows about the + +00:05:34.920 --> 00:05:38.119 +Python environment. So it knows about the Python language + +00:05:38.120 --> 00:05:42.359 +basically. So as soon as we start writing things, adding + +00:05:42.360 --> 00:05:47.359 +variables or creating writing functions or even doing + +00:05:47.360 --> 00:05:51.679 +imports. Then the session will be more and more aware of the + +00:05:51.680 --> 00:05:55.819 +code so we will add things to the to the session and then that + +00:05:55.820 --> 00:06:00.519 +means that we can run functions we can print out these + +00:06:00.520 --> 00:06:05.859 +variables and things like that. But with REPL driven + +00:06:05.860 --> 00:06:09.839 +development it's not really that well at least not what I + +00:06:09.840 --> 00:06:14.039 +mean with REPL driven development. So what I'm thinking of + +00:06:14.040 --> 00:06:19.639 +is that you are in your code editor where you have your + +00:06:19.640 --> 00:06:22.799 +autocomplete, and you have your syntax highlighting and + +00:06:22.800 --> 00:06:30.459 +your favorite theme, color theme, and all of those things. But + +00:06:30.460 --> 00:06:34.979 +instead, you have this running REPL in the background or in a + +00:06:34.980 --> 00:06:41.139 +smaller window or buffer. So that means that you write code + +00:06:41.140 --> 00:06:45.319 +and you can send that code to the running REPL, to the REPL + +00:06:45.320 --> 00:06:50.399 +session. You write and do everything as you would do when + +00:06:50.400 --> 00:06:55.219 +writing your code basically. In this case, in this + +00:06:55.220 --> 00:07:00.599 +example, I have evaluated these two functions. I've sent + +00:07:00.600 --> 00:07:05.819 +them to the REPL session so it's aware of these functions. + +00:07:05.820 --> 00:07:10.399 +Then I switched to a separate different module and + +00:07:10.400 --> 00:07:14.039 +evaluated that one. So the REPL session now knows about + +00:07:14.040 --> 00:07:19.039 +these two functions and also these two variables. That + +00:07:19.040 --> 00:07:23.999 +means that I can evaluate the state of those variables and + +00:07:24.000 --> 00:07:28.999 +change code and re-evaluate and things like that. So in this + +00:07:29.000 --> 00:07:33.639 +example if you look in the smaller area there you see that I + +00:07:33.640 --> 00:07:39.639 +have evaluated this res variable on line 6 and the output was + +00:07:39.640 --> 00:07:42.399 +that it's a dictionary with two keys and two values + +00:07:42.400 --> 00:07:51.219 +basically. So this setup works in basically any of your + +00:07:51.220 --> 00:07:54.079 +favorite code editors. So you can do this in Visual Studio + +00:07:54.080 --> 00:08:01.239 +Code, you can do this in PyCharm or Vim. But what I have done is + +00:08:01.240 --> 00:08:07.119 +that... More like what I have missed is that when I write code + +00:08:07.120 --> 00:08:10.239 +and do this evaluation, this is really cool, but then I need + +00:08:10.240 --> 00:08:15.459 +to switch context if I want to see the result. I have to switch + +00:08:15.460 --> 00:08:21.979 +context to this other window. I + +00:08:21.980 --> 00:08:25.759 +have my focus on the code and then I have to look in a different + +00:08:25.760 --> 00:08:31.799 +place to know the results. And if it's a larger output, then + +00:08:31.800 --> 00:08:37.479 +maybe I need to scroll. So I wanted to find out if it was + +00:08:37.480 --> 00:08:43.479 +possible to make this even smoother and faster, this + +00:08:43.480 --> 00:08:45.479 +feedback loop even faster, so I don't have to switch + +00:08:45.480 --> 00:08:52.119 +context. What I've done here is that... I can select a row or a + +00:08:52.120 --> 00:08:58.079 +region and I can evaluate and then an overlay, a small pop-up + +00:08:58.080 --> 00:09:03.119 +shows up with the evaluated result right next to it. So I can + +00:09:03.120 --> 00:09:07.519 +change code and re-evaluate and quickly see the result of it + +00:09:07.520 --> 00:09:12.640 +without doing this context switching. So the way I've done + +00:09:12.641 --> 00:09:20.679 +it is that I wanted to reuse the existing tooling that I + +00:09:20.680 --> 00:09:27.739 +already had. I know that my in-editor REPL, the IPython + +00:09:27.740 --> 00:09:31.559 +REPL, already does this evaluation. So I figured maybe I can + +00:09:31.560 --> 00:09:35.359 +extract the data and do this visualization as a separate + +00:09:35.360 --> 00:09:40.839 +thing. That's how I've done it. What I've done is that + +00:09:40.840 --> 00:09:47.199 +I've created this overlay and placed it where my cursor + +00:09:47.200 --> 00:09:50.859 +currently is, right next to the code. Then I've + +00:09:50.860 --> 00:09:55.719 +extracted the evaluated result and put it in this overlay. + +00:09:55.720 --> 00:10:01.039 +I also want this overlay to have this nice looking syntax, + +00:10:01.040 --> 00:10:04.759 +so I've set it to this Python mode, so we get this syntax + +00:10:04.760 --> 00:10:10.559 +highlighting. Make it look very readable. And as a nice + +00:10:10.560 --> 00:10:16.879 +developer experience thing, + +00:10:16.880 --> 00:10:20.379 +when you move the cursor, of course you don't want the + +00:10:20.380 --> 00:10:25.679 +overlay to be there. You want it to disappear. So those kinds + +00:10:25.680 --> 00:10:28.999 +of things I've added. So putting the overlay at the right + +00:10:29.000 --> 00:10:33.279 +place and feed it with the evaluated data and then make it + +00:10:33.280 --> 00:10:39.839 +disappear when it's not interesting to look at anymore. + +00:10:39.840 --> 00:10:44.639 +What I've described so far is something that I use on a + +00:10:44.640 --> 00:10:50.639 +daily basis, and it covers most of my needs while doing Python + +00:10:50.640 --> 00:10:56.119 +development. But one thing I still miss, and I miss it from my + +00:10:56.120 --> 00:11:03.479 +days as a Clojure developer, because over there we could + +00:11:03.480 --> 00:11:07.919 +have a running app on our local machine and we can have our + +00:11:07.920 --> 00:11:12.719 +editor, and the app and the editor were connected. So when I + +00:11:12.720 --> 00:11:17.199 +did some changes in the code, the app would change without + +00:11:17.200 --> 00:11:20.559 +any restarts or anything like that. And the same if I would + +00:11:20.560 --> 00:11:24.679 +change the state of the app, I can inspect the state from the + +00:11:24.680 --> 00:11:28.919 +code. So they were connected. They are connected. So I was + +00:11:28.920 --> 00:11:32.839 +thinking, hey, this would be really cool if we could have + +00:11:32.840 --> 00:11:39.199 +something like this in Python. And that reminded me of + +00:11:39.200 --> 00:11:43.839 +Jupyter and Jupyter notebooks because I think notebooks, + +00:11:43.840 --> 00:11:49.659 +the way you do things there, is very similar to what I was + +00:11:49.660 --> 00:11:56.879 +trying to achieve. So I was reading up a little bit on how this + +00:11:56.880 --> 00:12:00.919 +notebook thing works. It turns out that a notebook is a + +00:12:00.920 --> 00:12:05.279 +client that talks to a server, that communicates with a + +00:12:05.280 --> 00:12:08.799 +server. It's on the server that all this Python + +00:12:08.800 --> 00:12:14.159 +evaluation and all this thing happens. Then what I've + +00:12:14.160 --> 00:12:19.659 +done is that instead of starting up IPython in my editor, I + +00:12:19.660 --> 00:12:23.519 +start the Jupyter console instead. And then I can give it + +00:12:23.520 --> 00:12:27.159 +that unique ID and it will be connected to that running + +00:12:27.160 --> 00:12:30.919 +kernel. + +NOTE FastAPI CRUD + +00:12:30.920 --> 00:12:37.199 +In this example, I've created this FastAPI CRUD app that + +00:12:37.200 --> 00:12:41.919 +has this create, read, update, and delete endpoints. It + +00:12:41.920 --> 00:12:46.399 +has this, it's locally running, it has this database where + +00:12:46.400 --> 00:12:51.639 +you can do all these things. I'm running this FastAPI app + +00:12:51.640 --> 00:12:58.059 +in the kernel and then I've connected to, I've connected to + +00:12:58.060 --> 00:13:03.239 +the kernel in my editor too. Both of them are connected to + +00:13:03.240 --> 00:13:09.719 +the kernel. What I do now is that I want to initially create + +00:13:09.720 --> 00:13:15.239 +some data. I'm going to add this, creating this message. + +00:13:15.240 --> 00:13:19.899 +What I get back is a message ID. I want to experiment in + +00:13:19.900 --> 00:13:24.359 +my browser. What do I get with that message ID? I'm + +00:13:24.360 --> 00:13:30.239 +evaluating the read function. I instantly get this + +00:13:30.240 --> 00:13:34.779 +evaluated result, which was this hello world text. So what + +00:13:34.780 --> 00:13:39.919 +happens if I do some changes in this app? I'm going to grab + +00:13:39.920 --> 00:13:49.659 +this message ID and write something else. + +00:13:49.660 --> 00:13:53.759 +Now I can evaluate the same thing again, and you can see that + +00:13:53.760 --> 00:14:02.399 +the content has changed to this new value. My editor isn't + +00:14:02.400 --> 00:14:07.719 +in any debug mode or something like that. It doesn't know + +00:14:07.720 --> 00:14:11.239 +what database it is. It doesn't have any environment + +00:14:11.240 --> 00:14:14.479 +variables set up or something like that. It is only + +00:14:14.480 --> 00:14:17.599 +connected to the kernel, and the kernel is aware of that. It's + +00:14:17.600 --> 00:14:20.479 +running the app. It has the connection strings and + +00:14:20.480 --> 00:14:28.799 +everything that is needed. So that's how this thing works. + +00:14:28.800 --> 00:14:34.199 +Now I want to do some inline hacking because I want to store + +00:14:34.200 --> 00:14:37.799 +this input that is sent from this app because I want to work + +00:14:37.800 --> 00:14:42.039 +with it afterwards. I can add this dictionary that stores + +00:14:42.040 --> 00:14:48.759 +this message. I'm updating the source code of this app, and + +00:14:48.760 --> 00:15:03.079 +when I run any of these endpoints again, you will see that + +00:15:03.080 --> 00:15:08.759 +the state changes, and the new inputs, I can grab and I can use + +00:15:08.760 --> 00:15:14.399 +them for quick evaluation or testing. This example is + +00:15:14.400 --> 00:15:18.519 +really simple. It was just an integer. For example, if you + +00:15:18.520 --> 00:15:23.519 +are sending a more complex object, maybe a pydantic schema + +00:15:23.520 --> 00:15:28.199 +or something, and you want to inspect what's coming in, and if + +00:15:28.200 --> 00:15:34.199 +you have some sort of validation that you want to test out. + +00:15:34.200 --> 00:15:38.399 +The configuration or the code that I wrote to make this work + +00:15:38.400 --> 00:15:44.159 +is a little bit different than just adding an overlay. I'm + +00:15:44.160 --> 00:15:50.999 +using this overlay just like with the IPython example, but in + +00:15:51.000 --> 00:15:57.839 +this case, when I change code, I have to think about where that + +00:15:57.840 --> 00:16:02.159 +code lives, because it's the app that runs the code. So it's + +00:16:02.160 --> 00:16:07.039 +in the app context I need to manipulate with the data. If you + +00:16:07.040 --> 00:16:11.919 +have started the app from maybe a main function and that + +00:16:11.920 --> 00:16:17.879 +module imports namespaces, then you need to, if you want to + +00:16:17.880 --> 00:16:22.359 +update a function or something like that, you need to update + +00:16:22.360 --> 00:16:26.679 +it in the correct namespace. What I did before in IPython + +00:16:26.680 --> 00:16:29.919 +by adding and changing things, everything ends up in the + +00:16:29.920 --> 00:16:34.439 +global namespace. But here, if you want the app to actually + +00:16:34.440 --> 00:16:38.479 +react to the changes, you need to put it in the right + +00:16:38.480 --> 00:16:43.479 +namespace. So that's what I do here. I do some lookups, where + +00:16:43.480 --> 00:16:49.139 +is this function, and then I do this reload of this function or + +00:16:49.140 --> 00:16:54.799 +module. And when I was developing this, I was thinking, hey, + +00:16:54.800 --> 00:16:59.319 +this is really ugly. I'm in this REPL and do some + +00:16:59.320 --> 00:17:03.559 +manipulation of the imports and things like that. That + +00:17:03.560 --> 00:17:09.759 +didn't feel good. Then I was reminded of the IPython. And + +00:17:09.760 --> 00:17:15.519 +IPython has this feature to reload any updated + +00:17:15.520 --> 00:17:19.119 +submodules. I was curious how do they do it. I looked in the + +00:17:19.120 --> 00:17:24.079 +IPython source code and saw that they also use importlib and + +00:17:24.080 --> 00:17:28.359 +reloading of this module. Once I've learned that, then I + +00:17:28.360 --> 00:17:32.599 +stopped thinking that my code was hacky. I thought it was + +00:17:32.600 --> 00:17:37.159 +good enough at least. + +NOTE Testing with an LLM + +00:17:37.160 --> 00:17:45.059 +But one thing that has bothered me for a long time is I quite + +00:17:45.060 --> 00:17:50.199 +often want to test out and evaluate individual rows that + +00:17:50.200 --> 00:17:58.559 +lives in a function. Quite often, this code uses the input + +00:17:58.560 --> 00:18:02.639 +to that function like the input parameters. To be able to + +00:18:02.640 --> 00:18:07.719 +do that, I need to manually type some fake data and set it to + +00:18:07.720 --> 00:18:12.279 +this variable, and then I can evaluate the code. But I think + +00:18:12.280 --> 00:18:17.779 +that takes... That slows me down. I was thinking, maybe I can + +00:18:17.780 --> 00:18:23.439 +do this in a quicker way, so I have this quicker feedback, so I + +00:18:23.440 --> 00:18:27.933 +can run this or evaluate this code much quicker. + +00:18:27.934 --> 00:18:29.439 +So my idea was maybe I + +00:18:29.440 --> 00:18:35.239 +can use an LLM for this. If I give it the parameters, maybe it + +00:18:35.240 --> 00:18:41.119 +can return some random data so I don't have to write it + +00:18:41.120 --> 00:18:44.119 +myself. I ended up doing that. I have this source code. + +00:18:44.120 --> 00:18:50.399 +I'm loading the REPL with the code. Then I select this + +00:18:50.400 --> 00:18:56.719 +function name and the parameters with its data type. I + +00:18:56.720 --> 00:19:02.839 +have this prompt that instructs the LLM to come up with fake + +00:19:02.840 --> 00:19:06.239 +data based on the tag name and on the data type. And then I can + +00:19:06.240 --> 00:19:10.099 +send that to the REPL. I do that with a key command. Then + +00:19:10.100 --> 00:19:16.019 +I can proceed by running the code within the function that + +00:19:16.020 --> 00:19:21.719 +uses these inputs. This works for all the data types. If + +00:19:21.720 --> 00:19:26.279 +there's a custom data type, you need to give the LLM extra + +00:19:26.280 --> 00:19:30.399 +context. So that's something to think about. Once it knows + +00:19:30.400 --> 00:19:35.679 +the context, it can generate this fake data that very often is + +00:19:35.680 --> 00:19:39.839 +good enough just to test out, you know, like I've done here, like + +00:19:39.840 --> 00:19:45.399 +string... sorry, list destructuring and parsing and things + +00:19:45.400 --> 00:19:51.879 +like that. I think that was all I had, and thank you for + +00:19:51.880 --> 00:19:52.920 +listening! diff --git a/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--answers.vtt b/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--answers.vtt new file mode 100644 index 00000000..b9dae5b5 --- /dev/null +++ b/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--answers.vtt @@ -0,0 +1,1081 @@ +WEBVTT + +00:00:00.000 --> 00:00:01.479 +The first question, + +00:00:01.480 --> 00:00:03.599 +and I'm reading from the etherpad here, + +00:00:03.600 --> 00:00:05.519 +is there a scope for integrating + +00:00:05.520 --> 00:00:07.839 +the C library to Emacs itself + +00:00:07.840 --> 00:00:13.159 +with MuPDF becoming an optional dependency? + +00:00:13.160 --> 00:00:18.719 +Right, so integrating the C library into Emacs itself + +00:00:18.720 --> 00:00:24.359 +is like having MuPDF inside Emacs source tree. + +00:00:24.360 --> 00:00:27.999 +I don't think Emacs devs would be inclined to do that, + +00:00:28.000 --> 00:00:30.079 +and I don't think we really need it. + +00:00:30.080 --> 00:00:33.039 +Um, I think as it is, uh, Emacs + +00:00:33.040 --> 00:00:36.439 +with doc view needs new tool, which is something you need + +00:00:36.440 --> 00:00:38.919 +to install from new PDF anyways. + +00:00:38.920 --> 00:00:42.599 +So, um, I think it is almost expected + +00:00:42.600 --> 00:00:46.279 +that you install new PDF from system package manager. + +00:00:46.280 --> 00:00:49.119 +Um, and I think that as it is, is better + +00:00:49.120 --> 00:00:50.999 +because we don't really need to have + +00:00:51.000 --> 00:00:53.439 +a whole PDF engine inside Emacs. + +00:00:53.440 --> 00:00:59.879 +Um, Next question also from the pad, + +00:00:59.880 --> 00:01:01.759 +the dynamic module some great, + +00:01:01.760 --> 00:01:06.639 +and it's amazing that they've been there since 2017. + +00:01:06.640 --> 00:01:09.839 +Why do you think they've been slowly + +00:01:09.840 --> 00:01:11.559 +so slow to get adopted? + +00:01:11.560 --> 00:01:14.279 +Is there a prior art with them? Right? + +00:01:14.280 --> 00:01:16.359 +That's a good question. + +00:01:16.360 --> 00:01:22.119 +Actually, I think 1 of the reasons is that. + +00:01:22.120 --> 00:01:24.919 +Most of the time, I think people love Emacs + +00:01:24.920 --> 00:01:27.519 +because they can do so much with Elisp. + +00:01:27.520 --> 00:01:28.919 +I think certainly there is a bias + +00:01:28.920 --> 00:01:31.319 +towards trying to do things with Elisp. + +00:01:31.320 --> 00:01:35.039 +I think there's only a sort of specific class of problems + +00:01:35.040 --> 00:01:36.879 +that you can solve with dynamic modules, + +00:01:36.880 --> 00:01:40.879 +such as this, where you want to use a native library + +00:01:40.880 --> 00:01:44.239 +to do something in a faster, better way. + +00:01:44.240 --> 00:01:48.959 +I use that quite a lot. + +00:01:48.960 --> 00:01:53.319 +There's of course libvterm, which uses a dynamic module + +00:01:53.320 --> 00:01:55.119 +and it does it really well. + +00:01:55.120 --> 00:02:00.439 +And I think there's another one, a plotting library + +00:02:00.440 --> 00:02:05.879 +or package in Emacs that was using something from Python. + +00:02:05.880 --> 00:02:07.879 +So, dynamic modules are good, + +00:02:07.880 --> 00:02:10.039 +but I think they don't really come + +00:02:10.040 --> 00:02:13.974 +to the surface level packages, your day-to-day packages, + +00:02:13.975 --> 00:02:17.359 +because most of the day-to-day packages that we use in Emacs + +00:02:17.360 --> 00:02:20.879 +can be done with Elisp. So, unless you really need + +00:02:20.880 --> 00:02:23.199 +something system-level efficient, + +00:02:23.200 --> 00:02:29.519 +Most of the time, you don't want to write C or C++ or something. + +00:02:29.520 --> 00:02:34.919 +But there is actually a really nice Rust crate for native modules, + +00:02:34.920 --> 00:02:37.239 +and there's a really nice Haskell package. + +00:02:37.240 --> 00:02:39.879 +So there's actually really good support + +00:02:39.880 --> 00:02:41.279 +for multiple languages. + +00:02:41.280 --> 00:02:45.799 +So it's there, it's just not used as much. Yeah. + +00:02:45.800 --> 00:02:47.039 +So what you're saying is + +00:02:47.040 --> 00:02:51.279 +if Elisp weren't so simple to learn and easy to use + +00:02:51.280 --> 00:02:52.879 +and so fully featured, + +00:02:52.880 --> 00:02:54.959 +we'd get a lot more mileage + +00:02:54.960 --> 00:02:57.799 +out of this super cool dynamic module feature. + +00:02:57.800 --> 00:03:02.159 +Yeah. Cool I'll take I'll bring in the next question. + +00:03:02.160 --> 00:03:07.399 +How how? How difficult is our PDF tools to install? + +00:03:07.400 --> 00:03:10.439 +The questioner is installing it + +00:03:10.440 --> 00:03:12.519 +using the built-in package manager + +00:03:12.520 --> 00:03:16.679 +looking at the Emacs reader installation instructions + +00:03:16.680 --> 00:03:18.479 +It doesn't necessarily cover + +00:03:18.480 --> 00:03:20.399 +how how to install that easily + +00:03:20.400 --> 00:03:25.679 +person is not using use package or straight and Okay. + +00:03:25.680 --> 00:03:27.959 +Oh, and they say that you didn't + +00:03:27.960 --> 00:03:32.439 +catch much of this in the presentation. + +00:03:32.440 --> 00:03:35.079 +Okay, so you want me to skip that or should I answer? + +00:03:35.080 --> 00:03:38.159 +It's your choice. If you would like to say more. + +00:03:38.160 --> 00:03:40.519 +Yeah, I think just as a thing, + +00:03:40.520 --> 00:03:43.319 +the reason I said PDF tools is difficult + +00:03:43.320 --> 00:03:45.839 +is PDF tools has a huge list of dependencies. + +00:03:45.840 --> 00:03:47.639 +The only thing Emacs Vita depends + +00:03:47.640 --> 00:03:50.599 +on is new PDF, nothing else. There's a single dependency. + +00:03:50.600 --> 00:03:54.479 +PDF tools depends on a lot of things + +00:03:54.480 --> 00:03:57.759 +and they have their own server, + +00:03:57.760 --> 00:04:00.039 +which is packaged as a system package, + +00:04:00.040 --> 00:04:02.359 +which you don't really find everywhere. + +00:04:02.360 --> 00:04:05.039 +And there's like systems, the new Linux systems + +00:04:05.040 --> 00:04:07.359 +where the package is very difficult to build + +00:04:07.360 --> 00:04:10.079 +because of so many dependencies. + +00:04:10.080 --> 00:04:13.159 +So my goal was to sort of reduce + +00:04:13.160 --> 00:04:14.839 +the number of dependencies. + +00:04:14.840 --> 00:04:19.559 +And then right now it's very, it's sort of a key + +00:04:19.560 --> 00:04:21.119 +to install Emacs Reader. + +00:04:21.120 --> 00:04:23.319 +Once we go to GNU Elpa, it's just + +00:04:23.320 --> 00:04:25.999 +going to be Emacs package install, just that. + +00:04:26.000 --> 00:04:27.919 +Right now you have to do package VC + +00:04:27.920 --> 00:04:32.359 +a bit. Boy, we get spoiled as + +00:04:32.360 --> 00:04:35.359 +Emacs users. Everything just gets so easy + +00:04:35.360 --> 00:04:37.959 +for us. It's like an IDE for our + +00:04:37.960 --> 00:04:44.839 +whole machine. What tools did you use to measure the + +00:04:44.840 --> 00:04:48.879 +memory usage between the three packages? + +00:04:48.880 --> 00:04:50.119 +Yeah, that's a good question. + +00:04:50.120 --> 00:04:54.799 +So during my development, I used mostly for debugging + +00:04:54.800 --> 00:05:00.119 +purposes Valgrind. So Valgrind is a a set of suite + +00:05:00.120 --> 00:05:01.559 +of debugging tools. + +00:05:01.560 --> 00:05:03.799 +And one of the tools that it has is Massive. + +00:05:03.800 --> 00:05:08.919 +It's a heap analyzer, heap profiler. + +00:05:08.920 --> 00:05:10.839 +So Valgrind plus Massive, + +00:05:10.840 --> 00:05:14.119 +and then there's a KDE package + +00:05:14.120 --> 00:05:15.759 +called Massive Visualizer. + +00:05:15.760 --> 00:05:19.839 +So I first get the Massive output using Valgrind, + +00:05:19.840 --> 00:05:23.159 +and then put that output into Massive Visualizer. + +00:05:23.160 --> 00:05:24.519 +That gives me the grasp. + +00:05:24.520 --> 00:05:28.599 +Are there Emacs integrations for those components at all? + +00:05:28.600 --> 00:05:30.279 +Does Valgrind have them? + +00:05:30.280 --> 00:05:32.399 +I don't think so. I don't think so. + +00:05:32.400 --> 00:05:37.319 +There's, yeah, there's I think a few packages + +00:05:37.320 --> 00:05:38.879 +which do something with Massive, + +00:05:38.880 --> 00:05:42.159 +but I don't think like they're maintained. + +00:05:42.160 --> 00:05:47.759 +Yeah. Gotcha. Cool. Awesome opportunity + +00:05:47.760 --> 00:05:49.399 +there for someone spunky. + +00:05:49.400 --> 00:05:55.399 +How is conversion between Elisp and foreign language types? + +00:05:55.400 --> 00:05:59.039 +For example, when interfacing with the C++ library + +00:05:59.040 --> 00:06:03.439 +that makes heavy use of the C++ object system and templates. + +00:06:03.440 --> 00:06:05.879 +Yeah, that's a good question. + +00:06:05.880 --> 00:06:10.519 +So the go-to answer is the blog post that I wrote, + +00:06:10.520 --> 00:06:12.199 +which is an extensive explanation + +00:06:12.200 --> 00:06:14.679 +on how the internals of dynamic modules work. + +00:06:14.680 --> 00:06:21.119 +The short answer is that basically what happens + +00:06:21.120 --> 00:06:24.639 +is anything that is compatible with C-ABI + +00:06:24.640 --> 00:06:27.759 +When you compile that language code, + +00:06:27.760 --> 00:06:33.559 +so when I compile C++ code, I would have a particular API. + +00:06:33.560 --> 00:06:35.799 +So we have a dynamic module API, + +00:06:35.800 --> 00:06:39.119 +which is the emacs-module.h, the file that I showed. + +00:06:39.120 --> 00:06:45.799 +You have to put that into your C++ package program + +00:06:45.800 --> 00:06:48.679 +and then link it to... + +00:06:48.680 --> 00:06:51.119 +So emacs-module.h is basically going to... + +00:06:51.120 --> 00:06:56.799 +like use things in your Emacs installation + +00:06:56.800 --> 00:07:04.359 +to interact with this C++ language. So it's basically FFI. + +00:07:04.360 --> 00:07:10.959 +And what this gives you is that you can have things in C++. + +00:07:10.960 --> 00:07:13.119 +So let's say you want to do multi-threading + +00:07:13.120 --> 00:07:15.279 +the way I did system level multi-threading. + +00:07:15.280 --> 00:07:20.519 +You can have C++ be responsible for the multi-threading. + +00:07:20.520 --> 00:07:22.999 +but you want the output + +00:07:23.000 --> 00:07:24.879 +of the multithreading to go into Emacs. + +00:07:24.880 --> 00:07:29.039 +So then you write like a piece of C++ function, + +00:07:29.040 --> 00:07:31.879 +which is going to be a dynamic module function. + +00:07:31.880 --> 00:07:32.919 +A dynamic module function + +00:07:32.920 --> 00:07:34.959 +is written in the language that you target, + +00:07:34.960 --> 00:07:37.359 +that is C++ or C or Rust. + +00:07:37.360 --> 00:07:40.759 +And then that is going to be compiled + +00:07:40.760 --> 00:07:43.279 +into a share library like SO. + +00:07:43.280 --> 00:07:46.439 +shared object, and then that shared object + +00:07:46.440 --> 00:07:50.639 +is going to be loaded into Emacs system using require. + +00:07:50.640 --> 00:07:53.119 +So when I do require render core + +00:07:53.120 --> 00:07:54.799 +in one of the slides that I showed, + +00:07:54.800 --> 00:07:58.439 +I'm basically loading that shared object, + +00:07:58.440 --> 00:08:00.516 +and that shared object already has + +00:08:00.517 --> 00:08:03.891 +the compiled dynamic module functions and so on. + +00:08:03.892 --> 00:08:06.308 +But my blog will explain that better. + +00:08:06.309 --> 00:08:10.016 +Gotcha. I thought that was pretty clear. + +00:08:10.017 --> 00:08:12.016 +I'm looking forward to seeing that blog post + +00:08:12.017 --> 00:08:13.641 +and understanding what I glossed over + +00:08:13.642 --> 00:08:15.860 +trying to understand from that explanation. + +00:08:15.861 --> 00:08:18.420 +That was great. + +00:08:18.421 --> 00:08:22.879 +Can one look at PDF metadata with Emacs Reader? + +00:08:22.880 --> 00:08:26.199 +Can you do annotations? Does it understand forms? + +00:08:26.200 --> 00:08:29.959 +Can it handle encrypted PDFs? + +00:08:29.960 --> 00:08:33.159 +In other words, I think reading between the lines, + +00:08:33.160 --> 00:08:34.279 +wow, this is awesome. + +00:08:34.280 --> 00:08:39.199 +Is there anything I can't do? You're right. + +00:08:39.200 --> 00:08:44.119 +So Emacs Reader will be able to do all of those things. + +00:08:44.120 --> 00:08:48.359 +It can do annotations. It will be able to do forms. + +00:08:48.360 --> 00:08:52.279 +And we have an issue open for interpret PDFs. + +00:08:52.280 --> 00:08:54.839 +The thing is, right now we are struggling with + +00:08:54.840 --> 00:08:58.759 +making Emacs Reader be very efficient + +00:08:58.760 --> 00:09:02.679 +in terms of highlighting and text selection + +00:09:02.680 --> 00:09:05.519 +because of the challenges that I mentioned in the slides, + +00:09:05.520 --> 00:09:07.959 +so it will be able to do all that. + +00:09:07.960 --> 00:09:10.959 +Once we tackle the basic features + +00:09:10.960 --> 00:09:18.599 +down in an efficient manner. Gotcha. Um. + +00:09:18.600 --> 00:09:24.119 +Comment or questioner says, + +00:09:24.120 --> 00:09:28.799 +I installed Emacs Reader already as promised. Great job. + +00:09:28.800 --> 00:09:34.879 +How can I associate ODT files to open with Emacs Reader? + +00:09:34.880 --> 00:09:38.479 +You don't really need to do anything. + +00:09:38.480 --> 00:09:40.599 +You should be just able to do find file, + +00:09:40.600 --> 00:09:42.959 +Control X, Control F, and open. + +00:09:42.960 --> 00:09:45.319 +And it should open with Emacs Reader + +00:09:45.320 --> 00:09:47.759 +because we have an auto mode list, + +00:09:47.760 --> 00:09:51.679 +a list that takes an ODT file + +00:09:51.680 --> 00:09:53.199 +and opens it with reader mode. + +00:09:53.200 --> 00:09:55.639 +So you should just be able to do find file. + +00:09:55.640 --> 00:09:56.879 +If you're not able to do that, + +00:09:56.880 --> 00:09:58.199 +you should open Embug report. + +00:09:58.200 --> 00:10:00.759 +And I'll just mention + +00:10:00.760 --> 00:10:03.239 +we've got about 10 minutes left of our live Q&A, + +00:10:03.240 --> 00:10:06.079 +but if you're watching the stream, + +00:10:06.080 --> 00:10:08.439 +it's possible that we'll just keep going. + +00:10:08.440 --> 00:10:10.799 +The questions just keep coming, which I just love that. + +00:10:10.800 --> 00:10:14.519 +So feel free to join the BBB link + +00:10:14.520 --> 00:10:17.439 +that should have shown in the IRC chat. + +00:10:17.440 --> 00:10:21.559 +Jump in and we can take questions + +00:10:21.560 --> 00:10:25.999 +as long as Divya has steam for that. + +00:10:26.000 --> 00:10:30.439 +If a PDF file is open in Emacs Reader + +00:10:30.440 --> 00:10:33.199 +and I reintegrate the PDF with some changes, + +00:10:33.200 --> 00:10:36.519 +does the Emacs Reader refresh the PDF on its own + +00:10:36.520 --> 00:10:38.919 +or do I reload it? + +00:10:38.920 --> 00:10:41.319 +Right, that's also a really good question. + +00:10:41.320 --> 00:10:44.599 +So one answer is that it depends on + +00:10:44.600 --> 00:10:46.079 +how you change the PDF. + +00:10:46.080 --> 00:10:50.839 +So for example, if I just replaced the PDF + +00:10:50.840 --> 00:10:52.639 +with something else of the same name, + +00:10:52.640 --> 00:10:55.799 +Emacs will update it immediately. + +00:10:55.800 --> 00:10:57.919 +If you have auto revert mode on, + +00:10:57.920 --> 00:10:59.119 +it'll just revert the buffer + +00:10:59.120 --> 00:11:01.879 +and it'll reload the PDF really nicely. + +00:11:01.880 --> 00:11:05.439 +But if you're doing it something like LaTeX, + +00:11:05.440 --> 00:11:07.399 +where you're writing something in LaTeX + +00:11:07.400 --> 00:11:10.519 +and LaTeX is continuously producing the PDF, + +00:11:10.520 --> 00:11:13.279 +that needs SyncTeX integration. + +00:11:13.280 --> 00:11:16.159 +Because LaTeX, while it's producing the PDF, + +00:11:16.160 --> 00:11:19.159 +it does a lot of funky things. + +00:11:19.160 --> 00:11:24.519 +It does not provide a sort of renderable PDF all the time. + +00:11:24.520 --> 00:11:28.679 +So Emacs will sort of crash trying to + +00:11:28.680 --> 00:11:31.679 +basically render a PDF that is not ready yet. + +00:11:31.680 --> 00:11:34.799 +So we need SyncTex to sync + +00:11:34.800 --> 00:11:37.279 +with LaTeX to do that really nice. + +00:11:37.280 --> 00:11:39.559 +Okay, so we have to do some care + +00:11:39.560 --> 00:11:41.319 +and feeding of the exact timing + +00:11:41.320 --> 00:11:46.879 +if we have more of a continuous behind the curtains, so to speak. + +00:11:46.880 --> 00:11:50.959 +That makes a lot of sense to me. What are the challenges + +00:11:50.960 --> 00:11:55.719 +with integrating synctex and AucTex? + +00:11:55.720 --> 00:11:58.919 +This would be great to see as PDF handles as well, + +00:11:58.920 --> 00:12:02.319 +or PDF tools handles as well. Yeah, yeah. + +00:12:02.320 --> 00:12:04.399 +So, we have Synctex and Auctex planned. + +00:12:04.400 --> 00:12:06.839 +I don't really see any major obstacles + +00:12:06.840 --> 00:12:08.679 +for doing that, to be very honest. + +00:12:08.680 --> 00:12:11.519 +I think we can do it in a much simpler way + +00:12:11.520 --> 00:12:12.479 +than PDF Tools does. + +00:12:12.480 --> 00:12:17.479 +The only reason we haven't done it yet is because, again, + +00:12:17.480 --> 00:12:20.479 +we have more important highlighting + +00:12:20.480 --> 00:12:24.399 +and text selection and those features planned, + +00:12:24.400 --> 00:12:32.919 +but it's anticipated. Yeah. All right. This next question + +00:12:32.920 --> 00:12:36.439 +I love your presentation. Will you be giving another talk + +00:12:36.440 --> 00:12:39.399 +on the architecture you went over a deep dive on? + +00:12:39.400 --> 00:12:44.919 +That would be awesome. I'm not sure if an EmacsConf talk + +00:12:44.920 --> 00:12:48.479 +will be appropriate for this, but I do stream bi-weekly. + +00:12:48.480 --> 00:12:52.599 +So you're always welcome to come on my stream and ask, + +00:12:52.600 --> 00:12:55.359 +and I would be very happy to go deep into this. + +00:12:55.360 --> 00:12:58.119 +I'm looking forward to catching that myself. + +00:12:58.120 --> 00:13:02.639 +Thank you for the shout. Is there search functionality, + +00:13:02.640 --> 00:13:05.319 +something like isearch and occur? + +00:13:05.320 --> 00:13:07.599 +Yeah, we don't really have it, + +00:13:07.600 --> 00:13:09.599 +but this is the most immediate feature + +00:13:09.600 --> 00:13:10.959 +after we have text selection. + +00:13:10.960 --> 00:13:12.399 +So once we have text selection, + +00:13:12.400 --> 00:13:14.359 +once we're able to select the text, + +00:13:14.360 --> 00:13:17.679 +then we can have iSearch so that it can highlight the text. + +00:13:17.680 --> 00:13:26.679 +Yeah. Um, all right. And then, um, there's, I'm just gonna, + +00:13:26.680 --> 00:13:28.799 +I'll read out this question + +00:13:28.800 --> 00:13:30.639 +and then I have to do a little bookkeeping on the pad. + +00:13:30.640 --> 00:13:35.639 +Um, does the dynamic module, uh, prevent customization + +00:13:35.640 --> 00:13:39.999 +that Emacs usually provides advice, hooks, et cetera, + +00:13:40.000 --> 00:13:44.359 +or does everything just kind of + +00:13:44.360 --> 00:13:46.559 +No, if you have a dynamic module, + +00:13:46.560 --> 00:13:49.279 +it doesn't limit you into doing anything. + +00:13:49.280 --> 00:13:52.839 +You can do everything on the Elisp side that you want, + +00:13:52.840 --> 00:13:55.719 +and you only take care of certain things + +00:13:55.720 --> 00:13:56.879 +on the dynamic module side. + +00:13:56.880 --> 00:13:57.999 +If you're asking whether + +00:13:58.000 --> 00:14:01.879 +you can do advices, hooks, and all of that + +00:14:01.880 --> 00:14:03.879 +on the dynamic module itself, + +00:14:03.880 --> 00:14:05.679 +from the dynamic module itself, + +00:14:05.680 --> 00:14:09.719 +that's a bit tricky because something like + +00:14:09.720 --> 00:14:13.999 +Calling a macro or doing macros and dynamic modules + +00:14:14.000 --> 00:14:18.119 +is not really that nice You have to pretty much manually + +00:14:18.120 --> 00:14:21.359 +expand the macro yourself in the dynamic module + +00:14:21.360 --> 00:14:23.839 +so if you want to do it from the dynamic module, + +00:14:23.840 --> 00:14:25.959 +there's not much support right now, + +00:14:25.960 --> 00:14:29.479 +but you can do everything on the elisp side + +00:14:29.480 --> 00:14:33.399 +without touching the dynamic module. Got it + +00:14:33.400 --> 00:14:38.279 +So those are the questions that I see. + +00:14:38.280 --> 00:14:39.999 +I'm just going to take a quick peek, + +00:14:40.000 --> 00:14:42.639 +but let me invite you if you want to. + +00:14:42.640 --> 00:14:45.999 +We've got just about 5 minutes left + +00:14:46.000 --> 00:14:48.239 +and I will get carried away sometimes + +00:14:48.240 --> 00:14:51.279 +and fail to make this invitation before we cut away live, + +00:14:51.280 --> 00:14:54.479 +especially if we do keep going a bit. + +00:14:54.480 --> 00:14:57.799 +that you have live onto the stream. + +00:14:57.800 --> 00:15:02.599 +Of course, you don't have to do that. + +00:15:02.600 --> 00:15:05.799 +You said a lot in your presentation. + +00:15:05.800 --> 00:15:12.199 +No, I think mostly that's fine. + +00:15:12.200 --> 00:15:13.679 +I'm just really happy + +00:15:13.680 --> 00:15:17.079 +that people are interested in the package, + +00:15:17.080 --> 00:15:19.879 +and I would be glad to have contributors + +00:15:19.880 --> 00:15:25.199 +and viewers or anything. That would be nice. Awesome. + +00:15:25.200 --> 00:15:28.879 +So here comes one more question, + +00:15:28.880 --> 00:15:31.959 +or actually a couple more questions coming in. + +00:15:31.960 --> 00:15:34.239 +Following up on dynamic modules, + +00:15:34.240 --> 00:15:38.479 +do you usually create an Elisp shim + +00:15:38.480 --> 00:15:40.399 +from foreign function interface + +00:15:40.400 --> 00:15:41.559 +and then use them with Elisp? + +00:15:41.560 --> 00:15:46.159 +Yeah, so basically how you do is you write, + +00:15:46.160 --> 00:15:49.639 +let's say I have a C function + +00:15:49.640 --> 00:15:51.399 +that I've written in the dynamic module. + +00:15:51.400 --> 00:15:52.879 +It's a dynamic module function. + +00:15:52.880 --> 00:15:54.639 +And then when I'm trying to call + +00:15:54.640 --> 00:15:56.039 +the dynamic module function, + +00:15:56.040 --> 00:15:58.999 +most of the time, I don't call it like that. + +00:15:59.000 --> 00:16:01.679 +I wrap it inside a proper Elisp function + +00:16:01.680 --> 00:16:03.559 +and then call that Elisp function. + +00:16:03.560 --> 00:16:08.279 +So that's how I think it's better to do that because + +00:16:08.280 --> 00:16:12.559 +You can take care of certain cases + +00:16:12.560 --> 00:16:15.199 +on when you want the dynamic module function to be called. + +00:16:15.200 --> 00:16:17.199 +Maybe sometimes you don't want + +00:16:17.200 --> 00:16:18.839 +the dynamic module function + +00:16:18.840 --> 00:16:19.879 +to be called immediately. + +00:16:19.880 --> 00:16:22.159 +So it's better to wrap it. + +00:16:22.160 --> 00:16:26.599 +Yeah. Okay. So timing issues. Yeah. + +00:16:26.600 --> 00:16:31.679 +For the purposes of managing timing issues, + +00:16:31.680 --> 00:16:34.319 +that elisp shim is preferred. + +00:16:34.320 --> 00:16:38.959 +Yeah. Makes sense. Um. + +00:16:38.960 --> 00:16:44.639 +Uh, so question question here + +00:16:44.640 --> 00:16:47.439 +is searching for the person is searching for a roadmap. + +00:16:47.440 --> 00:16:49.279 +Is that already available as a feature? + +00:16:49.280 --> 00:16:52.239 +Searching is on the roadmap. + +00:16:52.240 --> 00:16:56.559 +It is not available yet as a feature, but it's on priority. + +00:16:56.560 --> 00:16:59.839 +I think you may have may have touched on that. + +00:16:59.840 --> 00:17:06.559 +Sorry. All right. Those are the questions that I see. + +00:17:06.560 --> 00:17:08.279 +We've got just a couple of minutes. + +00:17:08.280 --> 00:17:10.399 +I'm not sure if you have more you wanted to say, + +00:17:10.400 --> 00:17:13.719 +but I have to say how much I appreciate your talk, + +00:17:13.720 --> 00:17:16.119 +especially you jumping in live with us + +00:17:16.120 --> 00:17:19.079 +and just taking everything on the fly. + +00:17:19.080 --> 00:17:24.559 +I think this is a big part of what adds the energy, + +00:17:24.560 --> 00:17:28.039 +you in particular, just really dynamic speaker. + +00:17:28.040 --> 00:17:31.479 +Thank you. Thank you. Thank you. I enjoyed it as well. + +00:17:31.480 --> 00:17:37.159 +A person is, and I think this may have been touched on already, + +00:17:37.160 --> 00:17:39.439 +but let's maybe get into it more specifically. + +00:17:39.440 --> 00:17:42.159 +We've said that search is kind of + +00:17:42.160 --> 00:17:44.719 +a next up type of feature as things, + +00:17:44.720 --> 00:17:48.159 +as the current iteration stabilizes. + +00:17:48.160 --> 00:17:52.239 +Question was, you know, occur like, how would you? + +00:17:52.240 --> 00:17:56.159 +Totally. There will be occur searches. + +00:17:56.160 --> 00:17:59.639 +There will be isearch enabled, isearch. + +00:17:59.640 --> 00:18:02.879 +used to with PDF tools, + +00:18:02.880 --> 00:18:06.439 +we would be like parity with the features, + +00:18:06.440 --> 00:18:08.719 +all the features that you're used to with PDF tools. + +00:18:08.720 --> 00:18:12.599 +Um, so, uh, certainly occur anything + +00:18:12.600 --> 00:18:15.679 +that is important in Emacs with text + +00:18:15.680 --> 00:18:17.359 +and that can be done with PDFs. + +00:18:17.360 --> 00:18:19.839 +We really want to do that because, um, + +00:18:19.840 --> 00:18:22.679 +I want the package to be as knitted + +00:18:22.680 --> 00:18:24.959 +into Emacs ecosystem as possible. + +00:18:24.960 --> 00:18:28.159 +Okay. We'll see if we can get in this last question here. + +00:18:28.160 --> 00:18:30.319 +Do you have a timing expectation for ELPA? + +00:18:30.320 --> 00:18:33.199 +Uh, yeah, next major release essentially. + +00:18:33.200 --> 00:18:35.279 +So next major release is most likely + +00:18:35.280 --> 00:18:37.319 +going to be within a month or two. + +00:18:37.320 --> 00:18:39.639 +So once we have the next major release, we're going to be. + +00:18:39.640 --> 00:18:43.479 +Uh, timing couldn't be more perfect. + +00:18:43.480 --> 00:18:45.519 +Maybe this is a good, good point to break. + +00:18:45.520 --> 00:18:47.759 +We'll be cutting away to the next talk + +00:18:47.760 --> 00:18:48.879 +in just a couple of minutes. + +00:18:48.880 --> 00:18:51.479 +So let me say one more time how much + +00:18:51.480 --> 00:18:52.959 +on behalf of all the attendees + +00:18:52.960 --> 00:18:54.959 +and all the volunteers and all everybody, + +00:18:54.960 --> 00:18:57.079 +um, how much we appreciate your talks + +00:18:57.080 --> 00:19:01.299 +and, uh, your awesome contribution to the Emacs world. + +00:19:01.300 --> 00:19:02.766 +Thanks, Corwin. diff --git a/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--main--chapters.vtt b/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--main--chapters.vtt new file mode 100644 index 00000000..d5b51235 --- /dev/null +++ b/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--main--chapters.vtt @@ -0,0 +1,47 @@ +WEBVTT + + +00:00:00.720 --> 00:00:44.759 +An introduction to the Emacs reader + +00:00:44.760 --> 00:02:05.759 +Yet another document viewer in Emacs? + +00:02:05.760 --> 00:06:00.279 +Architecture of Emacs Reader + +00:06:00.280 --> 00:07:39.559 +A word on dynamic modules + +00:07:39.560 --> 00:07:56.759 +Features of Emacs Reader + +00:07:56.760 --> 00:11:18.719 +Memory efficiency + +00:11:18.720 --> 00:14:23.679 +Performance and speed + +00:14:23.680 --> 00:17:08.959 +Scanned PDFs + +00:17:08.960 --> 00:23:44.239 +System-level multi-threading + +00:23:44.240 --> 00:25:10.339 +Native Emacs integrations + +00:25:10.340 --> 00:26:01.139 +(Naive) dark mode + +00:26:01.140 --> 00:29:14.271 +Challenges and further improvements + +00:29:14.272 --> 00:32:32.299 +What Emacs can learn? + +00:32:32.300 --> 00:33:35.519 +Contributing to the development + +00:33:35.520 --> 00:34:37.280 +Acknowledgements diff --git a/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--main.vtt b/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--main.vtt new file mode 100644 index 00000000..2f83bc19 --- /dev/null +++ b/2025/captions/emacsconf-2025-reader--an-introduction-to-the-emacs-reader--divy--main.vtt @@ -0,0 +1,2431 @@ +WEBVTT captioned by jay_bird and sachac + +NOTE An introduction to the Emacs reader + +00:00:00.720 --> 00:00:02.879 +Hello EmacsConf! + +00:00:02.880 --> 00:00:06.639 +Today I'm here to introduce you to the Emacs Reader. + +00:00:06.640 --> 00:00:08.759 +It is a general-purpose document viewer + +00:00:08.760 --> 00:00:12.319 +that lives inside our beloved Emacs. + +00:00:12.320 --> 00:00:14.159 +It tries to prioritize memory + +00:00:14.160 --> 00:00:17.159 +and performance efficiency as much as possible + +00:00:17.160 --> 00:00:20.519 +even when you're using a lower-end hardware. + +00:00:20.520 --> 00:00:22.119 +And, most importantly, + +00:00:22.120 --> 00:00:25.439 +it tries to do things in an Emacs manner. + +00:00:25.440 --> 00:00:26.999 +That is, it tries to integrate + +00:00:27.000 --> 00:00:29.719 +with existing packages as much as possible + +00:00:29.720 --> 00:00:32.239 +instead of reinventing the wheel. + +00:00:32.240 --> 00:00:36.119 +And architecturally, it tries to take the advantage + +00:00:36.120 --> 00:00:38.479 +of dynamic or native modules + +00:00:38.480 --> 00:00:44.759 +which were introduced back in 2015 into Emacs. + +NOTE Yet another document viewer in Emacs? + +00:00:44.760 --> 00:00:46.759 +You would ask, why exactly do we need + +00:00:46.760 --> 00:00:49.199 +another document viewer in Emacs? + +00:00:49.200 --> 00:00:51.839 +Don't we already have the built-in DocView + +00:00:51.840 --> 00:00:55.199 +and the notorious pdf-tools? + +00:00:55.200 --> 00:00:59.439 +Well, the built-in DocView has unusable latency, + +00:00:59.440 --> 00:01:01.399 +and I'm going to show you this later + +00:01:01.400 --> 00:01:04.599 +when I compare this with Emacs Reader. + +00:01:04.600 --> 00:01:08.079 +The famous pdf-tools has actually multiple issues. + +00:01:08.080 --> 00:01:10.639 +One, it is extremely memory-hungry + +00:01:10.640 --> 00:01:14.399 +regardless of what kind of PDFs you're reading. + +00:01:14.400 --> 00:01:17.939 +And, well, it can only read PDFs. + +00:01:17.940 --> 00:01:22.199 +Poppler, the library which pdf-tools uses, + +00:01:22.200 --> 00:01:23.879 +is actually sub-optimal, + +00:01:23.880 --> 00:01:25.799 +especially relative to MuPDF, + +00:01:25.800 --> 00:01:28.559 +which is what Emacs Reader is based on. + +00:01:28.560 --> 00:01:31.919 +pdf-tools is also extremely painful to install. + +00:01:31.920 --> 00:01:34.279 +If you've ever installed pdf-tools, + +00:01:34.280 --> 00:01:38.479 +you know that it has a bunch of dependencies, + +00:01:38.480 --> 00:01:42.319 +including a server that is supposedly packaged. + +00:01:42.320 --> 00:01:45.061 +across package managers, system package managers. + +00:01:45.062 --> 00:01:47.737 +It's extremely difficult to install + +00:01:47.738 --> 00:01:50.279 +and painful to install. + +00:01:50.280 --> 00:01:52.839 +And of course, pdf-tools + +00:01:52.840 --> 00:01:54.559 +since the last couple of years + +00:01:54.560 --> 00:01:56.559 +has not been maintained as much. + +00:01:56.560 --> 00:02:05.759 +There's huge PRs that have been unnoticed and unmerged. + +NOTE Architecture of Emacs Reader + +00:02:05.760 --> 00:02:08.999 +Architecturally, Emacs Reader takes a distance + +00:02:09.000 --> 00:02:12.559 +from both DocView and pdf-tools. + +00:02:12.560 --> 00:02:15.399 +So how DocView works is that + +00:02:15.400 --> 00:02:18.679 +it basically wraps around + +00:02:18.680 --> 00:02:20.879 +a tool called mutool. + +00:02:20.880 --> 00:02:22.319 +mutool is actually + +00:02:22.320 --> 00:02:26.119 +a command line tool from MuPDF itself. + +00:02:26.120 --> 00:02:28.199 +It relies on mutool and a bunch + +00:02:28.200 --> 00:02:30.579 +of other similar command line tools, + +00:02:30.580 --> 00:02:34.199 +and basically makes process calls + +00:02:34.200 --> 00:02:36.519 +from Elisp to the CLI tools. + +00:02:36.520 --> 00:02:38.639 +That's how DocView works, + +00:02:38.640 --> 00:02:41.319 +and that's why it sort of has latency issues + +00:02:41.320 --> 00:02:42.519 +because that's the best you can do + +00:02:42.520 --> 00:02:45.019 +by literally calling CLI tools + +00:02:45.020 --> 00:02:50.679 +and outputting the images into Emacs. + +00:02:50.680 --> 00:02:55.039 +How pdf-tools works is that it tries + +00:02:55.040 --> 00:02:57.479 +to have a server-client model. + +00:02:57.480 --> 00:02:58.999 +So the client is Emacs + +00:02:59.000 --> 00:03:00.559 +and the server is basically + +00:03:00.560 --> 00:03:02.999 +something they call epdfinfo. + +00:03:03.000 --> 00:03:07.240 +It's supposed to render the images using Poppler + +00:03:07.241 --> 00:03:10.919 +and then send the images to Emacs + +00:03:10.920 --> 00:03:13.279 +which then tries to display. + +00:03:13.280 --> 00:03:16.279 +I think the server client model is terrible. + +00:03:16.280 --> 00:03:18.079 +One, for latency purposes, + +00:03:18.080 --> 00:03:19.839 +and two, it makes things + +00:03:19.840 --> 00:03:21.799 +unnecessarily more complicated. + +00:03:21.800 --> 00:03:24.199 +Here is where we come + +00:03:24.200 --> 00:03:26.679 +and introduce dynamic modules. + +00:03:26.680 --> 00:03:30.579 +So Emacs Reader is based on + +00:03:30.580 --> 00:03:32.279 +the concept of dynamic modules + +00:03:32.280 --> 00:03:34.279 +which I'm going to talk about in a bit. + +00:03:34.280 --> 00:03:37.159 +But how it works is that we have C modules. + +00:03:37.160 --> 00:03:39.039 +So we have the emacs-module.h, + +00:03:39.040 --> 00:03:40.679 +that's the dynamic module header + +00:03:40.680 --> 00:03:43.159 +which every dynamic module package must have. + +00:03:43.160 --> 00:03:45.479 +And then we have our C files. + +00:03:45.480 --> 00:03:52.579 +And these C files essentially define functions + +00:03:52.580 --> 00:03:56.439 +that are going to be used in Emacs but in C. + +00:03:56.440 --> 00:03:59.319 +We then load these C modules + +00:03:59.320 --> 00:04:03.799 +using simple (require ...) in our Elisp modules. + +00:04:03.800 --> 00:04:05.079 +And then whenever we call + +00:04:05.080 --> 00:04:07.119 +something in the Emacs runtime, + +00:04:07.120 --> 00:04:09.159 +say I'm going to open + +00:04:09.160 --> 00:04:13.559 +PDF files in (find-file) or (reader-open-doc), + +00:04:13.560 --> 00:04:15.799 +what it does is that + +00:04:15.800 --> 00:04:19.039 +it tries to use one of the functions + +00:04:19.040 --> 00:04:20.999 +that is wrapped in Elisp, + +00:04:21.000 --> 00:04:24.839 +but actually tries to call a function in C. + +00:04:24.840 --> 00:04:26.839 +And then the C module is actually + +00:04:26.840 --> 00:04:29.279 +going to make calls to the MuPDF. + +00:04:29.280 --> 00:04:31.599 +Here the MuPDF system package, + +00:04:31.600 --> 00:04:33.399 +this is actually a system package + +00:04:33.400 --> 00:04:35.839 +that is dynamically linked to the C modules. + +00:04:35.840 --> 00:04:36.919 +So we're basically + +00:04:36.920 --> 00:04:39.799 +just using it as a shared library. + +00:04:39.800 --> 00:04:43.359 +So you have the fz_load_page, for example, + +00:04:43.360 --> 00:04:44.839 +it's a MuPDF function + +00:04:44.840 --> 00:04:47.399 +that we're going to be using in the C modules. + +00:04:47.400 --> 00:04:50.079 +So it's going to make + +00:04:50.080 --> 00:04:53.279 +a shared dynamic call to MuPDF + +00:04:53.280 --> 00:04:55.119 +and then render the page + +00:04:55.120 --> 00:04:59.179 +and then show this to Emacs. + +00:04:59.180 --> 00:05:01.839 +This pipeline, I argue, + +00:05:01.840 --> 00:05:05.599 +is much better and leaner and efficient + +00:05:05.600 --> 00:05:07.639 +than a server-client model. + +00:05:07.640 --> 00:05:09.479 +One, because we don't really need + +00:05:09.480 --> 00:05:10.839 +the server-client model. + +00:05:10.840 --> 00:05:12.359 +So back when Politza + +00:05:12.360 --> 00:05:14.759 +first introduced pdf-tools, + +00:05:14.760 --> 00:05:19.759 +that was like 10 years ago in 2015, + +00:05:19.760 --> 00:05:21.240 +the concept of dynamic modules + +00:05:21.241 --> 00:05:23.279 +were not integrated into Emacs. + +00:05:23.280 --> 00:05:24.359 +I think they came around + +00:05:24.360 --> 00:05:28.079 +like one or two years late, 2017. + +00:05:28.080 --> 00:05:31.219 +So that's the best he could go with. + +00:05:31.220 --> 00:05:33.079 +We don't really have to, today, + +00:05:33.080 --> 00:05:35.719 +because, since we can use MuPDF + +00:05:35.720 --> 00:05:36.999 +as a shared library + +00:05:37.000 --> 00:05:39.479 +which can render things in real-time + +00:05:39.480 --> 00:05:41.759 +and just give us the rendered images + +00:05:41.760 --> 00:05:43.599 +which we can then display, + +00:05:43.600 --> 00:05:49.659 +there's no reason for a server to do things for us. + +00:05:49.660 --> 00:05:53.359 +So that's the main architectural difference + +00:05:53.360 --> 00:05:55.479 +that Emacs Reader introduces + +00:05:55.480 --> 00:06:00.279 +compared to pdf-tools and DocView. + +NOTE A word on dynamic modules + +00:06:00.280 --> 00:06:02.479 +What exactly are dynamic modules? + +00:06:02.480 --> 00:06:04.119 +Well, I can't really give you + +00:06:04.120 --> 00:06:06.199 +a full-fledged explanation, + +00:06:06.200 --> 00:06:08.639 +but essentially dynamic modules + +00:06:08.640 --> 00:06:10.519 +let you evaluate + +00:06:10.520 --> 00:06:12.039 +native compiled code + +00:06:12.040 --> 00:06:15.119 +in other languages like C, C++, Rust + +00:06:15.120 --> 00:06:18.519 +that behaves like regular Emacs Lisp. + +00:06:18.520 --> 00:06:23.639 +So when our Emacs C modules, + +00:06:23.640 --> 00:06:26.039 +the render-core.c or render-theme.c, + +00:06:26.040 --> 00:06:28.299 +when all of these are compiled, + +00:06:28.300 --> 00:06:30.839 +and they're called from the Elisp modules. + +00:06:30.840 --> 00:06:34.439 +They behave like Elisp even though + +00:06:34.440 --> 00:06:37.039 +they're as fast as a C function + +00:06:37.040 --> 00:06:39.359 +because they're compiled C code. + +00:06:39.360 --> 00:06:41.399 +But you essentially call them + +00:06:41.400 --> 00:06:42.759 +just like Elisp functions. + +00:06:42.760 --> 00:06:47.819 +You can find them using C-h f and so on. + +00:06:47.820 --> 00:06:49.679 +So you can call any function + +00:06:49.680 --> 00:06:51.719 +from any language that supports + +00:06:51.720 --> 00:06:53.519 +the C ABI, which is virtually everything, + +00:06:53.520 --> 00:06:54.919 +without leaving Emacs + +00:06:54.920 --> 00:06:56.759 +and without losing any performance. + +00:06:56.760 --> 00:06:58.479 +This is extremely helpful + +00:06:58.480 --> 00:06:59.919 +when you want to use + +00:06:59.920 --> 00:07:02.119 +existing libraries like MuPDF + +00:07:02.120 --> 00:07:04.079 +or any other cryptographic library + +00:07:04.080 --> 00:07:06.039 +that is written in C + +00:07:06.040 --> 00:07:07.037 +and you don't want to rewrite + +00:07:07.038 --> 00:07:08.537 +the entire thing in Elisp, + +00:07:08.538 --> 00:07:11.739 +but you can just use it as a native library. + +00:07:11.740 --> 00:07:13.039 +You can read more + +00:07:13.040 --> 00:07:14.679 +on how dynamic modules work + +00:07:14.680 --> 00:07:17.759 +and how you can write one in this blog. + +00:07:17.760 --> 00:07:19.479 +This is something that I wrote myself + +00:07:19.480 --> 00:07:22.239 +just after starting this package + +00:07:22.240 --> 00:07:25.439 +and it will give you a bit more guidance + +00:07:25.440 --> 00:07:27.519 +on how to use dynamic modules more efficiently. + +00:07:27.520 --> 00:07:28.679 +I think dynamic modules + +00:07:28.680 --> 00:07:32.299 +should be used more and more in Emacs + +00:07:32.300 --> 00:07:34.519 +and I think their advantages + +00:07:34.520 --> 00:07:36.079 +have not been exploited + +00:07:36.080 --> 00:07:39.559 +as much as they should. + +NOTE Features of Emacs Reader + +00:07:39.560 --> 00:07:42.319 +Now we're going to talk a bit about + +00:07:42.320 --> 00:07:46.719 +the core features of Emacs Reader. + +00:07:46.720 --> 00:07:48.879 +And these are the following features + +00:07:48.880 --> 00:07:50.399 +that we're going to talk about. + +00:07:50.400 --> 00:07:51.959 +And finally, to talk about + +00:07:51.960 --> 00:07:56.759 +some challenges that we faced. + +NOTE Memory efficiency + +00:07:56.760 --> 00:07:58.519 +First is memory efficiency. + +00:07:58.520 --> 00:08:00.819 +I already told you that + +00:08:00.820 --> 00:08:03.239 +Emacs Reader's first priority + +00:08:03.240 --> 00:08:06.439 +is to make sure that we are not slow + +00:08:06.440 --> 00:08:07.959 +and we are not taking + +00:08:07.960 --> 00:08:10.319 +a bunch of memory unnecessarily. + +00:08:10.320 --> 00:08:14.439 +So here's a graph of the heap memory size + +00:08:14.440 --> 00:08:17.919 +as it grows for DocView. + +00:08:17.920 --> 00:08:20.637 +So this is again in emacs -Q. + +00:08:20.638 --> 00:08:22.399 +So this is a fresh Emacs session + +00:08:22.400 --> 00:08:25.279 +with just DocView. + +00:08:25.280 --> 00:08:27.819 +It grows up to 900MB + +00:08:27.820 --> 00:08:31.559 +for a very small PDF that is a LaTeX PDF. + +00:08:31.560 --> 00:08:36.779 +No scanned huge PDF. It's a 2MB PDF. + +00:08:36.780 --> 00:08:39.679 +But when I scrolled from the beginning + +00:08:39.680 --> 00:08:41.619 +of the PDF to the end, + +00:08:41.620 --> 00:08:43.639 +it went up to 900MB. + +00:08:43.640 --> 00:08:46.819 +That's the memory heap size. + +00:08:46.820 --> 00:08:49.699 +Does pdf-tools make this any better? + +00:08:49.700 --> 00:08:51.919 +It actually doesn't. + +00:08:51.920 --> 00:08:55.039 +So, pdf-tools pretty much + +00:08:55.040 --> 00:08:57.219 +does the same thing. + +00:08:57.220 --> 00:08:58.439 +if you look at it here + +00:08:58.440 --> 00:09:01.359 +just so if you're going to ask me + +00:09:01.360 --> 00:09:02.939 +are they two different graphs, + +00:09:02.940 --> 00:09:04.839 +or are you just showing me the same graph, + +00:09:04.840 --> 00:09:06.119 +they're actually two different graphs, + +00:09:06.120 --> 00:09:08.779 +because if you look at the DocView graph + +00:09:08.780 --> 00:09:11.559 +it uses cairo and it uses librsvg + +00:09:11.560 --> 00:09:13.439 +because docview by default + +00:09:13.440 --> 00:09:16.119 +converts the images into SVG. + +00:09:16.120 --> 00:09:17.999 +The rendered images are SVGs. + +00:09:18.000 --> 00:09:20.559 +pdf-tools doesn't, so you don't see + +00:09:20.560 --> 00:09:24.039 +any librsvg calls here or anything + +00:09:24.040 --> 00:09:25.439 +So this is pdf-tools + +00:09:25.440 --> 00:09:27.079 +and it basically takes up + +00:09:27.080 --> 00:09:29.079 +the same amount of memory, 900MB, + +00:09:29.080 --> 00:09:30.919 +and exactly the same operation, + +00:09:30.920 --> 00:09:32.479 +exactly the same PDF, + +00:09:32.480 --> 00:09:36.139 +exactly scrolling from first to the last. + +00:09:36.140 --> 00:09:37.719 +Where do we stand? + +00:09:37.720 --> 00:09:40.559 +Well, we actually do much better. + +00:09:40.560 --> 00:09:42.599 +So let me zoom in this. + +00:09:42.600 --> 00:09:46.319 +So if you see, we stand within + +00:09:46.320 --> 00:09:49.259 +at a peak of 72MB. + +00:09:49.260 --> 00:09:51.279 +Exactly the same PDF, + +00:09:51.280 --> 00:09:53.039 +exactly the same operation + +00:09:53.040 --> 00:09:54.559 +from the beginning to the end, + +00:09:54.560 --> 00:09:57.599 +around 285 pages scrolled. + +00:09:57.600 --> 00:10:03.239 +We take much less than 80 MB. + +00:10:03.240 --> 00:10:05.071 +And actually, to be very frank, + +00:10:05.072 --> 00:10:09.204 +the only memory that we're storing in Emacs, + +00:10:09.205 --> 00:10:12.439 +oh, sorry, not in Emacs, + +00:10:12.440 --> 00:10:16.599 +in the MuPDF heap is just about 30 MB. + +00:10:16.600 --> 00:10:19.119 +It's this dark red one. + +00:10:19.120 --> 00:10:22.559 +That's the cache that we're storing. + +00:10:22.560 --> 00:10:24.759 +That's the memory that we're interacting with + +00:10:24.760 --> 00:10:25.479 +in real time. + +00:10:25.480 --> 00:10:29.199 +This is stuff that Emacs adds on top of it + +00:10:29.200 --> 00:10:32.919 +and a bit of libmupdf. + +00:10:32.920 --> 00:10:35.199 +So you can see, in terms of memory, + +00:10:35.200 --> 00:10:37.239 +we're saving... + +00:10:37.240 --> 00:10:41.119 +we're literally down, + +00:10:41.120 --> 00:10:45.359 +what, a fraction of 10! + +00:10:45.360 --> 00:10:48.519 +This was a priority for us + +00:10:48.520 --> 00:10:49.279 +since the beginning, + +00:10:49.280 --> 00:10:51.999 +because when I was starting to use pdf-tools, + +00:10:52.000 --> 00:10:53.359 +it was unusable for me + +00:10:53.360 --> 00:10:55.159 +because I was on a lower-end hardware + +00:10:55.160 --> 00:10:57.599 +and I thought it should not be + +00:10:57.600 --> 00:10:58.959 +really that difficult + +00:10:58.960 --> 00:11:00.879 +for a document reader + +00:11:00.880 --> 00:11:04.099 +to not take a gigabyte of memory. + +00:11:04.100 --> 00:11:05.919 +It really shouldn't because + +00:11:05.920 --> 00:11:07.359 +you're not really doing that much, + +00:11:07.360 --> 00:11:10.919 +you're just displaying images. + +00:11:10.920 --> 00:11:12.239 +So that's how efficient + +00:11:12.240 --> 00:11:13.639 +we are in terms of memory. + +00:11:13.640 --> 00:11:15.371 +Let's see how efficient + +00:11:15.372 --> 00:11:18.719 +we are in terms of speed. + +NOTE Performance and speed + +00:11:18.720 --> 00:11:21.099 +So Emacs Reader is actually + +00:11:21.100 --> 00:11:23.119 +as fast as pdf-tools, + +00:11:23.120 --> 00:11:24.079 +and it is actually + +00:11:24.080 --> 00:11:27.239 +way more faster than DocView. + +00:11:27.240 --> 00:11:28.559 +In some cases, + +00:11:28.560 --> 00:11:31.679 +it actually beats existing + +00:11:31.680 --> 00:11:34.859 +standalone document readers and browsers. + +00:11:34.860 --> 00:11:41.119 +So let's actually see this in action. + +00:11:41.120 --> 00:11:42.319 +So here we are with + +00:11:42.320 --> 00:11:46.039 +a few emacs -Q sessions. + +00:11:46.040 --> 00:11:50.719 +I'm using emacs -Q so as to give you... + +00:11:50.720 --> 00:11:52.159 +that this is actually + +00:11:52.160 --> 00:11:55.139 +as less overhead possible. + +00:11:55.140 --> 00:11:57.359 +So we have first DocView. + +00:11:57.360 --> 00:12:01.137 +All of these tests + +00:12:01.138 --> 00:12:03.039 +are going to be done on the same PDF. + +00:12:03.040 --> 00:12:07.199 +It's the documentation manual from MuPDF. + +00:12:07.200 --> 00:12:10.559 +So if I scroll, this is fine. + +00:12:10.560 --> 00:12:12.859 +I'm just pressing n + +00:12:12.860 --> 00:12:15.159 +and it seems to work fine. + +00:12:15.160 --> 00:12:19.519 +If I press and hold n, + +00:12:19.520 --> 00:12:21.799 +I have pressed n and I'm holding. + +00:12:21.800 --> 00:12:26.419 +And Emacs is stuck. + +00:12:26.420 --> 00:12:27.559 +And it's going to stay stuck + +00:12:27.560 --> 00:12:28.799 +because it's making calls + +00:12:28.800 --> 00:12:31.279 +to the CLI tool that I said, mutool. + +00:12:31.280 --> 00:12:35.519 +And after it's done getting stuck, + +00:12:35.520 --> 00:12:40.179 +it is going to get back. + +00:12:40.180 --> 00:12:43.039 +As you can see, if you go back, + +00:12:43.040 --> 00:12:45.079 +you're able to go back fine. + +00:12:45.080 --> 00:12:46.199 +It does not get stuck + +00:12:46.200 --> 00:12:48.439 +because what Emacs does + +00:12:48.440 --> 00:12:51.519 +is it basically calls mutool, + +00:12:51.520 --> 00:12:53.239 +like fetches a bunch of pages, + +00:12:53.240 --> 00:12:54.919 +essentially all the pages + +00:12:54.920 --> 00:12:56.199 +that you asked for it, + +00:12:56.200 --> 00:12:59.159 +and it puts them into the memory. + +00:12:59.160 --> 00:12:59.879 +And that's it. + +00:12:59.880 --> 00:13:01.199 +It puts them into the memory + +00:13:01.200 --> 00:13:03.139 +and then scrolls through it. + +00:13:03.140 --> 00:13:05.839 +So going back, you will most likely + +00:13:05.840 --> 00:13:07.239 +not have any stuck issues. + +00:13:07.240 --> 00:13:07.839 +Sometimes you do + +00:13:07.840 --> 00:13:10.919 +because some images do get GC'd. + +00:13:10.920 --> 00:13:13.599 +But that's the idea. + +00:13:13.600 --> 00:13:16.639 +Whenever there's no image in memory, + +00:13:16.640 --> 00:13:18.739 +it gets stuck. + +00:13:18.740 --> 00:13:21.239 +And it gets stuck good. + +00:13:21.240 --> 00:13:23.579 +That's DocView. + +00:13:23.580 --> 00:13:25.199 +pdf-tools is actually + +00:13:25.200 --> 00:13:27.359 +not problematic here. + +00:13:27.360 --> 00:13:29.039 +pdf-tools is extremely efficient + +00:13:29.040 --> 00:13:30.199 +and extremely fast. + +00:13:30.200 --> 00:13:32.839 +So we can go through the pages + +00:13:32.840 --> 00:13:34.479 +without any issues. + +00:13:34.480 --> 00:13:37.159 +We can zoom. + +00:13:37.160 --> 00:13:39.879 +The zoom did get stuck a bit, + +00:13:39.880 --> 00:13:44.039 +but that's relatively fine. + +00:13:44.040 --> 00:13:46.959 +Emacs Reader is exactly as fast + +00:13:46.960 --> 00:13:49.199 +as pdf-tools here. + +00:13:49.200 --> 00:13:50.279 +So this is pdf-view, + +00:13:50.280 --> 00:13:51.279 +this is Emacs Reader. + +00:13:51.860 --> 00:13:55.759 +Let's scroll through the pages. + +00:13:55.760 --> 00:13:59.159 +As you can see, nothing is getting stuck + +00:13:59.160 --> 00:14:00.919 +because we're not really waiting + +00:14:00.920 --> 00:14:06.359 +for any tool to send us any images. + +00:14:06.360 --> 00:14:08.299 +We just have a little cache + +00:14:08.300 --> 00:14:09.399 +and we're scrolling through them + +00:14:09.400 --> 00:14:13.959 +and rendering images in real time. + +00:14:13.960 --> 00:14:17.279 +Zooming also works fine. + +00:14:17.280 --> 00:14:19.519 +So, with regards to this, + +00:14:19.520 --> 00:14:23.679 +we're in parity with pdf-tools. + +NOTE Scanned PDFs + +00:14:23.680 --> 00:14:26.319 +Now, where pdf-tools and actually + +00:14:26.320 --> 00:14:28.079 +a lot of readers have issues + +00:14:28.080 --> 00:14:32.499 +is when they're dealing with scanned PDF. + +00:14:32.500 --> 00:14:36.839 +So, we have this PDF which is notorious + +00:14:36.840 --> 00:14:40.599 +for being really difficult to render + +00:14:40.600 --> 00:14:42.599 +because this is entirely built + +00:14:42.600 --> 00:14:43.479 +with scanned images. + +00:14:43.480 --> 00:14:44.619 +This is the kind of PDF + +00:14:44.620 --> 00:14:46.519 +that you get from Internet Archive. + +00:14:46.520 --> 00:14:47.839 +This is essentially someone + +00:14:47.840 --> 00:14:50.919 +took photos of the book in a camera + +00:14:50.920 --> 00:14:56.659 +and literally turned them into a PDF. + +00:14:56.660 --> 00:14:58.719 +Emacs Reader actually does not have + +00:14:58.720 --> 00:15:01.079 +any issues rendering this. + +00:15:01.080 --> 00:15:05.119 +As you can see, it renders it smoothly + +00:15:05.120 --> 00:15:09.679 +and fine without any halts. + +00:15:09.680 --> 00:15:13.959 +I can change Emacs even while it's doing so, + +00:15:13.960 --> 00:15:17.139 +and it does not have any issues. + +00:15:17.140 --> 00:15:20.071 +pdf-tools are the same. + +00:15:20.072 --> 00:15:21.759 +PDF also does not have any issues. + +00:15:21.760 --> 00:15:26.579 +Sorry. Click pdf-view-mode. + +00:15:26.580 --> 00:15:29.859 +pdf-view (pdf-tools) is a bit slower + +00:15:29.860 --> 00:15:35.619 +but does not have any issues. It works. + +00:15:35.620 --> 00:15:40.700 +Here, actually, pdf-tools and Emacs Reader + +00:15:40.701 --> 00:15:46.099 +are more efficient than even browsers. + +00:15:46.100 --> 00:15:47.199 +So, if I try to open + +00:15:47.200 --> 00:15:50.839 +the same page in a browser, + +00:15:50.840 --> 00:15:52.919 +I'm trying to scroll. + +00:15:52.920 --> 00:15:54.919 +And after I've scrolled and I leave, + +00:15:54.920 --> 00:15:58.119 +scrolling is going to load + +00:15:58.120 --> 00:15:59.839 +for a bunch of seconds + +00:15:59.840 --> 00:16:03.139 +to give me the page. + +00:16:03.140 --> 00:16:04.679 +It's more than five seconds, + +00:16:04.680 --> 00:16:05.479 +as you can see, + +00:16:05.480 --> 00:16:08.639 +and this is actually totally not usable. + +00:16:08.640 --> 00:16:10.199 +If you're going to read this book, + +00:16:10.200 --> 00:16:11.999 +an electromagnetics book, + +00:16:12.000 --> 00:16:13.599 +you're going to have a terrible time + +00:16:13.600 --> 00:16:14.759 +reading this in a browser, + +00:16:14.760 --> 00:16:15.479 +which is supposed to be + +00:16:15.480 --> 00:16:17.159 +the fastest thing alive. + +00:16:17.160 --> 00:16:19.119 +You sort of have the same experience + +00:16:19.120 --> 00:16:20.559 +in Okular. So this is Okular. + +00:16:20.560 --> 00:16:22.439 +If I try to scroll through this, + +00:16:22.440 --> 00:16:25.419 +it will do the same thing. + +00:16:25.420 --> 00:16:28.519 +And while it is better than the browser, + +00:16:28.520 --> 00:16:31.119 +it still takes a while + +00:16:31.120 --> 00:16:34.119 +and it still has, like, if you zoom, + +00:16:34.120 --> 00:16:36.799 +you're going to have a bit of a delay. + +00:16:36.800 --> 00:16:41.579 +You don't really face that in Emacs Reader. + +00:16:41.580 --> 00:16:45.259 +We zoom in and out just fine. + +00:16:45.260 --> 00:16:47.239 +And even with using mouse, + +00:16:47.240 --> 00:16:51.839 +you can zoom in and out just fine. + +00:16:51.840 --> 00:16:54.799 +So this is how Emacs Reader performs + +00:16:54.800 --> 00:17:01.119 +in terms of speed with these other tools. + +00:17:01.120 --> 00:17:08.959 +Now we will go back to the original presentation. + +NOTE System-level multi-threading + +00:17:08.960 --> 00:17:11.919 +Now, how exactly is Emacs Reader + +00:17:11.920 --> 00:17:14.079 +able to do a lot of this? + +00:17:14.080 --> 00:17:17.839 +I wish I could sort of spend + +00:17:17.840 --> 00:17:18.999 +an entire session + +00:17:19.000 --> 00:17:21.239 +just talking about this, but I can't. + +00:17:21.240 --> 00:17:22.919 +So I'm just going to make this short. + +00:17:22.920 --> 00:17:24.799 +When you load Emacs Reader, + +00:17:24.800 --> 00:17:26.319 +in the standard output, + +00:17:26.320 --> 00:17:27.439 +it's going to say this: + +00:17:27.440 --> 00:17:29.279 +that eight threads have been initialized. + +00:17:29.280 --> 00:17:32.679 +Now, what we did with Emacs here + +00:17:32.680 --> 00:17:33.799 +is that we enabled + +00:17:33.800 --> 00:17:35.039 +system-level multithreading. + +00:17:35.040 --> 00:17:36.639 +Now, Emacs is not multithreaded. + +00:17:36.640 --> 00:17:38.199 +We all know that notoriously. + +00:17:38.200 --> 00:17:39.519 +It is single-threaded. + +00:17:39.520 --> 00:17:41.479 +But we don't really + +00:17:41.480 --> 00:17:43.819 +need Emacs to be multithreaded, though. + +00:17:43.820 --> 00:17:45.759 +Emacs does not need to be multithreaded. + +00:17:45.760 --> 00:17:47.199 +What needs to be multithreaded + +00:17:47.200 --> 00:17:48.519 +is the rendering part + +00:17:48.520 --> 00:17:50.759 +because that's the most expensive part. + +00:17:50.760 --> 00:17:53.519 +In Emacs, we're only just displaying images. + +00:17:53.520 --> 00:17:56.479 +Emacs itself does not have a PDF engine + +00:17:56.480 --> 00:17:57.919 +that is rendering stuff. + +00:17:57.920 --> 00:18:00.559 +MuPDF is supposed to take care of that. + +00:18:00.560 --> 00:18:03.199 +So if I can do multithreading + +00:18:03.200 --> 00:18:05.079 +in the rendering pipeline, + +00:18:05.080 --> 00:18:07.119 +that is when I'm rendering pages + +00:18:07.120 --> 00:18:08.719 +instead of displaying them, + +00:18:08.720 --> 00:18:10.279 +that's fine for me because + +00:18:10.280 --> 00:18:11.679 +the rendering part most of the time, + +00:18:11.680 --> 00:18:12.959 +especially in scanned PDFs, + +00:18:12.960 --> 00:18:14.679 +is the most expensive part. + +00:18:14.680 --> 00:18:16.439 +So if you look at this graph, + +00:18:16.440 --> 00:18:17.959 +we have two parts here. + +00:18:17.960 --> 00:18:19.679 +We have the display pipeline + +00:18:19.680 --> 00:18:22.279 +and we have the rendering pipeline. + +00:18:22.280 --> 00:18:23.639 +In the display pipeline, + +00:18:23.640 --> 00:18:26.519 +we have just the Emacs session + +00:18:26.520 --> 00:18:29.359 +which has the reader loaded + +00:18:29.360 --> 00:18:31.579 +and that's the main thread. + +00:18:31.580 --> 00:18:33.319 +Then we have the rendering pipeline + +00:18:33.320 --> 00:18:35.559 +which has the MuPDF system package + +00:18:35.560 --> 00:18:38.459 +dynamically linked. + +00:18:38.460 --> 00:18:40.399 +So when you load Emacs Reader, + +00:18:40.400 --> 00:18:45.159 +we initialize a thread pool with eight threads. + +00:18:45.160 --> 00:18:48.759 +Now what you do is let's say we are at page 50. + +00:18:48.760 --> 00:18:51.759 +At page 50, the Emacs Reader + +00:18:51.760 --> 00:18:53.999 +maintains a cache. + +00:18:54.000 --> 00:18:56.519 +It's like a stack of pages + +00:18:56.520 --> 00:18:58.479 +that we keep in memory all the time. + +00:18:58.480 --> 00:19:02.519 +This cache is entirely outside of Emacs. + +00:19:02.520 --> 00:19:04.559 +It is not inside Emacs environment. + +00:19:04.560 --> 00:19:07.570 +It is in the C memory heap, + +00:19:07.571 --> 00:19:09.119 +in the MuPDF memory heap + +00:19:09.120 --> 00:19:11.119 +that is outside of Emacs environment. + +00:19:11.120 --> 00:19:13.839 +It does not make any calls to Emacs anything. + +00:19:13.840 --> 00:19:15.799 +It does not have a single Elisp line. + +00:19:15.800 --> 00:19:20.119 +So this cache is stored outside. + +00:19:20.120 --> 00:19:22.079 +Now when I want to retrieve + +00:19:22.080 --> 00:19:23.439 +anything from this cache, + +00:19:23.440 --> 00:19:26.199 +let's say, so I have cached + +00:19:26.200 --> 00:19:29.359 +up until 55, from 45 to 55. + +00:19:29.360 --> 00:19:31.079 +So what happens is that + +00:19:31.080 --> 00:19:32.759 +when you're at page 50, + +00:19:32.760 --> 00:19:34.359 +you always have a cache + +00:19:34.360 --> 00:19:36.719 +that's n + 5 and n - 5. + +00:19:36.720 --> 00:19:39.719 +So you have cache of 5 pages forward + +00:19:39.720 --> 00:19:41.959 +and 5 pages backward. + +00:19:41.960 --> 00:19:44.399 +But let's say I want to go to page 56. + +00:19:45.140 --> 00:19:50.079 +So I will ask an Emacs render page 56. + +00:19:50.080 --> 00:19:51.399 +And I'm not going to ask it + +00:19:51.400 --> 00:19:53.079 +to MuPDF directly. + +00:19:53.080 --> 00:19:54.399 +I'm going to ask it + +00:19:54.400 --> 00:19:56.719 +to the thread pool that do this job. + +00:19:56.720 --> 00:19:58.119 +And thread pool is going to + +00:19:58.120 --> 00:19:59.719 +assign one thread to it. + +00:19:59.720 --> 00:20:00.959 +Let's say the thread 1 + +00:20:00.960 --> 00:20:03.239 +which is going to render page 56. + +00:20:03.240 --> 00:20:06.559 +So this thread is going to make calls to MuPDF + +00:20:06.560 --> 00:20:08.919 +through our code dynamic module. + +00:20:08.920 --> 00:20:11.839 +And MuPDF after rendering it + +00:20:11.840 --> 00:20:13.439 +is going to store it in the cache. + +00:20:13.440 --> 00:20:18.059 +So we're going to add another 56 page to this. + +00:20:18.060 --> 00:20:21.759 +Now, while this is happening, + +00:20:21.760 --> 00:20:24.679 +Emacs Reader does not, like Emacs itself, + +00:20:24.680 --> 00:20:27.379 +the session is not going to be stuck + +00:20:27.380 --> 00:20:30.239 +because we just made a call to the thread. + +00:20:30.240 --> 00:20:32.279 +We just asked the thread. + +00:20:32.280 --> 00:20:35.359 +So like this, this call, like it's done. + +00:20:35.360 --> 00:20:38.159 +So you just assign something to a thread + +00:20:38.160 --> 00:20:40.959 +and then this is fine. + +00:20:40.960 --> 00:20:42.479 +Like, you're not waiting for the thread + +00:20:42.480 --> 00:20:43.719 +to complete or anything. + +00:20:43.720 --> 00:20:46.519 +Emacs is not waiting for the thread to complete. + +00:20:46.520 --> 00:20:48.519 +The dynamic module or the C side + +00:20:48.520 --> 00:20:49.479 +might wait to complete + +00:20:49.480 --> 00:20:51.279 +but that is entirely different from + +00:20:51.280 --> 00:20:52.159 +the Emacs session. + +00:20:52.160 --> 00:20:54.839 +So Emacs viewer can continue to + +00:20:54.840 --> 00:20:56.279 +display the page 50 + +00:20:56.280 --> 00:20:58.599 +while the rendering pipeline + +00:20:58.600 --> 00:21:01.979 +is still rendering the 56th page. + +00:21:01.980 --> 00:21:05.759 +And when Emacs asks to display page 56, + +00:21:05.760 --> 00:21:09.619 +it's going to ask it to a thread pool. + +00:21:09.620 --> 00:21:11.536 +Then thread pool is going to assign + +00:21:11.537 --> 00:21:13.319 +another thread, let's say this one, + +00:21:13.320 --> 00:21:16.999 +to retrieve page 56 from the memory cache. + +00:21:17.000 --> 00:21:20.039 +And then the 56 page is going to be sent + +00:21:20.040 --> 00:21:24.559 +to the Emacs to be displayed. + +00:21:24.560 --> 00:21:26.039 +Again, the retrieval part + +00:21:26.040 --> 00:21:28.519 +is entirely independent of Emacs. + +00:21:28.520 --> 00:21:30.159 +Emacs does not have to wait for it. + +00:21:30.160 --> 00:21:34.719 +Emacs only needs to wait to display it. + +00:21:34.720 --> 00:21:36.619 +So, the displaying part + +00:21:36.620 --> 00:21:37.919 +and the rendering pipeline + +00:21:37.920 --> 00:21:41.559 +are entirely asynchronous, so to speak. + +00:21:41.560 --> 00:21:43.639 +And in the diagram, if you see, + +00:21:43.640 --> 00:21:46.399 +all the arrows that are + +00:21:46.400 --> 00:21:48.839 +magenta in color, + +00:21:48.840 --> 00:21:51.639 +they are native to the Emacs runtime. + +00:21:51.640 --> 00:21:53.959 +That is, they are single-threaded. + +00:21:53.960 --> 00:21:55.679 +They are connected to Emacs. + +00:21:55.680 --> 00:21:58.759 +And all the arrows that are red in color, + +00:21:58.760 --> 00:22:01.859 +they are totally asynchronous. + +00:22:01.860 --> 00:22:03.519 +They can be multi-threaded if you want. + +00:22:03.520 --> 00:22:05.759 +They are multi-threaded by default + +00:22:05.760 --> 00:22:07.679 +because they interact + +00:22:07.680 --> 00:22:09.519 +only with the MuPDF shared library + +00:22:09.520 --> 00:22:11.399 +and the C heap. + +00:22:11.400 --> 00:22:12.719 +They do not touch anything + +00:22:12.720 --> 00:22:14.639 +in the Emacs runtime. + +00:22:14.640 --> 00:22:18.959 +This is how we're able to switch quickly + +00:22:18.960 --> 00:22:22.519 +between these huge scanned PDFs + +00:22:22.520 --> 00:22:23.959 +that have huge images + +00:22:23.960 --> 00:22:25.359 +in each of their pages + +00:22:25.360 --> 00:22:28.079 +because we don't really wait for + +00:22:28.080 --> 00:22:31.379 +each page to be rendered. + +00:22:31.380 --> 00:22:35.359 +And Emacs does not wait for that. + +00:22:35.360 --> 00:22:39.239 +So that's another architectural feature + +00:22:39.240 --> 00:22:40.319 +of Emacs Reader + +00:22:40.320 --> 00:22:43.199 +that we are system-level multithreaded. + +00:22:43.200 --> 00:22:47.399 +Now Emacs viewer also supports + +00:22:47.400 --> 00:22:49.319 +almost all document formats. + +00:22:49.320 --> 00:22:54.759 +It supports PDF, EPUB, MOBI, XPS, CPZ comics, + +00:22:54.760 --> 00:22:56.439 +and it even supports + +00:22:56.440 --> 00:22:59.970 +other non-ebook formats + +00:22:59.971 --> 00:23:00.839 +like document format, + +00:23:00.840 --> 00:23:01.839 +so you can open + +00:23:01.840 --> 00:23:04.799 +LibreOffice documents in it, + +00:23:04.800 --> 00:23:07.079 +and even stuff like PPT and Excel in it, + +00:23:07.080 --> 00:23:08.759 +even though they're not going to be + +00:23:08.760 --> 00:23:13.859 +supported in a as nice manner. + +00:23:13.860 --> 00:23:16.239 +And we can do that because MuPDF does this. + +00:23:16.240 --> 00:23:18.079 +MuPDF has support for all of this + +00:23:18.080 --> 00:23:22.679 +and it treats them just as it treats PDF. + +00:23:22.680 --> 00:23:24.539 +Nothing special. + +00:23:24.540 --> 00:23:26.519 +The only thing that we don't support right now + +00:23:26.520 --> 00:23:30.159 +is DejaVu, so that is not supported right now. + +00:23:30.160 --> 00:23:33.319 +I'm going to work on making it supported + +00:23:33.320 --> 00:23:35.079 +at the upstream MuPDF. + +00:23:36.020 --> 00:23:38.439 +That's going to take a long time, + +00:23:38.440 --> 00:23:44.239 +but it's in the plans. + +NOTE Native Emacs integrations + +00:23:44.240 --> 00:23:45.439 +Now with Emacs Reader, + +00:23:45.440 --> 00:23:46.679 +we also integrate + +00:23:46.680 --> 00:23:48.619 +with existing Emacs packages + +00:23:48.620 --> 00:23:50.039 +as much as possible. + +00:23:50.040 --> 00:23:52.999 +So bookmarks, C-x r b, + +00:23:53.000 --> 00:23:54.359 +you can do it natively. + +00:23:54.360 --> 00:23:57.559 +So you can save a page as a bookmark + +00:23:57.560 --> 00:23:59.639 +just as you save anything else in Emacs + +00:23:59.640 --> 00:24:00.519 +as a bookmark. + +00:24:00.520 --> 00:24:02.599 +There's also saveplace integration. + +00:24:02.600 --> 00:24:06.159 +So you can scroll a PDF, close it, + +00:24:06.160 --> 00:24:07.599 +and then come back to it + +00:24:07.600 --> 00:24:10.159 +at the same page that you saved it at. + +00:24:10.160 --> 00:24:12.879 +Sorry, that you closed it at. + +00:24:12.880 --> 00:24:14.919 +And it's going to work just out of the box + +00:24:14.920 --> 00:24:16.399 +because of the saveplace + +00:24:16.400 --> 00:24:18.999 +package in Emacs that is built in. + +00:24:19.000 --> 00:24:20.919 +We also have imenu integration + +00:24:20.920 --> 00:24:22.479 +for table of contents. + +00:24:22.480 --> 00:24:26.719 +So if you see this, this is imenu + +00:24:26.720 --> 00:24:28.679 +and you can scroll through the contents + +00:24:28.680 --> 00:24:30.559 +just like you scroll through any imenu. + +00:24:30.560 --> 00:24:39.499 +You can also do it in the menu bar by clicking. + +00:24:39.500 --> 00:24:40.679 +It works just as nice. + +00:24:40.680 --> 00:24:42.739 +We also have something like + +00:24:42.740 --> 00:24:44.799 +the outline mode that pdf-tools has. + +00:24:44.800 --> 00:24:48.039 +So if you press O in a document, + +00:24:48.040 --> 00:24:49.959 +it's going to give you this outline. + +00:24:49.960 --> 00:24:53.399 +And these are buttons that are clickable. + +00:24:53.400 --> 00:24:54.439 +You can click them. + +00:24:54.440 --> 00:24:56.519 +You can press Enter at them. + +00:24:56.520 --> 00:25:00.359 +And this is the menu bar item that I was looking at. + +00:25:00.360 --> 00:25:01.999 +If you click here, index, + +00:25:02.000 --> 00:25:03.279 +it's going to show you + +00:25:03.280 --> 00:25:05.339 +the exact same thing + +00:25:05.340 --> 00:25:10.339 +but in a different interface. + +NOTE (Naive) dark mode + +00:25:10.340 --> 00:25:15.259 +We also have a naive dark mode, + +00:25:15.260 --> 00:25:17.799 +which is not really as nice as + +00:25:17.800 --> 00:25:18.599 +we would like it to be, + +00:25:18.600 --> 00:25:20.799 +and dark mode fanatics + +00:25:20.800 --> 00:25:22.199 +I'm sure will have issues with it, + +00:25:22.200 --> 00:25:24.199 +but we're going to improve it in time. + +00:25:24.200 --> 00:25:27.379 +For now, this is what we have. + +00:25:27.380 --> 00:25:30.359 +And it can be enabled per document, + +00:25:30.360 --> 00:25:33.099 +so you can have one, like, + +00:25:33.100 --> 00:25:34.879 +one document that is in dark mode, + +00:25:34.880 --> 00:25:36.439 +but another one that is not. + +00:25:36.440 --> 00:25:39.279 +That is nice to have. + +00:25:39.280 --> 00:25:42.679 +Eventually we're going to work on more themes. + +00:25:42.680 --> 00:25:46.479 +You should be able to actually integrate it + +00:25:46.480 --> 00:25:49.439 +with Emacs themes as much as possible. + +00:25:49.440 --> 00:25:52.679 +You can make it default so that + +00:25:52.680 --> 00:25:54.839 +it inherits colors from the Emacs theme. + +00:25:54.840 --> 00:25:56.359 +That is one of the things + +00:25:56.360 --> 00:26:01.139 +that we also have planned. + +NOTE Challenges and further improvements + +00:26:01.140 --> 00:26:03.439 +We did face a bunch of challenges + +00:26:03.440 --> 00:26:05.519 +while trying to implement these features. + +00:26:05.520 --> 00:26:07.519 +One of the initial challenges was that + +00:26:07.520 --> 00:26:09.319 +SVGs were actually a bad idea. + +00:26:09.320 --> 00:26:12.159 +They're huge, especially in scanned PDFs, + +00:26:12.160 --> 00:26:14.679 +and they make things much slower. + +00:26:14.680 --> 00:26:18.119 +So we chose to actually have PPMs, + +00:26:18.120 --> 00:26:24.099 +which is the simplest image format ever possible. + +00:26:24.100 --> 00:26:26.439 +Now, it was also very difficult + +00:26:26.440 --> 00:26:29.559 +to make reader-mode be window-specific. + +00:26:29.560 --> 00:26:31.559 +So, you know, while you're scrolling + +00:26:31.560 --> 00:26:34.279 +the same document in one window, + +00:26:34.280 --> 00:26:36.199 +the other window with the same document + +00:26:36.200 --> 00:26:37.039 +should not change. + +00:26:37.040 --> 00:26:39.079 +We should be able to have multiple pages + +00:26:39.080 --> 00:26:42.319 +in different windows of the same document. + +00:26:42.320 --> 00:26:44.679 +That was very difficult + +00:26:44.680 --> 00:26:46.679 +because as I told you about the cache, + +00:26:46.680 --> 00:26:50.599 +the cache works in an idiosyncratic manner + +00:26:50.600 --> 00:26:54.079 +and we needed to make it so that each window + +00:26:54.080 --> 00:26:56.559 +will have its own cache + +00:26:56.560 --> 00:27:01.199 +instead of having a global cache for each file. + +00:27:01.200 --> 00:27:03.799 +That took some rewrite. + +00:27:03.800 --> 00:27:06.879 +And now, because we needed to do + +00:27:06.880 --> 00:27:07.799 +this sort of multithreading, + +00:27:07.800 --> 00:27:08.999 +system-level multithreading, + +00:27:09.000 --> 00:27:10.919 +we needed to use + +00:27:10.920 --> 00:27:13.039 +a specific package of MuPDF + +00:27:13.040 --> 00:27:16.439 +that had a bug for this which got fixed. + +00:27:16.440 --> 00:27:20.719 +And that's 1.26.0. + +00:27:20.720 --> 00:27:23.336 +Because we did that, + +00:27:23.337 --> 00:27:26.462 +a lot of the GNU/Linux distributions did not + +00:27:26.463 --> 00:27:28.871 +really have this latest package. + +00:27:28.872 --> 00:27:30.771 +So we had to actually + +00:27:30.772 --> 00:27:33.804 +package it in-tree. + +00:27:33.805 --> 00:27:36.971 +as a git sub-module. + +00:27:36.972 --> 00:27:40.737 +That was a horror! But eventually... now + +00:27:40.738 --> 00:27:43.604 +I think most GNU/Linux distributions + +00:27:43.605 --> 00:27:46.340 +already have this [version]. + +00:27:46.341 --> 00:27:48.639 +The upcoming features that we have planned + +00:27:48.640 --> 00:27:52.799 +are the first one is that we need to rewrite + +00:27:52.800 --> 00:27:55.359 +the display mechanism entirely from scratch + +00:27:55.360 --> 00:27:57.559 +to use a tiled rendering approach. + +00:27:57.560 --> 00:27:59.999 +So right now we just take an image + +00:28:00.000 --> 00:28:02.959 +and display it inside an Emacs buffer + +00:28:02.960 --> 00:28:03.959 +just like that. + +00:28:03.960 --> 00:28:08.759 +But it will be changed so that the image + +00:28:08.760 --> 00:28:10.759 +will be displayed in the tiled manner + +00:28:10.760 --> 00:28:12.479 +so there will be multiple tiles + +00:28:12.480 --> 00:28:14.719 +but it'll be pixel perfect + +00:28:14.720 --> 00:28:16.399 +so you won't really see a difference. + +00:28:16.400 --> 00:28:19.839 +The reason to do this is to implement features + +00:28:19.840 --> 00:28:20.999 +for text selection, actually. + +00:28:21.000 --> 00:28:24.239 +So we can't really do text selection + +00:28:24.240 --> 00:28:27.079 +without running into a bunch of memory + +00:28:27.080 --> 00:28:29.999 +and other issues latency issues + +00:28:30.000 --> 00:28:33.019 +if we don't do tiling. + +00:28:33.020 --> 00:28:35.679 +So we need to do those two things, + +00:28:35.680 --> 00:28:38.879 +they are at the highest priority right now. + +00:28:38.880 --> 00:28:40.279 +And then, once we're done with that, + +00:28:40.280 --> 00:28:42.279 +we're going to support annotations, + +00:28:42.280 --> 00:28:45.439 +highlighting, everything that you're used to + +00:28:45.440 --> 00:28:47.319 +in pdf-tools and org-noter. + +00:28:47.320 --> 00:28:50.119 +And once we're done with that, + +00:28:50.120 --> 00:28:55.019 +we're going to also integrate with AucTeX and SyncTeX. + +00:28:55.020 --> 00:28:58.519 +Because right now, when a PDF gets updated, + +00:28:58.520 --> 00:29:00.239 +especially a LaTeX PDF, + +00:29:00.240 --> 00:29:03.437 +since there is no SyncTeX integration, + +00:29:03.438 --> 00:29:05.771 +it can't really do it nicely + +00:29:05.772 --> 00:29:08.660 +and it sometimes even crashes Emacs. + +00:29:08.661 --> 00:29:11.537 +So that's something that + +00:29:11.538 --> 00:29:14.271 +we will be planning to implement. + +NOTE What Emacs can learn? + +00:29:14.272 --> 00:29:16.159 +Now, from this experiment, + +00:29:16.160 --> 00:29:17.919 +what exactly can Emacs, + +00:29:17.920 --> 00:29:20.519 +the Emacs core devs and others + +00:29:20.520 --> 00:29:22.399 +who are building packages can learn? + +00:29:22.400 --> 00:29:24.919 +Well, the first thing is that all of this + +00:29:24.920 --> 00:29:27.159 +should not be really this difficult + +00:29:27.160 --> 00:29:30.359 +because all we're asking from Emacs + +00:29:30.360 --> 00:29:32.439 +is to display images in real-time + +00:29:32.440 --> 00:29:36.279 +and update them in real-time. + +00:29:36.280 --> 00:29:37.759 +That should not be that difficult + +00:29:37.760 --> 00:29:40.279 +of a thing to do, but apparently it is. + +00:29:40.280 --> 00:29:43.279 +And that's why Emacs's graphical interface + +00:29:43.280 --> 00:29:47.959 +needs to be more modular, more composable, + +00:29:47.960 --> 00:29:50.999 +and flexible for real-time graphics. + +00:29:51.000 --> 00:29:54.219 +If it is supposed to have things like, + +00:29:54.220 --> 00:29:56.179 +again, a document reader, + +00:29:56.180 --> 00:29:57.279 +something like a video editor, + +00:29:57.280 --> 00:29:58.239 +and something like that, + +00:29:58.980 --> 00:30:00.479 +Emacs's graphical interface + +00:30:00.480 --> 00:30:05.239 +needs to grow and be more mature. + +00:30:05.240 --> 00:30:06.239 +One of the things + +00:30:06.240 --> 00:30:08.079 +that's stopping it from doing that + +00:30:08.080 --> 00:30:10.319 +is actually Emacs's overlay functionality. + +00:30:10.320 --> 00:30:13.939 +So right now, the way we display + +00:30:13.940 --> 00:30:16.519 +an image in a buffer + +00:30:16.520 --> 00:30:18.900 +is using an overlay, + +00:30:18.901 --> 00:30:22.019 +actually multiple overlays. + +00:30:22.020 --> 00:30:25.839 +Overlays are static in the sense that + +00:30:25.840 --> 00:30:29.739 +if I attach to one image to one overlay, + +00:30:29.740 --> 00:30:34.039 +I need to have an entirely different image + +00:30:34.040 --> 00:30:37.199 +updated for that overlay. + +00:30:37.200 --> 00:30:39.639 +So I need to create another different image, + +00:30:39.640 --> 00:30:41.179 +change it in the memory, + +00:30:41.180 --> 00:30:43.639 +and then display it to update it. + +00:30:43.640 --> 00:30:46.639 +I can't change the image data + +00:30:46.640 --> 00:30:49.239 +in real time of the overlay. + +00:30:49.240 --> 00:30:53.999 +And that is a big issue. + +00:30:54.000 --> 00:30:56.259 +I've actually made an emacs-devel + +00:30:56.260 --> 00:30:58.279 +mailing list thread about it. + +00:30:58.280 --> 00:31:01.119 +I talked to Eli about it as well. + +00:31:01.120 --> 00:31:04.639 +And he said there's a possibility + +00:31:04.640 --> 00:31:05.359 +that this can be changed, + +00:31:05.360 --> 00:31:06.959 +but it's going to take + +00:31:06.960 --> 00:31:09.919 +a certain amount of rewrite. + +00:31:09.920 --> 00:31:12.319 +There's also issues with Emacs GC. + +00:31:12.320 --> 00:31:14.639 +Emacs GC sometimes leaks memory + +00:31:14.640 --> 00:31:16.439 +when you update images too quickly. + +00:31:16.440 --> 00:31:18.599 +That is, when you have a bunch of images + +00:31:18.600 --> 00:31:21.359 +that are getting churned out too quickly, + +00:31:21.360 --> 00:31:23.039 +Emacs GC starts leaking + +00:31:23.040 --> 00:31:25.159 +and it just goes up to + +00:31:25.160 --> 00:31:29.679 +a huge number of gigabytes in RAM. + +00:31:29.680 --> 00:31:32.399 +That's also a huge problem. + +00:31:32.400 --> 00:31:33.759 +The dynamic module API, + +00:31:33.760 --> 00:31:37.139 +the emacs-module.h header, + +00:31:37.140 --> 00:31:38.799 +needs to have more helpers. + +00:31:38.800 --> 00:31:41.719 +It's really bare bones, + +00:31:41.720 --> 00:31:43.439 +and I like that it is bare bones + +00:31:43.440 --> 00:31:44.999 +so that other languages can use it, + +00:31:45.000 --> 00:31:46.959 +but at the same time, I think + +00:31:46.960 --> 00:31:47.879 +it'll be really good + +00:31:47.880 --> 00:31:49.839 +if we can have some helpers + +00:31:49.840 --> 00:31:53.879 +that can do better memory interaction, + +00:31:53.880 --> 00:31:57.259 +like strings and so on, + +00:31:57.260 --> 00:32:00.379 +which we also faced some issues with. + +00:32:00.380 --> 00:32:02.319 +Emacs's fractional scaling system + +00:32:02.320 --> 00:32:05.359 +seems to be broken across different toolkits. + +00:32:05.360 --> 00:32:10.999 +We have bug reports that say in pgtk in Wayland, + +00:32:11.000 --> 00:32:13.559 +something seems to render differently + +00:32:13.560 --> 00:32:17.259 +because they have fractional scaling enabled. + +00:32:17.260 --> 00:32:18.439 +So that's something + +00:32:18.440 --> 00:32:21.239 +that I think Emacs, overall, + +00:32:21.240 --> 00:32:24.359 +I think Emacs needs to focus on improving + +00:32:24.360 --> 00:32:28.239 +the graphical interface pipeline + +00:32:28.240 --> 00:32:32.299 +to be a much more mature one. + +NOTE Contributing to the development + +00:32:32.300 --> 00:32:34.239 +And finally, how can you contribute + +00:32:34.240 --> 00:32:35.799 +to the development of Emacs Reader? + +00:32:35.800 --> 00:32:37.359 +Well, we are on Codeberg. + +00:32:37.360 --> 00:32:40.279 +We are not on GitHub, sorry. + +00:32:40.280 --> 00:32:41.639 +You can go there, + +00:32:41.640 --> 00:32:43.079 +you can look through the issues + +00:32:43.080 --> 00:32:45.279 +and send us a PR if you're interested. + +00:32:45.280 --> 00:32:46.879 +The next major release + +00:32:46.880 --> 00:32:49.839 +is going to go to GNU ELPA. + +00:32:49.840 --> 00:32:52.259 +Finally, we are not yet at GNU ELPA, + +00:32:52.260 --> 00:32:54.439 +so you can't really do M-x package-install + +00:32:54.440 --> 00:32:56.119 +and install our package. + +00:32:56.120 --> 00:32:58.199 +you would need to install it + +00:32:58.200 --> 00:33:04.939 +through use-package :vc. + +00:33:04.940 --> 00:33:07.499 +And since we're going to go to GNU ELPA, + +00:33:07.500 --> 00:33:09.119 +we request you to assign + +00:33:09.120 --> 00:33:10.519 +your copyright to Emacs + +00:33:10.520 --> 00:33:13.959 +because GNU ELPA is essentially part of GNU Emacs. + +00:33:13.960 --> 00:33:16.719 +So you would need to do copyright assignment + +00:33:16.720 --> 00:33:20.579 +if you make non-trivial contribution. + +00:33:20.580 --> 00:33:22.479 +You can join us at IRC + +00:33:22.480 --> 00:33:24.359 +at #phi-mu-lambda. + +00:33:24.360 --> 00:33:27.199 +And I also stream the development + +00:33:27.200 --> 00:33:28.039 +of this package + +00:33:28.040 --> 00:33:29.839 +bi-weekly on Sundays + +00:33:29.840 --> 00:33:31.639 +at PeerTube at the following channel. + +00:33:31.640 --> 00:33:35.519 +Feel free to join us. + +NOTE Acknowledgements + +00:33:35.520 --> 00:33:38.499 +Finally, I want to thank Tushar, + +00:33:38.500 --> 00:33:40.639 +who has been persistently contributing + +00:33:40.640 --> 00:33:42.839 +to the project since 0.1.0, + +00:33:42.840 --> 00:33:46.519 +and I'm very, very thankful for him, + +00:33:46.520 --> 00:33:47.759 +for his suggestions, + +00:33:47.760 --> 00:33:50.879 +and for his code contributions as well. + +00:33:50.880 --> 00:33:53.319 +I would also like to thank Prom, + +00:33:53.320 --> 00:33:55.799 +who fixed a major bug + +00:33:55.800 --> 00:33:56.859 +in the Windows build, + +00:33:56.860 --> 00:33:58.839 +since I don't really use Windows anymore, + +00:33:58.840 --> 00:33:59.919 +so that was really nice, + +00:33:59.920 --> 00:34:05.459 +and for Teeoius, for fixing a pthread bug. + +00:34:05.460 --> 00:34:06.919 +I would also like to thank others + +00:34:06.920 --> 00:34:09.559 +who helped fix little things, + +00:34:09.560 --> 00:34:13.179 +who come to the stream to chat, + +00:34:13.180 --> 00:34:16.599 +who sort of see me bang my head + +00:34:16.600 --> 00:34:19.239 +across these C memory bugs. + +00:34:19.240 --> 00:34:21.599 +So thank you to all of those. + +00:34:21.600 --> 00:34:24.399 +And thank you finally to the viewers + +00:34:24.400 --> 00:34:28.079 +and to EmacsConf organizers as well. + +00:34:28.080 --> 00:34:31.939 +This is a splendid opportunity. + +00:34:31.940 --> 00:34:37.280 +Thank you. diff --git a/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--answers.vtt b/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--answers.vtt new file mode 100644 index 00000000..c41a24db --- /dev/null +++ b/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--answers.vtt @@ -0,0 +1,1015 @@ +WEBVTT + +00:00:00.000 --> 00:00:01.381 +So the first question, + +00:00:01.382 --> 00:00:05.461 +have you tried ivy-bibtex or bibtex-completion earlier + +00:00:05.462 --> 00:00:06.524 +and how it compares to eBib? + +00:00:06.525 --> 00:00:09.941 +Well, I would say that I use both. + +00:00:09.942 --> 00:00:14.901 +I don't think there is very much a comparison + +00:00:14.902 --> 00:00:18.661 +because for me, they're achieving different goals. + +00:00:18.662 --> 00:00:24.501 +When I want to just very quickly find the paper + +00:00:24.502 --> 00:00:28.621 +in the entirety of the literature, + +00:00:28.622 --> 00:00:34.701 +I can just go here and open ivy-bibtex and see it. + +00:00:34.702 --> 00:00:36.661 +Bibtex now needs to parse my bib files, + +00:00:36.662 --> 00:00:38.781 +so it may take a second. + +00:00:38.782 --> 00:00:41.581 +Yeah, so if I want to just search, I'll do this. + +00:00:41.582 --> 00:00:46.461 +If I want a bigger view, then I can open eBib, + +00:00:46.462 --> 00:00:49.661 +but I don't use eBib so much as a tool + +00:00:49.662 --> 00:00:54.381 +to find just one literature. I use it for other purposes. + +00:00:54.382 --> 00:00:58.501 +So I think they're not really mutually exclusive, + +00:00:58.502 --> 00:01:00.941 +like you can use both. + +00:01:00.942 --> 00:01:04.641 +And they don't think that the features that one provides + +00:01:04.642 --> 00:01:08.821 +are something that the other also provides. + +00:01:08.822 --> 00:01:13.381 +They're different kind of goals for me. + +00:01:13.382 --> 00:01:15.341 +Also, for the answers, is it OK + +00:01:15.342 --> 00:01:20.741 +if I don't write anything down and I can just write them + +00:01:20.742 --> 00:01:23.741 +After, when I have time, and I'll just talk. + +00:01:23.742 --> 00:01:27.861 +Yeah, that's OK. We'll transcribe all the answers later. + +00:01:27.862 --> 00:01:32.541 +So you can just go ahead and talk. + +00:01:32.542 --> 00:01:34.301 +And do you find showing abstract + +00:01:34.302 --> 00:01:36.661 +on your navigation panel helpful? + +00:01:36.662 --> 00:01:38.461 +I always delete the abstract info, + +00:01:38.462 --> 00:01:40.421 +and my bib files make things more concise. + +00:01:40.422 --> 00:01:44.981 +So for me, I think it is helpful to see the abstract. + +00:01:44.982 --> 00:01:50.861 +I think that if you're in a regular screen, + +00:01:50.862 --> 00:01:52.941 +you have the space to have that. + +00:01:52.942 --> 00:01:57.421 +And yeah, for example, if I go again here, + +00:01:57.422 --> 00:02:00.021 +it's kind of indeed a bit more, + +00:02:00.022 --> 00:02:01.741 +a bit longer than it can be. + +00:02:01.742 --> 00:02:09.341 +And also you find a bigger abstract somewhere. + +00:02:09.342 --> 00:02:10.421 +It may be more space, + +00:02:10.422 --> 00:02:16.381 +but like, for example, this, yeah, this is a big abstract. + +00:02:16.382 --> 00:02:19.181 +And for example, yeah, this takes a bit more space, + +00:02:19.182 --> 00:02:23.021 +but I find it easy because the only case + +00:02:23.022 --> 00:02:25.901 +where I'm actually looking at this panel + +00:02:25.902 --> 00:02:30.581 +and trying to see things is when I'm going to be either, + +00:02:30.582 --> 00:02:33.861 +is when I'm going to be trying to find something + +00:02:33.862 --> 00:02:37.141 +that I don't remember the title to search immediately. + +00:02:37.142 --> 00:02:38.581 +And if you don't remember the title + +00:02:38.582 --> 00:02:39.781 +and you're trying to search, + +00:02:39.782 --> 00:02:43.261 +the abstract will be a way + +00:02:43.262 --> 00:02:49.221 +that helps you search better maybe. + +00:02:49.222 --> 00:02:51.701 +and also the other thing they use + +00:02:51.702 --> 00:02:54.981 +is also the small little descriptions + +00:02:54.982 --> 00:02:59.261 +I add in the note entries to help me + +00:02:59.262 --> 00:03:03.381 +but I think that the abstract is nice to be there + +00:03:03.382 --> 00:03:05.141 +in case you don't remember + +00:03:05.142 --> 00:03:07.541 +to find something from the title + +00:03:07.542 --> 00:03:08.581 +or from your notes + +00:03:08.582 --> 00:03:10.581 +and just need something more general. + +00:03:10.582 --> 00:03:16.621 +So yes it can be large and not always convenient, + +00:03:16.622 --> 00:03:20.181 +but I generally like it being there + +00:03:20.182 --> 00:03:29.421 +in case I need it for anything. Then the next question. + +00:03:29.422 --> 00:03:34.381 +Also, if any question is not fully answered by what I'm saying, + +00:03:34.382 --> 00:03:36.941 +feel free to add more to your question + +00:03:36.942 --> 00:03:39.501 +and we can discuss more. I don't have a problem. + +00:03:39.502 --> 00:03:45.621 +So for the next one, yeah, I copied this from IRC + +00:03:45.622 --> 00:03:49.141 +because I prefer to answer it orally + +00:03:49.142 --> 00:03:53.261 +because it's a bit longer than the others answering in IRC. + +00:03:53.262 --> 00:03:55.261 +So it seems that there's a meta problem here. + +00:03:55.262 --> 00:03:57.621 +There's too much information. + +00:03:57.622 --> 00:04:02.221 +And does this tool reduce the cognitive load? + +00:04:02.222 --> 00:04:09.061 +Well, for me, it does reduce the cognitive load because + +00:04:09.062 --> 00:04:11.261 +Indeed, there's a lot of information, + +00:04:11.262 --> 00:04:18.661 +but that's how managing literature works, essentially. + +00:04:18.662 --> 00:04:21.061 +It necessarily has to have a lot of cognitive load, + +00:04:21.062 --> 00:04:22.981 +because you are trying to + +00:04:22.982 --> 00:04:25.021 +process more information + +00:04:25.022 --> 00:04:28.221 +than your brain can process to begin with. + +00:04:28.222 --> 00:04:31.301 +So you really need a tool + +00:04:31.302 --> 00:04:36.581 +to help you not keep everything in your mind, + +00:04:36.582 --> 00:04:40.461 +process the information externally. + +00:04:40.462 --> 00:04:44.181 +They do think that the way I do this, for me at least, + +00:04:44.182 --> 00:04:49.661 +it does help with reducing cognitive load. + +00:04:49.662 --> 00:04:51.061 +Because I'm here, for example, + +00:04:51.062 --> 00:04:55.221 +if I'm looking for something, I do not remember, + +00:04:55.222 --> 00:05:01.501 +I've read most of these papers not too many months ago, + +00:05:01.502 --> 00:05:02.701 +so a lot of them are recent. + +00:05:02.702 --> 00:05:06.181 +If I don't look at what I have written for it, + +00:05:06.182 --> 00:05:08.821 +I do not remember anything. + +00:05:08.822 --> 00:05:11.941 +So indeed, you have this kind of cognitive load + +00:05:11.942 --> 00:05:17.341 +that I cannot remember everything. + +00:05:17.342 --> 00:05:23.101 +But on the other hand, I think the tool helps + +00:05:23.102 --> 00:05:26.861 +because my notes are what keeps, what I want to remember. + +00:05:26.862 --> 00:05:30.981 +So it doesn't stay in my mind, it stays in the text. + +00:05:30.982 --> 00:05:35.221 +And regarding things like the reading list, + +00:05:35.222 --> 00:05:39.021 +I think also for me reduces the cognitive load + +00:05:39.022 --> 00:05:42.821 +because I will mostly remember + +00:05:42.822 --> 00:05:46.341 +what the papers I have in that list are, + +00:05:46.342 --> 00:05:50.901 +but just sorting them by priority helps me + +00:05:50.902 --> 00:05:54.621 +Okay, this was the thing I wanted to do next. + +00:05:54.622 --> 00:06:00.301 +Oh, sorry. This is the thing I wanted to do next. + +00:06:00.302 --> 00:06:02.501 +And I didn't have to remember + +00:06:02.502 --> 00:06:03.901 +that this is what I want to do next. + +00:06:03.902 --> 00:06:06.821 +I just had it, I saw it there. + +00:06:06.822 --> 00:06:11.261 +So for me, it reduces cognitive load, + +00:06:11.262 --> 00:06:16.981 +but the problem of too much information is 100% there + +00:06:16.982 --> 00:06:19.541 +because there's objectively + +00:06:19.542 --> 00:06:21.021 +too much information + +00:06:21.022 --> 00:06:23.181 +when you're working with literature + +00:06:23.182 --> 00:06:35.221 +that's by nature and yeah essentially that + +00:06:35.222 --> 00:06:36.381 +that's for me the thing + +00:06:36.382 --> 00:06:41.141 +that i'm i'm just putting this information elsewhere + +00:06:41.142 --> 00:06:44.941 +so i don't have to keep it in my mind + +00:06:44.942 --> 00:06:52.421 +Okay, so when you download a new article, + +00:06:52.422 --> 00:06:54.941 +how do you integrate the file to the database? + +00:06:54.942 --> 00:06:58.261 +So, for example, do you remove + +00:06:58.262 --> 00:06:59.741 +and rename the file manually? + +00:06:59.742 --> 00:07:11.781 +So, for me, I also briefly showed that in the talk, + +00:07:11.782 --> 00:07:13.781 +but I did that very quickly, + +00:07:13.782 --> 00:07:16.581 +so it's understandable that it wasn't there. + +00:07:16.582 --> 00:07:21.501 +Essentially, And when I download the article, + +00:07:21.502 --> 00:07:27.421 +then I will open Ivy Bib Tech and find the article. + +00:07:27.422 --> 00:07:31.581 +For example, this one is the first. + +00:07:31.582 --> 00:07:34.941 +You can open the menu in Ivy Bib Tech. + +00:07:34.942 --> 00:07:40.061 +It's with an alt O, and then it will give you this menu. + +00:07:40.062 --> 00:07:44.261 +And from here, it will say, add PDF to library. + +00:07:44.262 --> 00:07:47.261 +And then it will ask from where do you want to add it? + +00:07:47.262 --> 00:07:49.941 +I don't recommend the URL + +00:07:49.942 --> 00:07:53.701 +because it doesn't download it properly sometimes. + +00:07:53.702 --> 00:07:56.981 +As I also mentioned that with Zotra, + +00:07:56.982 --> 00:08:00.301 +the URLs downloading things, + +00:08:00.302 --> 00:08:02.141 +especially with academic papers + +00:08:02.142 --> 00:08:05.341 +that are sometimes paywalled, it doesn't want to work well. + +00:08:05.342 --> 00:08:07.781 +So I will download the paper + +00:08:07.782 --> 00:08:10.981 +and then you can just press the F here for file. + +00:08:10.982 --> 00:08:13.421 +And then you find the file. + +00:08:13.422 --> 00:08:20.861 +and for example for me all my PDFs are in this folder + +00:08:20.862 --> 00:08:23.181 +it's still named Zotero PDFs + +00:08:23.182 --> 00:08:25.621 +from when it was Zotero saving them now + +00:08:25.622 --> 00:08:28.341 +Zotero no longer saves them + +00:08:28.342 --> 00:08:30.381 +but I'm too bored to change the name + +00:08:30.382 --> 00:08:33.501 +and then you just find the paper you want + +00:08:33.502 --> 00:08:37.261 +so you can see there is an endless list of papers here + +00:08:37.262 --> 00:08:42.821 +and it then will automatically rename it + +00:08:42.822 --> 00:08:56.781 +to have the title of the author, a small title and a date. + +00:08:56.782 --> 00:09:01.821 +I believe the naming is also configurable, + +00:09:01.822 --> 00:09:08.941 +but I have this notation in my config for many years now + +00:09:08.942 --> 00:09:11.181 +because that's how everything + +00:09:11.182 --> 00:09:17.981 +expects to find it, essentially. I do not then move it. + +00:09:17.982 --> 00:09:19.341 +It's stored in that folder. + +00:09:19.342 --> 00:09:22.501 +I store all my PDFs in that specific folder. + +00:09:22.502 --> 00:09:27.541 +And then Emacs knows that all PDFs + +00:09:27.542 --> 00:09:29.021 +should be found in that folder. + +00:09:29.022 --> 00:09:32.581 +And it then just looks for the name + +00:09:32.582 --> 00:09:33.981 +that it expects to find. + +00:09:33.982 --> 00:09:38.221 +And ivy-bibtex has renamed it automatically to that. + +00:09:38.222 --> 00:09:54.381 +Okay, I'll wait a bit to continue with that + +00:09:54.382 --> 00:09:59.801 +for moving to the next question. + +00:09:59.802 --> 00:10:02.301 +Yeah, ivy-bibtex has that functionality. + +00:10:02.302 --> 00:10:08.061 +And then annotations with e-readers. + +00:10:08.062 --> 00:10:12.781 +Viewing and taking an Emacs or Reader touchscreen, + +00:10:12.782 --> 00:10:16.501 +highlighting notes, noter, think would be an alternative, + +00:10:16.502 --> 00:10:18.301 +e-book annotation alternative. + +00:10:18.302 --> 00:10:25.981 +So, I do not use an e-reader, personally. + +00:10:25.982 --> 00:10:29.781 +The only thing that I have is my tablet, + +00:10:29.782 --> 00:10:34.981 +I can actually show you. It's this little thing here. + +00:10:34.982 --> 00:10:39.661 +It's a Chromebook. + +00:10:39.662 --> 00:10:42.381 +And the reason it's a Chromebook is that + +00:10:42.382 --> 00:10:44.621 +when I bought it a few years ago, + +00:10:44.622 --> 00:10:48.541 +it was the most viable alternative I could find + +00:10:48.542 --> 00:10:52.301 +that can run Linux as a tablet with good touchscreen. + +00:10:52.302 --> 00:10:55.021 +That was also a bit budget + +00:10:55.022 --> 00:10:57.821 +because there are some Linux tablets, + +00:10:57.822 --> 00:11:00.301 +but they were a bit too high cost + +00:11:00.302 --> 00:11:02.181 +for what I was looking back then. + +00:11:02.182 --> 00:11:07.501 +And this thing runs Linux essentially + +00:11:07.502 --> 00:11:10.421 +natively from the Chromebook. + +00:11:10.422 --> 00:11:14.581 +And I've installed Emacs there. It has all my config. + +00:11:14.582 --> 00:11:21.741 +And so if I want to take touchscreen notes, I do it there. + +00:11:21.742 --> 00:11:27.181 +But again, that is in Emacs. And it's mostly with PDFs. + +00:11:27.182 --> 00:11:31.181 +I'm not sure if it answers exactly the question. + +00:11:31.182 --> 00:11:35.221 +So if it's an e-reader, if it's, for example, a book, + +00:11:35.222 --> 00:11:39.661 +I know that if you have an EPUB, + +00:11:39.662 --> 00:11:42.221 +I think it's called the format for books, + +00:11:42.222 --> 00:11:44.701 +and Org-noter can also read that. + +00:11:44.702 --> 00:11:49.741 +So you could also open that file inside Emacs + +00:11:49.742 --> 00:11:51.541 +using Org-noter and take notes. + +00:11:51.542 --> 00:12:02.941 +But otherwise, If you're not + +00:12:02.942 --> 00:12:06.901 +reading everything in Emacs, + +00:12:06.902 --> 00:12:09.021 +then it's hard to pass annotations + +00:12:09.022 --> 00:12:11.581 +from outside Emacs to inside it, + +00:12:11.582 --> 00:12:15.461 +because of course you have less interoperability in that case. + +00:12:15.462 --> 00:12:22.621 +but I think Emacs is featureful enough + +00:12:22.622 --> 00:12:25.621 +to where you can do all your reading inside it. + +00:12:25.622 --> 00:12:30.141 +And Org-noter has a surprising amount of different formats + +00:12:30.142 --> 00:12:31.621 +where you can read things actually. + +00:12:31.622 --> 00:12:40.141 +I hope it was clear if you want more on that + +00:12:40.142 --> 00:12:45.901 +because I know it's a bit more a complex question, I guess, + +00:12:45.902 --> 00:12:47.701 +also with e-readers. + +00:12:47.702 --> 00:12:52.061 +And if it is in Emacs or not, feel free to add more. + +00:12:52.062 --> 00:12:56.901 +And how old do you feel + +00:12:56.902 --> 00:13:00.461 +about making notes on websites, PDF, videos? + +00:13:00.462 --> 00:13:05.741 +So I will agree with the other question + +00:13:05.742 --> 00:13:07.621 +that I answered here. + +00:13:07.622 --> 00:13:11.301 +If you can convert something to PDF, + +00:13:11.302 --> 00:13:13.621 +I prefer it because then + +00:13:13.622 --> 00:13:16.741 +you need to only worry about PDFs + +00:13:16.742 --> 00:13:19.941 +and it works better that way + +00:13:19.942 --> 00:13:21.981 +than having to annotate websites. + +00:13:21.982 --> 00:13:26.181 +There is, I believe, I should have it + +00:13:26.182 --> 00:13:27.661 +in my bookmarks somewhere. + +00:13:27.662 --> 00:13:32.381 +There is a, the org-roam protocol + +00:13:32.382 --> 00:13:36.621 +that allows you to take notes directly out of a website + +00:13:36.622 --> 00:13:39.421 +and it saves all the metadata of the website. + +00:13:39.422 --> 00:13:42.941 +I did look at it at some point, + +00:13:42.942 --> 00:13:47.781 +but I haven't really continued using it too much + +00:13:47.782 --> 00:13:53.541 +because I find that I don't often take notes + +00:13:53.542 --> 00:14:00.221 +from a website where I want the and more information + +00:14:00.222 --> 00:14:02.421 +than just either the link of the website + +00:14:02.422 --> 00:14:05.741 +or if I want the full text converting into a PDF. + +00:14:05.742 --> 00:14:07.261 +So I haven't really found + +00:14:07.262 --> 00:14:08.541 +a very big use case for it, + +00:14:08.542 --> 00:14:11.301 +but I know that Org-Roam protocol is a thing. + +00:14:11.302 --> 00:14:16.701 +And then for videos is a bit of a longer story + +00:14:16.702 --> 00:14:19.901 +because if you want to take notes on videos, + +00:14:19.902 --> 00:14:21.541 +that's a bit more complex. + +00:14:21.542 --> 00:14:28.181 +And I don't know of a way to do it in Emacs, + +00:14:28.182 --> 00:14:30.941 +but I also don't know of an effective way + +00:14:30.942 --> 00:14:34.421 +to take notes on videos using other tools. + +00:14:34.422 --> 00:14:39.901 +What I typically do if I'm following the video or something + +00:14:39.902 --> 00:14:44.461 +is that I will take notes of the more important things. + +00:14:44.462 --> 00:14:50.581 +I'll take notes of the more important things + +00:14:50.582 --> 00:14:52.381 +that I was listening in the video. + +00:14:52.382 --> 00:14:55.101 +And while I'm listening, I will take + +00:14:55.102 --> 00:14:57.581 +some ideal crude notes, + +00:14:57.582 --> 00:15:00.901 +not because I don't want to lose + +00:15:00.902 --> 00:15:03.981 +a lot of my attention during the, + +00:15:03.982 --> 00:15:09.781 +what I'm trying to learn by taking very good notes. + +00:15:09.782 --> 00:15:11.141 +So most of the time, + +00:15:11.142 --> 00:15:13.741 +those kinds of notes will be in paper, + +00:15:13.742 --> 00:15:16.181 +even just very simple, crude notes. + +00:15:16.182 --> 00:15:20.381 +And then without any timestamps or anything, + +00:15:20.382 --> 00:15:23.941 +because that's too complex for what I've done. + +00:15:23.942 --> 00:15:28.501 +And after watching, I will try to + +00:15:28.502 --> 00:15:31.421 +consolidate all my thoughts that I wrote down + +00:15:31.422 --> 00:15:36.061 +into some more permanent notes using Org Roam. + +00:15:36.062 --> 00:15:46.181 +And then like move on with that also look online + +00:15:46.182 --> 00:15:50.421 +if I noted that I want to look more on on this subject + +00:15:50.422 --> 00:15:52.821 +that was mentioned the video + +00:15:52.822 --> 00:15:53.821 +and I didn't fully understand it + +00:15:53.822 --> 00:15:57.381 +then I will try and look more and things like that + +00:15:57.382 --> 00:16:02.981 +so for me that's how I do it because I think that + +00:16:02.982 --> 00:16:05.661 +Annotating a video directly with timestamps + +00:16:05.662 --> 00:16:07.821 +and everything is a bit too complex. + +00:16:07.822 --> 00:16:09.501 +I don't know if you have + +00:16:09.502 --> 00:16:12.061 +any suggestions for working with that, + +00:16:12.062 --> 00:16:19.381 +but for me, it has been very troublesome. + +00:16:19.382 --> 00:16:22.341 +And then how do you add a new article from scratch, + +00:16:22.342 --> 00:16:25.301 +a PDF that you did not have in your bib file? + +00:16:25.302 --> 00:16:29.661 +How do you generate the bib entry metadata and abstract? + +00:16:29.662 --> 00:16:36.941 +So yeah, the package is called Zotra. + +00:16:36.942 --> 00:16:44.061 +I can also show it again. Let's find something. + +00:16:44.062 --> 00:16:49.861 +and can open up. Let's not do that. + +00:16:49.862 --> 00:16:53.981 +If I open it, I need to access it through my institution. + +00:16:53.982 --> 00:16:57.621 +So I will not open the link, but I can show you essentially + +00:16:57.622 --> 00:17:02.101 +you run Zotra add entry, this function, + +00:17:02.102 --> 00:17:10.421 +and it copies what you have currently in your, in your, + +00:17:10.422 --> 00:17:12.461 +what you have already copied right now + +00:17:12.462 --> 00:17:15.861 +it's the message I copied before for the Q&A + +00:17:15.862 --> 00:17:21.861 +but if you open a paper and have the URL copied + +00:17:21.862 --> 00:17:26.341 +it will immediately come here and will save everything + +00:17:26.342 --> 00:17:28.621 +and also as I mentioned there's the + +00:17:28.622 --> 00:17:31.301 +you can also download the patches from there + +00:17:31.302 --> 00:17:34.381 +but with paywalled articles doesn't always work well + +00:17:34.382 --> 00:17:40.261 +so I just do it manually + +00:17:40.262 --> 00:17:45.821 +Oh, system is running low on power. Give me just a second. + +00:17:45.822 --> 00:17:59.021 +So the computer doesn't turn off as we're speaking. Yes. + +00:17:59.022 --> 00:18:03.541 +So yeah, the, everything is added from scratch. + +00:18:03.542 --> 00:18:14.541 +Essentially you copy the URL and give it to Soletrend. + +00:18:14.542 --> 00:18:17.381 +It does everything. uh when you fact check every details + +00:18:17.382 --> 00:18:26.261 +for a bib entry your open names published journal + +00:18:26.262 --> 00:18:29.461 +doi stuff uh so i i generally don't do that + +00:18:29.462 --> 00:18:30.861 +oh yeah thanks for the person + +00:18:30.862 --> 00:18:35.101 +that added the link to the zocha + +00:18:35.102 --> 00:18:38.381 +i i wouldn't say that i fact check the details + +00:18:38.382 --> 00:18:40.901 +i assume that When they're added, + +00:18:40.902 --> 00:18:44.541 +they're actually correct. + +00:18:44.542 --> 00:18:49.741 +Have you actually had trouble with a tool + +00:18:49.742 --> 00:18:52.021 +that automatically adds them to add them wrong? + +00:18:52.022 --> 00:18:54.861 +I'm curious. I haven't really heard + +00:18:54.862 --> 00:18:59.421 +that happening too much. + +00:18:59.422 --> 00:19:01.861 +I've always thought that, yeah, if you do it manually, + +00:19:01.862 --> 00:19:04.621 +you need to fact check that you did it correctly. + +00:19:04.622 --> 00:19:06.461 +But I always assume that if you do it + +00:19:06.462 --> 00:19:09.301 +automatically through a tool, + +00:19:09.302 --> 00:19:11.661 +It should already be correct. + +00:19:11.662 --> 00:19:15.101 +And I don't remember ever having any trouble either + +00:19:15.102 --> 00:19:20.221 +when I was using Zotero before or now + +00:19:20.222 --> 00:19:24.101 +with the more Emacs based tools. + +00:19:24.102 --> 00:19:29.781 +I feel like the big entries are copied correctly. + +00:19:29.782 --> 00:19:35.101 +I haven't noticed this being incorrect. + +00:19:35.102 --> 00:19:40.181 +But I'm curious, do you have any point + +00:19:40.182 --> 00:19:44.661 +On that, I will keep in mind. + +00:19:44.662 --> 00:19:48.541 +Sometimes, DOI records are not exactly correct. + +00:19:48.542 --> 00:19:52.861 +For example, they can contain some very strange symbols. + +00:19:52.862 --> 00:20:01.901 +So that can happen sometimes. OK. Yeah. I don't know. + +00:20:01.902 --> 00:20:05.741 +I guess then if you want to fact check, + +00:20:05.742 --> 00:20:12.141 +it's probably the best to do it directly as it is added, + +00:20:12.142 --> 00:20:14.901 +like it's added, for example, here, + +00:20:14.902 --> 00:20:17.941 +and you can just directly, when you add it, + +00:20:17.942 --> 00:20:23.501 +find it and say, is everything correct here? + +00:20:23.502 --> 00:20:27.661 +Because I think that if you leave it for later, + +00:20:27.662 --> 00:20:31.381 +it will be much more of a mess. + +00:20:31.382 --> 00:20:33.181 +So for checking, I would just do it directly + +00:20:33.182 --> 00:20:47.261 +after I add it to the bit file. + +00:20:47.262 --> 00:20:50.621 +And let me see, is there anything else? + +00:20:50.622 --> 00:20:53.501 +I think one common way it can fail + +00:20:53.502 --> 00:20:56.381 +is when the metadata includes + +00:20:56.382 --> 00:20:59.581 +HTML tags for math, for example. + +00:20:59.582 --> 00:21:03.501 +And in some papers, for some journals, it can happen. + +00:21:03.502 --> 00:21:05.061 +So then you can imagine what happens + +00:21:05.062 --> 00:21:06.981 +when you try to put that citation + +00:21:06.982 --> 00:21:08.741 +into your references. + +00:21:08.742 --> 00:21:12.421 +That's going to be a mess. + +00:21:12.422 --> 00:21:17.501 +Yeah, okay. I didn't know, to be honest, so yeah. + +00:21:17.502 --> 00:21:27.101 +Thanks for the information. + +00:21:27.102 --> 00:21:29.501 +I think our graph has automatic cleaning + +00:21:29.502 --> 00:21:30.421 +of certain things + +00:21:30.422 --> 00:21:34.741 +for common errors in the metadata. + +00:21:34.742 --> 00:21:37.221 +How did you call that? + +00:21:37.222 --> 00:21:38.381 +I can note it down also here for the discussion. + +00:21:38.382 --> 00:21:45.861 +Oh, our graph. Or graph. Or graph. Yeah. + +00:21:45.862 --> 00:22:12.261 +Okay. Okay. I will put it down the pad. + +00:22:12.262 --> 00:22:14.141 +And I think the next talk, + +00:22:14.142 --> 00:22:18.461 +the live will move in the next minute anyways. + +00:22:18.462 --> 00:22:22.141 +And I see we're done with all the questions. + +00:22:22.142 --> 00:22:26.141 +So thank you everyone. I hope this was interesting. + +00:22:26.142 --> 00:22:28.501 +Thank you for giving me a lot of questions + +00:22:28.502 --> 00:22:31.461 +so we had to discuss for the whole time + +00:22:31.462 --> 00:22:34.541 +and we weren't just here sitting. + +00:22:34.542 --> 00:22:36.182 +And enjoy the rest of EmacsConf. diff --git a/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--main--chapters.vtt b/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--main--chapters.vtt new file mode 100644 index 00000000..dbd303e8 --- /dev/null +++ b/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--main--chapters.vtt @@ -0,0 +1,32 @@ +WEBVTT + + +00:00:00.820 --> 00:01:43.599 +Introduction + +00:01:43.600 --> 00:04:00.919 +Capture + +00:04:00.920 --> 00:05:03.478 +Organizing + +00:05:03.479 --> 00:07:55.479 +Ebib + +00:07:55.480 --> 00:09:36.178 +Filters + +00:09:36.179 --> 00:12:50.539 +Dependent databases + +00:12:50.540 --> 00:15:02.439 +Reading lists + +00:15:02.440 --> 00:18:05.639 +Special org-roam-node-find + +00:18:05.640 --> 00:19:21.819 +Annotations + +00:19:21.820 --> 00:20:14.000 +Wrapping up diff --git a/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--main.vtt b/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--main.vtt new file mode 100644 index 00000000..33a06efa --- /dev/null +++ b/2025/captions/emacsconf-2025-reference--emacs-as-a-fullyfledged-reference-manager--vidianos-giannitsis--main.vtt @@ -0,0 +1,1035 @@ +WEBVTT captioned by vidianos + +NOTE Introduction + +00:00:00.820 --> 00:00:03.079 +So, hello everyone, welcome to EmacsConf. + +00:00:03.080 --> 00:00:06.519 +My name is Vidianos, and I'm a PhD student in KU Leuven, + +00:00:06.520 --> 00:00:08.279 +and today I'm going to be showing you + +00:00:08.280 --> 00:00:12.679 +how I managed to use Emacs as a reference manager, + +00:00:12.680 --> 00:00:17.219 +replacing what was for me Zotero, + +00:00:17.220 --> 00:00:24.439 +to a fully fledged approach inside Emacs. + +00:00:24.440 --> 00:00:26.639 +So, what is my typical reference workflow? + +00:00:26.640 --> 00:00:28.479 +First I need to find literature, + +00:00:28.480 --> 00:00:30.439 +then I need to collect and organize it, + +00:00:30.440 --> 00:00:32.599 +which I originally did with Zotero, + +00:00:32.600 --> 00:00:36.611 +but now with Emacs centered tools + +00:00:36.612 --> 00:00:39.879 +such as zotra and ebib. + +00:00:39.880 --> 00:00:41.279 +Then I create a reading list. + +00:00:41.280 --> 00:00:43.439 +This is a new addition to my workflow + +00:00:43.440 --> 00:00:47.679 +I started doing after moving this approach to Emacs + +00:00:47.680 --> 00:00:50.119 +because now everything is well integrated. + +00:00:50.120 --> 00:00:53.839 +I have made a very nice reading list implementation + +00:00:53.840 --> 00:00:57.759 +inside org-roam which I am going to be showing today. + +00:00:57.760 --> 00:01:01.199 +Then obviously I need to read the literature, take notes, + +00:01:01.200 --> 00:01:04.239 +organize the notes, and ensure I am actually learning + +00:01:04.240 --> 00:01:06.539 +from what I am reading. This is then done through packages + +00:01:06.540 --> 00:01:09.159 +such as org-noter and org-roam + +00:01:09.160 --> 00:01:11.359 +and is not going to be the focus of this talk. + +00:01:11.360 --> 00:01:14.239 +I already gave a talk about this part of my workflow, + +00:01:14.240 --> 00:01:17.959 +which I've been doing for many years now. + +00:01:17.960 --> 00:01:20.439 +You can find that + +00:01:20.440 --> 00:01:23.239 +or you can find many other people's approaches + +00:01:23.240 --> 00:01:25.999 +to reading literature and taking notes + +00:01:26.000 --> 00:01:31.039 +as it is quite a popular topic in the Emacs community. + +00:01:31.040 --> 00:01:32.759 +Lastly, I will have a short section + +00:01:32.760 --> 00:01:37.039 +about how I ensure that I can recall the knowledge + +00:01:37.040 --> 00:01:39.679 +from this literature very easily + +00:01:39.680 --> 00:01:43.599 +through this reference management system. + +NOTE Capture + +00:01:43.600 --> 00:01:48.199 +So, how can we capture an article in Emacs? + +00:01:48.200 --> 00:01:52.099 +One of the most commonly known packages is doi-utils + +00:01:52.100 --> 00:01:58.879 +where doi-utils has a lot of useful things to do + +00:01:58.880 --> 00:02:03.519 +and one of them is to capture a paper, + +00:02:03.520 --> 00:02:06.459 +but you need a DOI, and for me, that is a bit inconvenient, + +00:02:06.460 --> 00:02:08.879 +because what I want to do is that + +00:02:08.880 --> 00:02:11.999 +I have a URL here of a paper, + +00:02:12.000 --> 00:02:16.519 +I want to just copy this URL, not copy the DOI, + +00:02:16.520 --> 00:02:23.199 +and be able to save it immediately to my bib file. + +00:02:23.200 --> 00:02:24.311 +And that can now be done + +00:02:24.312 --> 00:02:27.719 +through this function zotra-add-entry. + +00:02:27.720 --> 00:02:28.679 +And as you can see here, + +00:02:28.680 --> 00:02:31.079 +there is also a zotra-download-attachment + +00:02:31.080 --> 00:02:34.159 +that sometimes works, but not always. + +00:02:34.160 --> 00:02:35.879 +I don't personally recommend it. + +00:02:35.880 --> 00:02:39.599 +But the problem is that due to articles being + +00:02:39.600 --> 00:02:42.639 +locked behind paywalls in many cases, + +00:02:42.640 --> 00:02:45.639 +downloading attachments doesn't work + +00:02:45.640 --> 00:02:47.479 +through Emacs. Sometimes it doesn't work + +00:02:47.480 --> 00:02:51.119 +through Zotero. Sometimes you just need to go to the browser, + +00:02:51.120 --> 00:02:54.259 +say download PDF, and that's the only solution + +00:02:54.260 --> 00:02:58.399 +that will properly work. + +00:02:58.400 --> 00:03:01.519 +So how do I then add this to the paper? + +00:03:01.520 --> 00:03:04.711 +I need to find this paper that is here + +00:03:04.712 --> 00:03:05.879 +through ivy-bibtex. + +00:03:05.880 --> 00:03:10.239 +This is the bib file manager I use. + +00:03:10.240 --> 00:03:11.759 +There is also others like citar. + +00:03:11.760 --> 00:03:15.559 +I think citar has much better coding and integration + +00:03:15.560 --> 00:03:18.159 +with other packages, but I haven't really bothered + +00:03:18.160 --> 00:03:19.639 +to move from ivy-bibtex + +00:03:19.640 --> 00:03:24.439 +because it does basically everything I want perfectly. + +00:03:24.440 --> 00:03:28.279 +So I go here, say add pdf to library. + +00:03:28.280 --> 00:03:31.719 +I find where I saved it, + +00:03:31.720 --> 00:03:35.399 +and it will suggest to automatically name it something + +00:03:35.400 --> 00:03:37.445 +which is in full integration + +00:03:37.446 --> 00:03:40.919 +with the rest of my Emacs packages, + +00:03:40.920 --> 00:03:43.839 +and all the literature management stuff + +00:03:43.840 --> 00:03:46.799 +knows to find it with this exact name. + +00:03:46.800 --> 00:03:49.045 +So it iss saved and now + +00:03:49.046 --> 00:03:53.319 +when I try to create a file from this, + +00:03:53.320 --> 00:03:55.199 +which I will show later, + +00:03:55.200 --> 00:04:00.919 +you will see that the file will already appear there. + +NOTE Organizing + +00:04:00.920 --> 00:04:06.519 +So now let's go to organizing. + +00:04:06.520 --> 00:04:09.119 +Organizing in Zotero is typically done through a + +00:04:09.120 --> 00:04:10.519 +hierarchical folder structure. + +00:04:10.520 --> 00:04:14.999 +This is very familiar to most people and generally works, + +00:04:15.000 --> 00:04:19.519 +but being someone that takes notes using the Zettelkasten method, + +00:04:19.520 --> 00:04:24.319 +which has a fully flat hierarchy, nothing goes in folders, + +00:04:24.320 --> 00:04:27.959 +everything is in the same folder, + +00:04:27.960 --> 00:04:31.959 +and you find everything because it's connected to other things. + +00:04:31.960 --> 00:04:34.839 +We have some basic indexes, + +00:04:34.840 --> 00:04:37.799 +from where you can jump to different points. + +00:04:37.800 --> 00:04:41.359 +I love this structure, so I also wanted to include it + +00:04:41.360 --> 00:04:42.919 +in my bibliography management, + +00:04:42.920 --> 00:04:45.579 +because with folders you have problems like, + +00:04:45.580 --> 00:04:48.359 +this article can go in that folder, can go in that folder, + +00:04:48.360 --> 00:04:51.079 +can go in that folder. Where do I actually put it? + +00:04:51.080 --> 00:04:54.439 +Do I put copies of it in different folders? + +00:04:54.440 --> 00:04:59.279 +It's just confusing and not really practical in my opinion. + +00:04:59.280 --> 00:05:03.478 +So I tried to do this approach inside Emacs. + +NOTE Ebib + +00:05:03.479 --> 00:05:08.239 +And how? With Ebib. + +00:05:08.240 --> 00:05:11.719 +Ebib is an amazing software built inside Emacs. + +00:05:11.720 --> 00:05:15.679 +It's a reference manager and it works absolutely amazing + +00:05:15.680 --> 00:05:18.199 +if you configure it to your liking. + +00:05:18.200 --> 00:05:21.119 +So let's open ebib first. + +00:05:21.120 --> 00:05:23.519 +This is the interface you will see when opening. + +00:05:23.520 --> 00:05:27.159 +Actually, by default you will not see anything, + +00:05:27.160 --> 00:05:30.799 +but I have open three bib files. + +00:05:30.800 --> 00:05:36.119 +These are opened by default on boot of ebib for me. + +00:05:36.120 --> 00:05:39.839 +These are my three main master bib files. + +00:05:39.840 --> 00:05:41.719 +This is the Zotero master bib file, + +00:05:41.720 --> 00:05:44.599 +which only Zotero can touch. If I change it, + +00:05:44.600 --> 00:05:47.959 +it will be overwritten. This is my new master bib, + +00:05:47.960 --> 00:05:53.759 +where I save all the files that I have now started using + +00:05:53.760 --> 00:05:55.599 +after switching to this approach. + +00:05:55.600 --> 00:05:59.119 +And then this is the master bib file + +00:05:59.120 --> 00:06:02.519 +for literature related to my PhD + +00:06:02.520 --> 00:06:07.479 +and things that I have already read. + +00:06:07.480 --> 00:06:09.759 +It's a very convenient interface. + +00:06:09.760 --> 00:06:14.140 +There is also search. There is one searching tool, + +00:06:14.141 --> 00:06:16.519 +the jump to entry, ebib-jump-to-entry, + +00:06:16.520 --> 00:06:23.039 +which searches through all open bib files for the title. + +00:06:23.040 --> 00:06:29.319 +So for example, I can search for membrane fabrication, + +00:06:29.320 --> 00:06:35.839 +because that's something I am currently doing, + +00:06:35.840 --> 00:06:41.919 +and go to this. There is another searching tool, + +00:06:41.920 --> 00:06:45.639 +the ebib-search, which searches through the database + +00:06:45.640 --> 00:06:48.359 +that you're on right now + +00:06:48.360 --> 00:06:50.399 +and it does a full text search, + +00:06:50.400 --> 00:06:53.459 +not only in the titles, but everywhere. + +00:06:53.460 --> 00:06:57.039 +So, for example, I see that in this paper + +00:06:57.040 --> 00:07:04.759 +if I go to the abstract and search for the word FTIR, + +00:07:04.760 --> 00:07:06.879 +which is a chemical analysis, + +00:07:06.880 --> 00:07:09.879 +it will tell me that it's here. + +00:07:09.880 --> 00:07:16.539 +Can it find it anywhere else? It cannot. That's okay. + +00:07:16.540 --> 00:07:18.111 +Let's search for something + +00:07:18.112 --> 00:07:21.679 +that we'll be able to find more easily, + +00:07:21.680 --> 00:07:24.799 +like, for example, membrane crystallization + +00:07:24.800 --> 00:07:27.539 +which is a main focus of my PhD. + +00:07:27.540 --> 00:07:30.319 +Then it will be able to find it many times, + +00:07:30.320 --> 00:07:35.159 +many, many times. + +00:07:35.160 --> 00:07:40.299 +I can also search on the next database + +00:07:40.300 --> 00:07:49.479 +or on this database and see where is everything that I want. + +00:07:49.480 --> 00:07:55.479 +So this is different searching tools which are very useful. + +NOTE Filters + +00:07:55.480 --> 00:08:01.700 +Then there's also another tool, that is, filters. + +00:08:01.701 --> 00:08:06.199 +So I can filter on any field. + +00:08:06.200 --> 00:08:09.739 +Like, for example, let's say on any field, + +00:08:09.740 --> 00:08:13.159 +and let's say I'm looking now again + +00:08:13.160 --> 00:08:16.279 +for membrane crystallization. + +00:08:16.280 --> 00:08:19.879 +This will now filter to all entries. + +00:08:19.880 --> 00:08:22.119 +You can see right now there's 18 entries here + +00:08:22.120 --> 00:08:28.019 +that mention these two words together in any field. + +00:08:28.020 --> 00:08:31.759 +Sometimes this is easier, because this is permanent. + +00:08:31.760 --> 00:08:33.699 +It's not like the search that we find one + +00:08:33.700 --> 00:08:35.218 +and then if you move, you've lost it, + +00:08:35.219 --> 00:08:37.885 +and you need to find it again. + +00:08:37.886 --> 00:08:39.679 +This is permanent until I say, + +00:08:39.680 --> 00:08:41.799 +okay, cancel the filter. + +00:08:41.800 --> 00:08:43.479 +I mostly work with filters, + +00:08:43.480 --> 00:08:47.059 +I think they're the most convenient. + +00:08:47.060 --> 00:08:49.679 +Then there's also the ebib-list-recent + +00:08:49.680 --> 00:08:51.479 +which is another very useful command. + +00:08:51.480 --> 00:08:53.359 +It asks you for a number of days + +00:08:53.360 --> 00:08:56.559 +and it will show you the files that were added + +00:08:56.560 --> 00:08:58.479 +in the most recent. + +00:08:58.480 --> 00:09:02.159 +So for example, show me the literature files + +00:09:02.160 --> 00:09:05.839 +that were added to this bib file in the last month. + +00:09:05.840 --> 00:09:09.799 +I will see five files in this case, + +00:09:09.800 --> 00:09:12.699 +because in this bib file, I have mostly entries + +00:09:12.700 --> 00:09:15.239 +that I have read, these are the files + +00:09:15.240 --> 00:09:18.959 +I have most recently read and added here. + +00:09:18.960 --> 00:09:21.599 +While if I go for example here and say that, + +00:09:21.600 --> 00:09:25.799 +these are files that maybe I haven't read yet, + +00:09:25.800 --> 00:09:31.099 +but I was planning to read. So this is something useful. + +00:09:31.100 --> 00:09:32.999 +Although for things I'm planning to read, + +00:09:33.000 --> 00:09:34.439 +I mostly use the reading list + +00:09:34.440 --> 00:09:36.178 +that I'm going to show next. + +NOTE Dependent databases + +00:09:36.179 --> 00:09:37.399 +But before that, + +00:09:37.400 --> 00:09:41.759 +a few more neat things that you can do in Ebib. + +00:09:41.760 --> 00:09:45.019 +So I have a list of dependent databases. + +00:09:45.020 --> 00:09:48.819 +For ease, I have already opened them here. + +00:09:48.820 --> 00:09:52.599 +These, as you can see, have two brackets here, + +00:09:52.600 --> 00:09:59.439 +indicating that they're dependent on phd_literature_1.bib, + +00:09:59.440 --> 00:10:06.378 +and these, in my case, act as the sort of index file, + +00:10:06.379 --> 00:10:10.911 +where I am tagging things based on the structure + +00:10:10.912 --> 00:10:14.651 +that I wanted to have for the organization. + +00:10:14.652 --> 00:10:16.478 +So all the organization is flat, + +00:10:16.479 --> 00:10:20.145 +all the literature is in phd_literature_1, + +00:10:20.146 --> 00:10:23.419 +however, I have this file + +00:10:23.420 --> 00:10:25.839 +that has 14 entries. + +00:10:25.840 --> 00:10:32.899 +I have another file here that has 20 entries. + +00:10:32.900 --> 00:10:35.719 +And these are smaller indexes + +00:10:35.720 --> 00:10:38.519 +where I can find things easier, + +00:10:38.520 --> 00:10:41.159 +but things are not limited to one of these. + +00:10:41.160 --> 00:10:45.599 +Things can be in all of these, or probably not all of these, + +00:10:45.600 --> 00:10:50.479 +but can be in three or four of these very easily. + +00:10:50.480 --> 00:10:55.219 +And how you add things is that I go here, + +00:10:55.220 --> 00:11:00.079 +and I say not r, it's... M for the dependent databases, + +00:11:00.080 --> 00:11:02.079 +and I add entry, and it will tell me + +00:11:02.080 --> 00:11:03.159 +"Where do you want to add this?" + +00:11:03.160 --> 00:11:05.159 +So when I read a new paper, + +00:11:05.160 --> 00:11:09.839 +I can say okay, this is related to these three tags, + +00:11:09.840 --> 00:11:11.239 +and this is sort of like, again, + +00:11:11.240 --> 00:11:13.185 +it's tagging it and it's putting it + +00:11:13.186 --> 00:11:15.059 +there, there, and there. + +00:11:15.060 --> 00:11:17.599 +And then this creates a flat structure + +00:11:17.600 --> 00:11:21.619 +that however has a great organization, + +00:11:21.620 --> 00:11:23.799 +similar to how Zettelkasten works + +00:11:23.800 --> 00:11:27.879 +and I really like working with something like this, + +00:11:27.880 --> 00:11:33.719 +with dependent databases. + +00:11:33.720 --> 00:11:36.539 +Another feature that I really like, + +00:11:36.540 --> 00:11:41.919 +another feature that exists by default... But if I tag, + +00:11:41.920 --> 00:11:45.279 +this tagging is done through "m", + +00:11:45.280 --> 00:11:49.019 +and then I can tag different files here, + +00:11:49.020 --> 00:11:52.159 +and this is to do different actions with these together, + +00:11:52.160 --> 00:11:53.585 +such as, for example, + +00:11:53.586 --> 00:11:55.585 +copy them to a different file, + +00:11:55.586 --> 00:11:59.459 +with "x" I can export the entries somewhere else, + +00:11:59.460 --> 00:12:00.685 +there are many things that you can do + +00:12:00.686 --> 00:12:01.439 +when you mark them. + +00:12:01.440 --> 00:12:05.319 +By the way, one of them is this function, + +00:12:05.320 --> 00:12:08.939 +which sees everything that I have marked + +00:12:08.940 --> 00:12:14.785 +and shows me an org-roam-node-find entry + +00:12:14.786 --> 00:12:18.052 +that is filtered to just these files. + +00:12:18.053 --> 00:12:20.885 +I can select one and it will take me + +00:12:20.886 --> 00:12:24.399 +to my notes on this specific paper. + +00:12:24.400 --> 00:12:25.719 +I find this very useful, + +00:12:25.720 --> 00:12:27.159 +because I can be looking for something + +00:12:27.160 --> 00:12:30.018 +and I can say, okay I remember, + +00:12:30.019 --> 00:12:31.399 +or I did some filtering, + +00:12:31.400 --> 00:12:34.099 +and I know it's in one of these files + +00:12:34.100 --> 00:12:37.239 +and now I want to see my in-depth notes on each one + +00:12:37.240 --> 00:12:41.079 +to remember where exactly I found it. + +00:12:41.080 --> 00:12:43.419 +So I find this kind of filtering, + +00:12:43.420 --> 00:12:50.539 +this org-roam related filtering, to be also very effective. + +NOTE Reading lists + +00:12:50.540 --> 00:12:54.079 +So now let's finally move to reading list. + +00:12:54.080 --> 00:12:55.399 +The reading list in ebib + +00:12:55.400 --> 00:13:00.259 +reminds me a lot of the philosophy that Emacs uses. + +00:13:00.260 --> 00:13:05.119 +By default, it is extremely bare bones, not very usable, + +00:13:05.120 --> 00:13:10.719 +but it is so customizable, to where you can do + +00:13:10.720 --> 00:13:13.019 +anything that you can imagine through it + +00:13:13.020 --> 00:13:16.479 +because the limit truly is your imagination. + +00:13:16.480 --> 00:13:21.039 +It's how much you can code into this + +00:13:21.040 --> 00:13:22.519 +that actually makes sense + +00:13:22.520 --> 00:13:25.479 +and you can actually imagine it working. + +00:13:25.480 --> 00:13:31.699 +Besides that, you can do anything really. + +00:13:31.700 --> 00:13:36.799 +So we can open ebib and try to find this paper + +00:13:36.800 --> 00:13:42.699 +that I just added here. + +00:13:42.700 --> 00:13:48.679 +Then we can create a reading list entry from it. + +00:13:48.680 --> 00:13:51.999 +Here, my reading list prompts me + +00:13:52.000 --> 00:13:53.418 +for a priority for this. + +00:13:53.419 --> 00:13:57.239 +How urgent it is for me to read this. + +00:13:57.240 --> 00:14:02.219 +It adds a TO-READ, which is a todo entry, + +00:14:02.220 --> 00:14:04.479 +which helps with organizing my reading list, + +00:14:04.480 --> 00:14:08.679 +because as you may also be able to see, this has an ID, + +00:14:08.680 --> 00:14:11.579 +because this is an org-roam node, + +00:14:11.580 --> 00:14:16.839 +so the TO-READ allows me to organize it inside org-roam. + +00:14:16.840 --> 00:14:21.839 +It saves the citekey, the link to the paper, + +00:14:21.840 --> 00:14:25.979 +and also tags it with the parent file node + +00:14:25.980 --> 00:14:30.379 +because I don't like having orphan nodes in my Zettelkasten. + +00:14:30.380 --> 00:14:33.839 +I like everything to be linked to at least one thing. + +00:14:33.840 --> 00:14:35.799 +So everything in the reading list + +00:14:35.800 --> 00:14:39.299 +is linked to the parent file. + +00:14:39.300 --> 00:14:47.519 +And now I can find this in the org-roam-node-find menu, + +00:14:47.520 --> 00:14:53.719 +here. However, that's not very interesting. + +00:14:53.720 --> 00:14:56.239 +In practice, my typical org-roam-node-find + +00:14:56.240 --> 00:14:59.759 +does not even include these reading list files + +00:14:59.760 --> 00:15:02.439 +because I don't really care to have them there. + +NOTE Special org-roam-node-find + +00:15:02.440 --> 00:15:06.159 +I have a special org-roam-node-find + +00:15:06.160 --> 00:15:13.439 +that is designed to find these in particular. + +00:15:13.440 --> 00:15:16.459 +And here these have 22. These are the amount of files + +00:15:16.460 --> 00:15:21.679 +that are currently in my reading list. + +00:15:21.680 --> 00:15:29.899 +So for example, let's try and press here. + +00:15:29.900 --> 00:15:33.479 +And magically, this prompts me to select a capture template, + +00:15:33.480 --> 00:15:39.119 +because what it's doing is that I selected this, + +00:15:39.120 --> 00:15:42.119 +and because of the citekey, it knows + +00:15:42.120 --> 00:15:46.539 +that it wants to create a new node for that. + +00:15:46.540 --> 00:15:47.959 +So I select the capture template. + +00:15:47.960 --> 00:15:56.099 +It knows that it wants to create this new node for this. + +00:15:56.100 --> 00:16:01.359 +And now, if I for a second close the reading list, + +00:16:01.360 --> 00:16:07.119 +now I can already go ahead and take notes on this. + +00:16:07.120 --> 00:16:09.759 +This is org-noter, in particular, + +00:16:09.760 --> 00:16:11.599 +and it makes it all very easy + +00:16:11.600 --> 00:16:15.719 +because it's all integrated in one place. + +00:16:15.720 --> 00:16:22.539 +If I then close this and open a new Emacs, + +00:16:22.540 --> 00:16:27.939 +we have this, and the reading list allows me to very quickly + +00:16:27.940 --> 00:16:32.539 +go from this being reading this item to initializing it. + +00:16:32.540 --> 00:16:35.039 +Another thing that is very useful is that + +00:16:35.040 --> 00:16:38.739 +everything is sorted by priority. + +00:16:38.740 --> 00:16:41.359 +So I need to increase the font size again + +00:16:41.360 --> 00:16:48.899 +because I closed the previous Emacs. + +00:16:48.900 --> 00:16:52.319 +So here, I can select what is high priority, + +00:16:52.320 --> 00:16:56.399 +what is low priority. I can also change the priority + +00:16:56.400 --> 00:16:58.799 +without needing to be in this file. + +00:16:58.800 --> 00:17:05.479 +Let's leave this file. I can say, okay, I decided + +00:17:05.480 --> 00:17:08.639 +that this file is priority B. It needs to be A, + +00:17:08.640 --> 00:17:11.899 +which is more urgent. + +00:17:11.900 --> 00:17:16.079 +In my system, there's five different priority levels. + +00:17:16.080 --> 00:17:17.999 +You can get away with less + +00:17:18.000 --> 00:17:20.959 +but I like to have the very much low ones + +00:17:20.960 --> 00:17:22.999 +as this is not urgent at all + +00:17:23.000 --> 00:17:27.159 +but I want to keep it somewhere. A is very urgent + +00:17:27.160 --> 00:17:31.779 +and B is urgent but just below A. + +00:17:31.780 --> 00:17:34.619 +And then the C in the middle is just + +00:17:34.620 --> 00:17:35.999 +I will eventually read this + +00:17:36.000 --> 00:17:41.919 +but not something I want to focus my attention on right now. + +00:17:41.920 --> 00:17:45.439 +So this is mostly about reading list. + +00:17:45.440 --> 00:17:46.639 +I can also show, for example, + +00:17:46.640 --> 00:17:50.679 +I have this if I finalize something, + +00:17:50.680 --> 00:17:56.799 +if I read it. For example, I created a note for this new thing. + +00:17:56.800 --> 00:17:59.079 +Let's say I finished reading it. + +00:17:59.080 --> 00:18:02.179 +I want to remove from my reading list. + +00:18:02.180 --> 00:18:05.639 +It's also just one command and it's done. + +NOTE Annotations + +00:18:05.640 --> 00:18:08.739 +If we now return to the presentation, + +00:18:08.740 --> 00:18:11.699 +the last thing I want to show is annotations. + +00:18:11.700 --> 00:18:17.119 +So for annotations, it's the idea that sometimes + +00:18:17.120 --> 00:18:23.139 +you just need to find something in Ebib quickly. + +00:18:23.140 --> 00:18:26.679 +So I'm here and I'm looking for something. + +00:18:26.680 --> 00:18:30.999 +I said I'm here and I'm looking for something. + +00:18:31.000 --> 00:18:35.199 +And as you can see, there's the annote file everywhere, + +00:18:35.200 --> 00:18:40.839 +the annote entry, which is a very very small description + +00:18:40.840 --> 00:18:43.799 +of things that I want to remember for this paper. + +00:18:43.800 --> 00:18:48.039 +So I can be scrolling here or scrolling + +00:18:48.040 --> 00:18:51.811 +in one of the smaller files + +00:18:51.812 --> 00:18:56.859 +and saying this was in this subsection, + +00:18:56.860 --> 00:18:59.519 +and which paper was it, and I can scroll, + +00:18:59.520 --> 00:19:01.711 +read all these annotes. + +00:19:01.712 --> 00:19:04.919 +Each annote takes like 15 seconds to read, + +00:19:04.920 --> 00:19:07.359 +and really decide, okay, + +00:19:07.360 --> 00:19:09.799 +it was this paper that I wanted, good. + +00:19:09.800 --> 00:19:21.819 +Now I can open the note for it, go there, and it's very easy. + +NOTE Wrapping up + +00:19:21.820 --> 00:19:25.719 +So I think that's all. I would like to thank you for your time. + +00:19:25.720 --> 00:19:29.319 +I would love to see your questions either in IRC, + +00:19:29.320 --> 00:19:32.199 +I will be, maybe I've already answered + +00:19:32.200 --> 00:19:35.039 +some of your questions there in the Etherpad, + +00:19:35.040 --> 00:19:37.599 +or right now, we're going to the live Q&A + +00:19:37.600 --> 00:19:42.159 +where I'd love to interact with everyone and have a discussion. + +00:19:42.160 --> 00:19:44.479 +However, if you don't have any questions right now, + +00:19:44.480 --> 00:19:48.559 +but you have a question later on, feel free to send me an email. + +00:19:48.560 --> 00:19:51.739 +My mail is also on the site. + +00:19:51.740 --> 00:19:54.599 +And if you're curious how all this "magic" worked, + +00:19:54.600 --> 00:20:00.839 +feel free to go to my Github and see the ebib section + +00:20:00.840 --> 00:20:04.039 +here that will also be linked in the doc page, + +00:20:04.040 --> 00:20:06.279 +where you can see all the configuration + +00:20:06.280 --> 00:20:10.919 +that I have done in Ebib for everything to work. + +00:20:10.920 --> 00:20:14.000 +Thank you again and have a wonderful EmacsConf! diff --git a/2025/captions/emacsconf-2025-sat-open--saturday-opening-remarks--main--chapters.vtt b/2025/captions/emacsconf-2025-sat-open--saturday-opening-remarks--main--chapters.vtt new file mode 100644 index 00000000..af2b588c --- /dev/null +++ b/2025/captions/emacsconf-2025-sat-open--saturday-opening-remarks--main--chapters.vtt @@ -0,0 +1,41 @@ +WEBVTT + + +00:00:00.000 --> 00:00:15.999 +Tracks + +00:00:16.000 --> 00:01:00.606 +Watching and participating + +00:01:00.607 --> 00:01:10.600 +Other schedule formats + +00:01:10.601 --> 00:01:46.035 +BigBlueButton + +00:01:46.036 --> 00:02:03.216 +On and off the stream + +00:02:03.217 --> 00:02:25.455 +Etherpad and IRC + +00:02:25.456 --> 00:02:59.439 +Etherpad + +00:02:59.440 --> 00:03:32.777 +IRC + +00:03:32.778 --> 00:03:55.237 +Captions + +00:03:55.238 --> 00:04:07.281 +status.emacsconf.org + +00:04:07.282 --> 00:04:16.019 +Guidelines for conduct + +00:04:16.020 --> 00:04:26.775 +Videos + +00:04:26.776 --> 00:04:49.323 +Let's get started! diff --git a/2025/captions/emacsconf-2025-sat-open--saturday-opening-remarks--main.vtt b/2025/captions/emacsconf-2025-sat-open--saturday-opening-remarks--main.vtt new file mode 100644 index 00000000..d6a7d98c --- /dev/null +++ b/2025/captions/emacsconf-2025-sat-open--saturday-opening-remarks--main.vtt @@ -0,0 +1,376 @@ +WEBVTT + + +NOTE Tracks + +00:00:00.000 --> 00:00:02.246 +Welcome to EmacsConf, where we have fun + +00:00:02.247 --> 00:00:05.484 +exploring just how much we can do with a text editor. + +00:00:05.485 --> 00:00:07.924 +There's a General track and a Development track, + +00:00:07.925 --> 00:00:09.483 +but really, you'll probably find + +00:00:09.484 --> 00:00:11.078 +interesting things on both tracks + +00:00:11.079 --> 00:00:13.215 +no matter what your level of experience is, + +00:00:13.216 --> 00:00:15.999 +so don't feel limited to one or the other. + +NOTE Watching and participating + +00:00:16.000 --> 00:00:19.392 +The best parts of EmacsConf are the conversations. + +00:00:19.393 --> 00:00:22.485 +The wiki has a page on how to watch and participate, + +00:00:22.486 --> 00:00:24.909 +and I'll give you a quick overview as well. + +00:00:24.910 --> 00:00:28.884 +You can watch both streams at live.emacsconf.org + +00:00:28.885 --> 00:00:31.185 +using free and open source software. + +00:00:31.186 --> 00:00:34.387 +Using a streaming media player like mpv + +00:00:34.388 --> 00:00:37.274 +seems to be the best way to watch in terms of performance + +00:00:37.275 --> 00:00:39.240 +but there are also web-based players + +00:00:39.241 --> 00:00:41.377 +just in case that's all you've got. + +00:00:41.378 --> 00:00:44.063 +The schedule shows the General track on top + +00:00:44.064 --> 00:00:45.602 +and the Development track on the bottom, + +00:00:45.603 --> 00:00:47.819 +so you can see what else is going on. + +00:00:47.820 --> 00:00:49.818 +As you're watching the talks, + +00:00:49.819 --> 00:00:52.354 +you can refer to the schedule in another window. + +00:00:52.355 --> 00:00:55.600 +Hover over the boxes to see the times and titles, + +00:00:55.601 --> 00:00:57.613 +and click on the boxes in the schedule + +00:00:57.614 --> 00:01:00.606 +to jump to the talk's page for more details. + +NOTE Other schedule formats + +00:01:00.607 --> 00:01:03.586 +You can also get the schedule as an iCalendar file + +00:01:03.587 --> 00:01:05.620 +or as an Org file in different time zones. + +00:01:05.621 --> 00:01:08.254 +The Org file has some links to talk resources + +00:01:08.255 --> 00:01:10.600 +and might be handy as a starting point for your notes. + +NOTE BigBlueButton + +00:01:10.601 --> 00:01:12.144 +Many talks will be followed by + +00:01:12.145 --> 00:01:14.571 +live Q&A web conferences with the speaker, + +00:01:14.572 --> 00:01:17.733 +which will be done in BigBlueButton or BBB. + +00:01:17.734 --> 00:01:20.818 +These are indicated with a solid border on the schedule + +00:01:20.819 --> 00:01:24.000 +and by Q&A: BBB on the schedule page. + +00:01:24.001 --> 00:01:25.900 +You can join the web conference room + +00:01:25.901 --> 00:01:27.466 +by clicking on the BBB link + +00:01:27.467 --> 00:01:30.175 +on the schedule page or the talk's webpage. + +00:01:30.176 --> 00:01:34.214 +Then you can ask your questions yourself when the Q&A starts. + +00:01:34.215 --> 00:01:37.210 +To improve performance, please keep your webcam off + +00:01:37.211 --> 00:01:39.889 +and stay muted until it's your turn to talk. + +00:01:39.890 --> 00:01:41.691 +If you don't like Javascript, + +00:01:41.692 --> 00:01:43.642 +you can still ask questions via IRC + +00:01:43.643 --> 00:01:46.035 +and the hosts can read them out for you. + +NOTE On and off the stream + +00:01:46.036 --> 00:01:47.894 +We're probably going to automatically switch + +00:01:47.895 --> 00:01:49.482 +between talks and Q&A sessions, + +00:01:49.483 --> 00:01:52.896 +so the transitions on the stream might be a little sudden. + +00:01:52.897 --> 00:01:54.438 +People in the BigBlueButton room + +00:01:54.439 --> 00:01:55.861 +can continue the conversation + +00:01:55.862 --> 00:01:58.219 +even after the talk moves off-stream, + +00:01:58.220 --> 00:02:00.270 +and you can also reach out to the speakers + +00:02:00.271 --> 00:02:03.216 +using the contact information on the talk page. + +NOTE Etherpad and IRC + +00:02:03.217 --> 00:02:06.301 +Other talks will have Q&A via Etherpad or IRC, + +00:02:06.302 --> 00:02:08.541 +depending on what the speakers prefer. + +00:02:08.542 --> 00:02:11.379 +This is indicated in the schedule with a dashed border + +00:02:11.380 --> 00:02:13.509 +and on the schedule page as well. + +00:02:13.510 --> 00:02:16.542 +The schedule pages have quick shortcuts so that you can + +00:02:16.543 --> 00:02:19.052 +find out more about talks, open the Etherpads, + +00:02:19.053 --> 00:02:21.203 +and join the Q&A sessions. + +00:02:21.204 --> 00:02:23.365 +The watch page has more tips + +00:02:23.366 --> 00:02:25.455 +on how to make the most of Q&A. + +NOTE Etherpad + +00:02:25.456 --> 00:02:28.329 +If you can, please add notes and ask questions + +00:02:28.330 --> 00:02:30.132 +in the Etherpad for the talk. + +00:02:30.133 --> 00:02:31.597 +That makes it easier + +00:02:31.598 --> 00:02:33.129 +for everyone to share their notes, + +00:02:33.130 --> 00:02:36.354 +and speakers and hosts can read the questions from there. + +00:02:36.355 --> 00:02:39.621 +We'll copy the notes to the talk pages afterwards. + +00:02:39.622 --> 00:02:41.496 +We have one pad for each talk, + +00:02:41.497 --> 00:02:43.772 +so you can follow the links to get to the next one + +00:02:43.773 --> 00:02:46.827 +or go back to the schedule and get the link from there. + +00:02:46.828 --> 00:02:48.422 +If you have general feedback about + +00:02:48.423 --> 00:02:50.667 +the conference itself, please put it in + +00:02:50.668 --> 00:02:54.592 +pad.emacsconf.org/emacsconf. + +00:02:54.593 --> 00:02:57.549 +You can also use this as a community message board + +00:02:57.550 --> 00:02:59.439 +for things like Help Wanted. + +NOTE IRC + +00:02:59.440 --> 00:03:02.799 +Internet Relay Chat or IRC can be another great way + +00:03:02.800 --> 00:03:05.175 +to be part of lots of conversations. + +00:03:05.176 --> 00:03:09.450 +You can use chat.emacsconf.org to join the IRC channels + +00:03:09.451 --> 00:03:11.045 +through your web browser. + +00:03:11.046 --> 00:03:12.856 +The tabs on the left can help you + +00:03:12.857 --> 00:03:14.891 +switch between the different channels. + +00:03:14.892 --> 00:03:17.610 +There's #emacsconf-gen for the General track + +00:03:17.611 --> 00:03:20.489 +and #emacsconf-dev for the Development track. + +00:03:20.490 --> 00:03:23.956 +If you need to reach us, you can join #emacsconf-org + +00:03:23.957 --> 00:03:29.474 +or e-mail emacsconf-org-private@gnu.org. + +00:03:29.475 --> 00:03:32.777 +You can use #emacsconf for hallway conversations. + +NOTE Captions + +00:03:32.778 --> 00:03:35.587 +Once again, we're going to be streaming with open captions + +00:03:35.588 --> 00:03:38.479 +for most of the talks this year, thanks to our speakers and + +00:03:38.480 --> 00:03:39.895 +captioning volunteers. + +00:03:39.896 --> 00:03:42.522 +The captioned talks are indicated on the schedule, + +00:03:42.523 --> 00:03:44.312 +and with any luck, we'll be posting + +00:03:44.313 --> 00:03:46.123 +videos and transcripts on talk pages + +00:03:46.124 --> 00:03:47.883 +shortly after the talks start. + +00:03:47.884 --> 00:03:51.069 +If you need additional accommodations, please let us know + +00:03:51.070 --> 00:03:54.016 +in #emacsconf-org and we'll see + +00:03:54.017 --> 00:03:55.237 +if we can make things happen. + +NOTE status.emacsconf.org + +00:03:55.238 --> 00:03:59.917 +If something goes down, we'll update status.emacsconf.org. + +00:03:59.918 --> 00:04:01.743 +If it doesn't look like we've noticed yet, + +00:04:01.744 --> 00:04:05.262 +please let us know in the #emacsconf-org IRC channel, + +00:04:05.263 --> 00:04:07.281 +where we will be quietly panicking. + +NOTE Guidelines for conduct + +00:04:07.282 --> 00:04:09.704 +In all of these conversations, please keep in mind + +00:04:09.705 --> 00:04:11.238 +our guidelines for conduct. + +00:04:11.239 --> 00:04:12.619 +You can find them on the wiki, + +00:04:12.620 --> 00:04:16.019 +and they basically boil down to: please be nice. Thank you! + +NOTE Videos + +00:04:16.020 --> 00:04:18.891 +If all goes well, the prerecorded talks and transcripts + +00:04:18.892 --> 00:04:20.537 +should be available from the talk pages + +00:04:20.538 --> 00:04:22.038 +shortly after they start playing, + +00:04:22.039 --> 00:04:24.143 +and we'll post the recordings of live talks + +00:04:24.144 --> 00:04:26.775 +and Q&A sessions within the next few weeks. + +NOTE Let's get started! + +00:04:26.776 --> 00:04:28.247 +All right, let's get going. + +00:04:28.248 --> 00:04:31.214 +You might see Leo Vivier, Corwin Brust, + +00:04:31.215 --> 00:04:33.953 +and Amin Bandali hosting the various tracks. + +00:04:33.954 --> 00:04:35.767 +I will run around mostly backstage, + +00:04:35.768 --> 00:04:37.793 +and you'll probably meet us in the closing remarks. + +00:04:37.794 --> 00:04:39.243 +That's also where we get to thank + +00:04:39.244 --> 00:04:40.659 +all the people and organizations + +00:04:40.660 --> 00:04:42.549 +who make EmacsConf possible. + +00:04:42.550 --> 00:04:44.462 +Let's have fun at EmacsConf! diff --git a/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--answers.vtt b/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--answers.vtt new file mode 100644 index 00000000..738e9779 --- /dev/null +++ b/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--answers.vtt @@ -0,0 +1,1531 @@ +WEBVTT + +00:00:00.000 --> 00:00:03.839 +[oops, forgot to start] object protocol has a scheme implementation. + +00:00:03.840 --> 00:00:07.159 +Does this mean schemacs will be + +00:00:07.160 --> 00:00:11.079 +meta object changeable in practice? + +00:00:11.080 --> 00:00:16.599 +So I don't actually need the meta object protocol so far. + +00:00:16.600 --> 00:00:19.279 +In the reference implementation for Guile, + +00:00:19.280 --> 00:00:27.559 +Guile has its own object-oriented system called Goops. + +00:00:27.560 --> 00:00:29.239 +I'm sorry, I'm hearing a delay. + +00:00:29.240 --> 00:00:32.519 +Anyway, I'm going to turn off my stream quick. There we go. + +00:00:32.520 --> 00:00:39.439 +So, um. Yes, uh, I, I don't I wasn't aware of the, um. + +00:00:39.440 --> 00:00:43.919 +the meta-object protocol that you have mentioned here, + +00:00:43.920 --> 00:00:45.959 +but I will look into it. + +00:00:45.960 --> 00:00:48.719 +I know that there isn't really a standard + +00:00:48.720 --> 00:00:52.119 +meta-object protocol for Scheme. + +00:00:52.120 --> 00:00:53.519 +That was an issue for me + +00:00:53.520 --> 00:00:56.919 +because I'm trying to make this cross-platform, + +00:00:56.920 --> 00:00:59.639 +and so I've done all of my work so far + +00:00:59.640 --> 00:01:00.959 +without a meta-object protocol + +00:01:00.960 --> 00:01:02.439 +because that's the easiest way to make it work + +00:01:02.440 --> 00:01:04.879 +on multiple Scheme implementations. + +00:01:04.880 --> 00:01:07.359 +But if there is a nice portable one + +00:01:07.360 --> 00:01:12.559 +that works on many implementations, I would use that, yes. + +00:01:12.560 --> 00:01:14.999 +It's just that so far it hasn't been necessary. + +00:01:15.000 --> 00:01:19.279 +I've been doing mostly functional reactive programming + +00:01:19.280 --> 00:01:21.079 +and React.js-like framework. + +00:01:21.080 --> 00:01:23.239 +I've created that for the GUI front end. + +00:01:23.240 --> 00:01:26.199 +And that's all the more I've needed so far. + +00:01:26.200 --> 00:01:33.399 +So, yeah. Oh, yeah, please, next question. Sure. + +00:01:33.400 --> 00:01:39.599 +So how will the GUI display code be R7RS compliant? + +00:01:39.600 --> 00:01:45.079 +As far as I know, there's no DL open in R7RS. That's right. + +00:01:45.080 --> 00:01:48.879 +Yeah, R7RS small is extremely small + +00:01:48.880 --> 00:01:50.439 +and does not have any features at all. + +00:01:50.440 --> 00:01:54.799 +But it does provide a conv expand macro. + +00:01:54.800 --> 00:01:57.639 +And this allows you to load in different code + +00:01:57.640 --> 00:02:00.879 +depending on which scheme implementation you're using. + +00:02:00.880 --> 00:02:03.359 +So basically, I'll have to write a different back end + +00:02:03.360 --> 00:02:05.279 +for each scheme implementation. + +00:02:05.280 --> 00:02:06.639 +And I think that's really + +00:02:06.640 --> 00:02:10.919 +the only way is possible at all, + +00:02:10.920 --> 00:02:12.719 +because there's no standardization. + +00:02:12.720 --> 00:02:14.439 +So essentially, the libraries + +00:02:14.440 --> 00:02:15.719 +that I've written for schemacs + +00:02:15.720 --> 00:02:22.439 +will become kind of a platform-independent way + +00:02:22.440 --> 00:02:25.839 +of writing GUIs for Scheme. + +00:02:25.840 --> 00:02:27.119 +It's just a matter of, + +00:02:27.120 --> 00:02:28.679 +will your Scheme implementation + +00:02:28.680 --> 00:02:32.279 +support the Schemacs GUI protocol? + +00:02:32.280 --> 00:02:34.199 +So I've kind of written my own protocol, + +00:02:34.200 --> 00:02:36.679 +and it's entirely R7 RSML compliant. + +00:02:36.680 --> 00:02:38.239 +It's all done with record, + +00:02:38.240 --> 00:02:43.039 +what are they called, record types. + +00:02:43.040 --> 00:02:46.519 +Do you think some of the Schemacs + +00:02:46.520 --> 00:02:50.679 +could be extracted into SFRIs since you've made it portable + +00:02:50.680 --> 00:02:52.879 +between scheme implementations? + +00:02:52.880 --> 00:02:55.279 +Yes, I would definitely like to do that. + +00:02:55.280 --> 00:02:59.239 +Probably first thing I'll do is start splitting up + +00:02:59.240 --> 00:03:01.679 +and publishing independent libraries + +00:03:01.680 --> 00:03:04.319 +on the Aku package manager. + +00:03:04.320 --> 00:03:07.639 +This is a kind of a package manager ecosystem for Scheme, + +00:03:07.640 --> 00:03:11.679 +and in particular R7RS Scheme. + +00:03:11.680 --> 00:03:15.239 +And it's also mirrored on the other package manager, + +00:03:15.240 --> 00:03:18.279 +Snowfort, just by the way. + +00:03:18.280 --> 00:03:21.359 +But yeah, and then I might be also, + +00:03:21.360 --> 00:03:25.079 +I've considered creating a SRFI for the lens library, + +00:03:25.080 --> 00:03:27.399 +which is based on the Haskell lens library. + +00:03:27.400 --> 00:03:29.839 +I don't think that exists yet in Scheme, + +00:03:29.840 --> 00:03:34.319 +so I thought that might make a good SRFI. + +00:03:34.320 --> 00:03:36.719 +Is there a recommended Scheme implementation? + +00:03:36.720 --> 00:03:44.559 +Guile is the reference implementation. + +00:03:44.560 --> 00:03:47.279 +It's the only one that works with GUI, + +00:03:47.280 --> 00:03:51.359 +but as I demonstrated in my presentation, + +00:03:51.360 --> 00:03:52.599 +the Emacs Lisp interpreter + +00:03:52.600 --> 00:03:55.079 +works on multiple schemes so far, + +00:03:55.080 --> 00:04:00.039 +and I've had trouble with some of the scheme compilers. + +00:04:00.040 --> 00:04:04.839 +But yeah, I would recommend Guile. + +00:04:04.840 --> 00:04:07.719 +But how would schemacs deal with + +00:04:07.720 --> 00:04:10.039 +Emacs's re-display architecture + +00:04:10.040 --> 00:04:13.159 +will be having its own display architecture? + +00:04:13.160 --> 00:04:15.359 +And if so, how will you handle + +00:04:15.360 --> 00:04:18.479 +things like overlays and images? + +00:04:18.480 --> 00:04:25.239 +Yeah, definitely. That's to be determined. + +00:04:25.240 --> 00:04:31.279 +So basically, the scheme way of doing things + +00:04:31.280 --> 00:04:36.639 +So, I've created this React-like programming framework. + +00:04:36.640 --> 00:04:40.999 +It's like ReactJS or Vue.js. + +00:04:41.000 --> 00:04:45.119 +That is just the API of how you write GUI code in Scheme. + +00:04:45.120 --> 00:04:49.719 +And each Scheme implementation + +00:04:49.720 --> 00:04:52.279 +will have its own GUI backend, + +00:04:52.280 --> 00:04:55.599 +which implements that Protocol. + +00:04:55.600 --> 00:04:59.199 +And so when it comes time to link + +00:04:59.200 --> 00:05:03.079 +the Emacs Lisp built-in functions + +00:05:03.080 --> 00:05:08.279 +that do these things like overlays and so on, + +00:05:08.280 --> 00:05:11.079 +we're going to have to come up with some way + +00:05:11.080 --> 00:05:12.079 +of modeling that + +00:05:12.080 --> 00:05:15.799 +using the scheme framework that I've designed. + +00:05:15.800 --> 00:05:17.599 +And I may have to make alterations + +00:05:17.600 --> 00:05:22.039 +specifically to support Emacs Lisp. + +00:05:22.040 --> 00:05:28.559 +I don't know yet. I haven't got that far. + +00:05:28.560 --> 00:05:30.079 +You were saying that you would like + +00:05:30.080 --> 00:05:33.479 +to get the most out of the 1300 + +00:05:33.480 --> 00:05:36.519 +and something Emacs packages that exist. + +00:05:36.520 --> 00:05:38.759 +Are there technical blockers to doing them all + +00:05:38.760 --> 00:05:44.039 +or just a problem of getting enough people to jump into it? + +00:05:44.040 --> 00:05:48.639 +Yeah, it's just a matter of implementing enough + +00:05:48.640 --> 00:05:50.839 +of the Emacs built-in functions. + +00:05:50.840 --> 00:05:57.079 +Right now, there's kind of a big bug. + +00:05:57.080 --> 00:05:59.359 +I mentioned this also in the presentation. + +00:05:59.360 --> 00:06:02.599 +The stacks trace that you saw during my presentation, + +00:06:02.600 --> 00:06:05.799 +that is the biggest bug right now + +00:06:05.800 --> 00:06:08.159 +that's preventing me from running most other code. + +00:06:08.160 --> 00:06:10.359 +And I don't think other people + +00:06:10.360 --> 00:06:13.039 +will be able to contribute to the code base + +00:06:13.040 --> 00:06:14.559 +until I get that bug fixed, + +00:06:14.560 --> 00:06:18.679 +because it doesn't capture closures correctly. + +00:06:18.680 --> 00:06:22.519 +it doesn't behave like Emacs Lisp does, + +00:06:22.520 --> 00:06:26.959 +and that's the big problem. + +00:06:26.960 --> 00:06:31.759 +So once I get that worked out, + +00:06:31.760 --> 00:06:35.599 +then it's just a matter of implementing enough + +00:06:35.600 --> 00:06:37.879 +of the EmacsLisp built-in functions, + +00:06:37.880 --> 00:06:40.679 +these are the functions that are mostly implemented in C, + +00:06:40.680 --> 00:06:42.879 +implementing those in Scheme. + +00:06:42.880 --> 00:06:45.959 +And that, yeah, that's the thing + +00:06:45.960 --> 00:06:47.839 +that I'm going to need a lot of help with + +00:06:47.840 --> 00:06:49.719 +because there's quite a few of those APIs. + +00:06:49.720 --> 00:06:53.519 +But I imagine, I have no idea, no way of knowing, + +00:06:53.520 --> 00:06:56.459 +but I imagine we don't need 100% of them + +00:06:56.460 --> 00:06:58.167 +in order to run most of Elpa. + +00:06:58.168 --> 00:07:05.084 +We probably can get some of the important large Elpa packages + +00:07:05.085 --> 00:07:12.719 +like Magit and Org mode with just enough of the Emacs Lisp + +00:07:12.720 --> 00:07:14.959 +built-in functions to handle that. + +00:07:14.960 --> 00:07:19.279 +But we won't really know until we've tried. + +00:07:19.280 --> 00:07:22.519 +So yeah, I'll try to get this bug fixed right away. + +00:07:22.520 --> 00:07:24.979 +That way we can all start working on it together, hopefully. + +00:07:24.980 --> 00:07:27.126 +Highly relatable answer there. + +00:07:27.127 --> 00:07:31.959 +We'll burn that bridge when we're on it or something. + +00:07:31.960 --> 00:07:34.559 +What are your thoughts on chicken scheme? + +00:07:34.560 --> 00:07:37.199 +Will that be a good fit? Do you think? + +00:07:37.200 --> 00:07:41.039 +I think it will be, um, I, I did show + +00:07:41.040 --> 00:07:44.959 +trying to run chicken scheme in my, um, presentation + +00:07:44.960 --> 00:07:48.839 +and, uh, I ran up against some kind of issue, + +00:07:48.840 --> 00:07:51.079 +which I really don't know how to debug. + +00:07:51.080 --> 00:07:55.879 +Um, it's probably something to do with the, uh, pattern matcher. + +00:07:55.880 --> 00:07:58.919 +Um, I'm using the pattern matcher, + +00:07:58.920 --> 00:08:00.599 +uh, written by Alex shin, + +00:08:00.600 --> 00:08:02.599 +which seems to be the most portable. + +00:08:02.600 --> 00:08:05.919 +Pattern matcher, uh, for our seven RS scheme. + +00:08:05.920 --> 00:08:13.519 +But not all scheme compilers implement, what is it called? + +00:08:13.520 --> 00:08:19.559 +The macro, I can't remember what it's called. + +00:08:19.560 --> 00:08:24.199 +There's the macro expansion system for R7 RS small. + +00:08:24.200 --> 00:08:27.199 +All of these scheme implementations + +00:08:27.200 --> 00:08:29.319 +seem to have a slightly different take on how they work. + +00:08:29.320 --> 00:08:33.919 +And so that macro expander has been, for pattern matching, + +00:08:33.920 --> 00:08:35.719 +has been the biggest difficulty + +00:08:35.720 --> 00:08:37.359 +in making this code portable. + +00:08:37.360 --> 00:08:42.239 +And so I'm thinking of ways of maybe trying to ditch pattern matching, + +00:08:42.240 --> 00:08:44.999 +but that's such a useful feature and it's hard. + +00:08:45.000 --> 00:08:49.879 +So I don't know, we'll see if I can, + +00:08:49.880 --> 00:08:52.439 +if somebody can help me get it to work on chicken team, + +00:08:52.440 --> 00:08:56.599 +I'd really appreciate it. + +00:08:56.600 --> 00:09:01.799 +Can this implementation be used by Guile's Emacs Lisp mode? + +00:09:01.800 --> 00:09:08.199 +Guile's Emacs list mode. Okay. Yeah, good question. + +00:09:08.200 --> 00:09:10.919 +I did mention this last year in my presentation. + +00:09:10.920 --> 00:09:13.719 +Emacs list in Guile is totally different + +00:09:13.720 --> 00:09:16.199 +from what I've done. + +00:09:16.200 --> 00:09:21.292 +That implementation was written about 10 or 15 years ago. + +00:09:21.293 --> 00:09:26.501 +I can't remember exactly when. It is quite incomplete. + +00:09:26.502 --> 00:09:36.542 +I don't think it even runs most of the macro expanding code. + +00:09:36.543 --> 00:09:39.679 +Some of the code that is written + +00:09:39.680 --> 00:09:42.479 +for GNU Emacs in Emacs Lisp, + +00:09:42.480 --> 00:09:45.679 +where GNU Emacs is initializing itself, + +00:09:45.680 --> 00:09:51.319 +it can't even get the first file in that code. + +00:09:51.320 --> 00:09:53.479 +It hasn't been touched in 10 or 15 years. + +00:09:53.480 --> 00:09:57.239 +Initially, when I first started this project, + +00:09:57.240 --> 00:09:59.159 +I was using the parser + +00:09:59.160 --> 00:10:02.319 +for Guile's Emacs Lisp implementation, + +00:10:02.320 --> 00:10:05.319 +but it didn't give me things like source locations, + +00:10:05.320 --> 00:10:10.639 +so I had to rewrite that. And also, it wasn't portable. + +00:10:10.640 --> 00:10:14.279 +So yeah, because I want it to be portable, + +00:10:14.280 --> 00:10:16.919 +it's necessarily going to be not reliant + +00:10:16.920 --> 00:10:19.119 +on anything that's inside of the Guile library, + +00:10:19.120 --> 00:10:21.479 +including the Emacs LISP interpreter that's there. + +00:10:21.480 --> 00:10:24.959 +Maybe I could replace the Emacs LISP interpreter in Guile + +00:10:24.960 --> 00:10:29.599 +if Andy Wingo would be interested. All right. + +00:10:29.600 --> 00:10:31.599 +And I see we've got a few people + +00:10:31.600 --> 00:10:34.039 +that did jump into the BBB. + +00:10:34.040 --> 00:10:37.159 +I'm just going to quickly, oops. + +00:10:37.160 --> 00:10:40.679 +quickly try to make my text a little bigger + +00:10:40.680 --> 00:10:42.799 +so I can read a question that came here. + +00:10:42.800 --> 00:10:48.479 +I wonder if we can do some sort of pragmatic analysis + +00:10:48.480 --> 00:10:49.959 +on popular Emacs packages + +00:10:49.960 --> 00:10:52.399 +to see what list of functions they tend to depend on + +00:10:52.400 --> 00:10:54.799 +while a function calls down to the lower level. + +00:10:54.800 --> 00:10:57.209 +Yeah, that would be good. + +00:10:57.210 --> 00:11:02.251 +Somebody please do that for me. Awesome. + +00:11:02.252 --> 00:11:05.439 +Somebody's raising their hand. Divya. + +00:11:05.440 --> 00:11:08.799 +Let's see. Yeah, can you hear me? + +00:11:08.800 --> 00:11:12.359 +Yes, I can. Yeah, go ahead. Hello, thank you. + +00:11:12.360 --> 00:11:14.079 +Yeah, this is really awesome. + +00:11:14.080 --> 00:11:16.959 +I use Guile, and I love Guile, + +00:11:16.960 --> 00:11:18.919 +and I also love functional programming, + +00:11:18.920 --> 00:11:21.599 +so this is really nice that you took + +00:11:21.600 --> 00:11:22.719 +the declarative approach. + +00:11:22.720 --> 00:11:26.319 +One thing that I'm interested in is, + +00:11:26.320 --> 00:11:29.839 +are you also considering Racket in the scheme group? + +00:11:29.840 --> 00:11:32.959 +Because I know a lot of people do not consider Racket + +00:11:32.960 --> 00:11:36.639 +as a sort of scheme thing, because it grew out of it. + +00:11:36.640 --> 00:11:39.519 +Do you think you'll take something from Racket? + +00:11:39.520 --> 00:11:42.119 +Because I think Racket has + +00:11:42.120 --> 00:11:44.519 +a lot of good ideas that can be used. + +00:11:44.520 --> 00:11:48.439 +Yeah, I briefly looked at Racket's GUI library, + +00:11:48.440 --> 00:11:51.879 +but it's very, very heavily dependent + +00:11:51.880 --> 00:11:53.839 +on Racket's macro expander, + +00:11:53.840 --> 00:11:57.679 +which is, well, yeah, the macro expander + +00:11:57.680 --> 00:11:59.679 +is extremely complex for Racket, + +00:11:59.680 --> 00:12:02.159 +and I don't think it's possible to port it to any other scheme, + +00:12:02.160 --> 00:12:07.679 +as far as I know. But Racket is based on SheaScheme. + +00:12:07.680 --> 00:12:14.479 +And I am making an effort to port my code to Shea's scheme. + +00:12:14.480 --> 00:12:18.639 +I mentioned this earlier, + +00:12:18.640 --> 00:12:22.159 +but there's the Gwen Weinholdt Aku system, + +00:12:22.160 --> 00:12:25.439 +which allows you to translate R7RS to R6RS. + +00:12:25.440 --> 00:12:28.519 +And since Shea is an R6RS compiler, + +00:12:28.520 --> 00:12:33.919 +I did at one point get the Emacs Lisp interpreter + +00:12:33.920 --> 00:12:34.919 +to compile for Shea, + +00:12:34.920 --> 00:12:38.239 +although I think There's been a change + +00:12:38.240 --> 00:12:40.479 +either to Aku or somewhere in my own code base. + +00:12:40.480 --> 00:12:42.879 +It doesn't build anymore, and I'm not sure why. + +00:12:42.880 --> 00:12:47.039 +But I would also very much like to run this on Che. + +00:12:47.040 --> 00:12:54.679 +And I guess in that sense, we'll be able to work on Racket as well. + +00:12:54.680 --> 00:12:56.199 +There's also one other option. + +00:12:56.200 --> 00:13:03.519 +Alexis King has written an R7RS language package for Racket. + +00:13:03.520 --> 00:13:05.039 +I have not yet tried. + +00:13:05.040 --> 00:13:08.479 +running my package on R7RS for Racket. + +00:13:08.480 --> 00:13:11.599 +But that would be something interesting. + +00:13:11.600 --> 00:13:12.919 +Yes, I would like to try that. + +00:13:12.920 --> 00:13:13.919 +Yeah, it'll be interesting. + +00:13:13.920 --> 00:13:15.839 +I do have some experience with chairs. + +00:13:15.840 --> 00:13:17.479 +So, uh, if I can find some time, + +00:13:17.480 --> 00:13:21.239 +I'll, I'll, I'll certainly like to, I would appreciate. + +00:13:21.240 --> 00:13:24.039 +Yes. Yeah. Go ahead. Yeah. + +00:13:24.040 --> 00:13:26.079 +Another question I have is, like, + +00:13:26.080 --> 00:13:29.199 +what exactly is sort of, like, the, the approach is that + +00:13:29.200 --> 00:13:31.479 +you'll 1st want to do the interpreter + +00:13:31.480 --> 00:13:33.799 +and then have enough list functions. + +00:13:33.800 --> 00:13:36.479 +Uh, getting the max list functions + +00:13:36.480 --> 00:13:38.119 +interpreted or interpretable. + +00:13:38.120 --> 00:13:40.999 +And then go for GUI or do you want + +00:13:41.000 --> 00:13:42.759 +to sort of like go hand in hand + +00:13:42.760 --> 00:13:45.679 +is like we have the interpreter working on + +00:13:45.680 --> 00:13:46.959 +and we have also the GUI + +00:13:46.960 --> 00:13:53.199 +and we sort of use one for the other. + +00:13:53.200 --> 00:13:56.479 +Yeah, I consider the two tasks to be parallel. + +00:13:56.480 --> 00:13:59.639 +So I'm actually doing the GUI separately. + +00:13:59.640 --> 00:14:05.519 +The reason why is because the GUI for Schemacs + +00:14:05.520 --> 00:14:10.279 +is really just a clone of the look and feel of Emacs. + +00:14:10.280 --> 00:14:14.679 +It's not like an actual clone of the low-level C code + +00:14:14.680 --> 00:14:16.039 +that puts everything on screen. + +00:14:16.040 --> 00:14:18.679 +And I'm actually not really that interested + +00:14:18.680 --> 00:14:21.439 +in the low-level details + +00:14:21.440 --> 00:14:23.479 +of how Emacs draws things on screen either. + +00:14:23.480 --> 00:14:26.839 +I think it has a lot of historical baggage, + +00:14:26.840 --> 00:14:28.839 +and I'm actually trying to move away from that. + +00:14:28.840 --> 00:14:31.759 +So that was part of the reason why I started + +00:14:31.760 --> 00:14:36.399 +with this React.js or Vue.js-like Reactive GUI framework. + +00:14:36.400 --> 00:14:39.519 +So that GUI part is completely separate. + +00:14:39.520 --> 00:14:42.239 +And I want to worry about the details + +00:14:42.240 --> 00:14:46.719 +of how we make the GUI look and feel + +00:14:46.720 --> 00:14:50.319 +similar in Schemacs, similar to GNU Emacs. + +00:14:50.320 --> 00:14:54.799 +In Schemacs, using the Emacs programming language, + +00:14:54.800 --> 00:14:59.319 +I think that's something that we should worried about + +00:14:59.320 --> 00:15:03.399 +after we have enough of the Emacs list implemented. + +00:15:03.400 --> 00:15:04.919 +Yeah, that makes sense. + +00:15:04.920 --> 00:15:06.679 +There are sort of, I'm a bit worried. + +00:15:06.680 --> 00:15:10.599 +So, I don't know if, so one of my presentations + +00:15:10.600 --> 00:15:11.479 +is going to be tomorrow. + +00:15:11.480 --> 00:15:13.119 +I'm working on something called Emacs Viewer. + +00:15:13.120 --> 00:15:15.319 +It's a document viewer in Emacs. + +00:15:15.320 --> 00:15:17.679 +And essentially one of the issues that I'm up against + +00:15:17.680 --> 00:15:20.359 +is that Emacs's display system + +00:15:20.360 --> 00:15:25.439 +is sort of very let's say, not flexible. + +00:15:25.440 --> 00:15:31.839 +When trying to analyze where this inflexibility comes from, + +00:15:31.840 --> 00:15:35.759 +I don't think it's just the display architecture. + +00:15:35.760 --> 00:15:38.319 +I think parts of eLISP itself + +00:15:38.320 --> 00:15:43.599 +are connected to the display architecture. + +00:15:43.600 --> 00:15:48.399 +The notion of a cell in a buffer, + +00:15:48.400 --> 00:15:52.199 +itself is connected tightly to + +00:15:52.200 --> 00:15:54.519 +how the re-display architecture works. + +00:15:54.520 --> 00:15:57.199 +So I think you'll have to sort of figure out + +00:15:57.200 --> 00:16:00.679 +what exactly you can salvage from ELISP + +00:16:00.680 --> 00:16:05.199 +without taking the display architecture baggage. + +00:16:05.200 --> 00:16:08.001 +That's right. I do anticipate + +00:16:08.002 --> 00:16:09.876 +that's going to be fairly challenging. + +00:16:09.877 --> 00:16:14.584 +It's all Turing-complete, + +00:16:14.585 --> 00:16:17.879 +so I imagine we're probably going to end up + +00:16:17.880 --> 00:16:21.039 +creating something like an emulator + +00:16:21.040 --> 00:16:24.319 +for the Emacs Lisp display architecture in Scheme + +00:16:24.320 --> 00:16:27.559 +that will somehow translate down + +00:16:27.560 --> 00:16:30.039 +to the React-like protocol that I've written. + +00:16:30.040 --> 00:16:32.719 +But yeah, I don't I haven't that's nice. + +00:16:32.720 --> 00:16:36.319 +No, this is this is very exciting. Yeah. Oh Yes, it is. + +00:16:36.320 --> 00:16:39.559 +Yeah, I'm glad so like a lot of people have told me + +00:16:39.560 --> 00:16:41.679 +that they really Are excited to see this project + +00:16:41.680 --> 00:16:42.719 +and this really helps me + +00:16:42.720 --> 00:16:46.399 +You know keep focused on this project + +00:16:46.400 --> 00:16:48.319 +because a lot of people are very interested. + +00:16:48.320 --> 00:16:50.359 +So It's so I'd like to move on + +00:16:50.360 --> 00:16:52.159 +to a couple of questions from the past. + +00:16:52.160 --> 00:16:54.479 +We're starting to build up a good backlog. + +00:16:54.480 --> 00:16:59.719 +Thank you for that. Yeah Next question from the pad I have. + +00:16:59.720 --> 00:17:02.239 +Can you tell us more about the show stopping bug? + +00:17:02.240 --> 00:17:04.159 +How to squash it? How can people help? + +00:17:04.160 --> 00:17:08.799 +OK, well, that one, unfortunately, I think, + +00:17:08.800 --> 00:17:11.679 +unless you're really a scheme genius + +00:17:11.680 --> 00:17:13.799 +and you can really read my code + +00:17:13.800 --> 00:17:15.479 +and immediately understand how it all works, + +00:17:15.480 --> 00:17:18.319 +I don't think you'd be able to help. + +00:17:18.320 --> 00:17:22.599 +It shouldn't be too difficult for me to fix. + +00:17:22.600 --> 00:17:26.639 +So it has to do with how closures work. + +00:17:26.640 --> 00:17:30.719 +And a closure is basically an object + +00:17:30.720 --> 00:17:33.159 +that can be created with stuff that's on the stack. + +00:17:33.160 --> 00:17:37.079 +And this is a feature, I think, + +00:17:37.080 --> 00:17:39.679 +that was introduced with Emacs 27. + +00:17:39.680 --> 00:17:40.879 +I can't remember exactly, + +00:17:40.880 --> 00:17:43.439 +but it's actually a relatively recent feature. + +00:17:43.440 --> 00:17:45.879 +It was ever since they introduced + +00:17:45.880 --> 00:17:50.999 +lexically scoped variable bindings in Emacs Lisp. + +00:17:51.000 --> 00:17:54.519 +And so yeah, the problem is that + +00:17:54.520 --> 00:17:59.839 +when you create like a let structure + +00:17:59.840 --> 00:18:01.799 +and you could declare a variable in the let. + +00:18:01.800 --> 00:18:05.399 +And then you create inside of that a second let structure, + +00:18:05.400 --> 00:18:07.239 +and you have a lambda inside of that. + +00:18:07.240 --> 00:18:11.319 +And the lambda references or uses a variable + +00:18:11.320 --> 00:18:14.399 +that was declared in the outer let binding. + +00:18:14.400 --> 00:18:18.279 +That outer let binding is somewhere on the stack. + +00:18:18.280 --> 00:18:22.999 +And the lambda you can actually return it as a value. + +00:18:23.000 --> 00:18:25.319 +So when you do return that lambda, + +00:18:25.320 --> 00:18:27.679 +it has to have a note somewhere inside + +00:18:27.680 --> 00:18:31.279 +that says, by the way, I'm using that variable. + +00:18:31.280 --> 00:18:34.359 +So you need to capture it and restore it to the stack + +00:18:34.360 --> 00:18:38.199 +whenever this lambda is applied, whenever you execute it. + +00:18:38.200 --> 00:18:40.959 +And that is where the error is. + +00:18:40.960 --> 00:18:44.399 +It's not capturing the stack variable properly. + +00:18:44.400 --> 00:18:46.879 +And I think what I'm going to do, + +00:18:46.880 --> 00:18:49.759 +I haven't looked into it in detail yet + +00:18:49.760 --> 00:18:53.279 +because I've gone back to GUI stuff recently, + +00:18:53.280 --> 00:18:55.479 +but what I'm going to do, I think, + +00:18:55.480 --> 00:18:57.799 +is just do a static analysis + +00:18:57.800 --> 00:18:59.079 +of the code inside of the Lambda + +00:18:59.080 --> 00:19:02.919 +and see which symbols are being used, + +00:19:02.920 --> 00:19:05.079 +and then just capture all of those + +00:19:05.080 --> 00:19:07.559 +and place those into the record type + +00:19:07.560 --> 00:19:09.519 +that stores the lambda. + +00:19:09.520 --> 00:19:12.679 +That's how I'm going to fix that, I think. + +00:19:12.680 --> 00:19:15.999 +I hope anyway that's going to work. + +00:19:16.000 --> 00:19:17.239 +You never know with bugs. + +00:19:17.240 --> 00:19:21.759 +They're always a little bit tricky. Okay, next question. + +00:19:21.760 --> 00:19:23.119 +Are there performance concerns + +00:19:23.120 --> 00:19:28.479 +with implementing certain C primitives in PeerScheme? + +00:19:28.480 --> 00:19:32.879 +So who is it? The famous computer scientist that said + +00:19:32.880 --> 00:19:35.879 +premature optimization is the root of all evil. + +00:19:35.880 --> 00:19:39.799 +I think it was the guy who invented the A star algorithm. + +00:19:39.800 --> 00:19:42.719 +His name escapes me at the minute. + +00:19:42.720 --> 00:19:49.359 +But yeah, I'm not concerned about performance yet, + +00:19:49.360 --> 00:19:52.119 +although most of the scheme compilers that I have seen, + +00:19:52.120 --> 00:19:56.999 +especially Shea and Gambit + +00:19:57.000 --> 00:20:02.039 +have extremely good performance characteristics. + +00:20:02.040 --> 00:20:03.679 +And so I think there won't be + +00:20:03.680 --> 00:20:05.879 +too much difficulty with performance, + +00:20:05.880 --> 00:20:08.759 +even implementing some of the C stuff. + +00:20:08.760 --> 00:20:10.759 +And besides, a lot of the GUI stuff + +00:20:10.760 --> 00:20:12.719 +is already written in C anyway. + +00:20:12.720 --> 00:20:14.399 +I mean, it would be cool + +00:20:14.400 --> 00:20:16.879 +if we had a scheme GUI library + +00:20:16.880 --> 00:20:18.599 +that painted to a canvas, + +00:20:18.600 --> 00:20:21.639 +maybe for a Wayland implementation or something. + +00:20:21.640 --> 00:20:29.079 +But I don't know. It's not a concern for me, performance. + +00:20:29.080 --> 00:20:32.079 +Okay, there are a few more questions. I do want to mention + +00:20:32.080 --> 00:20:33.839 +that the stream has cut away at this point, + +00:20:33.840 --> 00:20:36.279 +but we're still recording live. + +00:20:36.280 --> 00:20:38.799 +All of this will be put up on the website + +00:20:38.800 --> 00:20:40.399 +and so on like that. + +00:20:40.400 --> 00:20:44.199 +So, I appreciate all the enthusiastic questions + +00:20:44.200 --> 00:20:47.799 +and you're kind of tanking through them all. + +00:20:47.800 --> 00:20:52.799 +Me too. I love how many questions I'm getting. + +00:20:52.800 --> 00:20:54.039 +This is very encouraging + +00:20:54.040 --> 00:20:55.999 +and it really makes me want to keep on working on it. + +00:20:56.000 --> 00:20:56.879 +So it's great. + +00:20:56.880 --> 00:21:00.199 +I'm so glad to hear that because that's exactly the message + +00:21:00.200 --> 00:21:01.439 +I think you should be receiving. + +00:21:01.440 --> 00:21:04.159 +This is a fantastic project. Thank you so much. + +00:21:04.160 --> 00:21:08.439 +I'll just say so myself. If the project is successful, + +00:21:08.440 --> 00:21:11.479 +are you worried about a possible split in the community + +00:21:11.480 --> 00:21:15.599 +between Schemacs and GNU Emacs? + +00:21:15.600 --> 00:21:18.959 +Oh, I have thought about that. + +00:21:18.960 --> 00:21:24.039 +And I really don't know what's going to happen. + +00:21:24.040 --> 00:21:26.239 +There seems to be already a huge demand + +00:21:26.240 --> 00:21:30.439 +for a scheme-based, a modern scheme-based editor. + +00:21:30.440 --> 00:21:33.399 +You know, the Edwin scheme for MIT scheme + +00:21:33.400 --> 00:21:37.279 +hasn't been touched since like 1987 or something, + +00:21:37.280 --> 00:21:41.439 +maybe 1993 or, but anyway. + +00:21:41.440 --> 00:21:43.159 +There seems to be huge demand. + +00:21:43.160 --> 00:21:45.119 +And so I guess a lot of people + +00:21:45.120 --> 00:21:47.679 +who are currently using GNU Emacs + +00:21:47.680 --> 00:21:49.079 +will probably just switch over + +00:21:49.080 --> 00:21:50.479 +because they've been wanting + +00:21:50.480 --> 00:21:53.159 +something like this for a very long time. + +00:21:53.160 --> 00:21:56.559 +And then, I mean, is that going to cause fragmentation? + +00:21:56.560 --> 00:21:58.679 +Is it really a big deal, though? + +00:21:58.680 --> 00:22:02.479 +I mean, it's all GPL-licensed code. + +00:22:02.480 --> 00:22:08.759 +I mean, I think a rising tide raises all the ships at the same time. + +00:22:08.760 --> 00:22:13.279 +So, yeah, also, the last thing I want to say about that + +00:22:13.280 --> 00:22:18.999 +is I would like to contribute some of what I do in Schemacs + +00:22:19.000 --> 00:22:24.399 +back into GNU Emacs, if I can. So, for example, I'm going + +00:22:24.400 --> 00:22:25.959 +to be working on like a canvas library + +00:22:25.960 --> 00:22:27.879 +where you can have interactive canvases + +00:22:27.880 --> 00:22:30.879 +and you know you can actually like draw pictures + +00:22:30.880 --> 00:22:33.559 +and put things with the mouse and drag things around. + +00:22:33.560 --> 00:22:36.079 +And I was thinking you know + +00:22:36.080 --> 00:22:37.667 +if if I can figure out how that works + +00:22:37.668 --> 00:22:41.917 +maybe I can write something like that for Emacs + +00:22:41.918 --> 00:22:47.759 +or GNU Emacs using the Cairo library, you know, + +00:22:47.760 --> 00:22:49.319 +SVG rendering library that they have. + +00:22:49.320 --> 00:22:51.319 +So, you know, if I have time, + +00:22:51.320 --> 00:22:55.799 +I would like to continue contributing to GNU Emacs as well. + +00:22:55.800 --> 00:22:57.839 +I'm sorry, what was the name of the library you mentioned? + +00:22:57.840 --> 00:23:01.039 +Oh, Cairo, like Cairo. + +00:23:01.040 --> 00:23:07.599 +Oh, Cairo, yeah. Absolutely. I spelled that poorly. + +00:23:07.600 --> 00:23:12.519 +The dream of never needing to change to the web browser. + +00:23:12.520 --> 00:23:18.376 +Would schemacs bring us closer to that? I hope so. + +00:23:18.377 --> 00:23:21.709 +That's also a dream of mine. + +00:23:21.710 --> 00:23:26.479 +The part of the reason why I wanted to work, you know, + +00:23:26.480 --> 00:23:30.999 +make sure I had a really good workable GUI framework + +00:23:31.000 --> 00:23:32.626 +is so that I could, you know, + +00:23:32.627 --> 00:23:34.879 +we could write apps like, you know, + +00:23:34.880 --> 00:23:38.759 +they have a mastodon client written in Emacs Lisp. + +00:23:38.760 --> 00:23:42.199 +that would be so nice to have this, you know, + +00:23:42.200 --> 00:23:43.439 +a really nice Mastodon client + +00:23:43.440 --> 00:23:47.479 +that was right inside of, you know, our scheme environment + +00:23:47.480 --> 00:23:50.039 +where we were doing our text editing and other stuff. + +00:23:50.040 --> 00:23:52.079 +I've always wanted something like that, + +00:23:52.080 --> 00:23:53.799 +or it would be cool to have + +00:23:53.800 --> 00:23:56.319 +just a slightly nicer GUI for Magit. + +00:23:56.320 --> 00:24:04.199 +So, yeah, I mean, like, yeah, being able to avoid the web entirely + +00:24:04.200 --> 00:24:08.199 +and just be able to like, you know, do social networking + +00:24:08.200 --> 00:24:11.439 +and do your GitHub stuff, + +00:24:11.440 --> 00:24:14.759 +everything from within Emacs or Schemacs in this case, + +00:24:14.760 --> 00:24:16.919 +that's a dream of mine as well. + +00:24:16.920 --> 00:24:20.079 +And so I hope that that's where we end up in a couple of years. + +00:24:20.080 --> 00:24:29.999 +The sooner the better. Anything, just double checking. + +00:24:30.000 --> 00:24:33.319 +Anything specific other than minimalism + +00:24:33.320 --> 00:24:35.799 +that made you choose Scheme over Commonwealth? + +00:24:35.800 --> 00:24:40.199 +Oh, yeah, it's kind of a philosophical question. + +00:24:40.200 --> 00:24:45.559 +So a couple of things. First of all, it was a conversation + +00:24:45.560 --> 00:24:47.399 +I had with William Byrd, + +00:24:47.400 --> 00:24:50.519 +and he's a guy who makes the Mini Conran framework for Scheme. + +00:24:50.520 --> 00:24:52.879 +It was his PhD thesis. + +00:24:52.880 --> 00:24:57.119 +He worked with, I'm sorry, I just can't remember his name. + +00:24:57.120 --> 00:24:59.679 +He worked at the University of Indiana. + +00:24:59.680 --> 00:25:03.839 +Another famous Scheme or Lisp person was there. + +00:25:03.840 --> 00:25:06.279 +Friedman, Dan Friedman was his advisor. + +00:25:06.280 --> 00:25:09.159 +Yeah, big name in Lisp. + +00:25:09.160 --> 00:25:12.839 +Anyway, so I was talking with William Byrd, + +00:25:12.840 --> 00:25:14.639 +and I'm a huge Haskell fan, + +00:25:14.640 --> 00:25:16.919 +and he told me why he didn't like Haskell at all, + +00:25:16.920 --> 00:25:19.639 +and kind of convinced me to try Scheme out. + +00:25:19.640 --> 00:25:22.759 +And what I really like about Scheme is, + +00:25:22.760 --> 00:25:25.399 +yeah, like you said, the minimalism, + +00:25:25.400 --> 00:25:29.839 +but it's more that it is very close + +00:25:29.840 --> 00:25:34.879 +to the mathematical framework of lambda calculus. + +00:25:34.880 --> 00:25:38.519 +Haskell is probably the most pure + +00:25:38.520 --> 00:25:39.919 +lambda calculus that I've ever used, + +00:25:39.920 --> 00:25:45.519 +but Scheme is like the simply typed lambda calculus, + +00:25:45.520 --> 00:25:47.799 +and That just appeals to me. + +00:25:47.800 --> 00:25:50.839 +I think, you know, if you have this tiny, tiny core language + +00:25:50.840 --> 00:25:55.599 +from which all of the computing can be defined, + +00:25:55.600 --> 00:25:57.119 +I think it's kind of a shame + +00:25:57.120 --> 00:26:00.079 +that so far we just haven't explored that space yet. + +00:26:00.080 --> 00:26:03.639 +I mean, there's compared to JavaScript or Python, + +00:26:03.640 --> 00:26:05.879 +there's very little scheme code out there + +00:26:05.880 --> 00:26:08.239 +and it could be doing so much. And I would just like to try + +00:26:08.240 --> 00:26:10.159 +and expand the scheme ecosystem + +00:26:10.160 --> 00:26:12.999 +and see just what this tiny little language can do. + +00:26:13.000 --> 00:26:14.479 +And I think we haven't even seen + +00:26:14.480 --> 00:26:16.839 +a fraction of what it can do. + +00:26:16.840 --> 00:26:22.399 +That's why I've chosen scheme. + +00:26:22.400 --> 00:26:24.719 +Divya, I see you've got a bunch more comments. + +00:26:24.720 --> 00:26:26.679 +I think we're just about close to our time here, + +00:26:26.680 --> 00:26:28.279 +but if you wanted to jump back in, + +00:26:28.280 --> 00:26:30.519 +I'm sorry, I had to cut you off a little before. + +00:26:30.520 --> 00:26:33.959 +No, it's fine. No, it's fine. + +00:26:33.960 --> 00:26:36.599 +I think I agree with most of what he said. + +00:26:36.600 --> 00:26:40.679 +So, yeah, thank you so much. + +00:26:40.680 --> 00:26:45.159 +Um, closing thoughts, Ramin. + +00:26:45.160 --> 00:26:51.639 +Yeah, I guess everybody, please, if you're interested, + +00:26:51.640 --> 00:26:56.719 +keep watching my Mastodon and keep watching my Codeberg. + +00:26:56.720 --> 00:27:01.559 +I'm going to try and squash this bug as quickly as I can. + +00:27:01.560 --> 00:27:03.279 +I hope early next year, + +00:27:03.280 --> 00:27:07.519 +hopefully not much later than February, + +00:27:07.520 --> 00:27:12.039 +I'll actually be able to start taking in contributions + +00:27:12.040 --> 00:27:16.719 +for some of the Emacs Lisp built-ins in the code base. + +00:27:16.720 --> 00:27:21.959 +So, please keep watching. The pace of my development + +00:27:21.960 --> 00:27:24.279 +has increased pretty rapidly recently, + +00:27:24.280 --> 00:27:25.839 +and I think we're pretty close + +00:27:25.840 --> 00:27:29.119 +to getting something that we can all use together. + +00:27:29.120 --> 00:27:31.719 +Thank you once again for your amazing talk, + +00:27:31.720 --> 00:27:34.039 +for your exceptional work, + +00:27:34.040 --> 00:27:36.599 +and for jumping in, doing the live Q&A, + +00:27:36.600 --> 00:27:40.039 +rolling with us here as we have yet another + +00:27:40.040 --> 00:27:42.079 +We'll See How It Goes conference. + +00:27:42.080 --> 00:27:44.279 +It's been just amazing so far, + +00:27:44.280 --> 00:27:46.839 +and this talk is no small part of that. Thank you. + +00:27:46.840 --> 00:27:50.279 +Oh, thank you so much. Yeah. OK, cool. + +00:27:50.280 --> 00:27:51.834 +And thanks for all the questions, everyone. diff --git a/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--main--chapters.vtt b/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--main--chapters.vtt new file mode 100644 index 00000000..d266d618 --- /dev/null +++ b/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--main--chapters.vtt @@ -0,0 +1,29 @@ +WEBVTT + + +00:02:07.200 --> 00:04:24.759 +The scope of the project + +00:04:24.760 --> 00:05:49.719 +Difference with Robin Templeton's project (Guile-Emacs) + +00:05:49.720 --> 00:07:28.039 +Progress made since last year + +00:07:28.040 --> 00:09:06.039 +Portable React-like GUI + +00:09:06.040 --> 00:11:48.699 +Demo + +00:11:48.700 --> 00:14:12.019 +Additional changes + +00:14:12.020 --> 00:17:06.199 +Other Scheme implementations + +00:17:06.200 --> 00:21:51.519 +GUI framework + +00:21:51.520 --> 00:23:14.113 +Wrapping up diff --git a/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--main.vtt b/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--main.vtt new file mode 100644 index 00000000..ed301c1c --- /dev/null +++ b/2025/captions/emacsconf-2025-schemacs--one-year-progress-update-schemacs-formerly-gypsum--ramin-honary--main.vtt @@ -0,0 +1,1183 @@ +WEBVTT captioned by sachac
+
+00:00:01.060 --> 00:00:05.639
+Hi, EmacsConf 2025. My name is Ramin Honary,
+
+00:00:05.640 --> 00:00:07.559
+and I'd like to talk to you today
+
+00:00:07.560 --> 00:00:10.399
+about my project called Schemacs
+
+00:00:10.400 --> 00:00:12.079
+which I presented last year.
+
+00:00:12.080 --> 00:00:13.879
+Back then it was called "Gypsum"
+
+00:00:13.880 --> 00:00:18.319
+and the name has since changed.
+
+00:00:18.320 --> 00:00:20.239
+So my name is Ramin Honary.
+
+00:00:20.240 --> 00:00:24.999
+I'm an Emacs enthusiast, have been since 2017 or so.
+
+00:00:25.000 --> 00:00:27.759
+I'm a full stack software developer.
+
+00:00:27.760 --> 00:00:29.300
+I love Haskell, Scheme,
+
+00:00:29.301 --> 00:00:31.433
+anything functional programming related,
+
+00:00:31.434 --> 00:00:32.959
+and of course Emacs.
+
+00:00:32.960 --> 00:00:36.199
+I started learning Scheme about three years ago,
+
+00:00:36.200 --> 00:00:37.999
+and this is my third time presenting
+
+00:00:38.000 --> 00:00:40.799
+at EmacsConf.
+
+00:00:40.800 --> 00:00:46.479
+So the Schemacs project that I'm talking to,
+
+00:00:46.480 --> 00:00:48.159
+I'm talking about to you today,
+
+00:00:48.160 --> 00:00:50.279
+was originally called "Gypsum".
+
+00:00:50.280 --> 00:00:53.359
+The reason I did not call it "Schemacs"
+
+00:00:53.360 --> 00:00:58.119
+was that the name "Schemacs" was taken on GitHub.
+
+00:00:58.120 --> 00:00:59.567
+But in the past year,
+
+00:00:59.568 --> 00:01:02.119
+I was able to get the permission
+
+00:01:02.120 --> 00:01:04.479
+of the author of GitHub's Schemacs
+
+00:01:04.480 --> 00:01:08.840
+project to name my project the same thing,
+
+00:01:08.841 --> 00:01:11.320
+even though it's a very similar project.
+
+00:01:11.321 --> 00:01:14.719
+So I changed the name.
+
+00:01:14.720 --> 00:01:19.700
+Let me see if I can quickly show the screen.
+
+00:01:19.701 --> 00:01:24.959
+So yeah, I have archived the old project.
+
+00:01:24.960 --> 00:01:27.719
+It's still there, but there's an explanation in
+
+00:01:27.720 --> 00:01:30.167
+the readme file and a screen grab
+
+00:01:30.168 --> 00:01:31.599
+of the conversation I had
+
+00:01:31.600 --> 00:01:36.119
+with the original author of GitHub Schemacs.
+
+00:01:36.120 --> 00:01:38.679
+My Schemacs is not on GitHub at all.
+
+00:01:38.680 --> 00:01:43.879
+It's only on Codeberg. So please don't get confused.
+
+00:01:43.880 --> 00:01:45.999
+But yes, I received permission
+
+00:01:46.000 --> 00:01:50.199
+to change the name and so I did.
+
+00:01:50.200 --> 00:01:52.839
+And I would like to give a quick shout-out to
+
+00:01:52.840 --> 00:01:57.239
+user "Tusharhero" for helping me with that.
+
+00:01:57.240 --> 00:02:02.639
+This person really helped make that name change happen.
+
+00:02:02.640 --> 00:02:07.199
+So back to the slides.
+
+NOTE The scope of the project
+
+00:02:07.200 --> 00:02:11.319
+And so now I'd like to clarify the scope of the project.
+
+00:02:11.320 --> 00:02:13.000
+I don't think I quite made it clear
+
+00:02:13.001 --> 00:02:14.919
+well enough last year,
+
+00:02:14.920 --> 00:02:18.400
+but... Although I'm definitely cloning
+
+00:02:18.401 --> 00:02:20.167
+the Emacs Lisp programming language,
+
+00:02:20.168 --> 00:02:25.267
+the actual scope of the Schemacs project
+
+00:02:25.268 --> 00:02:29.759
+is to make an Emacs-like app platform for Scheme.
+
+00:02:29.760 --> 00:02:32.959
+I don't consider Emacs to be a text editor.
+
+00:02:32.960 --> 00:02:38.199
+I consider Emacs to be a Lisp app platform.
+
+00:02:38.200 --> 00:02:39.839
+So it's similar to something like the
+
+00:02:39.840 --> 00:02:48.539
+World Wide Web, or Microsoft's .NET app platform, or Java.
+
+00:02:48.540 --> 00:02:52.559
+These are all examples of app platforms.
+
+00:02:52.560 --> 00:02:55.119
+I would like Schemacs to make it easy
+
+00:02:55.120 --> 00:02:59.399
+for not only people to use it for
+
+00:02:59.400 --> 00:03:03.479
+things like editing text or, you know, for
+
+00:03:03.480 --> 00:03:06.439
+using your computer through a command line
+
+00:03:06.440 --> 00:03:10.599
+or manipulating your Git repository.
+
+00:03:10.600 --> 00:03:13.159
+I'd also like you to be able to create simple
+
+00:03:13.160 --> 00:03:16.119
+GUIs or TUIs using Scheme.
+
+00:03:16.120 --> 00:03:19.319
+So that's also one of the goals of this project.
+
+00:03:19.320 --> 00:03:23.079
+It will of course have an Emacs-like text editor,
+
+00:03:23.080 --> 00:03:24.999
+and I will clone Emacs Lisp.
+
+00:03:25.000 --> 00:03:29.879
+So hopefully GNU Emacs users
+
+00:03:29.880 --> 00:03:32.779
+will feel comfortable moving over to Schemacs
+
+00:03:32.780 --> 00:03:35.679
+because they'll be able to use your init.
+
+00:03:35.680 --> 00:03:40.399
+You'll be able to use your init.el file.
+
+00:03:40.400 --> 00:03:43.239
+So configuring and scripting Schemacs
+
+00:03:43.240 --> 00:03:44.479
+should be done in Scheme.
+
+00:03:44.480 --> 00:03:47.679
+I'd like to encourage scripting in Scheme
+
+00:03:47.680 --> 00:03:51.199
+and creating new workflows and macros in Scheme.
+
+00:03:51.200 --> 00:03:54.267
+It will support Emacs Lisp depending on
+
+00:03:54.268 --> 00:03:59.319
+how much of the Emacs Lisp interpreter I can clone.
+
+00:03:59.320 --> 00:04:03.039
+That will be supported but not encouraged.
+
+00:04:03.040 --> 00:04:06.319
+But you should still be able to run your init.el.
+
+00:04:06.320 --> 00:04:08.839
+And I would like it to be good enough,
+
+00:04:08.840 --> 00:04:09.999
+this Emacs Lisp interpreter
+
+00:04:10.000 --> 00:04:12.999
+should be good enough to run packages from ELPA.
+
+00:04:13.000 --> 00:04:15.879
+Although it will probably be some time
+
+00:04:15.880 --> 00:04:17.559
+before it will be able to run
+
+00:04:17.560 --> 00:04:24.759
+something as large as Org Mode or Magit.
+
+NOTE Difference with Robin Templeton's project (Guile-Emacs)
+
+00:04:24.760 --> 00:04:27.439
+It is slightly different from the Guile-Emacs project.
+
+00:04:27.440 --> 00:04:30.333
+This is the work of Robin Templeton
+
+00:04:30.334 --> 00:04:32.219
+who presented last year.
+
+00:04:32.220 --> 00:04:36.033
+Guile-Emacs links the Guile runtime
+
+00:04:36.034 --> 00:04:38.500
+into the Emacs executable.
+
+00:04:38.501 --> 00:04:41.580
+It's not a Scheme application. Emacs,
+
+00:04:41.581 --> 00:04:44.200
+the core of Emacs is written in C.
+
+00:04:44.201 --> 00:04:48.120
+Guile, the core of Guile is written in C.
+
+00:04:48.121 --> 00:04:53.700
+What Robin Templeton has done is, at the C level, linked
+
+00:04:53.701 --> 00:04:56.833
+"libguile.so" into Emacs and then provided
+
+00:04:56.834 --> 00:04:59.500
+a programming layer where you can
+
+00:04:59.501 --> 00:05:04.759
+call the Scheme interpreter from Emacs Lisp
+
+00:05:04.760 --> 00:05:11.279
+so that you can run Scheme programs from within Emacs
+
+00:05:11.280 --> 00:05:13.919
+without having to launch a separate process
+
+00:05:13.920 --> 00:05:18.039
+and communicate over a channel such as a socket.
+
+00:05:18.040 --> 00:05:19.839
+You won't need "SLIME" or anything.
+
+00:05:19.840 --> 00:05:23.419
+The Guile interpreter is just right there inside of Emacs.
+
+00:05:23.420 --> 00:05:25.999
+But my project is not like this at all.
+
+00:05:26.000 --> 00:05:28.879
+Schemacs is written completely from the ground up
+
+00:05:28.880 --> 00:05:34.999
+in R7RS-compliant Scheme. And because it's R7RS-compliant,
+
+00:05:35.000 --> 00:05:37.999
+it's not bound to any one particular Scheme implementation,
+
+00:05:38.000 --> 00:05:39.879
+although Guile is the reference implementation.
+
+00:05:39.880 --> 00:05:42.359
+One goal of this project is to be able to run
+
+00:05:42.360 --> 00:05:49.719
+Schemacs on any R7RS-compliant Scheme implementation.
+
+NOTE Progress made since last year
+
+00:05:49.720 --> 00:05:56.259
+The work that I've done this past year mostly is internal.
+
+00:05:56.260 --> 00:06:00.939
+There's not much that you can see on the surface.
+
+00:06:00.940 --> 00:06:04.519
+But the most... One of the most important things that I
+
+00:06:04.520 --> 00:06:06.839
+did was I rewrote the parser in R7RS Scheme,
+
+00:06:06.840 --> 00:06:07.919
+so it no longer depends on
+
+00:06:07.920 --> 00:06:11.999
+the Guile regular expressions library.
+
+00:06:12.000 --> 00:06:14.959
+The parser now also provides source locations,
+
+00:06:14.960 --> 00:06:18.939
+so if an error occurs in Emacs Lisp,
+
+00:06:18.940 --> 00:06:20.567
+there will be a stack trace
+
+00:06:20.568 --> 00:06:23.633
+and it will show you where in the source code
+
+00:06:23.634 --> 00:06:28.319
+the error occured. This was not possible last year.
+
+00:06:28.320 --> 00:06:30.860
+And because it no longer depends on Guile,
+
+00:06:30.861 --> 00:06:34.520
+I can make it work on multiple Scheme implementations.
+
+00:06:34.521 --> 00:06:36.820
+So far, I've been able to get it to run on
+
+00:06:36.821 --> 00:06:38.920
+the Chibi Scheme interpreter
+
+00:06:38.921 --> 00:06:41.280
+and the Gauche Scheme interpreter, as well as
+
+00:06:41.281 --> 00:06:44.279
+Guile, which is the reference implementation.
+
+00:06:44.280 --> 00:06:48.559
+For a short time, it did work also on Chez Scheme,
+
+00:06:48.560 --> 00:06:53.179
+the Chez Scheme compiler, using Gwen Weinholt's "Akku,"
+
+00:06:53.180 --> 00:06:59.299
+which is a program that translates R7RS Scheme to R6RS Scheme.
+
+00:06:59.300 --> 00:07:04.519
+And with that translation, because Chez Scheme
+
+00:07:04.520 --> 00:07:07.319
+is pretty strictly an R6RS compiler,
+
+00:07:07.320 --> 00:07:11.519
+the translation allows you to run R7RS programs.
+
+00:07:11.520 --> 00:07:15.219
+But due to some change, I'm not sure where,
+
+00:07:15.220 --> 00:07:17.119
+it may have been changed in the Schemacs source code,
+
+00:07:17.120 --> 00:07:19.639
+or it may have been a change to Akku,
+
+00:07:19.640 --> 00:07:21.239
+but it no longer builds on Chez.
+
+00:07:21.240 --> 00:07:28.039
+It did at one point. I'd like to try to fix that.
+
+NOTE Portable React-like GUI
+
+00:07:28.040 --> 00:07:30.719
+The second most important thing that I've worked on is a
+
+00:07:30.720 --> 00:07:36.439
+portable React-like GUI. And so React,
+
+00:07:36.440 --> 00:07:40.999
+for anyone who has done web programming,
+
+00:07:41.000 --> 00:07:46.839
+is a very popular framework for programming web applications.
+
+00:07:46.840 --> 00:07:48.233
+And I've provided something
+
+00:07:48.234 --> 00:07:49.599
+very similar to that in Scheme now.
+
+00:07:49.600 --> 00:07:54.679
+So it works. I have constructed a DOM data structure
+
+00:07:54.680 --> 00:07:59.079
+in Scheme. It's just an ordinary Scheme data structure.
+
+00:07:59.080 --> 00:08:01.519
+It works like the web's "Document Object Model"
+
+00:08:01.520 --> 00:08:03.960
+or the "DOM" data structure.
+
+00:08:03.961 --> 00:08:09.999
+And then this Scheme DOM data structure can be rendered
+
+00:08:10.000 --> 00:08:13.059
+using any GUI framework that is convenient
+
+00:08:13.060 --> 00:08:16.239
+for the Scheme implementation that you're targeting.
+
+00:08:16.240 --> 00:08:18.879
+And you should be able to implement
+
+00:08:18.880 --> 00:08:22.919
+also rendering to a CLI as well.
+
+00:08:22.920 --> 00:08:24.600
+The current reference implementation
+
+00:08:24.601 --> 00:08:27.759
+is using a framework called Guile-GI.
+
+00:08:27.760 --> 00:08:30.639
+This is the "GObject Introspection" framework.
+
+00:08:30.640 --> 00:08:31.967
+It's a very simple
+
+00:08:31.968 --> 00:08:36.119
+GObject Introspection framework for Guile,
+
+00:08:36.120 --> 00:08:40.979
+and it binds to GTK3 on Linux.
+
+00:08:40.980 --> 00:08:42.919
+There's a similar framework called G-Golf
+
+00:08:42.920 --> 00:08:48.359
+which I'd like to begin using as well, also for Guile.
+
+00:08:48.360 --> 00:08:53.739
+G-Golf seems to be a bit more well-maintained, a bit...
+
+00:08:53.740 --> 00:08:57.799
+It has better features. G-Golf may be a
+
+00:08:57.800 --> 00:09:00.039
+better rendering backend for the reference
+
+00:09:00.040 --> 00:09:06.039
+implementation, but I would like to provide both.
+
+NOTE Demo
+
+00:09:06.040 --> 00:09:07.933
+I will give a demo of this now.
+
+00:09:07.934 --> 00:09:12.999
+Unfortunately not a whole lot
+
+00:09:13.000 --> 00:09:18.139
+to see compared to last year.
+
+00:09:18.140 --> 00:09:20.639
+First thing I'd like to show is
+
+00:09:20.640 --> 00:09:24.279
+that I now have a Makefile. You can look inside
+
+00:09:24.280 --> 00:09:28.400
+this Makefile and if you're able to read a Makefile,
+
+00:09:28.401 --> 00:09:31.967
+you can see that I have several targets now available.
+
+00:09:31.968 --> 00:09:35.000
+You can build Schemacs for Guile,
+
+00:09:35.001 --> 00:09:36.667
+you can build Schemacs for Gambit,
+
+00:09:36.668 --> 00:09:40.333
+or Stklos, or Chicken, or Chez,
+
+00:09:40.334 --> 00:09:42.900
+although none of these (except for Guile)
+
+00:09:42.901 --> 00:09:51.167
+currently works. These targets will actually
+
+00:09:51.168 --> 00:09:56.000
+build the source code, but then you would have to
+
+00:09:56.001 --> 00:09:59.433
+load it into the REPL separately.
+
+00:09:59.434 --> 00:10:02.467
+There are targets for launching
+
+00:10:02.468 --> 00:10:06.467
+a Gauche REPL and a Chibi REPL.
+
+00:10:06.468 --> 00:10:10.867
+You can also run the Emacs Lisp tests
+
+00:10:10.868 --> 00:10:13.067
+in Gauche and Chibi.
+
+00:10:13.068 --> 00:10:19.079
+You can also start a Guile REPL through this Makefile.
+
+00:10:19.080 --> 00:10:27.499
+So I will do that right now in the shell.
+
+00:10:27.500 --> 00:10:31.833
+(...make the text larger...there we go...)
+
+00:10:31.834 --> 00:10:38.479
+OK, so we have this directory of the source code.
+
+00:10:38.480 --> 00:10:44.559
+Let's just begin by running "guile.sh".
+
+00:10:44.560 --> 00:10:52.600
+This will launch a REPL and you can load "main-guile".
+
+00:10:52.601 --> 00:10:59.719
+This will launch the GUI. This is the basic
+
+00:10:59.720 --> 00:11:04.800
+proof of concept GUI that uses Guile-GI.
+
+00:11:04.801 --> 00:11:10.519
+So it may be hard to see.
+
+00:11:10.520 --> 00:11:14.559
+I cannot change the size of the text yet.
+
+00:11:14.560 --> 00:11:17.333
+I've implemented the M-: feature
+
+00:11:17.334 --> 00:11:24.067
+where you can eval in a minibuffer some Scheme code.
+
+00:11:24.068 --> 00:11:34.439
+(string-append "hello" ...)
+
+00:11:34.440 --> 00:11:38.279
+It outputs the result in the buffer.
+
+00:11:38.280 --> 00:11:40.959
+This is basically the "*Messages*" buffer.
+
+00:11:40.960 --> 00:11:42.619
+And that's all the more that I have.
+
+00:11:42.620 --> 00:11:45.479
+This is the same state it was in last year.
+
+00:11:45.480 --> 00:11:48.699
+It hasn't changed a whole lot since back then.
+
+NOTE Additional changes
+
+00:11:48.700 --> 00:11:52.819
+But I have made additional changes.
+
+00:11:52.820 --> 00:12:05.379
+So first of all, you can run
+
+00:12:05.380 --> 00:12:10.200
+(let me just go back into the Guile)... you can
+
+00:12:10.201 --> 00:12:16.619
+run the Emacs Lisp interpreter tests, so "elisp-tests".
+
+00:12:16.620 --> 00:12:18.919
+As you can see, it gives you a stack trace.
+
+00:12:18.920 --> 00:12:22.039
+So this is an error that I've been able to reproduce.
+
+00:12:22.040 --> 00:12:24.599
+I know exactly what the cause of this error is.
+
+00:12:24.600 --> 00:12:27.599
+It is not finding a variable
+
+00:12:27.600 --> 00:12:30.319
+because the closure is not correctly
+
+00:12:30.320 --> 00:12:35.199
+capturing its environment. So there should be a variable
+
+00:12:35.200 --> 00:12:38.719
+in the closure, but that variable has not been captured
+
+00:12:38.720 --> 00:12:43.459
+and so it is causing an error.
+
+00:12:43.460 --> 00:12:48.080
+It is currently loading "byte-run.el".
+
+00:12:48.081 --> 00:12:49.820
+Let me show you what code that is here.
+
+00:12:49.821 --> 00:12:53.500
+So I've copied into the source repository
+
+00:12:53.501 --> 00:12:58.760
+for Schemacs some of the Elisp code from GNU Emacs.
+
+00:12:58.761 --> 00:13:04.420
+So I have this "subr.el".
+
+00:13:04.421 --> 00:13:09.860
+This declares most of the core of Emacs Lisp
+
+00:13:09.861 --> 00:13:12.860
+that's not written in C.
+
+00:13:12.861 --> 00:13:18.999
+There's also "byte-run.el". Schemacs Emacs Lisp can now
+
+00:13:19.000 --> 00:13:24.379
+evaluate this. This is where functions like "defun" are
+
+00:13:24.380 --> 00:13:28.359
+defined, and "defmacro". So as you can see,
+
+00:13:28.360 --> 00:13:30.799
+defun itself is a defmacro defined right here.
+
+00:13:30.800 --> 00:13:34.859
+It's written in Emacs Lisp itself,
+
+00:13:34.860 --> 00:13:37.719
+defined in terms of defalias.
+
+00:13:37.720 --> 00:13:40.239
+So I can evaluate "byte-run",
+
+00:13:40.240 --> 00:13:42.739
+I can evaluate "macroexp",
+
+00:13:42.740 --> 00:13:46.019
+and the failure occurs somewhere in "subr.el".
+
+00:13:46.020 --> 00:13:48.959
+Although if you look at the stack trace,
+
+00:13:48.960 --> 00:13:51.159
+it doesn't provide all the necessary information.
+
+00:13:51.160 --> 00:13:56.439
+So it appears to be happening in byte-run.el.
+
+00:13:56.440 --> 00:14:00.619
+Really, it's an error that's occurring inside of a macro,
+
+00:14:00.620 --> 00:14:05.799
+and the macro call site is somewhere in subr.el.
+
+00:14:05.800 --> 00:14:08.639
+Anyway, take note of this stack trace.
+
+00:14:08.640 --> 00:14:12.019
+This was run from within Guile.
+
+NOTE Other Scheme implementations
+
+00:14:12.020 --> 00:14:14.199
+Now what I've done this past year
+
+00:14:14.200 --> 00:14:19.479
+is make it work on other Scheme implementations.
+
+00:14:19.480 --> 00:14:23.833
+Use "make" to launch a Gauche REPL.
+
+00:14:23.834 --> 00:14:25.999
+Now I'm inside of Gauche.
+
+00:14:26.000 --> 00:14:27.233
+This is the command that
+
+00:14:27.234 --> 00:14:30.079
+you would use to launch a Gauche REPL.
+
+00:14:30.080 --> 00:14:38.199
+And I can load the same program (load "elisp-tests.scm").
+
+00:14:38.200 --> 00:14:42.759
+You get the exact same result as Guile.
+
+00:14:42.760 --> 00:14:45.799
+So we have two different Scheme implementations
+
+00:14:45.800 --> 00:14:46.799
+producing the same result.
+
+00:14:46.800 --> 00:14:53.079
+Let's try "make" a Chibi REPL. This is Chibi Scheme.
+
+00:14:53.080 --> 00:15:00.219
+And you can (load "elisp-tests.scm").
+
+00:15:00.220 --> 00:15:04.080
+Chibi is a bit slower, but you get the exact same result.
+
+00:15:04.081 --> 00:15:07.400
+So we have three different Scheme implementations
+
+00:15:07.401 --> 00:15:11.539
+all running Emacs Lisp,
+
+00:15:11.540 --> 00:15:14.039
+and all producing the same result.
+
+00:15:14.040 --> 00:15:14.767
+I think that's...
+
+00:15:14.768 --> 00:15:17.099
+I'm fairly proud of that accomplishment.
+
+00:15:17.100 --> 00:15:21.200
+I was able to get the code written to the point
+
+00:15:21.201 --> 00:15:24.879
+where it actually runs on multiple implementations.
+
+00:15:24.880 --> 00:15:30.599
+You can also try making it for other Scheme compilers
+
+00:15:30.600 --> 00:15:35.959
+like "schemacs-mitscheme" for example,
+
+00:15:35.960 --> 00:15:40.019
+but this will fail.
+
+00:15:40.020 --> 00:15:46.679
+You can try building it for "schemacs-chez",
+
+00:15:46.680 --> 00:15:51.800
+Let's try Chez... there we go.
+
+00:15:51.801 --> 00:15:54.233
+And it will use Akku,
+
+00:15:54.234 --> 00:15:58.000
+and it will fetch the necessary dependencies.
+
+00:15:58.001 --> 00:16:03.433
+But it fails, and I haven't been able to
+
+00:16:03.434 --> 00:16:05.959
+debug that quite yet.
+
+00:16:05.960 --> 00:16:13.139
+Stklos fails for a similar reason.
+
+00:16:13.140 --> 00:16:21.699
+Gambit... Chicken still doesn't build all the way yet.
+
+00:16:21.700 --> 00:16:27.120
+The Makefile at least has places for it.
+
+00:16:27.121 --> 00:16:30.967
+If anyone can help me out and get Schemacs to compile
+
+00:16:30.968 --> 00:16:32.733
+on these other Scheme implementations,
+
+00:16:32.734 --> 00:16:34.000
+I'd appreciate it.
+
+00:16:34.001 --> 00:16:35.467
+I can probably figure it out myself,
+
+00:16:35.468 --> 00:16:37.000
+but that will take more time.
+
+00:16:37.001 --> 00:16:40.120
+And let me just show you quickly
+
+00:16:40.121 --> 00:16:41.720
+the test program.
+
+00:16:41.721 --> 00:16:44.500
+Basically this is the Emacs Lisp test program
+
+00:16:44.501 --> 00:16:48.580
+that I was just running, and it produces an error.
+
+00:16:48.581 --> 00:16:53.220
+All it does is it loads these files here in this order,
+
+00:16:53.221 --> 00:16:55.180
+and it fails right around here.
+
+00:16:55.181 --> 00:16:58.319
+So it's able to load these two.
+
+00:16:58.320 --> 00:17:01.360
+And yeah, that's what I've accomplished
+
+00:17:01.361 --> 00:17:06.199
+on the Emacs Lisp side of things.
+
+NOTE GUI framework
+
+00:17:06.200 --> 00:17:09.119
+The next thing I want to show you is the GUI framework
+
+00:17:09.120 --> 00:17:13.199
+that I've written, which I'm fairly proud of so far.
+
+00:17:13.200 --> 00:17:15.833
+So this is the GUI framework
+
+00:17:15.834 --> 00:17:19.919
+(oops, I better launch it again, OK...)
+
+00:17:19.920 --> 00:17:22.600
+and let me show you the tests.
+
+00:17:22.601 --> 00:17:25.700
+So here in the tests, you can start to see
+
+00:17:25.701 --> 00:17:29.067
+some examples of how you use it.
+
+00:17:29.068 --> 00:17:31.833
+So here is a "counter" test, and this is kind of like
+
+00:17:31.834 --> 00:17:35.940
+the "hello world" of reactive programming frameworks,
+
+00:17:35.941 --> 00:17:38.000
+where you have a state variable,
+
+00:17:38.200 --> 00:17:41.659
+sometimes called an "observable."
+
+00:17:41.660 --> 00:17:43.439
+I'm calling it "number",
+
+00:17:43.440 --> 00:17:47.838
+and it uses "=" to check if the state has updated.
+
+00:17:49.000 --> 00:17:52.820
+If an update occurs and the new value is different
+
+00:17:52.821 --> 00:17:55.032
+from the old value according to the "=" function,
+
+00:17:55.033 --> 00:17:59.232
+then trigger a state update in the GUI as well.
+
+00:17:59.233 --> 00:18:03.099
+Initialize to 0, bound to "number".
+
+00:18:03.100 --> 00:18:06.132
+I have a "button" function which creates a simple button.
+
+00:18:06.133 --> 00:18:07.832
+It takes a label and an action.
+
+00:18:07.833 --> 00:18:10.865
+Right here you see the "div" command.
+
+00:18:10.866 --> 00:18:13.039
+This is what creates a "div".
+
+00:18:13.040 --> 00:18:18.999
+Using the properties, I describe that this div is a
+
+00:18:19.000 --> 00:18:22.599
+push-button and the "on-button-push" is an action.
+
+00:18:22.600 --> 00:18:25.265
+The action is to update the variable "number"
+
+00:18:25.266 --> 00:18:30.399
+using whatever function or lambda was provided to it.
+
+00:18:30.400 --> 00:18:31.965
+And then the content that you see on screen,
+
+00:18:31.966 --> 00:18:34.033
+that you will see on screen when it runs,
+
+00:18:34.034 --> 00:18:38.667
+is here. You create a "div-pack cut-vertical".
+
+00:18:38.668 --> 00:18:43.233
+You declare two buttons and then you declare
+
+00:18:43.234 --> 00:18:46.800
+this "use-vars" which will take the content
+
+00:18:46.801 --> 00:18:48.833
+of this variable here, this observable,
+
+00:18:48.834 --> 00:18:51.733
+and place it into the GUI next to the buttons here.
+
+00:18:51.734 --> 00:18:54.233
+So what you will see on screen is
+
+00:18:54.234 --> 00:18:57.067
+a "plus" button which increments,
+
+00:18:57.068 --> 00:18:59.320
+here is the "increment" function,
+
+00:18:59.321 --> 00:19:02.779
+a "minus" button which decrements,
+
+00:19:02.780 --> 00:19:05.479
+and then the content of the variable that is
+
+00:19:05.480 --> 00:19:09.699
+being incremented and decremented.
+
+00:19:09.700 --> 00:19:11.865
+The advantage of these reactive frameworks is that
+
+00:19:11.866 --> 00:19:13.065
+with very few lines of code
+
+00:19:13.066 --> 00:19:16.032
+you can create fairly complex interfaces.
+
+00:19:16.033 --> 00:19:18.599
+The less code you have to write,
+
+00:19:18.600 --> 00:19:21.232
+the fewer chances you have to make mistakes.
+
+00:19:21.233 --> 00:19:23.967
+So let's just run this program.
+
+00:19:23.968 --> 00:19:33.292
+This was the "counter-test."
+
+00:19:33.293 --> 00:19:35.199
+And that is the debug window. Here's the "counter."
+
+00:19:35.200 --> 00:19:38.452
+I'm sorry it's not much larger than this.
+
+00:19:38.453 --> 00:19:41.132
+But here's the "plus" button, the "minus" button,
+
+00:19:41.133 --> 00:19:43.919
+and here's the "number", 0.
+
+00:19:43.920 --> 00:19:49.792
+And I can increment or decrement as much as I like.
+
+00:19:49.793 --> 00:19:51.100
+So yeah, that's kind of the hello world
+
+00:19:51.101 --> 00:19:55.239
+of reactive programming. (I'll reboot the REPL...)
+
+00:19:55.240 --> 00:19:58.599
+The next thing I want to show you is this layout test.
+
+00:19:58.600 --> 00:20:02.192
+And I'll just run the test first.
+
+00:20:02.193 --> 00:20:05.019
+So here we have basically
+
+00:20:05.020 --> 00:20:08.539
+a tiling window manager kind of thing,
+
+00:20:08.540 --> 00:20:11.279
+where you can resize the tiles
+
+00:20:11.280 --> 00:20:12.933
+and then by clicking on these buttons here,
+
+00:20:12.934 --> 00:20:16.939
+you can change the layout.
+
+00:20:16.940 --> 00:20:20.167
+So you can do two on the right,
+
+00:20:20.168 --> 00:20:27.100
+two up above, or three up above. So, yeah.
+
+00:20:27.101 --> 00:20:30.267
+Those tiling windows, as you can see,
+
+00:20:30.268 --> 00:20:33.000
+once I work this branch into the main branch of Schemacs,
+
+00:20:33.001 --> 00:20:35.273
+I can use that to implement
+
+00:20:35.274 --> 00:20:38.265
+the split window functionality for Schemacs,
+
+00:20:38.266 --> 00:20:42.466
+the editor. So here's what this split...
+
+00:20:42.466 --> 00:20:44.865
+Here's the layout test that you just saw.
+
+00:20:44.866 --> 00:20:46.732
+Let me make it a bit smaller
+
+00:20:46.733 --> 00:20:48.199
+so that it all fits on one screen.
+
+00:20:48.200 --> 00:20:51.365
+So basically we have the "button" command again,
+
+00:20:51.366 --> 00:20:54.132
+and then these are the button actions
+
+00:20:54.133 --> 00:20:56.999
+which basically just changes the layout,
+
+00:20:57.000 --> 00:21:01.459
+and then I have the layout. So this layout is a "div."
+
+00:21:01.460 --> 00:21:04.919
+The first div just places three buttons in a row.
+
+00:21:04.920 --> 00:21:07.532
+The next layout is a div within a div.
+
+00:21:07.533 --> 00:21:12.999
+So we have one div which places the button
+
+00:21:13.000 --> 00:21:18.632
+called "two right" buttons, and the div above it,
+
+00:21:18.633 --> 00:21:21.492
+which places the "three in a row" button
+
+00:21:21.493 --> 00:21:22.660
+or the "two above" buttons.
+
+00:21:22.661 --> 00:21:26.000
+And here's the next... So there's three different
+
+00:21:26.001 --> 00:21:30.600
+layouts, and clicking on one of their associated buttons
+
+00:21:30.601 --> 00:21:32.100
+will just change the layout.
+
+00:21:32.101 --> 00:21:33.433
+As you can see, very little code
+
+00:21:33.434 --> 00:21:38.500
+to create a somewhat complex user interface.
+
+00:21:38.501 --> 00:21:42.867
+That's the advantage of using reactive or declarative
+
+00:21:42.868 --> 00:21:44.233
+UI programming paradigms.
+
+00:21:44.234 --> 00:21:47.232
+So yeah, this has not been merged into Schemacs
+
+00:21:47.233 --> 00:21:48.700
+at the time of this recording,
+
+00:21:48.701 --> 00:21:51.519
+but will be soon hopefully.
+
+NOTE Wrapping up
+
+00:21:51.520 --> 00:21:55.165
+So yeah, I think I've already gone on for 20 minutes.
+
+00:21:55.166 --> 00:21:59.139
+So I guess I'll just end my presentation here.
+
+00:21:59.140 --> 00:22:00.465
+I have lots more to talk about.
+
+00:22:00.466 --> 00:22:03.979
+I guess I will say one last thing before I go:
+
+00:22:03.980 --> 00:22:07.065
+that I would very much like for others
+
+00:22:07.066 --> 00:22:09.199
+to try and contribute to this project.
+
+00:22:09.200 --> 00:22:14.232
+I will do my best to try and help teach anybody
+
+00:22:14.233 --> 00:22:16.832
+or work with anybody, especially even
+
+00:22:16.833 --> 00:22:18.599
+if you don't have much experience with Scheme.
+
+00:22:18.600 --> 00:22:22.759
+I'd like to help everybody try to contribute.
+
+00:22:22.760 --> 00:22:26.239
+Basically I want to get this proof of concept working.
+
+00:22:26.240 --> 00:22:30.673
+I want to get a stable user interface up and running,
+
+00:22:30.674 --> 00:22:33.065
+and then we can start working on
+
+00:22:33.066 --> 00:22:36.699
+improving the Emacs Lisp interpreter all together.
+
+00:22:36.700 --> 00:22:41.065
+There are close to 1,400 built-in functions
+
+00:22:41.066 --> 00:22:43.659
+which need to be implemented.
+
+00:22:43.660 --> 00:22:44.965
+We don't need to get all of them
+
+00:22:44.966 --> 00:22:48.465
+in order to be able to run probably most of ELPA,
+
+00:22:48.466 --> 00:22:50.865
+but as much as possible.
+
+00:22:50.866 --> 00:22:54.799
+We would like to clone Emacs Lisp and I need help.
+
+00:22:54.800 --> 00:23:02.579
+So get a hold of me. My project is on Codeberg.
+
+00:23:02.580 --> 00:23:06.919
+Well, (oh, I can't show this here),
+
+00:23:06.920 --> 00:23:14.113
+but I will end it there. Thank you for listening.
diff --git a/2025/captions/emacsconf-2025-sun-close--sunday-closing-remarks--main.vtt b/2025/captions/emacsconf-2025-sun-close--sunday-closing-remarks--main.vtt new file mode 100644 index 00000000..d2ad3832 --- /dev/null +++ b/2025/captions/emacsconf-2025-sun-close--sunday-closing-remarks--main.vtt @@ -0,0 +1,676 @@ +WEBVTT + +00:00:00.000 --> 00:00:17.279 +screen. That screen. Yes. All right. Thank you so much. + +00:00:17.280 --> 00:00:22.439 +We have made it thus far. It is the end of EmacsConf 2025. + +00:00:22.440 --> 00:00:24.359 +Oh, I better remember to open this + +00:00:24.360 --> 00:00:32.999 +in case anyone wants to join me in this room. + +00:00:49.460 --> 00:00:51.139 +Hang on a sec. And normally all this stuff + +00:00:51.140 --> 00:00:52.959 +gets done automatically by my scripts, + +00:00:52.960 --> 00:00:55.250 +so I'm doing it manually. Ah, there you go. + +00:00:55.251 --> 00:00:58.125 +Okay, now people can join. Hooray, we made it! + +00:00:58.126 --> 00:01:01.439 +Today was great, and yesterday was great too, + +00:01:01.440 --> 00:01:06.519 +with so many fascinating talks and conversations. + +00:01:06.520 --> 00:01:09.599 +I'm really, really glad that it all worked out, + +00:01:09.600 --> 00:01:12.159 +despite some running around + +00:01:12.160 --> 00:01:14.679 +and figuring things out on the fly, + +00:01:14.680 --> 00:01:18.559 +we all managed to get there. + +00:01:18.560 --> 00:01:20.639 +I actually have some of the live + +00:01:20.640 --> 00:01:22.959 +talks recordings up already + +00:01:22.960 --> 00:01:28.399 +on media.emacsconf.org and YouTube, assuming things work. + +00:01:28.400 --> 00:01:33.319 +I'm just going to republish it from Emacs naturally. + +00:01:33.320 --> 00:01:36.359 +As you can see, I was e-debugging things + +00:01:36.360 --> 00:01:37.479 +to the very last minute. + +00:01:37.480 --> 00:01:39.799 +Yeah, feel free to spread the word. + +00:01:39.800 --> 00:01:42.519 +I check the Emacs hashtag every week + +00:01:42.520 --> 00:01:45.839 +as part of the Emacs news process anyway. + +00:01:45.840 --> 00:01:47.839 +So if you have any favorite talks, + +00:01:47.840 --> 00:01:52.039 +that's a great way to share the ideas with more people, + +00:01:52.040 --> 00:01:54.559 +and then even more conversations can happen. + +00:01:54.560 --> 00:01:58.079 +The prerecorded talks, as I mentioned, + +00:01:58.080 --> 00:02:00.239 +are already up on the wiki + +00:02:00.240 --> 00:02:05.199 +and at the media emacsconf.org slash 2027 website. + +00:02:05.200 --> 00:02:10.959 +Sorry, 2025. We're not in the time machine. 2025 site. + +00:02:10.960 --> 00:02:13.799 +And they should already be on YouTube as well. + +00:02:13.800 --> 00:02:16.399 +I will upload the late submissions + +00:02:16.400 --> 00:02:18.999 +and the live talks and the Q&A sessions + +00:02:19.000 --> 00:02:20.439 +over the next week or two. + +00:02:20.440 --> 00:02:23.199 +I usually get that done very quickly. + +00:02:23.200 --> 00:02:27.519 +I didn't even finish this sentence. + +00:02:27.520 --> 00:02:31.079 +I'll post an update to the Emacs Conf Discuss mailing list, + +00:02:31.080 --> 00:02:34.479 +so feel free to subscribe to that if you'd like an update. + +00:02:34.480 --> 00:02:37.559 +If you've got ideas for making things better, + +00:02:37.560 --> 00:02:40.959 +then feel free to drop them into the Etherpad + +00:02:40.960 --> 00:02:45.759 +so that we can make next year's conference even smoother. + +00:02:45.760 --> 00:02:51.119 +I had a lot of people watching, so thank you for that. + +00:02:51.120 --> 00:02:53.719 +And of course, thanks to all the speakers + +00:02:53.720 --> 00:02:56.359 +who put hours and hours into their presentations, + +00:02:56.360 --> 00:03:01.079 +the volunteers who helped both before and during the conference + +00:03:01.080 --> 00:03:03.439 +and who will help in the days ahead + +00:03:03.440 --> 00:03:08.919 +as we get everything extracted and packaged and transcribed even, + +00:03:08.920 --> 00:03:11.239 +and a nice chapter indices on the Q&A + +00:03:11.240 --> 00:03:14.399 +so you can jump to when a specific question was answered, + +00:03:14.400 --> 00:03:16.519 +all that good stuff. + +00:03:16.520 --> 00:03:19.799 +and to all those other people in their lives + +00:03:19.800 --> 00:03:23.479 +whose patience and support make all of this possible. + +00:03:23.480 --> 00:03:26.919 +So thank you so much for that. + +00:03:26.920 --> 00:03:30.199 +This year's host, you saw Corwin and you saw, + +00:03:30.200 --> 00:03:32.319 +I mean, what's, why am I, + +00:03:32.320 --> 00:03:34.439 +wait, I'm like buzzing all over the place + +00:03:34.440 --> 00:03:37.039 +as people are mentioning my nick on IRC. + +00:03:37.040 --> 00:03:40.319 +All right, now that I'm in do not disturb mode. + +00:03:40.320 --> 00:03:42.199 +So thank you to the hosts + +00:03:42.200 --> 00:03:43.839 +and thank you to other volunteers, + +00:03:43.840 --> 00:03:49.919 +JC and Trico and James and Amitav and Rodion and Jaybird and Indra. + +00:03:49.920 --> 00:03:55.119 +and Yang3, and Bhavin, and Michael, and Ian, + +00:03:55.120 --> 00:03:57.879 +and Jamie, and Ihor, and FlowyCoder, + +00:03:57.880 --> 00:03:58.839 +and probably other people + +00:03:58.840 --> 00:04:02.599 +that I have forgotten to copy out of my conference.org file + +00:04:02.600 --> 00:04:05.159 +and into this, but thank you anyway. + +00:04:05.160 --> 00:04:08.039 +Thank you to the Free Software Foundation. + +00:04:08.040 --> 00:04:12.159 +They host the mailing list, they host the media server, + +00:04:12.160 --> 00:04:16.359 +and of course, they've got like Emacs, so that's awesome. + +00:04:16.360 --> 00:04:23.479 +To make things easier, our streams are actually not on my computer. + +00:04:23.480 --> 00:04:26.279 +We use OBS and a server, + +00:04:26.280 --> 00:04:30.279 +a fairly beefy one that Ry P shares with us. + +00:04:30.280 --> 00:04:33.279 +So then I can VNC into it and control OBS + +00:04:33.280 --> 00:04:36.239 +and stream to IceCast and all that other goodness. + +00:04:36.240 --> 00:04:39.719 +And I don't have to worry about my computer stressing out. + +00:04:39.720 --> 00:04:43.439 +It's all good. And so we use a whole lot of free + +00:04:43.440 --> 00:04:45.519 +and open source software in the stack. + +00:04:45.520 --> 00:04:47.119 +So we are very, very grateful + +00:04:47.120 --> 00:04:49.159 +for all the users and contributors + +00:04:49.160 --> 00:04:50.759 +who make all of that possible. + +00:04:50.760 --> 00:04:55.919 +Things like Emacs and Org Mode and ERC and Tramp and Magit + +00:04:55.920 --> 00:04:59.159 +and BigBlueButton and Etherpad and IckyWicky and IceCast + +00:04:59.160 --> 00:05:02.319 +and OBS and TheLaunch and LiberaChat and FFmpeg + +00:05:02.320 --> 00:05:05.719 +and OpenAI Whisper, WhisperX, different interface. + +00:05:05.720 --> 00:05:09.639 +The Aeneas forced alignment tool, site transfer for uploads, + +00:05:09.640 --> 00:05:11.679 +subed for editing the subtitles, + +00:05:11.680 --> 00:05:14.439 +sub-seg for cutting the subtitles into nice chunks + +00:05:14.440 --> 00:05:17.399 +so that you're not like trying to read a whole lot in one line, + +00:05:17.400 --> 00:05:22.759 +Mozilla Firefox, MPV and TamperMonkey + +00:05:22.760 --> 00:05:25.919 +so that everything gets automatically logged in + +00:05:25.920 --> 00:05:30.479 +when the stream switches to like a big blue button room, it's handy. + +00:05:30.480 --> 00:05:32.999 +and of course, many other tools and services + +00:05:33.000 --> 00:05:35.199 +that we use to prepare and host this year's conference. + +00:05:35.200 --> 00:05:37.199 +Thanks to Shoshin for the music. + +00:05:37.200 --> 00:05:39.479 +He's an Emacs geek as well. + +00:05:39.480 --> 00:05:42.159 +If you also have music that you'd like to share with us + +00:05:42.160 --> 00:05:44.999 +under the Creative Commons Attribution License, + +00:05:45.000 --> 00:05:47.239 +please feel free to let me know + +00:05:47.240 --> 00:05:50.679 +or I should put in my email address here. + +00:05:50.680 --> 00:05:57.079 +Yeah, sacha@sachachua.com. + +00:05:57.080 --> 00:05:59.559 +So let us know in case you have music + +00:05:59.560 --> 00:06:01.599 +or other things you want to share. + +00:06:01.600 --> 00:06:03.599 +Thanks to the people who donated + +00:06:03.600 --> 00:06:06.439 +via the FSF working together program. + +00:06:06.440 --> 00:06:09.919 +It costs like I think less than a hundred dollars + +00:06:09.920 --> 00:06:11.319 +to run this whole thing + +00:06:11.320 --> 00:06:14.879 +that the biggest thing really is people's time. + +00:06:14.880 --> 00:06:17.119 +And thank you so much for sharing that with us. + +00:06:17.120 --> 00:06:20.719 +So yes, but thank you specifically to Scott and Jonathan + +00:06:20.720 --> 00:06:23.039 +and the other anonymous donors + +00:06:23.040 --> 00:06:26.479 +through the Working Together program. + +00:06:26.480 --> 00:06:30.199 +And that's where we are so far. Feel free to join me. + +00:06:30.200 --> 00:06:32.319 +I can be here until the kiddo says + +00:06:32.320 --> 00:06:34.719 +I have not given her enough hugs for today. + +00:06:34.720 --> 00:06:40.439 +But if you want to like do a quick recap of your favorite talks + +00:06:40.440 --> 00:06:43.719 +or how you're excited to take things going forward + +00:06:43.720 --> 00:06:45.159 +and all that stuff. + +00:06:45.160 --> 00:06:47.719 +You can join me in this as Sunday closing. + +00:06:47.720 --> 00:06:49.519 +If you look at the talk page, + +00:06:49.520 --> 00:06:51.999 +there's going to be theoretically + +00:06:52.000 --> 00:06:54.999 +a big blue button link there that you can join. + +00:06:55.000 --> 00:07:04.839 +But thank you for this. And now it's like awkward silence. + +00:07:04.840 --> 00:07:07.719 +I'm wondering what you learned most + +00:07:07.720 --> 00:07:09.519 +from this conference this year. + +00:07:09.520 --> 00:07:11.679 +Because I'm running around so much, + +00:07:11.680 --> 00:07:23.839 +I don't get a lot of the live stuff. + +00:07:23.840 --> 00:07:30.039 +Like, for example, when I was listening to your Q&A, + +00:07:30.040 --> 00:07:34.519 +I had it in one ear and I had Christian's dental casting Q&A in the other ear, + +00:07:34.520 --> 00:07:36.879 +so that just in case he had questions also. + +00:07:36.880 --> 00:07:39.559 +which kind of just meant I was listening for silences + +00:07:39.560 --> 00:07:43.199 +and that meant I had to read the next question out loud. + +00:07:43.200 --> 00:07:46.879 +But I love going through the videos and captioning them. + +00:07:46.880 --> 00:07:50.599 +And I'm really excited about the kinds of conversations + +00:07:50.600 --> 00:07:53.719 +that people have been having on the etherpacks and IRC. + +00:07:53.720 --> 00:07:57.039 +So I think the biggest thing that I'm learning + +00:07:57.040 --> 00:08:00.999 +is that people are having a lot of fun with Emacs. + +00:08:01.000 --> 00:08:05.199 +Which is no surprise, of course. + +00:08:05.200 --> 00:08:09.079 +But it's always so exciting to see people bump into other people + +00:08:09.080 --> 00:08:11.159 +whose minds work the same way. + +00:08:11.160 --> 00:08:17.639 +And then who knows where that will go over the next year, over the next years. + +00:08:17.640 --> 00:08:22.039 +That's sort of an interesting topic, + +00:08:22.040 --> 00:08:24.279 +is like how to keep the conversations + +00:08:24.280 --> 00:08:27.439 +going between the conferences, you know? + +00:08:27.440 --> 00:08:33.039 +is where do people hang out and discuss these things? + +00:08:33.040 --> 00:08:49.359 +Reddit's one place. IRC. I figure it's... Sorry, go ahead. I'm done. + +00:08:49.360 --> 00:08:54.879 +I think it's rather... + +00:08:54.880 --> 00:08:59.679 +I like to think of it as the start of the conversation. + +00:08:59.680 --> 00:09:08.159 +And so we have around 100 people, + +00:09:08.160 --> 00:09:12.639 +more than 100, around 200 people yesterday, + +00:09:12.640 --> 00:09:14.999 +around 100 today joining us. + +00:09:15.000 --> 00:09:16.999 +And those are a lot of conversations, + +00:09:17.000 --> 00:09:18.639 +but then they're the conversations that happen + +00:09:18.640 --> 00:09:22.399 +when people look up the videos and the captions + +00:09:22.400 --> 00:09:25.399 +and the resources that people have shared. + +00:09:25.400 --> 00:09:30.079 +And so I think it gives us a lot of material, + +00:09:30.080 --> 00:09:31.679 +a lot of exciting points + +00:09:31.680 --> 00:09:34.359 +for plenty of other conversations this year. + +00:09:34.360 --> 00:09:41.119 +Yeah, it's a great community. Oh, yes, I should mention, + +00:09:41.120 --> 00:09:42.799 +the conversation doesn't stop here + +00:09:42.800 --> 00:09:44.399 +because there are mailing lists. + +00:09:44.400 --> 00:09:45.999 +Thank you, Rudy, for the reminder. + +00:09:46.000 --> 00:09:50.759 +If you're looking for more of this kind of sense of community, + +00:09:50.760 --> 00:09:56.879 +there's like, well, Emacs Develop course has a lot of technical discussions going on, + +00:09:56.880 --> 00:10:00.559 +but the Org Mode mailing list is very nice. + +00:10:00.560 --> 00:10:02.719 +There are also lots of meetups. + +00:10:02.720 --> 00:10:05.199 +There's definitely a meetup every month. + +00:10:05.200 --> 00:10:10.639 +Org Meetup, in fact, is happening in a couple of days. + +00:10:10.640 --> 00:10:13.159 +If you look on the Emacs wiki for user groups, + +00:10:13.160 --> 00:10:14.719 +or you check my Emacs news, + +00:10:14.720 --> 00:10:16.959 +or you check, if you look for like Emacs calendar, + +00:10:16.960 --> 00:10:20.679 +which I think I put on like emacslife.com slash calendar, + +00:10:20.680 --> 00:10:22.639 +then you'll find upcoming meetups. + +00:10:22.640 --> 00:10:26.999 +so that you can keep reconnecting with people. + +00:10:27.000 --> 00:10:29.599 +And if you come up with something cool, + +00:10:29.600 --> 00:10:33.759 +you don't have to wait until the next Emacs Con + +00:10:33.760 --> 00:10:35.279 +to show it to everybody. + +00:10:35.280 --> 00:10:43.079 +You can also go to these meetups and start sharing it + +00:10:43.080 --> 00:10:53.319 +and get feedback and make it even better and so on. + +00:10:53.320 --> 00:10:56.399 +Great, thank you. Rudy says, the Emacs bugs mailing list + +00:10:56.400 --> 00:10:58.599 +is surprisingly interesting as well. + +00:10:58.600 --> 00:11:01.439 +Lots of discussion on there, various details + +00:11:01.440 --> 00:11:04.159 +and upcoming little features every single day. + +00:11:04.160 --> 00:11:37.999 +Oh yes, Maddie would like another shout out for Emacs Carnival + +00:11:38.000 --> 00:11:41.319 +which is a monthly blogging people share topics + +00:11:41.320 --> 00:11:46.999 +so that people can all write about the same thing + +00:11:47.000 --> 00:11:52.439 +and then discover other people's perspectives on it. + +00:11:52.440 --> 00:11:54.839 +There have been quite a few now. + +00:11:54.840 --> 00:11:57.759 +So if you want, you can go through the Emacs Carnival page + +00:11:57.760 --> 00:12:01.239 +in the Emacs wiki and start exploring the past issues. + +00:12:01.240 --> 00:12:04.039 +The host will have a list of links + +00:12:04.040 --> 00:12:07.079 +to the people who've submitted. So it's a great way to see + +00:12:07.080 --> 00:12:09.919 +what other people in the community + +00:12:09.920 --> 00:12:11.359 +have been thinking about something. + +00:12:11.360 --> 00:12:18.279 +Also, people are very curious about the fonts and templates + +00:12:18.280 --> 00:12:20.599 +that people use for their presentations. + +00:12:20.600 --> 00:12:22.599 +It's always, that's one of the things + +00:12:22.600 --> 00:12:23.959 +I love about presentations. + +00:12:23.960 --> 00:12:26.359 +You kind of get this, you pick up so much more + +00:12:26.360 --> 00:12:28.599 +when you're looking over someone's shoulder, + +00:12:28.600 --> 00:12:32.079 +the things that they would forget to even mention + +00:12:32.080 --> 00:12:34.199 +because it's not the point of their talk + +00:12:34.200 --> 00:12:36.839 +or they take it for granted. + +00:12:36.840 --> 00:12:40.519 +So, yes. if the presenters can share their fonts + +00:12:40.520 --> 00:12:44.479 +and setups and themes and stuff like that. + +00:12:44.480 --> 00:12:47.279 +Or if you as a viewer have been watching something + +00:12:47.280 --> 00:12:50.639 +and you see someone do this really cool keyword shortcut + +00:12:50.640 --> 00:12:53.279 +and you have no idea how they did that, + +00:12:53.280 --> 00:12:56.119 +because of course, you know, it just flies by too quickly + +00:12:56.120 --> 00:12:57.639 +and it's part of their muscle memory, + +00:12:57.640 --> 00:12:59.239 +so they don't even explain it anymore. + +00:12:59.240 --> 00:13:01.799 +Go ahead and ask the speakers, hey, + +00:13:01.800 --> 00:13:05.799 +that command that you did, that just did the magic, how? + +00:13:05.800 --> 00:13:11.759 +So yes, please feel free to go back over the videos, + +00:13:11.760 --> 00:13:12.679 +look at them slowly, + +00:13:12.680 --> 00:13:45.079 +look for interesting things you want to learn more about. + +00:13:45.080 --> 00:13:49.159 +All right, it sounds like we are + +00:13:49.160 --> 00:13:53.239 +pretty much ready to wrap up. + +00:13:53.240 --> 00:13:58.999 +So thank you, everyone, for coming. + +00:13:59.000 --> 00:14:01.519 +See you next year and also in the months in between + +00:14:01.520 --> 00:14:02.479 +because there are meetups, + +00:14:02.480 --> 00:14:04.039 +which you're going to go check out and have fun at. + +00:14:04.040 --> 00:14:05.879 +Thank you for this. + +00:14:05.880 --> 00:14:07.919 +Yes, thank you for this nice Emacs weekend. + +00:14:07.920 --> 00:14:14.319 +Thanks for putting it all together, Sacha and everyone. + +00:14:14.320 --> 00:14:19.326 +That's great. Bye! diff --git a/2025/captions/emacsconf-2025-sun-open--sunday-opening-remarks--main--chapters.vtt b/2025/captions/emacsconf-2025-sun-open--sunday-opening-remarks--main--chapters.vtt new file mode 100644 index 00000000..af2b588c --- /dev/null +++ b/2025/captions/emacsconf-2025-sun-open--sunday-opening-remarks--main--chapters.vtt @@ -0,0 +1,41 @@ +WEBVTT + + +00:00:00.000 --> 00:00:15.999 +Tracks + +00:00:16.000 --> 00:01:00.606 +Watching and participating + +00:01:00.607 --> 00:01:10.600 +Other schedule formats + +00:01:10.601 --> 00:01:46.035 +BigBlueButton + +00:01:46.036 --> 00:02:03.216 +On and off the stream + +00:02:03.217 --> 00:02:25.455 +Etherpad and IRC + +00:02:25.456 --> 00:02:59.439 +Etherpad + +00:02:59.440 --> 00:03:32.777 +IRC + +00:03:32.778 --> 00:03:55.237 +Captions + +00:03:55.238 --> 00:04:07.281 +status.emacsconf.org + +00:04:07.282 --> 00:04:16.019 +Guidelines for conduct + +00:04:16.020 --> 00:04:26.775 +Videos + +00:04:26.776 --> 00:04:49.323 +Let's get started! diff --git a/2025/captions/emacsconf-2025-sun-open--sunday-opening-remarks--main.vtt b/2025/captions/emacsconf-2025-sun-open--sunday-opening-remarks--main.vtt new file mode 100644 index 00000000..d6a7d98c --- /dev/null +++ b/2025/captions/emacsconf-2025-sun-open--sunday-opening-remarks--main.vtt @@ -0,0 +1,376 @@ +WEBVTT + + +NOTE Tracks + +00:00:00.000 --> 00:00:02.246 +Welcome to EmacsConf, where we have fun + +00:00:02.247 --> 00:00:05.484 +exploring just how much we can do with a text editor. + +00:00:05.485 --> 00:00:07.924 +There's a General track and a Development track, + +00:00:07.925 --> 00:00:09.483 +but really, you'll probably find + +00:00:09.484 --> 00:00:11.078 +interesting things on both tracks + +00:00:11.079 --> 00:00:13.215 +no matter what your level of experience is, + +00:00:13.216 --> 00:00:15.999 +so don't feel limited to one or the other. + +NOTE Watching and participating + +00:00:16.000 --> 00:00:19.392 +The best parts of EmacsConf are the conversations. + +00:00:19.393 --> 00:00:22.485 +The wiki has a page on how to watch and participate, + +00:00:22.486 --> 00:00:24.909 +and I'll give you a quick overview as well. + +00:00:24.910 --> 00:00:28.884 +You can watch both streams at live.emacsconf.org + +00:00:28.885 --> 00:00:31.185 +using free and open source software. + +00:00:31.186 --> 00:00:34.387 +Using a streaming media player like mpv + +00:00:34.388 --> 00:00:37.274 +seems to be the best way to watch in terms of performance + +00:00:37.275 --> 00:00:39.240 +but there are also web-based players + +00:00:39.241 --> 00:00:41.377 +just in case that's all you've got. + +00:00:41.378 --> 00:00:44.063 +The schedule shows the General track on top + +00:00:44.064 --> 00:00:45.602 +and the Development track on the bottom, + +00:00:45.603 --> 00:00:47.819 +so you can see what else is going on. + +00:00:47.820 --> 00:00:49.818 +As you're watching the talks, + +00:00:49.819 --> 00:00:52.354 +you can refer to the schedule in another window. + +00:00:52.355 --> 00:00:55.600 +Hover over the boxes to see the times and titles, + +00:00:55.601 --> 00:00:57.613 +and click on the boxes in the schedule + +00:00:57.614 --> 00:01:00.606 +to jump to the talk's page for more details. + +NOTE Other schedule formats + +00:01:00.607 --> 00:01:03.586 +You can also get the schedule as an iCalendar file + +00:01:03.587 --> 00:01:05.620 +or as an Org file in different time zones. + +00:01:05.621 --> 00:01:08.254 +The Org file has some links to talk resources + +00:01:08.255 --> 00:01:10.600 +and might be handy as a starting point for your notes. + +NOTE BigBlueButton + +00:01:10.601 --> 00:01:12.144 +Many talks will be followed by + +00:01:12.145 --> 00:01:14.571 +live Q&A web conferences with the speaker, + +00:01:14.572 --> 00:01:17.733 +which will be done in BigBlueButton or BBB. + +00:01:17.734 --> 00:01:20.818 +These are indicated with a solid border on the schedule + +00:01:20.819 --> 00:01:24.000 +and by Q&A: BBB on the schedule page. + +00:01:24.001 --> 00:01:25.900 +You can join the web conference room + +00:01:25.901 --> 00:01:27.466 +by clicking on the BBB link + +00:01:27.467 --> 00:01:30.175 +on the schedule page or the talk's webpage. + +00:01:30.176 --> 00:01:34.214 +Then you can ask your questions yourself when the Q&A starts. + +00:01:34.215 --> 00:01:37.210 +To improve performance, please keep your webcam off + +00:01:37.211 --> 00:01:39.889 +and stay muted until it's your turn to talk. + +00:01:39.890 --> 00:01:41.691 +If you don't like Javascript, + +00:01:41.692 --> 00:01:43.642 +you can still ask questions via IRC + +00:01:43.643 --> 00:01:46.035 +and the hosts can read them out for you. + +NOTE On and off the stream + +00:01:46.036 --> 00:01:47.894 +We're probably going to automatically switch + +00:01:47.895 --> 00:01:49.482 +between talks and Q&A sessions, + +00:01:49.483 --> 00:01:52.896 +so the transitions on the stream might be a little sudden. + +00:01:52.897 --> 00:01:54.438 +People in the BigBlueButton room + +00:01:54.439 --> 00:01:55.861 +can continue the conversation + +00:01:55.862 --> 00:01:58.219 +even after the talk moves off-stream, + +00:01:58.220 --> 00:02:00.270 +and you can also reach out to the speakers + +00:02:00.271 --> 00:02:03.216 +using the contact information on the talk page. + +NOTE Etherpad and IRC + +00:02:03.217 --> 00:02:06.301 +Other talks will have Q&A via Etherpad or IRC, + +00:02:06.302 --> 00:02:08.541 +depending on what the speakers prefer. + +00:02:08.542 --> 00:02:11.379 +This is indicated in the schedule with a dashed border + +00:02:11.380 --> 00:02:13.509 +and on the schedule page as well. + +00:02:13.510 --> 00:02:16.542 +The schedule pages have quick shortcuts so that you can + +00:02:16.543 --> 00:02:19.052 +find out more about talks, open the Etherpads, + +00:02:19.053 --> 00:02:21.203 +and join the Q&A sessions. + +00:02:21.204 --> 00:02:23.365 +The watch page has more tips + +00:02:23.366 --> 00:02:25.455 +on how to make the most of Q&A. + +NOTE Etherpad + +00:02:25.456 --> 00:02:28.329 +If you can, please add notes and ask questions + +00:02:28.330 --> 00:02:30.132 +in the Etherpad for the talk. + +00:02:30.133 --> 00:02:31.597 +That makes it easier + +00:02:31.598 --> 00:02:33.129 +for everyone to share their notes, + +00:02:33.130 --> 00:02:36.354 +and speakers and hosts can read the questions from there. + +00:02:36.355 --> 00:02:39.621 +We'll copy the notes to the talk pages afterwards. + +00:02:39.622 --> 00:02:41.496 +We have one pad for each talk, + +00:02:41.497 --> 00:02:43.772 +so you can follow the links to get to the next one + +00:02:43.773 --> 00:02:46.827 +or go back to the schedule and get the link from there. + +00:02:46.828 --> 00:02:48.422 +If you have general feedback about + +00:02:48.423 --> 00:02:50.667 +the conference itself, please put it in + +00:02:50.668 --> 00:02:54.592 +pad.emacsconf.org/emacsconf. + +00:02:54.593 --> 00:02:57.549 +You can also use this as a community message board + +00:02:57.550 --> 00:02:59.439 +for things like Help Wanted. + +NOTE IRC + +00:02:59.440 --> 00:03:02.799 +Internet Relay Chat or IRC can be another great way + +00:03:02.800 --> 00:03:05.175 +to be part of lots of conversations. + +00:03:05.176 --> 00:03:09.450 +You can use chat.emacsconf.org to join the IRC channels + +00:03:09.451 --> 00:03:11.045 +through your web browser. + +00:03:11.046 --> 00:03:12.856 +The tabs on the left can help you + +00:03:12.857 --> 00:03:14.891 +switch between the different channels. + +00:03:14.892 --> 00:03:17.610 +There's #emacsconf-gen for the General track + +00:03:17.611 --> 00:03:20.489 +and #emacsconf-dev for the Development track. + +00:03:20.490 --> 00:03:23.956 +If you need to reach us, you can join #emacsconf-org + +00:03:23.957 --> 00:03:29.474 +or e-mail emacsconf-org-private@gnu.org. + +00:03:29.475 --> 00:03:32.777 +You can use #emacsconf for hallway conversations. + +NOTE Captions + +00:03:32.778 --> 00:03:35.587 +Once again, we're going to be streaming with open captions + +00:03:35.588 --> 00:03:38.479 +for most of the talks this year, thanks to our speakers and + +00:03:38.480 --> 00:03:39.895 +captioning volunteers. + +00:03:39.896 --> 00:03:42.522 +The captioned talks are indicated on the schedule, + +00:03:42.523 --> 00:03:44.312 +and with any luck, we'll be posting + +00:03:44.313 --> 00:03:46.123 +videos and transcripts on talk pages + +00:03:46.124 --> 00:03:47.883 +shortly after the talks start. + +00:03:47.884 --> 00:03:51.069 +If you need additional accommodations, please let us know + +00:03:51.070 --> 00:03:54.016 +in #emacsconf-org and we'll see + +00:03:54.017 --> 00:03:55.237 +if we can make things happen. + +NOTE status.emacsconf.org + +00:03:55.238 --> 00:03:59.917 +If something goes down, we'll update status.emacsconf.org. + +00:03:59.918 --> 00:04:01.743 +If it doesn't look like we've noticed yet, + +00:04:01.744 --> 00:04:05.262 +please let us know in the #emacsconf-org IRC channel, + +00:04:05.263 --> 00:04:07.281 +where we will be quietly panicking. + +NOTE Guidelines for conduct + +00:04:07.282 --> 00:04:09.704 +In all of these conversations, please keep in mind + +00:04:09.705 --> 00:04:11.238 +our guidelines for conduct. + +00:04:11.239 --> 00:04:12.619 +You can find them on the wiki, + +00:04:12.620 --> 00:04:16.019 +and they basically boil down to: please be nice. Thank you! + +NOTE Videos + +00:04:16.020 --> 00:04:18.891 +If all goes well, the prerecorded talks and transcripts + +00:04:18.892 --> 00:04:20.537 +should be available from the talk pages + +00:04:20.538 --> 00:04:22.038 +shortly after they start playing, + +00:04:22.039 --> 00:04:24.143 +and we'll post the recordings of live talks + +00:04:24.144 --> 00:04:26.775 +and Q&A sessions within the next few weeks. + +NOTE Let's get started! + +00:04:26.776 --> 00:04:28.247 +All right, let's get going. + +00:04:28.248 --> 00:04:31.214 +You might see Leo Vivier, Corwin Brust, + +00:04:31.215 --> 00:04:33.953 +and Amin Bandali hosting the various tracks. + +00:04:33.954 --> 00:04:35.767 +I will run around mostly backstage, + +00:04:35.768 --> 00:04:37.793 +and you'll probably meet us in the closing remarks. + +00:04:37.794 --> 00:04:39.243 +That's also where we get to thank + +00:04:39.244 --> 00:04:40.659 +all the people and organizations + +00:04:40.660 --> 00:04:42.549 +who make EmacsConf possible. + +00:04:42.550 --> 00:04:44.462 +Let's have fun at EmacsConf! diff --git a/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt b/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt new file mode 100644 index 00000000..35eb7ce7 --- /dev/null +++ b/2025/captions/emacsconf-2025-swanky--swanky-python-interactive-development-for-python--scott-zimmermann--main.vtt @@ -0,0 +1,1108 @@ +WEBVTT captioned by sachac + +00:00:00.880 --> 00:00:02.439 +Hello everyone, I'm Scott + +00:00:02.440 --> 00:00:04.239 +and I'll be talking about Swanky Python, + +00:00:04.240 --> 00:00:06.199 +which is a development environment for Python + +00:00:06.200 --> 00:00:08.319 +based on Emacs' Slime package. + +00:00:08.320 --> 00:00:11.679 +So what is that and why might you find it interesting? + +00:00:11.680 --> 00:00:15.279 +SLIME is the Superior Lisp Interaction Mode for Emacs. + +00:00:15.280 --> 00:00:17.999 +It's an Emacs package for developing Common Lisp, + +00:00:18.000 --> 00:00:20.679 +and it's a bit different from the way we develop most languages + +00:00:20.680 --> 00:00:22.599 +in that you're always connected + +00:00:22.600 --> 00:00:25.399 +to a running instance of your application, + +00:00:25.400 --> 00:00:27.959 +and you kind of build up your application, piece by piece, + +00:00:27.960 --> 00:00:30.399 +modifying one expression at a time + +00:00:30.400 --> 00:00:34.559 +without ever having to restart your application. + +00:00:34.560 --> 00:00:36.679 +So why might you want to develop this way? + +00:00:36.680 --> 00:00:40.039 +One advantage is that you can get a faster feedback loop. + +00:00:40.040 --> 00:00:42.599 +For some kinds of software, it doesn't make a big difference. + +00:00:42.600 --> 00:00:43.919 +Like, if you're developing a web backend + +00:00:43.920 --> 00:00:48.039 +where all state is stored externally in a database, + +00:00:48.040 --> 00:00:50.279 +then you can have a file watcher + +00:00:50.280 --> 00:00:52.799 +that just restarts the whole Python process + +00:00:52.800 --> 00:00:54.639 +whenever you make any edit, + +00:00:54.640 --> 00:00:56.159 +and you're not really losing anything, + +00:00:56.160 --> 00:00:59.679 +because all the state is stored outside the Python process + +00:00:59.680 --> 00:01:01.719 +in a database. So it works great. + +00:01:01.720 --> 00:01:03.559 +But for other kinds of software, like + +00:01:03.560 --> 00:01:05.559 +let's say you're developing an Emacs package + +00:01:05.560 --> 00:01:07.279 +or a video game, + +00:01:07.280 --> 00:01:10.319 +then it can be a real pain to restart the application + +00:01:10.320 --> 00:01:12.679 +and recreate the state it was in before + +00:01:12.680 --> 00:01:17.279 +just to test the effect of each edit you want to make. + +00:01:17.280 --> 00:01:21.359 +Another advantage is the runtime introspection you have available. + +00:01:21.360 --> 00:01:22.679 +So since you're always connected + +00:01:22.680 --> 00:01:24.999 +to a running instance of your application, + +00:01:25.000 --> 00:01:27.799 +you can inspect the values of variables, + +00:01:27.800 --> 00:01:30.959 +you can trace functions, and all sorts of other information + +00:01:30.960 --> 00:01:36.279 +to help you understand your application better. + +00:01:36.280 --> 00:01:39.919 +And lastly, it's just a lot of fun to develop this way, + +00:01:39.920 --> 00:01:43.519 +or at least I find it fun developing with SLIME, + +00:01:43.520 --> 00:01:45.759 +so I wrote a SLIME backend for Python + +00:01:45.760 --> 00:01:48.799 +so I could have more fun when I'm coding in Python. + +00:01:48.800 --> 00:01:52.599 +As for the name swanky-python, within SLIME, + +00:01:52.600 --> 00:01:56.279 +swank is the name of the Common Lisp backend + +00:01:56.280 --> 00:01:59.199 +that runs within your Common Lisp application + +00:01:59.200 --> 00:02:02.919 +and connects to Emacs. So I'm not too creative. + +00:02:02.920 --> 00:02:07.999 +swanky-python is just a swank implementation in Python. + +NOTE Demo + +00:02:08.000 --> 00:02:15.279 +So let's see it in action. So we started up with M-x slime. + +00:02:15.280 --> 00:02:19.639 +And what that does is it starts a Python process, + +00:02:19.640 --> 00:02:25.039 +starts swanky-python within it, and connects to it from Emacs. + +00:02:25.040 --> 00:02:29.039 +And you can configure how exactly it runs Python. + +00:02:29.040 --> 00:02:32.479 +Or you can start swanky python manually + +00:02:32.480 --> 00:02:35.119 +within a Python application running on a remote server + +00:02:35.120 --> 00:02:36.313 +and forward the port locally + +00:02:36.614 --> 00:02:40.919 +and connect to it in Emacs, from Emacs remotely. + +00:02:40.920 --> 00:02:43.239 +Within the README, there's more documentation + +00:02:43.240 --> 00:02:45.519 +on other ways to start it. + +00:02:45.520 --> 00:02:52.159 +But just M-x slime is the basic way that works most of the time. + +00:02:52.160 --> 00:02:55.759 +So within the REPL, the first thing you'll notice is that + +00:02:55.760 --> 00:02:58.839 +REPL outputs are clickable buttons, + +00:02:58.840 --> 00:03:02.119 +what SLIME calls presentations. + +00:03:02.120 --> 00:03:04.759 +So you can do things like inspect them. + +00:03:04.760 --> 00:03:09.759 +And for each presentation, in the Python backend, + +00:03:09.760 --> 00:03:12.479 +it holds on to the reference to the object. + +00:03:12.480 --> 00:03:14.559 +So for an int, it's not too interesting, + +00:03:14.560 --> 00:03:20.239 +but let's do a more complex object like a file. + +00:03:20.240 --> 00:03:22.519 +Then we can inspect the file. + +00:03:22.520 --> 00:03:26.599 +We can describe it, which will bring up documentation + +00:03:26.600 --> 00:03:33.759 +on that class. We can use it in further expressions + +00:03:33.760 --> 00:03:39.431 +like if we copy it, it will use the actual Python object + +00:03:39.432 --> 00:03:43.399 +in this expression. + +00:03:43.400 --> 00:03:48.319 +We can assign it to a variable. + +00:03:48.320 --> 00:03:50.999 +SLIME uses presentations everywhere + +00:03:51.000 --> 00:03:53.239 +that a Python object would be displayed. + +00:03:53.240 --> 00:03:56.559 +So instead of just their string representation, + +00:03:56.560 --> 00:04:00.239 +when you have a backtrace on an exception, + +00:04:00.240 --> 00:04:03.965 +or you... within the inspector or anywhere else really, + +00:04:03.966 --> 00:04:06.019 +anywhere that the string representation + +00:04:06.020 --> 00:04:07.940 +of an object would be displayed, + +00:04:07.941 --> 00:04:10.740 +it displays a presentation that you can go on to + +00:04:10.741 --> 00:04:14.960 +inspect, reuse, or send to the REPL and so on. + +00:04:14.961 --> 00:04:23.039 +One useful utility function is pp for print presentation. + +00:04:23.040 --> 00:04:25.119 +We haven't imported it yet. + +00:04:25.120 --> 00:04:29.159 +So when we get a name error exception + +00:04:29.160 --> 00:04:33.879 +and SLIME sees that that name is available for import somewhere, + +00:04:33.880 --> 00:04:38.279 +it'll give us the option of importing it. + +00:04:38.280 --> 00:04:40.599 +Since it's available for import from multiple modules, + +00:04:40.600 --> 00:04:43.919 +it'll prompt us for which one we want to import it from. + +00:04:43.920 --> 00:04:45.519 +We want to import it from swanky-python, + +00:04:45.520 --> 00:04:48.479 +not from the standard library. + +00:04:48.480 --> 00:04:52.599 +Then it will print a presentation of that object. + +00:04:52.600 --> 00:04:55.559 +Within the REPL, this is not really useful + +00:04:55.560 --> 00:04:58.919 +because all REPL outputs are already presentations. + +00:04:58.920 --> 00:05:02.799 +But I use this now whenever I would use print debugging, + +00:05:02.800 --> 00:05:05.639 +just whenever I would use insert print statements in my program + +00:05:05.640 --> 00:05:08.399 +to see what's going on, I have it print a presentation + +00:05:08.400 --> 00:05:11.199 +because that way I can go back and inspect it later, + +00:05:11.200 --> 00:05:16.599 +copy it to the REPL and further manipulate it and so on. + +NOTE Inspector + +00:05:16.600 --> 00:05:20.119 +Next up, let's look at the inspector more. + +00:05:20.120 --> 00:05:25.579 +If we go back and inspect the file object, + +00:05:25.580 --> 00:05:27.239 +you can write custom inspector views + +00:05:27.240 --> 00:05:28.839 +for different kinds of objects. + +00:05:28.840 --> 00:05:32.519 +So far, I just have a couple. One for sequences, + +00:05:32.520 --> 00:05:36.919 +one for mappings, and one for every other kind of object. + +00:05:36.920 --> 00:05:45.979 +Like if we inspect a mapping, there's a shortcut + +00:05:45.980 --> 00:05:48.639 +inspect last result, which is what I normally use + +00:05:48.640 --> 00:05:52.379 +to open the inspector. Then we see the values, + +00:05:52.380 --> 00:05:56.319 +and each value in the inspector is a presentation + +00:05:56.320 --> 00:05:58.419 +that we can go on to inspect, and so on. + +00:05:58.420 --> 00:06:03.979 +Let's go back to inspecting the file object. + +00:06:03.980 --> 00:06:06.039 +Again, we can inspect each of the values, + +00:06:06.040 --> 00:06:10.239 +we can copy them back to the REPL and so on. + +00:06:10.240 --> 00:06:13.839 +It just displays all the attributes for the class + +00:06:13.840 --> 00:06:15.399 +and their values. + +00:06:15.400 --> 00:06:18.119 +We can configure what attributes we want to show. + +00:06:18.120 --> 00:06:21.119 +There's a transient menu where we can toggle + +00:06:21.120 --> 00:06:23.359 +if we want to show private attributes, dunder attributes, + +00:06:23.360 --> 00:06:26.439 +doc strings, so on, or everything, + +00:06:26.440 --> 00:06:28.519 +which is a bit much to show by default. + +00:06:28.520 --> 00:06:33.719 +So we'll reset it to the default. + +00:06:33.720 --> 00:06:37.839 +In the future, I want to add graphical inspector views + +00:06:37.840 --> 00:06:40.679 +for different kinds of objects, and also support + +00:06:40.680 --> 00:06:42.999 +showing plots in both the inspector and the REPL, + +00:06:43.000 --> 00:06:47.719 +but that's future work I haven't started on yet. + +NOTE Evaluating Python + +00:06:47.720 --> 00:06:51.999 +Let's look at the different options for evaluating Python. + +00:06:52.000 --> 00:06:59.099 +So we can evaluate a whole file. + +00:06:59.100 --> 00:07:00.639 +We can evaluate just a class. + +00:07:00.640 --> 00:07:03.479 +We can evaluate just the method we're working on. + +00:07:03.480 --> 00:07:06.359 +We can evaluate a Python statement, + +00:07:06.360 --> 00:07:11.839 +and it will show the result in an overlay next to the cursor. + +00:07:11.840 --> 00:07:17.919 +We can select some code and just evaluate the highlighted region. + +00:07:17.920 --> 00:07:24.799 +We can sync the REPL to the active file. + +00:07:24.800 --> 00:07:27.319 +So now everything we evaluate in the REPL will be in the + +00:07:27.320 --> 00:07:29.639 +context of the eval_demo module. + +00:07:29.640 --> 00:07:35.399 +We can also set the module that the REPL is in. + +00:07:35.400 --> 00:07:38.279 +We can go back to main. + +00:07:38.280 --> 00:07:43.679 +But let's go back to the eval_demo module for now. + +NOTE Updating + +00:07:43.680 --> 00:07:49.799 +One useful thing is when you update a class or a function, + +00:07:49.800 --> 00:07:54.539 +it updates old instances of that class or function. + +00:07:54.540 --> 00:07:58.479 +So right now, f.bar is foobar. + +00:07:58.480 --> 00:08:03.719 +But if we edit that class, it will actually edit the code + +00:08:03.720 --> 00:08:05.239 +for the old instance of that class. + +00:08:05.240 --> 00:08:07.599 +And that's provided by code I copied + +00:08:07.600 --> 00:08:12.079 +from IPython's autoreload extension. + +00:08:12.080 --> 00:08:14.639 +It helps when you're trying to develop in Python + +00:08:14.640 --> 00:08:16.498 +without having to restart the Python process + +00:08:16.499 --> 00:08:20.039 +whenever you make a change. + +00:08:20.040 --> 00:08:22.599 +Auto reload in Python is a big topic + +00:08:22.600 --> 00:08:26.519 +that I don't really have time to go into here, + +00:08:26.520 --> 00:08:29.479 +but right now it is more limited + +00:08:29.480 --> 00:08:32.559 +than what is done in Common Lisp. + +00:08:32.560 --> 00:08:35.759 +Like for example, if you have a data class in Python + +00:08:35.760 --> 00:08:37.619 +and you add a new field to the data class, + +00:08:37.620 --> 00:08:41.039 +it won't automatically update old instances + +00:08:41.040 --> 00:08:43.399 +of the data class with a new field. + +00:08:43.400 --> 00:08:46.599 +So there's more that needs to be done with that, + +00:08:46.600 --> 00:08:50.359 +but I am perhaps naively optimistic + +00:08:50.360 --> 00:08:54.279 +that Python's runtime is quite dynamic and flexible, + +00:08:54.280 --> 00:08:59.799 +and that I can fully implement autoreload in Python, + +00:08:59.800 --> 00:09:02.119 +but there's still work to be done, + +00:09:02.120 --> 00:09:05.419 +and it's a big topic to go into. + +00:09:05.420 --> 00:09:08.959 +Next up, let's look at the backtrace buffer. + +00:09:08.960 --> 00:09:12.839 +But as it is right now, autoreload is actually useful. + +00:09:12.840 --> 00:09:16.959 +I mostly develop in Python without having to restart the process + +00:09:16.960 --> 00:09:19.599 +and without running into issues from old state + +00:09:19.600 --> 00:09:22.899 +that hasn't been updated properly. + +NOTE Backtraces + +00:09:22.900 --> 00:09:25.999 +So if we go on to look at the backtrace buffer, + +00:09:26.000 --> 00:09:32.819 +whenever we get an exception in Python... + +00:09:32.820 --> 00:09:37.079 +Let's go back to it. + +00:09:37.080 --> 00:09:41.419 +Whenever we get an exception, it will... + +00:09:41.420 --> 00:09:43.698 +let's change the code so that it actually + +00:09:43.699 --> 00:09:49.965 +gets an exception... + +00:09:49.966 --> 00:09:52.519 +we will get an interactive backtrace buffer + +00:09:52.520 --> 00:09:57.599 +where we can browse the source code for the different stack frames + +00:09:57.600 --> 00:10:00.199 +and the local variables within the stack frames, + +00:10:00.200 --> 00:10:03.439 +which are all presentations that we can inspect and so on. + +00:10:04.340 --> 00:10:10.619 +We can also open a REPL in the context of any stack frame. + +00:10:10.620 --> 00:10:16.439 +Or we can, when we go to the source for a given stack frame, + +00:10:16.440 --> 00:10:20.359 +we can select some Python code and evaluate it + +00:10:20.360 --> 00:10:25.959 +within the context of that stack frame. + +00:10:25.960 --> 00:10:30.699 +One major limitation compared to SLIME for Common Lisp + +00:10:30.700 --> 00:10:33.759 +is that in Common Lisp, you have the option to + +00:10:33.760 --> 00:10:38.159 +restart or resume execution from a given stack frame + +00:10:38.160 --> 00:10:42.439 +after an exception happens, where in Python, + +00:10:42.440 --> 00:10:45.799 +what we have right now is pretty much equivalent to + +00:10:45.800 --> 00:10:47.159 +the postmortem debugger. + +00:10:47.160 --> 00:10:50.839 +You can view the state that the call stack was in + +00:10:50.840 --> 00:10:51.959 +at the time of the exception, + +00:10:51.960 --> 00:10:55.659 +but you can't actually resume execution, + +00:10:55.660 --> 00:10:57.559 +which you often might want to do, + +00:10:57.560 --> 00:10:59.919 +because when you're coding in a dynamic language, + +00:10:59.920 --> 00:11:01.479 +you're going to get runtime errors. + +00:11:01.480 --> 00:11:04.119 +So if you're writing a script that does like some sort of + +00:11:04.120 --> 00:11:07.999 +long-running computation or processes a ton of files + +00:11:08.000 --> 00:11:11.939 +and gets an exception parsing one file halfway through, + +00:11:11.940 --> 00:11:16.919 +normally you'd have to fix the script, and then rerun it + +00:11:16.920 --> 00:11:19.759 +and have it process all the same files all over again, + +00:11:19.760 --> 00:11:23.839 +and lose a bunch of time for every bug you run into + +00:11:23.840 --> 00:11:24.879 +and fix you have to make. + +00:11:24.880 --> 00:11:28.679 +So right now we've got a kind of mediocre workaround + +00:11:28.680 --> 00:11:34.019 +which is you can add the restart decorator to a function + +00:11:34.020 --> 00:11:37.239 +and then... where in the case of a script + +00:11:37.240 --> 00:11:38.879 +processing a bunch of files, + +00:11:38.880 --> 00:11:41.799 +you would add the restart decorator to the function + +00:11:41.800 --> 00:11:43.599 +that processes a single file. + +00:11:43.600 --> 00:11:45.439 +You'd add it to the function + +00:11:45.440 --> 00:11:47.879 +that represents kind of the smallest unit of work + +00:11:47.880 --> 00:11:50.219 +that might fail with an exception, + +00:11:50.220 --> 00:11:54.359 +Then, when you get an exception, + +00:11:54.360 --> 00:11:57.479 +you can actually edit the function. + +00:11:57.480 --> 00:12:01.019 +Like, if we edit it so it doesn't throw an error, + +00:12:01.020 --> 00:12:07.199 +and then we can resume execution, + +00:12:07.200 --> 00:12:12.799 +then it will return from foo using the + +00:12:12.800 --> 00:12:15.040 +the new version of baz, + +00:12:15.041 --> 00:12:18.559 +without having to run the script from the beginning again. + +00:12:18.560 --> 00:12:22.379 +So in the example of a script that processes a bunch of files, + +00:12:22.380 --> 00:12:24.299 +that would let you, + +00:12:24.300 --> 00:12:27.619 +as you run into files that cause an exception, + +00:12:27.620 --> 00:12:29.079 +fix your code to deal with it + +00:12:29.080 --> 00:12:31.880 +and resume execution without having to restart the script + +00:12:31.881 --> 00:12:33.080 +from the beginning. + +00:12:33.081 --> 00:12:36.120 +But this is obviously a pretty terrible hack, + +00:12:36.121 --> 00:12:38.840 +having to add the restart decorator to the function. + +00:12:38.841 --> 00:12:46.739 +I would like it to be able to restart from any function. + +00:12:46.740 --> 00:12:49.631 +without needing the decorator, as you can in Common Lisp, + +00:12:49.632 --> 00:12:54.031 +but I think that will require patching CPython + +00:12:54.032 --> 00:12:56.579 +and I really have no idea how to do that. + +00:12:56.580 --> 00:13:00.531 +So if you do know anything about CPython internals + +00:13:00.532 --> 00:13:03.720 +and are interested in helping, please reach out. + +NOTE pydumpling + +00:13:03.721 --> 00:13:07.119 +Another feature we have with the backtrace buffer is + +00:13:07.120 --> 00:13:09.079 +there's this library called PyDumpling + +00:13:09.080 --> 00:13:14.659 +which can serialize a traceback and store it to a file. + +00:13:14.660 --> 00:13:17.859 +So you can use PyDumpling with your applications running in + +00:13:17.860 --> 00:13:21.239 +production to serialize a traceback + +00:13:21.240 --> 00:13:24.899 +whenever they have an exception and save it to a file. + +00:13:24.900 --> 00:13:28.599 +Then you can transfer the file locally + +00:13:28.600 --> 00:13:38.859 +and load it into your local Emacs with slime-py-load-pydumpling. + +00:13:38.860 --> 00:13:41.839 +This will load the same backtrace buffer, + +00:13:41.840 --> 00:13:44.559 +and you see all the same local variables + +00:13:44.560 --> 00:13:45.759 +at the time of the exception. + +00:13:45.760 --> 00:13:48.199 +You can inspect them and get a REPL + +00:13:48.200 --> 00:13:50.999 +in the context of the stack frame. + +00:13:51.000 --> 00:13:54.199 +Well, this will only work for variables + +00:13:54.200 --> 00:13:57.619 +that can be serialized with pickle. + +00:13:57.620 --> 00:13:59.519 +Or actually, the library uses dill, + +00:13:59.520 --> 00:14:03.039 +which can serialize a bit more than pickle can. + +00:14:03.040 --> 00:14:10.200 +But yeah so this can help you inspect and debug errors + +00:14:10.201 --> 00:14:12.880 +for applications running in production remotely + +00:14:12.881 --> 00:14:20.059 +that you don't want to have SLIME connected to 24-7. + +NOTE Documentation browser + +00:14:20.060 --> 00:14:24.859 +Next up, let's look at the documentation browser. + +00:14:24.860 --> 00:14:29.919 +We can bring up documentation for any module, + +00:14:29.920 --> 00:14:33.079 +and all this information is generated + +00:14:33.080 --> 00:14:34.999 +from runtime introspection, + +00:14:35.000 --> 00:14:37.079 +from the doc strings for the module + +00:14:37.080 --> 00:14:39.159 +and the classes and so on. + +00:14:39.160 --> 00:14:41.879 +So you won't see documentation for libraries + +00:14:41.880 --> 00:14:43.159 +that you don't have actually loaded + +00:14:43.160 --> 00:14:45.939 +into your running Python process. + +00:14:45.940 --> 00:14:50.119 +Then you can go browse to classes. + +00:14:50.120 --> 00:14:54.719 +It'll show all the attributes, their methods, and so on. + +00:14:54.720 --> 00:14:57.239 +By each method to the right, it will show + +00:14:57.240 --> 00:15:02.599 +the base class where the method was originally inherited from. + +00:15:02.600 --> 00:15:09.079 +You can also bring up a screen with all the Python packages + +00:15:09.080 --> 00:15:14.439 +that are installed, and browse that with imenu, + +00:15:14.440 --> 00:15:20.359 +and bring up information on any package and so on. + +NOTE Thread view + +00:15:20.360 --> 00:15:28.499 +Next up, let's take a look at the thread view. + +00:15:28.500 --> 00:15:31.839 +So let's run this and then bring up the thread view + +00:15:31.840 --> 00:15:35.559 +and this will show information on all running threads. + +00:15:35.560 --> 00:15:38.799 +You can configure it to refresh after a given interval, + +00:15:38.800 --> 00:15:41.959 +like every second, but I don't have that set up right now, + +00:15:41.960 --> 00:15:45.659 +so I have to manually refresh it. + +00:15:45.660 --> 00:15:47.639 +Probably the most useful thing is that + +00:15:47.640 --> 00:15:49.739 +you can bring up a backtrace for any thread + +00:15:49.740 --> 00:15:51.759 +which won't pause the thread or anything, + +00:15:51.760 --> 00:15:53.879 +but will just give you the call stack + +00:15:53.880 --> 00:15:55.879 +at the time you requested the backtrace. + +00:15:55.880 --> 00:15:59.199 +You can again view the stack frames, local variables, + +00:15:59.200 --> 00:16:04.139 +open a REPL in the context of the thread, and so on. + +00:16:04.140 --> 00:16:07.839 +There's also a viewer for async tasks, + +00:16:07.840 --> 00:16:09.999 +but I'm not going to demo that right now, + +00:16:10.000 --> 00:16:14.159 +because for that to work, you have to start swanky-python + +00:16:14.160 --> 00:16:16.599 +after the async event loop has started, + +00:16:16.600 --> 00:16:18.519 +from within the same thread. + +00:16:18.520 --> 00:16:20.279 +If you go to the project readme, + +00:16:20.280 --> 00:16:23.919 +there's a demo of how to use the async task viewer + +00:16:23.920 --> 00:16:27.439 +with a fastapi project. + +NOTE Tracing functions + +00:16:27.440 --> 00:16:33.879 +Next up, let's look at tracing functions. + +00:16:33.880 --> 00:16:36.279 +So here we got some random error, + +00:16:36.280 --> 00:16:39.879 +because this is still very much a work in progress. + +00:16:39.880 --> 00:16:42.359 +But it looks like it executed + +00:16:42.360 --> 00:16:43.199 +correctly this time. + +00:16:43.200 --> 00:16:47.565 +So now let's mark the fibonacci function + +00:16:47.566 --> 00:16:50.239 +for tracing and execute it. + +00:16:50.240 --> 00:16:56.079 +We can see, every time the function is called, + +00:16:56.080 --> 00:16:58.239 +all its arguments and return values. + +00:16:58.240 --> 00:17:02.899 +Again, there are presentations that we can inspect and so on. + +00:17:02.900 --> 00:17:06.079 +But let's inspect a more complex object, like a file object. + +00:17:06.080 --> 00:17:11.339 +If we trace the count_lines function and run that code, + +00:17:11.340 --> 00:17:15.319 +then we can inspect the file it was passed, or the file object. + +00:17:15.320 --> 00:17:21.039 +One pitfall is that in Python, objects are mutable. + +00:17:21.040 --> 00:17:25.559 +So in the trace buffer, the string representation + +00:17:25.560 --> 00:17:27.879 +that's printed is the string representation + +00:17:27.880 --> 00:17:31.219 +at the time it was passed to the function. + +00:17:31.220 --> 00:17:32.639 +But when we go to inspect it, + +00:17:32.640 --> 00:17:34.919 +we're inspecting the object as it is right now, + +00:17:34.920 --> 00:17:37.639 +which can be different than it was at the time + +00:17:37.640 --> 00:17:41.559 +the function saw it. So for this file object, for example, + +00:17:41.560 --> 00:17:44.279 +it's closed now, when it was open at the time + +00:17:44.280 --> 00:17:47.799 +the function used it. + +NOTE AI integrations + +00:17:47.800 --> 00:17:50.479 +Next up, let's look at AI integrations. + +00:17:50.480 --> 00:17:54.519 +So if you're used to SLIME with Common Lisp, + +00:17:54.520 --> 00:18:09.479 +Emacs actually has a built-in AI that can help with the transition. + +00:18:09.480 --> 00:18:14.559 +So it's just a joke, I actually really like Python. + +00:18:14.560 --> 00:18:18.119 +And for more serious AI integrations, + +00:18:18.120 --> 00:18:19.959 +I have some ideas for the future + +00:18:19.960 --> 00:18:21.919 +but I haven't implemented anything yet. + +00:18:21.920 --> 00:18:27.319 +I think right now, people are mostly passing source code to LLMs + +00:18:27.320 --> 00:18:32.679 +but since we're embedded in the Python process at runtime, + +00:18:32.680 --> 00:18:35.639 +we have a lot of more information available, + +00:18:35.640 --> 00:18:39.439 +like maybe we can trace all calls to functions, + +00:18:39.440 --> 00:18:41.799 +and when we have a bug, + +00:18:41.800 --> 00:18:46.479 +we can feed the trace to the LLM, + +00:18:46.480 --> 00:18:48.719 +and the LLM can point out maybe + +00:18:48.720 --> 00:18:51.959 +when this function was called with these arguments, + +00:18:51.960 --> 00:18:53.879 +its return value doesn't make sense, + +00:18:53.880 --> 00:18:55.679 +so maybe that's the root cause of your bug. + +00:18:55.680 --> 00:19:02.359 +If you have any ideas of potential LLM or AI integrations, + +00:19:02.360 --> 00:19:05.999 +let me know. I'm happy to discuss. + +NOTE LSP-type features + +00:19:06.000 --> 00:19:09.919 +Next up, let's look at standard LSP-type features. + +00:19:09.920 --> 00:19:14.439 +So we've got completions. It's fuzzy completions right now, + +00:19:14.440 --> 00:19:16.319 +so it's showing everything with a PR in the name. + +00:19:16.320 --> 00:19:21.779 +We can bring up documentation for each one. + +00:19:21.780 --> 00:19:26.759 +When we start calling a method in the minibuffer at the bottom + +00:19:26.760 --> 00:19:28.859 +it'll show the signature. + +00:19:28.860 --> 00:19:33.719 +There's some refactoring available. + +00:19:33.720 --> 00:19:37.399 +We can extract a function or variable, + +00:19:37.400 --> 00:19:39.499 +or rename something, + +00:19:39.500 --> 00:19:42.919 +like, let's rename fib to fib2, + +00:19:42.920 --> 00:19:47.479 +and it will rename all the uses of it. + +00:19:47.480 --> 00:19:49.759 +All these features are based on Jedi, + +00:19:49.760 --> 00:19:55.399 +which is the Python library used by IPython. + +00:19:55.400 --> 00:19:56.999 +But as it is right now, + +00:19:57.000 --> 00:20:02.039 +if you want the most complete Python development experience + +00:20:02.040 --> 00:20:05.579 +in Emacs, I'd probably recommend using LSP + +00:20:05.580 --> 00:20:10.439 +for everything LSP can do, and then just using swanky-python + +00:20:10.440 --> 00:20:13.679 +for the object inspector and backtrace buffer, + +00:20:13.680 --> 00:20:15.359 +and the interactive features it has + +00:20:15.360 --> 00:20:18.031 +that an LSP can't provide. + +NOTE Wrapping up + +00:20:18.032 --> 00:20:23.339 +And that's it really. + +00:20:23.340 --> 00:20:25.865 +Shortly we'll have questions and answers + +00:20:25.866 --> 00:20:28.799 +as part of EmacsConf, and later on, + +00:20:28.800 --> 00:20:31.199 +if you have any questions, ideas, or issues + +00:20:31.200 --> 00:20:34.639 +feel free to reach out over email + +00:20:34.640 --> 00:20:37.999 +or create an issue on the repository. + +00:20:38.000 --> 00:20:39.331 +I should probably warn you, + +00:20:39.332 --> 00:20:41.119 +if you want to try out the project: + +00:20:41.120 --> 00:20:45.279 +so far I'm probably the only user of it + +00:20:45.280 --> 00:20:48.279 +and I've only tested it on my own Emacs setup, + +00:20:48.280 --> 00:20:50.839 +so it's quite likely you'll run into issues + +00:20:50.840 --> 00:20:53.479 +trying to get it installed and working. + +00:20:53.480 --> 00:20:56.119 +But if you do run into problems, please reach out, + +00:20:56.120 --> 00:20:59.279 +let me know. I'm happy to help and try and fix them. + +00:20:59.280 --> 00:21:03.640 +So that's it. Thanks for listening. diff --git a/2025/captions/emacsconf-2025-weights--weightlifting-tracking-with-emacs-on-android--zachary-romero--main.vtt b/2025/captions/emacsconf-2025-weights--weightlifting-tracking-with-emacs-on-android--zachary-romero--main.vtt new file mode 100644 index 00000000..6d1efa38 --- /dev/null +++ b/2025/captions/emacsconf-2025-weights--weightlifting-tracking-with-emacs-on-android--zachary-romero--main.vtt @@ -0,0 +1,1672 @@ +WEBVTT + +00:00.000 --> 00:05.819 +And you're ready to go. All right, perfect. + +00:05.820 --> 00:07.875 +Hello, my name is Zachary Romero + +00:07.876 --> 00:08.879 +and today I'll be giving a talk + +00:08.880 --> 00:12.719 +on how I'm using Emacs for Android + +00:12.720 --> 00:15.399 +to replace my fitness app I normally use. + +00:15.400 --> 00:17.239 +So it goes without saying + +00:17.240 --> 00:21.559 +that a lot of the mobile ecosystem these days + +00:21.560 --> 00:25.439 +are pretty hostile to the interest of its users. + +00:25.440 --> 00:26.999 +So there's privacy policies + +00:27.000 --> 00:32.959 +that are constantly collecting your data and selling it. + +00:32.960 --> 00:36.399 +without your consent, bombardment of ads. + +00:36.400 --> 00:37.999 +And then there's a lot of features that are locked. + +00:38.000 --> 00:40.479 +Sometimes features that the app gives you, + +00:40.480 --> 00:42.959 +they're put behind paywalls. + +00:42.960 --> 00:45.159 +And so a lot of the ecosystem + +00:45.160 --> 00:49.119 +isn't in the best interest of users. + +00:49.120 --> 00:51.959 +And obviously there are apps like on F-Droid + +00:51.960 --> 00:56.799 +and the Android ecosystem that do try to address this, + +00:56.800 --> 00:59.159 +but the solutions overall are lagging + +00:59.160 --> 01:05.439 +behind maybe desktop computers. + +01:05.440 --> 01:14.479 +One option that has come in the past few years + +01:14.480 --> 01:17.239 +is Emacs on Android. It's just a normal Emacs build, + +01:17.240 --> 01:21.159 +and so it can do everything, in theory, that Emacs can do. + +01:21.160 --> 01:24.399 +And so I got to thinking how could I, how I could use Emacs + +01:24.400 --> 01:27.039 +to replace some of the proprietary apps + +01:27.040 --> 01:28.479 +that I use on a daily basis. + +01:28.480 --> 01:31.279 +So I just went thinking about the apps, + +01:31.280 --> 01:33.039 +the apps that Emacs can replace. + +01:33.040 --> 01:35.119 +Some of them seem quite easy. + +01:35.120 --> 01:39.879 +Some of them... maybe might take a little effort but seem doable + +01:39.880 --> 01:41.959 +and then obviously there's a whole class of apps + +01:41.960 --> 01:47.199 +that would be pretty impossible to emulate on Emacs. + +01:47.200 --> 01:52.679 +So I mean besides like to-do lists, note taking, org mode, + +01:52.680 --> 01:55.759 +one thing that came to mind was my fitness tracking app. + +01:55.760 --> 01:59.239 +This is an app I use pretty often + +01:59.240 --> 02:06.719 +and in theory Emacs should be quite usable for this case. + +02:06.720 --> 02:09.759 +So weightlifting tracking is, + +02:09.760 --> 02:13.599 +so it's normally used to record + +02:13.600 --> 02:17.519 +what exercises you do at what intensity + +02:17.520 --> 02:20.719 +in order to progress week by week. + +02:20.720 --> 02:25.719 +So you might plan on like slowly increasing + +02:25.720 --> 02:27.399 +the amount of effort you put into + +02:27.400 --> 02:30.159 +your various workouts from week to week, + +02:30.160 --> 02:34.079 +and then maybe you'll have put some rest weeks in there. + +02:34.080 --> 02:37.439 +And so you want a detailed plan + +02:37.440 --> 02:40.439 +and recording of what you do throughout the week. + +02:40.440 --> 02:43.919 +And so I guess way back, normally + +02:43.920 --> 02:45.919 +this would have been done on pen and paper. + +02:45.920 --> 02:48.079 +So you would take your notebook + +02:48.080 --> 02:50.999 +and just write down on paper what you did. + +02:51.000 --> 02:56.559 +And this obviously works, and a lot of people do do this. + +02:56.560 --> 02:59.799 +But these days, there are quite a few apps + +02:59.800 --> 03:02.639 +that make this process quite seamless and effortless. + +03:02.640 --> 03:06.279 +So just as an example, really fast. + +03:06.280 --> 03:09.039 +So this is one of the popular apps out these days + +03:09.040 --> 03:10.399 +that has such a feature. + +03:10.400 --> 03:13.479 +So you can save all your workout routines + +03:13.480 --> 03:14.319 +and this nice interface. + +03:14.320 --> 03:18.719 +And so you click a button and then it starts, + +03:18.720 --> 03:20.919 +you have the workout interface and then + +03:20.920 --> 03:23.439 +You can kind of, you go through your workout + +03:23.440 --> 03:25.079 +and then you can input, + +03:25.080 --> 03:27.399 +you can input like what things you do. + +03:27.400 --> 03:29.119 +And then it has this like fancy timer at the bottom. + +03:29.120 --> 03:30.959 +So like, this is kind of like the, + +03:30.960 --> 03:35.839 +kind of like what a lot of people use these days, + +03:35.840 --> 03:39.319 +just for, just for, to make it as frictionless as possible. + +03:39.320 --> 03:44.359 +So obviously you can do like this bare bone text editing in Emacs. + +03:44.360 --> 03:46.959 +You just have to open up an org mode file and just right away. + +03:46.960 --> 03:48.879 +So, but there are a number of problems with this. + +03:48.880 --> 03:50.559 +So like, especially on mobile, + +03:50.560 --> 03:52.719 +character by character editing, + +03:52.720 --> 03:55.879 +just like writing all these, this text out manually, + +03:55.880 --> 03:58.759 +maybe some formatting, it can be pretty tedious + +03:58.760 --> 04:01.839 +and not, maybe not something you want to, you want to have to do, + +04:01.840 --> 04:04.559 +especially if you're like exhausted or tired. + +04:04.560 --> 04:06.479 +So, I mean, there's also like the problem + +04:06.480 --> 04:09.439 +of like remembering which, where in your workout you are, + +04:09.440 --> 04:11.839 +like how many of these, these, like which, + +04:11.840 --> 04:13.479 +which, like where are you, where you are, + +04:13.480 --> 04:17.159 +like, um like which set number set number are you on + +04:17.160 --> 04:17.679 +are you on the first second + +04:17.680 --> 04:19.919 +and then also like maybe you failed + +04:19.920 --> 04:22.239 +maybe you weren't able to like perform this + +04:22.240 --> 04:24.279 +and maybe you have to make a note that so like + +04:24.280 --> 04:28.279 +so that's even more text editing you would have to do + +04:28.280 --> 04:30.959 +um also some things like unit conversions + +04:30.960 --> 04:31.799 +like you could use calc + +04:31.800 --> 04:35.879 +but then you know you'd have to like open up the calc, + +04:35.880 --> 04:39.799 +and then number, unit conversion, switch buffers. + +04:39.800 --> 04:41.999 +So it's doable, but it takes a little effort. + +04:42.000 --> 04:43.439 +And then also the rest timer. + +04:43.440 --> 04:45.399 +So if you want to make sure you're resting + +04:45.400 --> 04:46.999 +in between these exercises you do, + +04:47.000 --> 04:51.079 +you'd have to maybe open up another app, + +04:51.080 --> 04:52.439 +or maybe you'd have to bring your watch. + +04:52.440 --> 04:53.719 +So that's another thing that + +04:53.720 --> 04:58.399 +these apps normally would do for you. + +04:58.400 --> 05:02.559 +So writing some Elisp, I created a package + +05:02.560 --> 05:04.479 +to try to emulate that experience + +05:04.480 --> 05:06.079 +I showed you on that other app. + +05:06.080 --> 05:08.159 +So let me just demo this real fast. + +05:08.160 --> 05:13.679 +So here, the package is called org-fit. + +05:13.680 --> 05:17.359 +And so here, I'm going to start a new workout. + +05:17.360 --> 05:19.559 +And then here, I'm prompted by a list of routines + +05:19.560 --> 05:22.159 +that I have pre-written in org mode. + +05:22.160 --> 05:25.759 +So the header name is the routine name. + +05:25.760 --> 05:29.279 +And so I can, out of all these routines I've written, + +05:29.280 --> 05:35.959 +I can select one and then also I can have it populate. + +05:35.960 --> 05:41.519 +So here it's populating preset weights I had for it. + +05:41.520 --> 05:45.839 +So yeah, so basically this is my current attempt + +05:45.840 --> 05:47.599 +to emulate that experience. + +05:47.600 --> 05:51.039 +So here we can, so here like the arrows and the tabs, + +05:51.040 --> 05:55.239 +they only go through like the, editable fields I can so + +05:55.240 --> 05:58.119 +on the notes section you see you see here in the table + +05:58.120 --> 06:00.439 +this is like the my plan for the day + +06:00.440 --> 06:02.159 +so I can press space to easily + +06:02.160 --> 06:03.839 +just fill out the data tab + +06:03.840 --> 06:06.879 +go the next the next the next set + +06:06.880 --> 06:10.239 +I can press quote to copy from above + +06:10.240 --> 06:13.359 +There's also some interesting things with Android, + +06:13.360 --> 06:15.719 +like you can bind the volume down key. + +06:15.720 --> 06:17.319 +So here I have the volume down key + +06:17.320 --> 06:21.439 +just like inputting the data automatically + +06:21.440 --> 06:22.399 +and going to the next field. + +06:22.400 --> 06:26.639 +So you see there it's quite seamless input of information. + +06:26.640 --> 06:30.119 +Notice also when all the sets + +06:30.120 --> 06:31.839 +of a single exercise are done, + +06:31.840 --> 06:34.759 +it marks that heading as done. + +06:34.760 --> 06:37.959 +Also, if you notice at the top, on the left, + +06:37.960 --> 06:42.239 +you have the session time for the workout. + +06:42.240 --> 06:44.199 +And then on here, we have the rest timer. + +06:44.200 --> 06:48.519 +So the rest timer is actually just defined as an org mode property. + +06:48.520 --> 06:50.839 +So here it's saying that, okay, + +06:50.840 --> 06:52.759 +you should start the auto rest timer + +06:52.760 --> 06:54.479 +for three minutes every time you do a set. + +06:54.480 --> 06:58.279 +So here, let's fill it in, go to the next one. + +06:58.280 --> 07:00.639 +And now the rest timer is set for three minutes. + +07:00.640 --> 07:03.079 +And so here I have, I can just rest + +07:03.080 --> 07:05.879 +I just have the information right here. + +07:05.880 --> 07:08.119 +Also, you'll notice here we have + +07:08.120 --> 07:09.439 +some calculations at the bottom. + +07:09.440 --> 07:12.159 +This is something also that those apps provide, + +07:12.160 --> 07:14.319 +like in order to make sure you're tracking + +07:14.320 --> 07:16.719 +on certain levels of intensity. + +07:16.720 --> 07:22.599 +Let's see, what else do we have? + +07:22.600 --> 07:30.879 +We can add warmups, automatic warmup set inserting, unit conversions, + +07:30.880 --> 07:33.439 +and then Something else to know + +07:33.440 --> 07:35.439 +is that all of these actions I'm doing, + +07:35.440 --> 07:37.079 +they're all bound to a single key + +07:37.080 --> 07:40.159 +to make things as effortless as possible. + +07:40.160 --> 07:43.679 +So yeah, that's the app in a nutshell. + +07:43.680 --> 07:47.079 +And then, so how is this done? + +07:47.080 --> 07:51.239 +So the philosophy behind this is to use org mode as a base. + +07:51.240 --> 07:55.639 +So all the functionality, the timer for the session, + +07:55.640 --> 08:00.319 +that's just clock in or clock in. + +08:00.320 --> 08:05.159 +The various, all the data you fill in, + +08:05.160 --> 08:09.519 +the exercises, routines, those are just org headings, + +08:09.520 --> 08:12.159 +like with nested entries. + +08:12.160 --> 08:14.959 +So yeah, and then all the movement, + +08:14.960 --> 08:16.759 +like a lot of the editing stuff + +08:16.760 --> 08:18.559 +is just going off of the org mode API. + +08:18.560 --> 08:22.919 +So like here, my upper field, is actually just using the, + +08:22.920 --> 08:26.239 +so it's using like the org table go to line function. + +08:26.240 --> 08:28.999 +Adding a no is org table put. + +08:29.000 --> 08:31.319 +So like all of my functions I'm using, + +08:31.320 --> 08:33.239 +they're just building off of the org mode API. + +08:33.240 --> 08:38.199 +And I found that this pattern worked work pretty well. + +08:38.200 --> 08:41.959 +So you get the benefits of org mode + +08:41.960 --> 08:48.839 +and then the ease of using it on mobile. + +08:48.840 --> 08:51.919 +And so I guess in the last few minutes of this talk, + +08:51.920 --> 08:53.479 +I'll just go over some quick things + +08:53.480 --> 08:56.319 +about working with Android that might come up. + +08:56.320 --> 08:58.879 +So the first thing is notifications. + +08:58.880 --> 09:01.039 +This is actually an interesting feature. + +09:01.040 --> 09:03.679 +So In the Android build for Emacs, + +09:03.680 --> 09:05.799 +you have the function android notifications notify. + +09:05.800 --> 09:09.039 +And so here, this is how you can send a notification. + +09:09.040 --> 09:11.999 +So my rest timer, for example, utilizes this function + +09:12.000 --> 09:14.399 +to let you know when your rest is over. + +09:14.400 --> 09:22.439 +And the cool thing about this is that the build for Emacs + +09:22.440 --> 09:29.039 +lets you, so here in the app settings, under notifications, + +09:29.040 --> 09:33.039 +so here you can actually pick a notification group, + +09:33.040 --> 09:36.639 +which is here set, which is, yeah, so it's set right here + +09:36.640 --> 09:37.999 +and you can just customize it. + +09:38.000 --> 09:39.599 +So like what sound do you want it to make? + +09:39.600 --> 09:40.439 +Do you want it to vibrate? + +09:40.440 --> 09:41.679 +Do you want to show on the screen? + +09:41.680 --> 09:43.519 +And so this way, like you can easily, + +09:43.520 --> 09:46.839 +so if you are resting, you will get a notification. + +09:46.840 --> 09:47.879 +It will vibrate. + +09:47.880 --> 09:50.079 +it might make a really loud noise if you want it to. + +09:50.080 --> 09:51.919 +And so this is all customizable. + +09:51.920 --> 09:54.479 +And the cool thing is that if you have other packages + +09:54.480 --> 09:55.639 +that utilize these notifications, + +09:55.640 --> 09:57.479 +all of the notification groups, + +09:57.480 --> 10:01.079 +they're all customizable separately. So, and there we go. + +10:01.080 --> 10:02.359 +So that notification you see on the top + +10:02.360 --> 10:04.999 +is actually from the Emacs app. + +10:05.000 --> 10:07.399 +So you notice here, we're not even running Emacs + +10:07.400 --> 10:09.759 +and yet we got that rest timer is over. + +10:09.760 --> 10:13.559 +So that's one thing. Next, keyboard. + +10:13.560 --> 10:15.039 +So just when working with Emacs, + +10:15.040 --> 10:19.079 +I found using the unexpected keyboard, in particular, + +10:19.080 --> 10:22.519 +to be really helpful with all the keybinding. + +10:22.520 --> 10:25.879 +So if you just want to try out Emacs + +10:25.880 --> 10:27.719 +from F-Droid or something, + +10:27.720 --> 10:30.239 +I would recommend using a keyboard like this + +10:30.240 --> 10:33.999 +to let you use the meta keys and the control keys. + +10:34.000 --> 10:37.039 +And then yeah, using this keyboard, + +10:37.040 --> 10:39.159 +I haven't really noticed any problems + +10:39.160 --> 10:41.679 +with Emacs key bindings. + +10:41.680 --> 10:45.159 +And then lastly, just like my setup. + +10:45.160 --> 10:49.679 +So SyncThinkFork is another app I rely on heavily. + +10:49.680 --> 10:54.399 +So as I mentioned, all the, this is org-fit files, + +10:54.400 --> 10:55.719 +they're all org-mode files. + +10:55.720 --> 10:57.439 +So I use SyncThinkFork to synchronize them + +10:57.440 --> 10:59.879 +between my laptop and my Android. + +10:59.880 --> 11:04.479 +And then also like to get this package, + +11:04.480 --> 11:06.559 +just syncing a list folder might be helpful + +11:06.560 --> 11:09.999 +if you want to easily edit your init file + +11:10.000 --> 11:12.319 +on Android on your machine. + +11:12.320 --> 11:15.639 +So yeah, SyncThinkPort is another helpful thing + +11:15.640 --> 11:17.959 +that you might wanna look into + +11:17.960 --> 11:22.919 +if you're exploring Android, the Emacs build of Android. + +11:22.920 --> 11:26.239 +So yeah, Emacs on Android does actually have the potential + +11:26.240 --> 11:30.959 +to replace a decent number of common use cases. + +11:30.960 --> 11:35.759 +And org mode can be a solid foundation + +11:35.760 --> 11:39.959 +for any of these applications that you're thinking of. + +11:39.960 --> 11:45.639 +And yeah, I highly recommend giving giving Emacs on Android a shot. + +11:45.640 --> 11:49.719 +And that concludes this presentation. + +11:49.720 --> 11:56.439 +Thank you so much, Zachary. That was an awesome talk, + +11:56.440 --> 11:59.599 +and I appreciate your preparing it for us. + +11:59.600 --> 12:03.399 +A couple questions on the pad, if anybody wants to jump in + +12:03.400 --> 12:05.119 +and throw in your questions or comments. + +12:05.120 --> 12:08.599 +Of course, happy to read them out on screen here. + +12:08.600 --> 12:12.039 +I think when we were talking backstage before, + +12:12.040 --> 12:14.239 +you had asked me to kind of read them out, + +12:14.240 --> 12:17.199 +but feel free to jump in and kind of + +12:17.200 --> 12:18.999 +take over at any point. + +12:19.000 --> 12:25.279 +This is the You Show. I'm kind of... + +12:25.280 --> 12:30.199 +So the first question we had was a comment. + +12:30.200 --> 12:31.439 +This is very cool. + +12:31.440 --> 12:33.519 +It would be nice to build up some + +12:33.520 --> 12:38.439 +org rep max calculation formula into calc. + +12:38.440 --> 12:42.119 +Is that something that you've thought about? + +12:42.120 --> 12:47.159 +Um, well, I mean, um, one rep max. Yeah. + +12:47.160 --> 12:48.799 +I mean, not in honesty, + +12:48.800 --> 12:52.359 +I'm not sure about the, like the, like, uh, + +12:52.360 --> 12:53.839 +extending calc itself. + +12:53.840 --> 12:56.799 +Like if there's, you know, if like, + +12:56.800 --> 12:59.199 +what are the ways of extending calc itself, + +12:59.200 --> 13:01.999 +but this, this package, um, or fit, + +13:02.000 --> 13:04.159 +I mean, it does have the one rep max. + +13:04.160 --> 13:11.199 +Like I kind of had to dig into that, like, um, uh, + +13:11.200 --> 13:20.079 +I can find the code, but yeah, I mean, it does, + +13:20.080 --> 13:25.079 +I mean, you know, so this is specifically this package, + +13:25.080 --> 13:33.039 +but yeah, you can use the various one rep max formulas for this. + +13:33.040 --> 13:37.159 +Extend this clock report. Yes, yeah, exactly. + +13:37.160 --> 13:39.199 +Graphical reports. These are all something that, + +13:39.200 --> 13:43.439 +It currently doesn't have, and these nice apps do have. + +13:43.440 --> 13:45.399 +They have charts of all kinds. + +13:45.400 --> 13:48.799 +You can see your progress from week to week + +13:48.800 --> 13:49.959 +on various exercise. + +13:49.960 --> 13:54.359 +They have like charts galore, all these like fancy apps. + +13:54.360 --> 14:00.319 +And in theory, it wouldn't be hard at all to like, + +14:00.320 --> 14:03.719 +cause like, you know, there's a GNU plot. + +14:03.720 --> 14:07.119 +There's those, and then they have like + +14:07.120 --> 14:10.479 +very good packages on any of them. + +14:10.480 --> 14:13.919 +So, I mean, I assume integration would be pretty seamless. + +14:13.920 --> 14:16.199 +So yes, that is definitely on the list + +14:16.200 --> 14:17.759 +of things I want to do. + +14:17.760 --> 14:21.599 +Have you ever wanted to modify + +14:21.600 --> 14:23.679 +the functionality of your mobile device + +14:23.680 --> 14:26.119 +while working out any good + +14:26.120 --> 14:28.439 +or challenging experiences or tips with that? + +14:28.440 --> 14:30.759 +Yeah, that's actually funny. + +14:30.760 --> 14:37.439 +There was a time where, yeah, I mean, like debugging, + +14:37.440 --> 14:40.999 +there was like some bug I was having with my code. + +14:41.000 --> 14:44.799 +And so I have, in the middle of a workout, + +14:44.800 --> 14:48.439 +yeah, start, like, open up the debugger and kind of, + +14:48.440 --> 14:50.959 +and the cool thing is that, I mean, + +14:50.960 --> 14:53.079 +the biggest thing, like, the biggest thing by far + +14:53.080 --> 14:54.599 +is unexpected keyboard. + +14:54.600 --> 14:56.359 +Like, I can't state how, + +14:56.360 --> 14:58.439 +I don't know how much unexpected keyboard is, + +14:58.440 --> 15:01.279 +because, like, with unexpected, with the unexpected, + +15:01.280 --> 15:03.599 +with that keyboard, you can literally just, like, + +15:03.600 --> 15:06.159 +it's, it's not hard at all to, like, + +15:06.160 --> 15:11.159 +you can do meta x or uh control meta x + +15:11.160 --> 15:13.639 +or you know control u control meta x + +15:13.640 --> 15:15.959 +to like you know debug like you can do all the key bindings + +15:15.960 --> 15:18.519 +with unexpected keyboard there's so there's no problem + +15:18.520 --> 15:20.279 +whatsoever whatsoever + +15:20.280 --> 15:23.599 +with that part the only part is muscle memory like like + +15:23.600 --> 15:25.599 +it's because you get the muscle memory + +15:25.600 --> 15:26.839 +of like the emacs key binding + +15:26.840 --> 15:28.279 +and so you have to kind of like yeah + +15:28.280 --> 15:31.639 +i mean that translation is actually kind of + +15:31.640 --> 15:35.039 +you have to think about it like, like, okay, + +15:35.040 --> 15:36.559 +what was that key binding again? + +15:36.560 --> 15:39.559 +And you have to kind of like do it with your fingers. + +15:39.560 --> 15:41.359 +And it was like doing it on the, on Android is, + +15:41.360 --> 15:44.199 +I mean, it takes a little longer + +15:44.200 --> 15:45.439 +and it's just a different, yeah, + +15:45.440 --> 15:47.079 +different set of different muscle memory. + +15:47.080 --> 15:51.559 +Gotcha. Sorry, if you've covered this, + +15:51.560 --> 15:55.439 +does the rest timer end with an audible notification? + +15:55.440 --> 15:58.199 +That's the cool thing. + +15:58.200 --> 16:02.519 +So with the Emacs, with the Android notification settings, + +16:02.520 --> 16:06.159 +you can, I can show that again in more detail. + +16:06.160 --> 16:17.079 +So bonus settings, apps, pick the app, notifications. + +16:17.080 --> 16:21.159 +And then here we get that Org Fit Restover. + +16:21.160 --> 16:22.919 +And so here you can set, for example, + +16:22.920 --> 16:24.879 +whether it's a silent notification. + +16:24.880 --> 16:27.959 +And so this won't, this won't make it make noise you can do + +16:27.960 --> 16:29.559 +or like make it have a noise + +16:29.560 --> 16:31.679 +and so you can have it make sure + +16:31.680 --> 16:33.119 +it's pop on this way the screen + +16:33.120 --> 16:37.039 +and then yeah you can just pick you can just pick whatever ringtone you want + +16:37.040 --> 16:38.679 +and you can make it look like yeah + +16:38.680 --> 16:42.559 +and then obviously you have like the whole uh volume setting + +16:42.560 --> 16:44.559 +so you can like when you're when you're uh when you're working + +16:44.560 --> 16:50.519 +you know you can just set the volume pretty high + +16:50.520 --> 16:51.679 +so if you set if you do happen + +16:51.680 --> 16:55.719 +to set your phone kind of away You set the volume high, + +16:55.720 --> 16:57.239 +maybe make a really annoying sound, + +16:57.240 --> 17:00.759 +a loud sound you won't miss. And then, yeah, you'll be set. + +17:00.760 --> 17:02.159 +So that works. + +17:02.160 --> 17:04.639 +That was actually one of the biggest surprises. + +17:04.640 --> 17:08.599 +I wasn't expecting that to work so nice. + +17:08.600 --> 17:17.279 +One of the next question relates to the unexpected keyboard. + +17:17.280 --> 17:19.399 +Question is, have you tried other keyboards, + +17:19.400 --> 17:20.399 +such as Hacker's Keyboard? + +17:20.400 --> 17:27.119 +Not recently. I haven't, so I couldn't compare them. + +17:27.120 --> 17:31.359 +Fair enough. Another keyboard question. + +17:31.360 --> 17:34.399 +Have you tried Flickboard on F-Droid? + +17:34.400 --> 17:37.959 +The commenter says, this is the craziest keyboard. + +17:37.960 --> 17:44.559 +You use one thumb. Oh, that is interesting. Let me see. + +17:44.560 --> 17:48.879 +Flickboard. Flickboard. Yeah, I'll have to try that. + +17:48.880 --> 17:53.119 +I'm curious to get the key bindings done. + +17:53.120 --> 17:57.359 +I wonder if the key bindings and all that work. + +17:57.360 --> 18:01.279 +I hope that's interesting. I'll definitely look into that. + +18:01.280 --> 18:02.359 +So I'll hold on just a moment + +18:02.360 --> 18:04.239 +as people are typing in more questions. + +18:04.240 --> 18:06.759 +A good moment to just thank you for the talk. + +18:06.760 --> 18:09.719 +It's personally, it's one of my favorite things + +18:09.720 --> 18:14.559 +to see at EmacsConf is, you know, a glimpse into a world + +18:14.560 --> 18:17.679 +that kind of isn't mine, right? + +18:17.680 --> 18:22.799 +but it shows how, you know, Emacs is sort of + +18:22.800 --> 18:25.999 +the bazaar in the cathedral + +18:26.000 --> 18:28.439 +and bazaar sense of we're all just here + +18:28.440 --> 18:31.839 +sort of hauling our bags of toys + +18:31.840 --> 18:35.679 +into the center square and, you know, making a, + +18:35.680 --> 18:38.439 +you know, I don't know if it's a house of cards + +18:38.440 --> 18:40.319 +or what exactly it is, + +18:40.320 --> 18:43.559 +but it, you know, it's managing to keep me afloat personally. + +18:43.560 --> 18:47.239 +And I just appreciate your, you know, + +18:47.240 --> 18:48.519 +kind of expanding my world. + +18:48.520 --> 18:53.759 +It's pretty cool. Yeah, definitely. Yeah, I mean, I agree. + +18:53.760 --> 19:01.079 +There's a lot of different, yeah. So, next commenter. + +19:01.080 --> 19:05.359 +I'm curious, oh, sorry, I skipped one here. + +19:05.360 --> 19:07.399 +This user interface is simplified, + +19:07.400 --> 19:09.639 +but still keyboard based. + +19:09.640 --> 19:11.959 +Have you thought about ways to make it more touch-based? + +19:11.960 --> 19:16.039 +Good question. Yeah, yeah, yeah. + +19:16.040 --> 19:19.599 +So the only thing currently, I think, + +19:19.600 --> 19:22.119 +of specific touch-based functionality I have, + +19:22.120 --> 19:25.399 +which, so this is like, so let's see, + +19:25.400 --> 19:37.679 +it's Control X, Control Plus, + +19:37.680 --> 19:40.159 +I think that's the, okay, that wrong, + +19:40.160 --> 19:42.959 +that key binding wrong, what was it? Okay, whatever. + +19:42.960 --> 19:45.559 +Yeah, so in terms of touch command, + +19:45.560 --> 19:47.839 +so pressing on a headline will actually unfold it + +19:47.840 --> 19:50.799 +and move your cursor to the next field that you, + +19:50.800 --> 19:54.639 +yeah, so like, yeah, at the beginning of the table. + +19:54.640 --> 19:56.959 +So like, there's that, yeah, and so. + +19:56.960 --> 20:02.399 +It sounds like that is something you're thinking about. + +20:02.400 --> 20:03.639 +Yeah, exactly. + +20:03.640 --> 20:05.999 +Like, you know, maybe like a little thing at the bottom, + +20:06.000 --> 20:09.559 +like, so this thing has the, this app has this, + +20:09.560 --> 20:10.839 +if you notice, like, if you do something, + +20:10.840 --> 20:12.479 +it has this rest timer at the bottom. + +20:12.480 --> 20:14.639 +So I mean, it wouldn't be, + +20:14.640 --> 20:16.599 +it wouldn't be pretty, it wouldn't be, + +20:16.600 --> 20:18.799 +it seems quite doable to just have like, + +20:18.800 --> 20:19.839 +maybe something at the bottom, + +20:19.840 --> 20:21.319 +like for a timer, + +20:21.320 --> 20:24.159 +and then you can just like plus 15 seconds or cancel it + +20:24.160 --> 20:25.239 +or, you know, just, + +20:25.240 --> 20:27.279 +and then those could all be just like touch based. + +20:27.280 --> 20:30.559 +And so, yeah. And then obviously just like, + +20:30.560 --> 20:36.119 +just like classic Emacs, the Emacs, + +20:36.120 --> 20:43.359 +like clicking actions, they just, yeah, + +20:43.360 --> 20:44.159 +they work just fine. + +20:44.160 --> 20:47.439 +Like, so there's no like weird Android touch thing + +20:47.440 --> 20:48.359 +you have to worry about. + +20:48.360 --> 20:52.559 +So let me ask a question of my own here. + +20:52.560 --> 20:57.199 +Just thinking about that myself, how would you, you know, + +20:57.200 --> 21:00.119 +ideally approach that as that you'd most prefer + +21:00.120 --> 21:02.879 +to sort of dive into yourself? + +21:02.880 --> 21:07.919 +Or would you think about factoring that out into + +21:07.920 --> 21:12.159 +like some kind of org touch higher level API or? + +21:12.160 --> 21:19.679 +Oh, I mean, personally, personally, I mean, I mean, + +21:19.680 --> 21:21.279 +I think just like the clicking + +21:21.280 --> 21:28.279 +and just like adding a lambda to it. That works. + +21:28.280 --> 21:35.759 +I mean, that feels like it works just fine. + +21:35.760 --> 21:41.639 +And you can add the code, like the command right there. + +21:41.640 --> 21:45.439 +So it's all like, yeah, it's all, I mean, + +21:45.440 --> 21:49.159 +and that's kind of a nice thing is like having everything like close, + +21:49.160 --> 21:54.159 +just like not having those, a lot of layers of abstraction. + +21:54.160 --> 22:03.279 +It's just like, you have a Lambda to the click and then just do. + +22:03.280 --> 22:06.439 +Yeah, just do. That was my experience too. + +22:06.440 --> 22:09.599 +This is a few years several years ago at ENAC's conference, + +22:09.600 --> 22:13.079 +we were shocked to learn just how usable, + +22:13.080 --> 22:18.559 +this is echoing a comment I see from Elip Energo on IRC, + +22:18.560 --> 22:21.479 +who says, touch seems so wildly usable nowadays, + +22:21.480 --> 22:22.399 +that's so awesome. + +22:22.400 --> 22:25.159 +And that was really my experience too with Dungeon. + +22:25.160 --> 22:28.719 +We were just working on it, we got the fog of war going, + +22:28.720 --> 22:32.439 +and then just took it onto a touchscreen laptop at the time, + +22:32.440 --> 22:33.959 +and we're just shocked to learn, + +22:33.960 --> 22:37.479 +you know, everything just worked. Yeah. + +22:37.480 --> 22:38.639 +Maybe like the hardest thing + +22:38.640 --> 22:40.559 +is actually just the default font size. + +22:40.560 --> 22:42.559 +You know, you have to like, you can't, + +22:42.560 --> 22:44.279 +you can't have your font too small or you'll, + +22:44.280 --> 22:46.319 +you'll like, you'll touch, you'll, + +22:46.320 --> 22:48.279 +you'll miss touch things a lot. Yeah. + +22:48.280 --> 22:50.159 +Well, there's no font size + +22:50.160 --> 22:52.999 +large enough to make me, you know, + +22:53.000 --> 22:58.159 +to make me comfortable on a smart device, unfortunately. + +22:58.160 --> 23:00.599 +But, but that, I think it may be a me problem. + +23:00.600 --> 23:04.439 +I think this question we might've missed. So the file sync. + +23:04.440 --> 23:12.679 +Yeah, so the file sync in terms of what's worked for me, + +23:12.680 --> 23:14.039 +I did have to play around with this a lot. + +23:14.040 --> 23:15.999 +Let me go ahead and read it out. + +23:16.000 --> 23:18.519 +You mentioned file sync, what have you found works well for you? + +23:18.520 --> 23:21.319 +Sorry. Yeah, yeah, yeah. + +23:21.320 --> 23:25.319 +So in terms of what, yeah, I did have to play around with this a lot, + +23:25.320 --> 23:28.639 +but sync thing fork is what I eventually settled on. + +23:28.640 --> 23:34.959 +I mean, this is another thing that, I mean, I don't, + +23:34.960 --> 23:36.319 +it wouldn't nearly be as usable, + +23:36.320 --> 23:39.679 +like Emacs wouldn't be nearly usable without it. + +23:39.680 --> 23:41.319 +So syncing fork essentially, okay. + +23:41.320 --> 23:44.559 +And then I also have like a droplet on DigitalOcean, + +23:44.560 --> 23:47.399 +just like, so that's kind of like the whole, + +23:47.400 --> 23:49.879 +that's kind of like what bridges it together. + +23:49.880 --> 23:52.519 +So like, so my Emacs can sync to that, + +23:52.520 --> 23:56.559 +and then my machine also syncs to that. + +23:56.560 --> 24:00.719 +And so like, I don't have to have them + +24:00.720 --> 24:06.359 +both on the same time. It's just there, that copy. + +24:06.360 --> 24:09.599 +And so that works pretty well. + +24:09.600 --> 24:13.559 +I also found that editing code in general, + +24:13.560 --> 24:15.359 +I think this also goes + +24:15.360 --> 24:19.919 +with the development experience question. + +24:19.920 --> 24:22.639 +So I'm curious about the development experience. + +24:22.640 --> 24:24.639 +Do you do everything on the phone? And that's the thing. + +24:24.640 --> 24:27.119 +None of my development in general is done on the phone. + +24:27.120 --> 24:32.439 +just because, for one, my muscle memory isn't there, + +24:32.440 --> 24:38.399 +and two, just in general, typing on a virtual keyboard on the phone, + +24:38.400 --> 24:40.119 +it's just really slow. + +24:40.120 --> 24:47.159 +So yeah, all the development is done on my machine, + +24:47.160 --> 24:52.119 +but then there's the problem of you have to have an init.l in your Android, + +24:52.120 --> 24:55.159 +and so you're going to have to write, you know, + +24:55.160 --> 24:56.919 +I found like you'd have to like, + +24:56.920 --> 24:58.279 +when you first get Emacs set up, + +24:58.280 --> 25:01.239 +you might have to like write some, I don't know, + +25:01.240 --> 25:03.959 +like you'll kind of have to like get into your init file + +25:03.960 --> 25:04.479 +and then just like, + +25:04.480 --> 25:06.999 +maybe just like start to put things together. + +25:07.000 --> 25:09.759 +But the cool thing is with SyncThinkFork, + +25:09.760 --> 25:15.519 +I'm syncing my, I'm setting it to load off of a sync directory. + +25:15.520 --> 25:18.559 +Like this, this init file, + +25:18.560 --> 25:21.159 +my Android file is synced with my machine. + +25:21.160 --> 25:24.319 +So if I wanted to, I could just edit it on my machine + +25:24.320 --> 25:25.879 +and just have that synced automatically. + +25:25.880 --> 25:28.839 +So that makes like the whole, like in it, + +25:28.840 --> 25:31.879 +cause like it's, it's such a, like, that is one of the, + +25:31.880 --> 25:33.079 +it's just like getting, + +25:33.080 --> 25:36.879 +sit writing your init L and M in Emacs on Android + +25:36.880 --> 25:37.839 +is just kind of a. + +25:37.840 --> 25:39.359 +We do have one more question. + +25:39.360 --> 25:41.479 +I can't help but throw in a comment there. + +25:41.480 --> 25:43.759 +I think that's like. + +25:43.760 --> 25:47.519 +That's an extremely good tip, right? + +25:47.520 --> 25:49.959 +That if we're, as we're exploring Android, + +25:49.960 --> 25:52.839 +we want to think about that as + +25:52.840 --> 25:55.759 +adding support for another port of Emacs. + +25:55.760 --> 25:58.959 +So the whole dance of, oh, I took, you know, + +25:58.960 --> 26:01.239 +I took, you know, I took my init + +26:01.240 --> 26:04.479 +and I wanted to use it on BSD + +26:04.480 --> 26:06.439 +after mostly using GNU Linux. + +26:06.440 --> 26:09.119 +Now we're going in and we're looking at our Emacs. + +26:09.120 --> 26:11.279 +all of our Emacs and it stuff + +26:11.280 --> 26:13.839 +and thinking about compatibility, + +26:13.840 --> 26:15.199 +turning features on and off + +26:15.200 --> 26:19.959 +based on the OS that we're running underneath and so on. + +26:19.960 --> 26:22.119 +I think that's pretty heads up advice. + +26:22.120 --> 26:24.759 +Let me read out this other question. + +26:24.760 --> 26:28.199 +Have you thought about integrating cardio tracking + +26:28.200 --> 26:30.559 +like time runs, bike rides, and so on? + +26:30.560 --> 26:34.319 +Yes, I definitely thought about that. + +26:34.320 --> 26:36.599 +And that might be another thing + +26:36.600 --> 26:38.479 +where a touch interface might be helpful. + +26:38.480 --> 26:41.559 +I don't know if I can easily pull it up, + +26:41.560 --> 26:47.199 +but the app itself, oh yeah, here it is. + +26:47.200 --> 26:50.199 +So you can see kind of how they have, + +26:50.200 --> 26:53.279 +and you can kind of see how this fits. + +26:53.280 --> 26:55.119 +This is like an org, you can see + +26:55.120 --> 26:57.399 +that these are just tables, right? + +26:57.400 --> 26:59.239 +This is just like this whole interface in general, + +26:59.240 --> 27:02.279 +just like kind of screams like an org mode, + +27:02.280 --> 27:05.119 +file with you have you have your different headings + +27:05.120 --> 27:06.559 +like here's a warm-up heading + +27:06.560 --> 27:07.839 +and then you have the tables + +27:07.840 --> 27:09.879 +and you know you could just like envision + +27:09.880 --> 27:12.839 +how you could have a org table + +27:12.840 --> 27:15.039 +with one of the columns called time + +27:15.040 --> 27:18.439 +and then you could just imagine like there'd be a button there + +27:18.440 --> 27:21.159 +and you can just just have it click, + +27:21.160 --> 27:24.279 +and then you'd have a timer in the background + +27:24.280 --> 27:25.799 +that would update this timer. + +27:25.800 --> 27:32.599 +It's so, I mean, conceptually, there's nothing really, + +27:32.600 --> 27:35.799 +it conceptually maps really well to this. + +27:35.800 --> 27:41.559 +So yeah, I mean, that's definitely something. + +27:41.560 --> 27:44.439 +That's awesome. Great answer. + +27:44.440 --> 27:47.759 +So I think we're just at about 90 seconds left. + +27:47.760 --> 27:50.119 +Perfect amount of time, I think, to just wrap up. + +27:50.120 --> 27:52.199 +Closing thoughts. I'll share mine first. + +27:52.200 --> 27:53.759 +Really appreciate you, Zach. + +27:53.760 --> 27:56.639 +Thank you for putting this talk together. + +27:56.640 --> 27:59.359 +I think this is the type of talk + +27:59.360 --> 28:01.239 +that's really going to tie the room together + +28:01.240 --> 28:07.559 +for people that may be, you know, not sure how they can take + +28:07.560 --> 28:12.719 +although they've been interested in that, + +28:12.720 --> 28:16.399 +this can be a really good way to kind of open up the world. + +28:16.400 --> 28:20.319 +Thank you. Thank you for putting it together. + +28:20.320 --> 28:22.439 +Yeah, yeah, yeah, yeah, I would just say + +28:22.440 --> 28:24.159 +like definitely just try things out. + +28:24.160 --> 28:25.359 +Like if you think, you know, + +28:25.360 --> 28:26.439 +they're just like random ideas, + +28:26.440 --> 28:30.319 +like a book tracking app or like a recipe app, + +28:30.320 --> 28:33.479 +like, you know, there's a lot of things + +28:33.480 --> 28:35.599 +that you do on your mobile device + +28:35.600 --> 28:37.719 +that aren't like banking apps that you could easily, + +28:37.720 --> 28:39.759 +that seem like they could be done in Emacs. + +28:39.760 --> 28:42.479 +So yeah, just try different things out + +28:42.480 --> 28:47.239 +and I would love to hear what other people do. Bravo. + +28:47.240 --> 28:52.519 +I appreciate it once again, you're coming together + +28:52.520 --> 28:56.639 +and especially you're doing it live. + +28:56.640 --> 29:00.079 +I know that as a conference, we have a lot of preference + +29:00.080 --> 29:01.479 +for those recorded talks + +29:01.480 --> 29:02.759 +and getting the captioning together, + +29:02.760 --> 29:05.319 +but I just have a special place in my heart + +29:05.320 --> 29:07.679 +for the energy that comes with a live talk + +29:07.680 --> 29:12.560 +and I appreciate you doing it. Thanks for putting this on. diff --git a/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--answers.vtt b/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--answers.vtt new file mode 100644 index 00000000..0362cbc2 --- /dev/null +++ b/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--answers.vtt @@ -0,0 +1,4019 @@ +WEBVTT + +00:00:00.000 --> 00:00:07.319 +Yes. All right. Take it away. Thank you, Christian. Thank you, too. + +00:00:07.320 --> 00:00:09.359 +If you could have the pad open at the same time, + +00:00:09.360 --> 00:00:11.319 +you can read the questions. + +00:00:11.320 --> 00:00:13.639 +Or I can start reading some to you while I'm here. + +00:00:13.640 --> 00:00:14.959 +Oh, no. I can read them. + +00:00:14.960 --> 00:00:21.599 +I was wondering whether I should maybe copy them into a new buffer. + +00:00:21.600 --> 00:00:30.159 +So they are also on screen. Increase the font size a bit. + +00:00:30.160 --> 00:00:39.839 +So I'm trying to do this on the fly. + +00:00:39.840 --> 00:00:41.279 +Maybe a bad idea. Let's see. + +00:00:41.280 --> 00:00:42.519 +Of course, you're going to capture it + +00:00:42.520 --> 00:00:45.879 +into your Zettelkasten then. Is that what's happening? + +00:00:45.880 --> 00:00:49.559 +Well, I can start you off. + +NOTE Q: What do you use for the fancy animations? + +00:00:49.560 --> 00:00:56.279 +The first question is, I wonder what they use for the fancy animations. + +00:00:56.280 --> 00:00:59.559 +I was thinking about this because that's the first question + +00:00:59.560 --> 00:01:00.959 +and I was thinking about this + +00:01:00.960 --> 00:01:02.599 +while I copied this stuff over. + +00:01:02.600 --> 00:01:09.359 +What part is the fancy part? + +00:01:09.360 --> 00:01:13.079 +I can recommend books, like if anyone wants to have book recommendations + +00:01:13.080 --> 00:01:18.039 +for how to make presentations with PowerPoint-like software + +00:01:18.040 --> 00:01:22.999 +in a very simple way, we taught this at university. + +00:01:23.000 --> 00:01:25.559 +was it now, some 15 years ago, + +00:01:25.560 --> 00:01:28.799 +to students to make animation abuse + +00:01:28.800 --> 00:01:32.439 +where everything was flashy and typed in or something. + +00:01:32.440 --> 00:01:36.679 +Don't do this, but instead do a couple of very simple tasteful things + +00:01:36.680 --> 00:01:41.959 +like fading through colors like filmmakers do, right? + +00:01:41.960 --> 00:01:44.199 +Fading through black to make a scene cut + +00:01:44.200 --> 00:01:47.839 +or just fade between things, the fanciness. + +00:01:47.840 --> 00:01:53.759 +Presentation software stack, the fanciness. + +00:01:53.760 --> 00:01:55.079 +I didn't dial fanciness up, + +00:01:55.080 --> 00:02:00.239 +I just resorted to a very simple fade animations, + +00:02:00.240 --> 00:02:04.719 +like fading stuff in and wipe, I think, for text effects. + +00:02:04.720 --> 00:02:06.879 +That was it, more or less. + +00:02:06.880 --> 00:02:09.959 +And for the lines, maybe the lines are fancy. + +00:02:09.960 --> 00:02:14.679 +I was using Apple Keynote because I'm fastest with that, + +00:02:14.680 --> 00:02:19.079 +but I also usually, we taught this workshop with PowerPoint + +00:02:19.080 --> 00:02:23.319 +and I think the LibreOffice stack got much better with that + +00:02:23.320 --> 00:02:24.239 +as well in the recent years, + +00:02:24.240 --> 00:02:26.279 +but I haven't tried that in a long time + +00:02:26.280 --> 00:02:31.599 +to like fiddle around and find all the knobs to dial. + +00:02:31.600 --> 00:02:34.719 +Because the Apple presentation thingy has this nice feature + +00:02:34.720 --> 00:02:37.079 +where you draw an arrow with a tip, + +00:02:37.080 --> 00:02:41.039 +and then you have a special animation for line drawing, + +00:02:41.040 --> 00:02:42.439 +which is only available for line art. + +00:02:42.440 --> 00:02:45.559 +And then it draws the arrow that moves around like that. + +00:02:45.560 --> 00:02:48.079 +So yeah, presentation stack, Apple Keynote, + +00:02:48.080 --> 00:02:52.559 +probably not of interest for anyone here. + +00:02:52.560 --> 00:02:56.439 +I usually don't use plain text presentation stuff, right? + +00:02:56.440 --> 00:03:03.319 +So I tried this, I tried this with markdown presentations, + +00:03:03.320 --> 00:03:08.319 +slidey things, org presentation. + +00:03:08.320 --> 00:03:12.879 +It's always not enough control for the fiddly things + +00:03:12.880 --> 00:03:17.959 +that I'm interested in to make the experience great. + +00:03:17.960 --> 00:03:20.199 +So I wonder what are the fancy animations. + +00:03:20.200 --> 00:03:25.439 +And the stack, the stack is Apple Keynote, sorry. + +00:03:25.440 --> 00:03:30.079 +Okay, that's enough. Thank you for capturing. + +NOTE Q: Are you not a fan of using *, **, *** headings in org-mode? + +00:03:30.080 --> 00:03:37.719 +Are you not a fan? Okay. You saw this in the recording. + +00:03:37.720 --> 00:03:43.839 +Why on earth is autofill mode not enabled? I don't know. + +00:03:43.840 --> 00:03:48.479 +I thought it is the default, but apparently it isn't. + +00:03:48.480 --> 00:03:52.039 +I could also use visual line mode. + +00:03:52.040 --> 00:03:55.719 +It's built in as well, right? Visual line mode. + +00:03:55.720 --> 00:03:57.999 +It's so weird to be in this vanilla setup + +00:03:58.000 --> 00:04:00.439 +and not have all my key bindings + +00:04:00.440 --> 00:04:04.959 +and my normal stuff ready, so. + +00:04:04.960 --> 00:04:08.479 +I am not a fan of using asterisk headings in org mode. + +00:04:08.480 --> 00:04:12.359 +It's interesting to see how people have different styles of writing org content. + +00:04:12.360 --> 00:04:22.359 +Am I not? What exactly? What did I do? + +00:04:22.360 --> 00:04:25.959 +And notes, just open one of these. + +00:04:25.960 --> 00:04:33.519 +Okay. I could see how you could, in examples like this, + +00:04:33.520 --> 00:04:36.639 +use org-mode to read-only. + +00:04:36.640 --> 00:04:44.599 +Why? How you could use org-mode to use headings for this, + +00:04:44.600 --> 00:04:48.159 +because it's an outliner first and foremost, + +00:04:48.160 --> 00:04:50.439 +so outlining is very natural. + +00:04:50.440 --> 00:04:53.279 +But when I do in my personal setup, + +00:04:53.280 --> 00:04:58.079 +I also have this what's called start indentation thingy. + +00:04:58.080 --> 00:05:01.079 +enabled, so that means that everything + +00:05:01.080 --> 00:05:04.159 +would be indented one level from the start. + +00:05:04.160 --> 00:05:05.599 +So I would probably fiddle around + +00:05:05.600 --> 00:05:07.799 +with that to not get like crazy. + +00:05:07.800 --> 00:05:12.039 +But also, I don't see, I don't see, + +00:05:12.040 --> 00:05:13.839 +like really see when I look at this, + +00:05:13.840 --> 00:05:17.879 +I didn't see a potential to create subheadings, + +00:05:17.880 --> 00:05:19.479 +I mean, or even headings. + +00:05:19.480 --> 00:05:21.559 +The only heading here is the title, + +00:05:21.560 --> 00:05:24.279 +like in my perception of this note, + +00:05:24.280 --> 00:05:27.159 +and it's one, It's two lists. + +00:05:27.160 --> 00:05:28.639 +You could group these in headings. + +00:05:28.640 --> 00:05:40.319 +I didn't. That's right. Where's another one? + +00:05:40.320 --> 00:05:42.679 +I opened the autosave file because I'm stupid. + +00:05:42.680 --> 00:05:46.719 +OK. So this one could also be probably subdivided. + +00:05:46.720 --> 00:05:48.559 +But I'm also not sure. + +00:05:48.560 --> 00:05:52.359 +I'm also not sure if I would gain anything structurally + +00:05:52.360 --> 00:05:55.799 +if I do it like this because then I'm in a structural level + +00:05:55.800 --> 00:05:58.279 +and the stuff that just flows naturally + +00:05:58.280 --> 00:06:01.039 +as a sequence of text paragraphs, + +00:06:01.040 --> 00:06:07.119 +this here, it's not disconnected. + +00:06:07.120 --> 00:06:10.519 +It wasn't meant to be under organism + +00:06:10.520 --> 00:06:16.839 +and I need to create a new same level thing + +00:06:16.840 --> 00:06:23.959 +to say, hey, these are, I don't know, details or whatever. + +00:06:23.960 --> 00:06:26.119 +So that's maybe the real reason. + +00:06:26.120 --> 00:06:28.879 +I'm fine with writing snippets that are self-contained + +00:06:28.880 --> 00:06:31.159 +and essentially one or two or three or five or whatever, + +00:06:31.160 --> 00:06:32.119 +how many paragraphs, + +00:06:32.120 --> 00:06:36.119 +but it's not like, it's always an outline form. + +00:06:36.120 --> 00:06:38.679 +So I don't resort to this. + +00:06:38.680 --> 00:06:40.999 +My onSettle custom is usually written in Markdown. + +00:06:41.000 --> 00:06:43.999 +So I use subheadings for actual headings + +00:06:44.000 --> 00:06:47.559 +to subdivide like I would subdivide an essay + +00:06:47.560 --> 00:06:49.759 +or an article, blog post. + +00:06:49.760 --> 00:06:52.839 +But that's the mode of writing that I'm in here. + +00:06:52.840 --> 00:06:54.319 +It's like blog post writing. + +00:06:54.320 --> 00:06:56.239 +I wouldn't start with four headings for this. + +00:06:56.240 --> 00:06:58.839 +So I'm not doing that. That's a thing. + +00:06:58.840 --> 00:07:04.919 +Okay, I guess I'm going to read the questions, + +00:07:04.920 --> 00:07:07.519 +but I'm going to stop copying them in because I lose time. + +00:07:07.520 --> 00:07:09.439 +I want to reply to you, folks. + +00:07:09.440 --> 00:07:11.479 +Didn't see a need for hierarchical structure. + +00:07:11.480 --> 00:07:13.719 +Thank you for capturing this. Next question. + +NOTE Q: Can you use org files and all its features inside Denote? + +00:07:13.720 --> 00:07:17.799 +Can you use org files and all its features inside Denote? + +00:07:17.800 --> 00:07:22.439 +Yes. Like this is, this is an org file + +00:07:22.440 --> 00:07:25.359 +and Denote uses org headings instead of, + +00:07:25.360 --> 00:07:28.799 +with Markdown, you get YAML front meta. + +00:07:28.800 --> 00:07:32.759 +And with org, you get these attributes, + +00:07:32.760 --> 00:07:36.359 +value attribute thingies + +00:07:36.360 --> 00:07:40.079 +that are then the metadata for the note. + +00:07:40.080 --> 00:07:45.279 +So yeah, the answer is yes. You get everything and on top, + +00:07:45.280 --> 00:07:48.159 +a small layer of a link, link management. + +00:07:48.160 --> 00:07:48.999 +That's all there is. + +NOTE Q: Where or how do you like to capture fleeting notes? + +00:07:49.000 --> 00:07:55.319 +Next question is, where or how do you like to capture fleeting notes? + +00:07:55.320 --> 00:07:58.479 +Oh, fleeting notes. If you say fleeting notes, + +00:07:58.480 --> 00:08:01.079 +you also need to say non-fleeting notes + +00:08:01.080 --> 00:08:02.399 +and figure out what these are. + +00:08:02.400 --> 00:08:05.079 +And when you say non-fleeting notes, + +00:08:05.080 --> 00:08:07.239 +and fleeting notes exist, because it's a distinction, + +00:08:07.240 --> 00:08:10.199 +and there's something on both sides of this distinction. + +00:08:10.200 --> 00:08:12.119 +If you say there's a distinction, there are two sides, + +00:08:12.120 --> 00:08:14.559 +maybe you want to subdivide the non-fleeting notes further, + +00:08:14.560 --> 00:08:16.199 +because, well, it's a non-fleeting note + +00:08:16.200 --> 00:08:21.159 +isn't very descriptive. So what else do you say there? + +00:08:21.160 --> 00:08:24.799 +And people have said a couple of things + +00:08:24.800 --> 00:08:28.479 +to define non-fleeting notes, for example, permanent notes. + +00:08:28.480 --> 00:08:33.199 +I guess that's a Sonke Ahrens, + +00:08:33.200 --> 00:08:35.039 +permanent notes is the most popular. + +00:08:35.040 --> 00:08:36.159 +Let's stay with that, stick with that. + +00:08:36.160 --> 00:08:38.279 +So if you have permanent notes and fleeting notes, + +00:08:38.280 --> 00:08:41.599 +now we have two types of notes. The thing is, in books, + +00:08:41.600 --> 00:08:46.319 +the only... when we would talk about note-taking + +00:08:46.320 --> 00:08:47.679 +and you would ask me, hey Christian, + +00:08:47.680 --> 00:08:49.559 +how do you take fleeting notes? + +00:08:49.560 --> 00:08:53.679 +I imagine the discussion would be in German + +00:08:53.680 --> 00:08:55.799 +because that's how people usually talk to me. + +00:08:55.800 --> 00:08:56.679 +I would pull out a book, + +00:08:56.680 --> 00:08:59.799 +this is Object-Oriented Software Engineering, + +00:08:59.800 --> 00:09:03.679 +interesting book by Ivar Jacobson. + +00:09:03.680 --> 00:09:06.159 +I'm not sure because, you know, + +00:09:06.160 --> 00:09:08.719 +it's an English or American person. + +00:09:08.720 --> 00:09:14.419 +And inside I have these fleeting notes like these + +00:09:14.420 --> 00:09:18.879 +are actual paper notes square what are these three by something inch + +00:09:18.880 --> 00:09:20.999 +American standard size I guess + +00:09:21.000 --> 00:09:25.964 +and A6 minus the tariff part + +00:09:25.965 --> 00:09:31.174 +from another notepad. These are notes I took, engagement notes + +00:09:31.175 --> 00:09:32.439 +if you will, like engagement notes, + +00:09:32.440 --> 00:09:34.999 +because the margins of the book don't suffice to take, + +00:09:35.000 --> 00:09:38.799 +and this is related to... I need more space, so this is more space. + +00:09:38.800 --> 00:09:41.119 +These are fleeting. + +00:09:41.120 --> 00:09:44.999 +As you see, I have them in my pile of books + +00:09:45.000 --> 00:09:46.839 +right next to me in the shelf + +00:09:46.840 --> 00:09:52.279 +and folded them in this piece of paper, + +00:09:52.280 --> 00:09:54.879 +labeled it with the author because I lost them + +00:09:54.880 --> 00:09:57.839 +couple of times they just fell out + +00:09:57.840 --> 00:09:58.759 +when I reached for the book + +00:09:58.760 --> 00:10:01.479 +and this is an envelope I shove it into the book + +00:10:01.480 --> 00:10:04.919 +and then forget about processing the book again + +00:10:04.920 --> 00:10:08.599 +for five or ten years. So what do I do with fleeting notes? + +00:10:08.600 --> 00:10:11.999 +I do fleeting notes on paper or if I'm using an e-reader + +00:10:12.000 --> 00:10:14.879 +maybe with an e-reader software annotation tool + +00:10:14.880 --> 00:10:21.639 +but fleeting in the most like simple non contrived sense, + +00:10:21.640 --> 00:10:23.839 +fleeting notes are meant as engagement notes + +00:10:23.840 --> 00:10:26.039 +and then you do something with them + +00:10:26.040 --> 00:10:27.519 +or like I just showed you, + +00:10:27.520 --> 00:10:29.879 +you don't because life's short, right? + +00:10:29.880 --> 00:10:31.919 +Time runs out, then you need to forget, + +00:10:31.920 --> 00:10:33.639 +then you need to remember + +00:10:33.640 --> 00:10:36.119 +how to restructure everything in your head + +00:10:36.120 --> 00:10:37.519 +to make sense of the notes again + +00:10:37.520 --> 00:10:38.359 +because they were fleeting, + +00:10:38.360 --> 00:10:40.999 +they were just little scribbles and it's + +00:10:41.000 --> 00:10:44.559 +It's basically ballast or waste. + +00:10:44.560 --> 00:10:46.679 +I'm just carrying this with me for years + +00:10:46.680 --> 00:10:50.879 +and maybe never get around to using these. + +00:10:50.880 --> 00:10:53.399 +But also, I put stuff on there, maybe I do. + +00:10:53.400 --> 00:10:55.399 +It doesn't hurt to keep them in there. + +00:10:55.400 --> 00:10:58.519 +It's just an odd collector's habit I can't get rid of. + +00:10:58.520 --> 00:11:03.399 +fleeting notes, I just capture them wherever + +00:11:03.400 --> 00:11:05.919 +and then either I process them or try to throw them away + +00:11:05.920 --> 00:11:07.079 +or forget about them + +00:11:07.080 --> 00:11:10.239 +because they're in some inbox file on a smartphone + +00:11:10.240 --> 00:11:13.159 +and then, you know, they might as well not exist, + +00:11:13.160 --> 00:11:15.439 +they're just there to engage me during the reading + +00:11:15.440 --> 00:11:17.079 +and if I don't process them in time, + +00:11:17.080 --> 00:11:21.999 +meh like, chance is up, it sucks + +00:11:22.000 --> 00:11:26.319 +Next question, like fleeting notes, permanent notes. + +00:11:26.320 --> 00:11:27.799 +I'm not going to talk about these + +00:11:27.800 --> 00:11:29.039 +unless someone asks a question. + +NOTE Q: Zettelkasten feels like a very "cagey" approach to note-taking and knowledge management. Doesn't it restrict one to think in certain ways rather than what feels natural to someone? + +00:11:29.040 --> 00:11:32.119 +Zettelkasten feels like a very cagey approach + +00:11:32.120 --> 00:11:34.079 +to note-taking and knowledge management. + +00:11:34.080 --> 00:11:36.519 +Doesn't it restrict one to think in certain ways + +00:11:36.520 --> 00:11:38.919 +rather than what feels natural to someone? + +00:11:38.920 --> 00:11:45.919 +Well, yes, but so does wearing underwear, right? + +00:11:45.920 --> 00:11:50.119 +A bit of personal revelation. + +00:11:50.120 --> 00:11:54.079 +When I'm working from home, I'm wearing pants. + +00:11:54.080 --> 00:11:57.039 +You don't see them, but I don't need to. + +00:11:57.040 --> 00:12:00.079 +But I'm also kind of self-restricting myself in a way + +00:12:00.080 --> 00:12:01.239 +because there's a window, + +00:12:01.240 --> 00:12:03.479 +it's dark outside, and I'm well lit. + +00:12:03.480 --> 00:12:05.479 +And if I just stand up and have no pants on, + +00:12:05.480 --> 00:12:12.919 +I don't care that much what the neighbors like 10, 20 meters across think. + +00:12:12.920 --> 00:12:15.759 +your mileage may vary then, right? + +00:12:15.760 --> 00:12:18.319 +So there are restrictions that make sense + +00:12:18.320 --> 00:12:24.439 +to get to some point in your day-to-day life. + +00:12:24.440 --> 00:12:25.999 +And in the case of Zettelkasten, + +00:12:26.000 --> 00:12:31.639 +I try to tell people the shortest story possible + +00:12:31.640 --> 00:12:36.159 +to convey a story there, but also not to cage them in + +00:12:36.160 --> 00:12:38.679 +with 20 definitions of different notes. + +00:12:38.680 --> 00:12:42.279 +Because all that matters is try to move your thinking + +00:12:42.280 --> 00:12:44.039 +into an environment where you can write, + +00:12:44.040 --> 00:12:45.719 +where you feel comfortable writing, + +00:12:45.720 --> 00:12:47.239 +and where you can keep this stuff. + +00:12:47.240 --> 00:12:50.239 +Because I do feel comfortable with a pencil and paper. + +00:12:50.240 --> 00:12:54.199 +But what I just showed you, this might as well never have happened. + +00:12:54.200 --> 00:12:56.719 +Something has changed in my brain. + +00:12:56.720 --> 00:13:01.159 +most likely, when I engaged with a book like this. + +00:13:01.160 --> 00:13:04.199 +As far as publications and writing is concerned, + +00:13:04.200 --> 00:13:06.079 +this might as well not exist in my life, + +00:13:06.080 --> 00:13:10.279 +because I didn't do something with it. + +00:13:10.280 --> 00:13:15.239 +I mean, I was reading the book probably on a commute back then, on the train. + +00:13:15.240 --> 00:13:18.679 +I didn't take notes on the computer right away. + +00:13:18.680 --> 00:13:20.159 +So if you feel caged in, + +00:13:20.160 --> 00:13:24.319 +that may be a sign that you went too far on the, + +00:13:24.320 --> 00:13:26.479 +I need to do this, I need to do that stage, + +00:13:26.480 --> 00:13:28.359 +and lose some of the playfulness. + +00:13:28.360 --> 00:13:29.959 +There needs to be playfulness + +00:13:29.960 --> 00:13:32.599 +inside of the whole procedure, otherwise it... + +00:13:32.600 --> 00:13:36.999 +If you don't enjoy doing it, you won't be doing it. + +00:13:37.000 --> 00:13:39.319 +And if you don't do it, then you don't get a benefit. + +00:13:39.320 --> 00:13:41.039 +And it's just another chore in your life. + +00:13:41.040 --> 00:13:42.479 +Then rather not do it. + +00:13:42.480 --> 00:13:46.479 +So try to avoid the feeling of caginess + +00:13:46.480 --> 00:13:49.639 +and do whatever you want with it + +00:13:49.640 --> 00:13:52.319 +as long as you try to give your best. + +00:13:52.320 --> 00:13:55.799 +That's the cage that you will benefit from + +00:13:55.800 --> 00:13:58.959 +like really trying maybe not trying hard + +00:13:58.960 --> 00:14:02.639 +but trying in earnest to produce + +00:14:02.640 --> 00:14:05.079 +something that you can read in a year in a week whatever + +00:14:05.080 --> 00:14:10.439 +and then make sense of it like that's that's that's the minimum bar and the rest + +00:14:10.440 --> 00:14:13.799 +If you find yourself writing for hours on end, + +00:14:13.800 --> 00:14:15.279 +during the nights, during the weekends, + +00:14:15.280 --> 00:14:17.759 +whatever, and can't stop, + +00:14:17.760 --> 00:14:21.279 +then you can tackle more of the prescriptions, let's say. + +00:14:21.280 --> 00:14:22.319 +But everything I showed to you + +00:14:22.320 --> 00:14:24.439 +was there are three essential things, + +00:14:24.440 --> 00:14:26.199 +and the rest is just add-ons. + +00:14:26.200 --> 00:14:28.519 +Add-ons to inspire you to think in certain ways, + +00:14:28.520 --> 00:14:31.279 +but you don't have to do them. You can scratch all of this. + +00:14:31.280 --> 00:14:33.679 +You just need to write to think, + +00:14:33.680 --> 00:14:35.119 +and then you need to connect + +00:14:35.120 --> 00:14:37.799 +to make the thinking happen in an organic way. + +00:14:37.800 --> 00:14:40.559 +Otherwise, you get a storage that's very hard to navigate + +00:14:40.560 --> 00:14:45.999 +and doesn't grow well. Thanks. Yeah, you're welcome. + +00:14:46.000 --> 00:14:51.159 +I'm not writing another show. Yeah. Oh, combine the forums. + +00:14:51.160 --> 00:14:54.439 +Like it's a Zettelkasten anonymous group there. + +00:14:54.440 --> 00:14:56.239 +Like everyone's struggling. + +00:14:56.240 --> 00:14:58.479 +Everyone's struggling and it's okay to like, + +00:14:58.480 --> 00:15:01.319 +I'm feeling like stuck at this and that. + +00:15:01.320 --> 00:15:03.919 +And then other people will be able to relate. + +00:15:03.920 --> 00:15:07.327 +I can promise. + +NOTE Q: How does denote compare to org-roam? + +00:15:07.328 --> 00:15:10.279 +How does it denote, question mark maybe, + +00:15:10.280 --> 00:15:11.639 +compared to org-roam? + +00:15:11.640 --> 00:15:18.559 +Roam Research was setting a new trend of connectiveness + +00:15:18.560 --> 00:15:21.119 +because you could create recursive structures with links + +00:15:21.120 --> 00:15:22.199 +and everything is linkable. + +00:15:22.200 --> 00:15:25.439 +And it's like you put every sentence in its own org heading + +00:15:25.440 --> 00:15:27.679 +and then link to all the headings possibly + +00:15:27.680 --> 00:15:31.039 +and then transpile them so you can expand in place + +00:15:31.040 --> 00:15:32.239 +where you would link to. + +00:15:32.240 --> 00:15:34.959 +I think this was the approach at least. + +00:15:34.960 --> 00:15:38.479 +So this was a very interesting transclusion, not transpile. + +00:15:38.480 --> 00:15:41.919 +Transclude the contents, like move them in right then and there + +00:15:41.920 --> 00:15:45.839 +and not navigate to another page. It was interesting. + +00:15:45.840 --> 00:15:47.439 +It never made sense for me + +00:15:47.440 --> 00:15:50.239 +when people told their stories of how they used it. + +00:15:50.240 --> 00:15:53.439 +I guess you can use this tool for a lot of purposes, + +00:15:53.440 --> 00:15:59.199 +but the prevailing story of the Roam-style note-taking tools + +00:15:59.200 --> 00:16:01.879 +was like, just dump everything in it. + +00:16:01.880 --> 00:16:04.439 +And garbage in, garbage out still holds. + +00:16:04.440 --> 00:16:07.559 +I do keep my personal journal away + +00:16:07.560 --> 00:16:10.279 +from my Zettelkasten nowadays + +00:16:10.280 --> 00:16:12.799 +because I want to not restrict myself + +00:16:12.800 --> 00:16:14.399 +when I feel the urge to journal, + +00:16:14.400 --> 00:16:18.919 +when I want to capture something that, for example, my 15-month-old baby daughter does. + +00:16:18.920 --> 00:16:21.239 +Like, first time she pulled a chair + +00:16:21.240 --> 00:16:22.679 +out of another room to the next room + +00:16:22.680 --> 00:16:25.479 +just to create a ladder to then climb onto another thing. + +00:16:25.480 --> 00:16:27.439 +It just was, okay, this is now the time + +00:16:27.440 --> 00:16:30.839 +to take note of this. in her life, like you were this + +00:16:30.840 --> 00:16:33.159 +and that many months old when you did this. + +00:16:33.160 --> 00:16:35.359 +So we have some reference parts. And I could put this kind + +00:16:35.360 --> 00:16:37.399 +of factual information in Zettelkasten, + +00:16:37.400 --> 00:16:42.199 +but also, like, what if I have a toothache or whatever, + +00:16:42.200 --> 00:16:44.924 +and just want to gather data for whatever reason? + +00:16:44.925 --> 00:16:52.119 +I don't know. Like this kind of personal stuff. + +00:16:52.120 --> 00:16:55.639 +That's too much of the non-useful stuff + +00:16:55.640 --> 00:16:58.199 +in a tool that I want to use to think. + +00:16:58.200 --> 00:17:00.479 +I do see the appeal there. + +00:17:00.480 --> 00:17:04.039 +But anyway, the org-roam, like that's a Roam part. + +00:17:04.040 --> 00:17:05.879 +You can watch a lot of videos + +00:17:05.880 --> 00:17:07.159 +on that to get a feel for this. + +00:17:07.160 --> 00:17:10.559 +Org-roam adopted this to make the connection easier + +00:17:10.560 --> 00:17:13.479 +and replicate features. As I said, porting tools + +00:17:13.480 --> 00:17:16.399 +that exist into Emacs, very nice pastime. + +00:17:16.400 --> 00:17:18.079 +A lot of people do this for a lot of things, + +00:17:18.080 --> 00:17:20.359 +but it's not a thinking environment. + +00:17:20.360 --> 00:17:22.319 +It's just another tool to take notes in + +00:17:22.320 --> 00:17:25.279 +that behave weirdly with links or interestingly with links. + +00:17:25.280 --> 00:17:29.159 +And Denote does do even less. + +00:17:29.160 --> 00:17:31.199 +It only offers you a couple of shortcuts + +00:17:31.200 --> 00:17:33.799 +to help you find files quickly. + +00:17:33.800 --> 00:17:37.679 +It does, like you see in the bottom here in the mode line, + +00:17:37.680 --> 00:17:40.519 +it does just show square brackets D + +00:17:40.520 --> 00:17:44.359 +instead of the whole ID, which would be rather long. + +00:17:44.360 --> 00:17:48.399 +So you have a buffer list that is bearable and works. + +00:17:48.400 --> 00:17:51.439 +You can read this and find the title quickly. + +00:17:51.440 --> 00:17:56.199 +Things like that, Denote does things like that. + +00:17:56.200 --> 00:17:58.219 +Oh, I closed the wrong. + +00:17:58.200 --> 00:18:00.639 +Denote does things like that very well, + +00:18:00.640 --> 00:18:02.559 +but it gets out of your way otherwise. + +00:18:02.560 --> 00:18:04.079 +Just a couple of conventions + +00:18:04.080 --> 00:18:06.239 +to get stuff into your file system. + +00:18:06.240 --> 00:18:08.839 +I'm not sure if Org-Roam now, + +00:18:08.840 --> 00:18:11.199 +what's the current state there? + +00:18:11.200 --> 00:18:13.399 +Do they do ID generation out of the box? + +00:18:13.400 --> 00:18:18.319 +Is there a standard popular convention or whatever? + +00:18:18.320 --> 00:18:19.879 +not sure, didn't follow, + +00:18:19.880 --> 00:18:21.759 +but I'm very happy that org-roam still exists + +00:18:21.760 --> 00:18:25.039 +because I think porting tools into emacs is very cool, + +NOTE Q: I noticed that the wikipedia link you wrote was typed wrongly - and it got me thinking about how to deal with broken links at scale? Do you have any thoughts on this? What about archival? + +00:18:25.040 --> 00:18:27.559 +I guess next question, + +00:18:27.560 --> 00:18:29.174 +I noticed that the wikipedia link you wrote + +00:18:29.175 --> 00:18:38.632 +was typed wrongly, oh no garbage in, garbage out, + +00:18:38.633 --> 00:18:45.079 +I think garbage in, garbage out, garbage well spotted. + +00:18:45.080 --> 00:18:47.199 +How do you do that? Oh, I typed it + +00:18:47.200 --> 00:18:50.679 +I typed it from... Yeah, right. I didn't, + +00:18:50.680 --> 00:18:53.359 +I didn't paste this. Right. Yeah, yeah. + +00:18:53.360 --> 00:18:55.879 +Janitorial tasks, that's the umbrella term. + +00:18:55.880 --> 00:18:56.839 +How do you deal with this? + +00:18:56.840 --> 00:18:59.560 +Like if you put stuff like this into your notes, + +00:18:59.560 --> 00:19:05.759 +you hopefully get a 404 code from wikipedia + +00:19:05.760 --> 00:19:06.859 +because the page doesn't exist. + +00:19:06.860 --> 00:19:11.999 +Let's now check. You get a 404, and then you could write a tool + +00:19:12.000 --> 00:19:13.799 +that checks all the links periodically + +00:19:13.800 --> 00:19:17.199 +and tells you about broken links, like a broken link checker + +00:19:17.200 --> 00:19:19.679 +that then looks up maybe automatically + +00:19:19.680 --> 00:19:21.919 +the last good version on archive.org + +00:19:21.920 --> 00:19:23.319 +and then the Wayback Machine + +00:19:23.320 --> 00:19:26.879 +and then corrects the link with the archived version, + +00:19:26.880 --> 00:19:30.479 +because the live one is gone. This happens all the time on the Internet. + +00:19:30.480 --> 00:19:31.919 +Even if you don't mistype, + +00:19:31.920 --> 00:19:35.879 +you could... you know things go out of order so + +00:19:35.880 --> 00:19:42.599 +what do you do with that? You need to automate this. + +00:19:42.600 --> 00:19:45.119 +I'm not clicking every link manually. + +00:19:45.120 --> 00:19:49.279 +I have like, what's it now, 11,000 notes or something. + +00:19:49.280 --> 00:19:51.999 +This is not a thing that humans are good at. + +00:19:52.000 --> 00:19:52.279 +I'm not good at this. + +00:19:52.280 --> 00:19:55.359 +I will never finish anything else if I do this manually. + +00:19:55.360 --> 00:19:57.079 +So write a tool, write a script, + +00:19:57.080 --> 00:19:58.719 +get a script from the interwebs. + +00:19:58.720 --> 00:20:01.919 +There are tools like this plenty that can do it. + +00:20:01.920 --> 00:20:06.319 +And then you just need to do the wiring. + +00:20:06.320 --> 00:20:07.599 +and that should help. + +00:20:07.600 --> 00:20:09.759 +You could automate this in Emacs, of course, right? + +00:20:09.760 --> 00:20:12.479 +For every file in my note directory, + +00:20:12.480 --> 00:20:14.359 +look if there's a link inside + +00:20:14.360 --> 00:20:16.119 +and then check the URL or whatever. + +00:20:16.120 --> 00:20:18.319 +Also works for inter-note connections. + +00:20:18.320 --> 00:20:21.239 +This could also break if you rename files or remove files + +00:20:21.240 --> 00:20:23.959 +and don't use a denote function, + +00:20:23.960 --> 00:20:26.879 +which I believe takes care of backlinks and forward links + +00:20:26.880 --> 00:20:28.639 +and keeps them organized. + +00:20:28.640 --> 00:20:31.399 +If you do this manually on another device, + +00:20:31.400 --> 00:20:38.119 +out of denote, out of Emacs, in Vim, I don't know, then yeah, mistakes happen + +00:20:38.120 --> 00:20:39.959 +and you need to deal with mistakes + +00:20:39.960 --> 00:20:44.359 +and heal and create scar tissue there in some way + +00:20:44.360 --> 00:20:48.279 +so write janitorial tools to do that. It's also, + +00:20:48.280 --> 00:20:50.679 +I'm mentioning the term janitorial tools + +00:20:50.680 --> 00:20:51.679 +a couple of times now, + +00:20:51.680 --> 00:20:55.439 +because that's the term that we in the forums at least + +00:20:55.440 --> 00:20:58.199 +usually talk about things like find orphaned notes, + +00:20:58.200 --> 00:21:02.119 +notes that no one links to find broken links, + +00:21:02.120 --> 00:21:07.479 +clean up references reformat notes, stuff like this. + +00:21:07.480 --> 00:21:10.039 +Find large notes and then suggest them + +00:21:10.040 --> 00:21:11.799 +to the user to break them up. + +00:21:11.800 --> 00:21:14.180 +Like these are tasks that you can do mechanically, + +00:21:14.160 --> 00:21:16.382 +but also it's better if you use a tool to get started, + +00:21:16.383 --> 00:21:20.590 +otherwise you waste a lot of time. + +NOTE Comment: When I completely re-worked my config some two years ago, I also tried out some of these packages for making notes in Emacs... + +00:21:20.591 --> 00:21:26.632 +Next question, when I complete, next long question. + +00:21:26.633 --> 00:21:34.964 +I'm going to copy this over because maybe... + +00:21:34.965 --> 00:21:42.399 +"when I completely reworked my configs from two years ago, + +00:21:42.400 --> 00:21:44.839 +I also tried some of these packages for making notes, + +00:21:44.840 --> 00:21:47.119 +but none of them actually fit my purpose, + +00:21:47.120 --> 00:21:51.919 +because I do not like the idea of splitting up my ideas. + +00:21:51.920 --> 00:21:53.279 +I'm writing prose. + +00:21:53.280 --> 00:21:55.639 +I collect material, reading lists, and so on + +00:21:55.640 --> 00:21:57.519 +in just one big file. Everything fits in. + +00:21:57.520 --> 00:22:00.879 +In this notebook file, I do archiving from time to time. + +00:22:00.880 --> 00:22:02.399 +I search these files in Finder + +00:22:02.400 --> 00:22:04.439 +to find old notes I would like to go back to. + +00:22:04.440 --> 00:22:06.119 +So if I write a paper, + +00:22:06.120 --> 00:22:09.199 +it's basically an extract from my old notes + +00:22:09.200 --> 00:22:13.719 +that only have one structure. + +00:22:13.720 --> 00:22:17.959 +when I took them time structures my thought and my notes + +00:22:17.960 --> 00:22:20.359 +but they would get lost if I split them up in a network + +00:22:20.360 --> 00:22:22.799 +like structure like a wiki, Zettelkasten my two cents + +00:22:22.800 --> 00:22:24.715 +by the way I work on legal sociological topics + +00:22:24.716 --> 00:22:29.452 +I'm a lawyer by training." + +00:22:29.453 --> 00:22:34.590 +You know, Luhmann was a German-style + +00:22:34.591 --> 00:22:35.632 +weird sociologist, + +00:22:35.633 --> 00:22:41.048 +and sociology studies are + +00:22:41.049 --> 00:22:43.999 +like the first four semesters at university, + +00:22:44.000 --> 00:22:48.639 +where a lot of, I don't know any of the terms in English, + +00:22:48.640 --> 00:22:50.999 +a lot of these things were theories + +00:22:51.000 --> 00:22:52.999 +in the loosest and broadest sense. + +00:22:53.000 --> 00:22:55.439 +Some were just models of how things might behave, + +00:22:55.440 --> 00:22:57.999 +but nobody knew because they were not empirically backed. + +00:22:58.000 --> 00:23:00.119 +Some were empirically backed, + +00:23:00.120 --> 00:23:01.959 +and then also there was some sense-making. + +00:23:01.960 --> 00:23:03.599 +And then also in sociology, + +00:23:03.600 --> 00:23:08.999 +you have some structure analysis of, + +00:23:09.000 --> 00:23:11.239 +like demographics and things like that. + +00:23:11.240 --> 00:23:15.559 +So very, very hard fact and statistics heavy things. + +00:23:15.560 --> 00:23:20.639 +So broad topic. And there's a lot of interconnections. + +00:23:20.640 --> 00:23:22.599 +I can see the approach here. + +00:23:22.600 --> 00:23:25.359 +I'm not going to defend Zettelkasten + +00:23:25.360 --> 00:23:30.519 +so that you in the end become a Zettelkasten aficionado + +00:23:30.520 --> 00:23:33.639 +or whatever I mean, if it works, fine, more power to you like + +00:23:33.640 --> 00:23:37.919 +reminds me of Twyla Tharp's like the shoebox approach + +00:23:37.920 --> 00:23:39.159 +or whatever it was called + +00:23:39.160 --> 00:23:41.959 +where she just dumped everything inside + +00:23:41.960 --> 00:23:44.759 +for her next project, like an idea box, + +00:23:44.760 --> 00:23:47.279 +like real physical things like oh, I want to, I don't know, + +00:23:47.280 --> 00:23:50.079 +like this weird 8-bit do controller inside + +00:23:50.080 --> 00:23:54.639 +and then eventually she would spread out everything she collected, + +00:23:54.640 --> 00:23:59.599 +newspaper clippings and I don't know, maybe toenails or some weird stuff, + +00:23:59.600 --> 00:24:01.879 +I don't know what she actually put there + +00:24:01.880 --> 00:24:03.359 +and then make sense of this + +00:24:03.360 --> 00:24:08.319 +and think of something of putting these sorted pieces into context + +00:24:08.320 --> 00:24:12.759 +and if you just dump stuff into a notebook file + +00:24:12.760 --> 00:24:20.199 +and then rework the stuff, yeah, fine + +00:24:20.200 --> 00:24:22.639 +One answer is Zettelkasten is great for mathematics. + +00:24:22.640 --> 00:24:25.239 +Or maybe you can have... Oh, next question. + +00:24:25.240 --> 00:24:31.439 +Sorry, I jumped. So my answer is, this was not a question, + +00:24:31.440 --> 00:24:34.799 +and I'm happy for you. So that's still an answer. + +NOTE Q: How Zettelkasten is useful for highly mathematical STEM academic fields like computer science or engineering fields? + +00:24:34.800 --> 00:24:38.639 +Next question. How Zettelkasten is useful + +00:24:38.640 --> 00:24:42.519 +for highly mathematical STEM academic fields + +00:24:42.520 --> 00:24:44.839 +like computer science or engineering fields, + +00:24:44.840 --> 00:24:48.879 +like when studying a STEM field? + +00:24:48.880 --> 00:24:52.999 +I need to unpack the acronym again maybe for the audience. + +00:24:53.000 --> 00:24:58.199 +M is mathematics. Engineering is E. + +00:24:58.200 --> 00:25:02.519 +Science and tech, tech, techno, + +00:25:02.520 --> 00:25:05.599 +I don't know, maybe technical. I could look this up, right? + +00:25:05.600 --> 00:25:09.839 +STEM, what was STEM again? I'm doing a bad job. + +00:25:09.840 --> 00:25:12.079 +Science, technology, engineering, mathematics. + +00:25:12.080 --> 00:25:16.479 +Okay, so probably technology is the computer stuff. + +00:25:16.480 --> 00:25:17.159 +Yeah, STEM. + +00:25:17.160 --> 00:25:19.399 +Dear audience, that's science, technology, + +00:25:19.400 --> 00:25:22.999 +engineering, mathematics, academic fields. + +00:25:23.000 --> 00:25:24.799 +What should we make notes of? + +00:25:24.800 --> 00:25:27.199 +The important bits are interconnected in a hierarchy, + +00:25:27.200 --> 00:25:28.199 +usually chapters of a book. + +00:25:28.200 --> 00:25:31.639 +Yes, someone did the job of making the order + +00:25:31.640 --> 00:25:33.559 +out of the chaotic findings + +00:25:33.560 --> 00:25:35.919 +that people did over hundreds of years for you. + +00:25:35.920 --> 00:25:39.479 +That's an order. But there are also many textbooks. + +00:25:39.480 --> 00:25:42.059 +So opinions may vary. The presentation may vary. + +00:25:42.060 --> 00:25:43.674 +Some textbooks may click with you, + +00:25:43.675 --> 00:26:04.559 +while others stay opaque, and you can't get into the meat. + +00:26:04.560 --> 00:26:12.919 +Sorry, I'm just typing the answer right now. + +00:26:12.920 --> 00:26:17.379 +Copying information to another box is not, yeah. + +00:26:17.380 --> 00:26:19.090 +Yeah, let's see what the first answer is. + +00:26:19.091 --> 00:26:21.559 +Someone posted that Zettelkasten is great for mathematics, + +00:26:21.560 --> 00:26:22.919 +incredible for computer science. + +00:26:22.920 --> 00:26:25.439 +With Org-Babel you can have living source code, yes, + +00:26:25.440 --> 00:26:26.719 +that you can execute from the note, + +00:26:26.720 --> 00:26:28.479 +also true for a formula, + +00:26:28.480 --> 00:26:35.239 +and LaTeX in interspersing of images and SVGs. + +00:26:35.240 --> 00:26:37.119 +You can even use Agda if you want to. + +00:26:37.120 --> 00:26:39.279 +Ah, I think I know who typed the answer. + +00:26:39.280 --> 00:26:42.999 +Hello, Oliver. If you want to have living proofs in your notes, + +00:26:43.000 --> 00:26:47.719 +even inline LaTeX is in here. That's, yeah, yeah, yeah. + +00:26:47.720 --> 00:26:58.959 +quote the sentence as is and add, yeah, add something, + +00:26:58.960 --> 00:27:01.319 +maybe your own summary. + +00:27:01.320 --> 00:27:02.959 +I would suggest add your own summary + +00:27:02.960 --> 00:27:11.299 +because we're looking at the Etherpad, right? + +00:27:11.300 --> 00:27:14.639 +Maybe I just copy this over so you can all... + +00:27:14.640 --> 00:27:30.879 +The Etherpad's indentation is missing with what Org is doing. + +00:27:30.880 --> 00:27:36.999 +And the answer was probably submitted by Oliver + +00:27:37.000 --> 00:27:40.479 +just in case someone wants to see + +00:27:40.480 --> 00:27:47.679 +who that could have been with the Agda reference + +00:27:47.680 --> 00:27:49.799 +because nobody uses Agda, + +00:27:49.800 --> 00:27:55.999 +nobody in the world maybe. So Agda is just a, yeah, + +00:27:56.000 --> 00:28:01.319 +let's say it's good for proofing the code that you type + +00:28:01.320 --> 00:28:04.399 +as you type it in the compilation set, very weird + +00:28:04.400 --> 00:28:07.199 +if you've never heard of this, so check that out. + +00:28:07.200 --> 00:28:13.839 +So question was how Zettelkasten is useful for these kinds of things + +00:28:13.840 --> 00:28:16.119 +yeah it sounds like in these kinds of fields + +00:28:16.120 --> 00:28:18.359 +that you only deal with facts. + +00:28:18.360 --> 00:28:24.719 +That's also kind of sort of true for psychology where you have a lot of, + +00:28:24.720 --> 00:28:29.639 +and also law, where you at least in German + +00:28:29.640 --> 00:28:32.011 +and our style of law where you have a lot of, + +00:28:32.012 --> 00:28:33.759 +where you have thick books of law + +00:28:33.760 --> 00:28:38.599 +and very very little records, + +00:28:38.600 --> 00:28:41.479 +that's not the right phrasing, + +00:28:41.480 --> 00:28:44.540 +where you don't rely on the ruling + +00:28:44.541 --> 00:28:48.239 +as much as you do in, for example, the USA, + +00:28:48.240 --> 00:28:52.674 +where you need to be aware of every court ruling + +00:28:52.675 --> 00:28:53.919 +to then put stuff into context + +00:28:53.920 --> 00:28:58.999 +and all of this is like the current how you do law. + +00:28:59.000 --> 00:29:01.039 +I don't know. + +00:29:01.040 --> 00:29:04.039 +I'm not a lawyer and also not good at this in English. + +00:29:04.040 --> 00:29:04.839 +So, sorry. + +00:29:04.840 --> 00:29:08.159 +If I don't find the cool words and technical terms, + +00:29:08.160 --> 00:29:11.079 +you probably all know. + +00:29:11.080 --> 00:29:12.639 +What do you do with these kinds of things? + +00:29:12.640 --> 00:29:14.719 +You need to collect a lot of stuff. + +00:29:14.720 --> 00:29:17.559 +Like the previous questionnaire mentioned, + +00:29:17.560 --> 00:29:19.719 +hey, I'm just copying stuff over + +00:29:19.720 --> 00:29:22.119 +and then I have a good time and can write about this + +00:29:22.120 --> 00:29:24.119 +and create prose in the end. + +00:29:24.120 --> 00:29:26.519 +Like with mathematics, you can't. + +00:29:26.520 --> 00:29:36.719 +You can't do a lot when you're still working on the foundations. + +00:29:36.720 --> 00:29:38.599 +Like, what do you want to do there? + +00:29:38.600 --> 00:29:41.959 +You don't innovate there. You just need to learn the stuff. + +00:29:41.960 --> 00:29:45.799 +Typing things out and creating your own organization + +00:29:45.800 --> 00:29:49.519 +of how things are connected there, + +00:29:49.520 --> 00:29:52.079 +that's where the depth of processing increases, + +00:29:52.080 --> 00:29:53.839 +like the actual depth of processing + +00:29:53.840 --> 00:29:57.759 +so that it takes more effort + +00:29:57.760 --> 00:30:01.399 +and affects more parts of your brain, basically, + +00:30:01.400 --> 00:30:03.919 +which then helps with remembering stuff. + +00:30:03.920 --> 00:30:12.759 +I'm trying not to go into a 10 minute tangent here, but + +00:30:12.760 --> 00:30:18.439 +If you've ever tried to memorize stuff with flashcards + +00:30:18.440 --> 00:30:20.879 +and you put a, I don't know, coffee stain + +00:30:20.880 --> 00:30:24.559 +or a weird scribble or spilled something on one of these cards, + +00:30:24.560 --> 00:30:26.639 +actual physical cards there, + +00:30:26.640 --> 00:30:29.119 +this card now has another piece of information + +00:30:29.120 --> 00:30:32.519 +that is actually important + +00:30:32.520 --> 00:30:36.119 +because it makes the card stand out + +00:30:36.120 --> 00:30:41.279 +more and more worthy of being remembered + +00:30:41.280 --> 00:30:42.639 +because now one of these cards + +00:30:42.640 --> 00:30:44.679 +has this coffee circle thingy + +00:30:44.680 --> 00:30:46.959 +and all the others don't so this one stands out + +00:30:46.960 --> 00:30:49.079 +and this may actually improve + +00:30:49.080 --> 00:30:51.519 +how you learn this particular fact + +00:30:51.520 --> 00:30:57.839 +that you want to remember or memorize + +00:30:57.840 --> 00:31:00.839 +Similar, like what kind of principle + +00:31:00.840 --> 00:31:04.439 +do people postulate is at play here? + +00:31:04.440 --> 00:31:06.399 +Again, last time I went into + +00:31:06.400 --> 00:31:08.079 +this kind of stuff was at university, + +00:31:08.080 --> 00:31:11.719 +so I'm not sure if there's something new + +00:31:11.720 --> 00:31:15.319 +in the field of flashcard learning. + +00:31:15.320 --> 00:31:18.919 +I'm not aware of anything, let's say. + +00:31:18.920 --> 00:31:23.279 +And the idea back then that we spread + +00:31:23.280 --> 00:31:25.360 +and that was taught to us was like this. + +00:31:27.540 --> 00:31:32.599 +That more information and more context and more stimuli + +00:31:32.600 --> 00:31:34.759 +and making things more interesting, + +00:31:34.760 --> 00:31:39.340 +that's what makes it memorable. + +00:31:39.341 --> 00:31:43.799 +if you go for a walk and then associate things with places. + +00:31:43.800 --> 00:31:47.359 +Going for a walk is a different activity + +00:31:47.360 --> 00:31:48.839 +than imagining going for a walk. + +00:31:48.840 --> 00:31:52.079 +It's also different from not doing anything + +00:31:52.080 --> 00:31:54.399 +and just sitting in your chair + +00:31:54.400 --> 00:31:56.519 +and relaxing because you're not engaged. + +00:31:56.520 --> 00:31:58.919 +You're losing, like you're using + +00:31:58.920 --> 00:32:01.959 +a bit of your brain matter to do the work + +00:32:01.960 --> 00:32:04.399 +while the rest of your body is stagnant. + +00:32:04.400 --> 00:32:07.759 +You don't smell anything different. + +00:32:07.760 --> 00:32:09.239 +You don't hear, see, feel on your skin, + +00:32:09.240 --> 00:32:11.399 +everything's constant, + +00:32:11.400 --> 00:32:15.239 +like you're in a, what are these called? + +00:32:15.240 --> 00:32:18.639 +These chambers where you're locked + +00:32:18.640 --> 00:32:21.479 +into very salty water, I think. + +00:32:21.480 --> 00:32:24.639 +Floating chambers, so sensual deprivation chambers. + +00:32:24.640 --> 00:32:29.519 +You're depriving yourself of a lot of sensual input + +00:32:29.520 --> 00:32:31.519 +if you just try to really focus + +00:32:31.520 --> 00:32:33.479 +into everything with your head. + +00:32:33.480 --> 00:32:34.999 +If you engage more of your body, + +00:32:35.000 --> 00:32:36.007 +if you engage more of your senses, + +00:32:36.008 --> 00:32:37.674 +then you have an easier time there. + +00:32:37.675 --> 00:32:40.590 +What does it have to do with this answer? + +00:32:40.560 --> 00:32:46.799 +My answer would be the value is in rephrasing, + +00:32:46.800 --> 00:32:51.799 +in making your own connections eventually. + +00:32:51.800 --> 00:32:56.439 +I don't know, the foundational laws of geometry, + +00:32:56.440 --> 00:32:58.119 +there's no room for innovation, + +00:32:58.120 --> 00:33:00.159 +but there's maybe a room for association. + +00:33:00.160 --> 00:33:03.759 +Like, hey, I remember this, like, if you can't figure out + +00:33:03.760 --> 00:33:09.759 +what the name of a certain axiom, lemma, whatever it is, and it has a name, + +00:33:09.760 --> 00:33:12.679 +adding your own story to the note doesn't hurt. + +00:33:12.680 --> 00:33:14.839 +If you say, hey, this is what my grandfather + +00:33:14.840 --> 00:33:18.719 +taught me with wire and sticks when we tried to measure + +00:33:18.720 --> 00:33:22.839 +whatever in the sand on a vacation one day. + +00:33:22.840 --> 00:33:26.199 +And these kinds of things make it more memorable. + +00:33:26.200 --> 00:33:31.039 +And that's at least something that you could need to then, + +00:33:31.040 --> 00:33:33.999 +which is the ultimate purpose of STEM at university, + +00:33:34.000 --> 00:33:39.559 +then you can pass the tests. Like that's it. + +00:33:39.560 --> 00:33:42.999 +You either, and eventually you embody the knowledge, right? + +00:33:43.000 --> 00:33:44.679 +If you do this stuff over and over again, + +00:33:44.680 --> 00:33:45.839 +then you don't need to look up + +00:33:45.840 --> 00:33:47.599 +how to do a certain kind of proof. + +00:33:47.600 --> 00:33:50.759 +And you just do the proof when you need to do the proof. + +00:33:50.760 --> 00:33:53.919 +But maybe you forget all the kinds of weird proofs + +00:33:53.920 --> 00:33:55.079 +that you encountered in your life + +00:33:55.080 --> 00:33:57.159 +because you only remember the 10 most weird ones, + +00:33:57.160 --> 00:33:58.519 +but you had 15 in your life. + +00:33:58.520 --> 00:34:00.399 +And what's about the, what do you do + +00:34:00.400 --> 00:34:02.800 +with the five missing ones? They just fade away. + +00:34:02.800 --> 00:34:05.279 +But if you capture them in some way or another, + +00:34:05.280 --> 00:34:08.559 +as superficial as it may be, + +00:34:08.560 --> 00:34:10.479 +and you still have access to this later + +00:34:10.480 --> 00:34:21.799 +when you need to check your personal inventory + +00:34:21.800 --> 00:34:30.519 +of mathematical proofs so my answer would be... + +00:34:30.520 --> 00:34:33.119 +Let's type in my answer + +00:34:33.120 --> 00:34:46.199 +on Etherpad would be... I'm not able to type. + +00:34:46.200 --> 00:34:52.599 +Sorry. My answer would be this. + +00:34:52.600 --> 00:35:05.239 +Foundational knowledge is important for tests mostly + +00:35:05.240 --> 00:35:13.300 +and eventually becomes your inventory of skills. + +00:35:23.200 --> 00:35:25.879 +Synth programming, like I don't need to look up for loops, + +00:35:25.880 --> 00:35:29.519 +I just do for loops and that's it, right? + +00:35:29.520 --> 00:35:32.999 +But still, I do have notes about for loops, I think, + +00:35:33.000 --> 00:35:34.839 +in different languages, like Python, + +00:35:34.840 --> 00:35:37.679 +the, what is it called, list comprehension. + +00:35:37.680 --> 00:35:39.919 +I'm not using Python, but it's so quirky. + +00:35:39.920 --> 00:35:42.879 +It's quirky and I captured this on a note + +00:35:42.880 --> 00:35:45.879 +because I needed to get myself used to the pieces + +00:35:45.880 --> 00:35:48.159 +and I needed to look at the syntax anyway, + +00:35:48.160 --> 00:35:50.719 +and then this is that part and this goes there. + +00:35:50.720 --> 00:35:55.799 +And I did this work, like this separation stuff on a note + +00:35:55.800 --> 00:36:01.159 +to then do the work with more engagement, + +00:36:01.160 --> 00:36:04.599 +like engage more so I can remember more later. + +00:36:04.600 --> 00:36:06.079 +I don't remember all the details, + +00:36:06.080 --> 00:36:08.079 +but I do remember there were different parts, + +00:36:08.080 --> 00:36:09.519 +and then I can look up the note. + +00:36:09.520 --> 00:36:12.799 +And it helps me refresh my memory rather quickly, + +00:36:12.800 --> 00:36:15.399 +because it's written by me for me + +00:36:15.400 --> 00:36:17.199 +in a way that I'm writing these notes + +00:36:17.200 --> 00:36:18.599 +for 15 years or something. + +00:36:18.600 --> 00:36:27.119 +16, at least, 16 years or something. + +00:36:27.120 --> 00:36:30.439 +So it's much better than looking, especially now, + +00:36:30.440 --> 00:36:31.759 +it's much better than going to the web + +00:36:31.760 --> 00:36:33.399 +and doing a web search for the same topic, + +00:36:33.400 --> 00:36:37.199 +because I will probably not get the useful resource + +00:36:37.200 --> 00:36:40.199 +that I relied on some eight years ago anyway, + +00:36:40.200 --> 00:36:41.599 +but some garbage instead, + +00:36:41.600 --> 00:36:44.919 +maybe AI generated stuff, I don't know. + +00:36:44.920 --> 00:36:48.319 +So I have my personal copy of this + +00:36:48.320 --> 00:36:50.639 +and it's not just copying the thing into a box, + +00:36:50.640 --> 00:36:51.759 +like from one box into another, + +00:36:51.760 --> 00:36:54.019 +from the public internet box into my own buffer, + +00:36:54.020 --> 00:36:56.399 +that Zettelkasten that's closer to me, + +00:36:56.400 --> 00:36:58.559 +like a fridge is closer to my kitchen + +00:36:58.560 --> 00:37:01.359 +and where I want to eat when I'm hungry + +00:37:01.360 --> 00:37:02.399 +than going to the supermarket + +00:37:02.400 --> 00:37:04.279 +or out into the wild and hunt animals, + +00:37:04.280 --> 00:37:06.199 +like this is all about proximity + +00:37:06.200 --> 00:37:10.759 +and also brought about ownership, like I own these notes + +00:37:10.760 --> 00:37:13.199 +and I still take responsibility + +00:37:13.200 --> 00:37:14.599 +for what I put on them to some degree + +00:37:14.600 --> 00:37:15.959 +like sometimes they're really bad + +00:37:15.960 --> 00:37:17.319 +and I want to distance myself, + +00:37:17.320 --> 00:37:23.919 +but still yeah, so that's it, I'm just I'm leaving, + +00:37:23.920 --> 00:37:29.639 +I'm not typing this out, I'm leaving copy box fridge, + +00:37:29.640 --> 00:37:32.119 +there was a term for this, wait a second, + +00:37:32.120 --> 00:37:38.839 +setup custom fridge can be fridge-like buffer of knowledge + +00:37:38.840 --> 00:37:48.079 +I'm just, let me just try to copy this note verbatim into the etherpad + +00:37:48.080 --> 00:37:51.879 +and then see whether you folks can do something with it. + +00:37:51.880 --> 00:38:00.959 +The formatting. See appendix A. I am doing this here. + +00:38:00.960 --> 00:38:10.319 +Appendix A. I'm not going to read this, + +00:38:10.320 --> 00:38:13.679 +but then you have a FridgeLab buffer of knowledge. + +00:38:13.680 --> 00:38:16.839 +Local link in the supply chain. That was the term. + +00:38:16.840 --> 00:38:18.199 +Didn't remember that one. + +00:38:18.200 --> 00:38:28.119 +It's at least a local link in supply chain. + +00:38:28.120 --> 00:38:36.079 +Also, engagement doing the work of not copying, + +00:38:36.080 --> 00:38:38.439 +but rephrasing, organizing, + +00:38:38.440 --> 00:38:46.399 +but sometimes also just typing the stuff in + +00:38:46.400 --> 00:38:51.759 +that's how people romanticize learning a basic + +00:38:51.760 --> 00:38:54.999 +like there were magazines with a lot of code listings + +00:38:55.000 --> 00:38:58.839 +and they just typed the code it was quite some effort + +00:38:58.840 --> 00:39:00.879 +you eventually got better at this + +00:39:00.880 --> 00:39:03.799 +but you did do mistakes and then you needed to correct + +00:39:03.800 --> 00:39:06.799 +and look through the source code carefully to spot the typo + +00:39:06.800 --> 00:39:11.839 +That's apparently virtue, at least people claim it's a virtue. + +00:39:11.840 --> 00:39:15.759 +I don't deny it's a virtue because I went through the same kind of crap + +00:39:15.760 --> 00:39:20.919 +and I believe it strengthened my character, for sure, but still. + +00:39:20.920 --> 00:39:26.639 +Maybe it's not that useful, but maybe it is. I don't know. + +00:39:26.640 --> 00:39:27.759 +There's studies I remember, + +00:39:27.760 --> 00:39:30.519 +but I don't remember any interesting results. + +00:39:30.520 --> 00:39:32.839 +It's not like it's a 10x improvement + +00:39:32.840 --> 00:39:36.959 +of recall if you type this, but it may be significant. + +00:39:36.960 --> 00:39:39.319 +Just check it out for yourself. I'm not sure. + +00:39:39.320 --> 00:39:40.959 +Next question, sorry. + +NOTE Q: In your experience, would you say that you re-use most of your notes? + +00:39:40.960 --> 00:39:45.639 +In your experience, would you say that you reuse most of your notes? + +00:39:45.640 --> 00:39:47.959 +Watching your demo, I thought that more notes you create, + +00:39:47.960 --> 00:39:51.279 +the less you might reuse them. Yes, that's true. + +00:39:51.280 --> 00:39:54.879 +I have 11,000 notes or something, + +00:39:54.880 --> 00:39:57.239 +and I don't use 11,000 notes every day. + +00:39:57.240 --> 00:39:59.879 +I can only use a fraction of them. + +00:39:59.880 --> 00:40:06.439 +But let's say you have the Feynman Darling notes, + +00:40:06.440 --> 00:40:08.479 +then you would probably use these. + +00:40:08.480 --> 00:40:11.479 +Imagine you have the same 12 Darlings for a year. + +00:40:11.480 --> 00:40:15.559 +Then you use these 12 thingies for one year more often. + +00:40:15.560 --> 00:40:17.919 +than most of your other notes, + +00:40:17.920 --> 00:40:19.999 +because these become your entry points + +00:40:20.000 --> 00:40:21.999 +into what's in my Zettelkasten today. + +00:40:22.000 --> 00:40:23.559 +These become your entry points + +00:40:23.560 --> 00:40:24.999 +of what do I want to work on today? + +00:40:25.000 --> 00:40:27.719 +These become your, where can I put + +00:40:27.720 --> 00:40:29.199 +the weird stuff that I just found? + +00:40:29.200 --> 00:40:31.119 +Does it stick to any of these surfaces? + +00:40:31.120 --> 00:40:33.719 +Entry point into the process. + +00:40:33.720 --> 00:40:41.839 +But let's say, five years later, + +00:40:41.840 --> 00:40:45.399 +maybe these 12 Feynman darlings were your darlings + +00:40:45.400 --> 00:40:47.719 +during university studies for STEM field, + +00:40:47.720 --> 00:40:49.339 +where you had a hard time figuring out + +00:40:49.340 --> 00:40:52.479 +how the Zettelkasten works for your benefit. + +00:40:52.480 --> 00:40:56.279 +And then five years later, you're in a job and you don't need all of them + +00:40:56.280 --> 00:41:00.799 +because your subject matters from university, they're gone. + +00:41:00.800 --> 00:41:03.119 +you're not at a day job and you have different darlings + +00:41:03.120 --> 00:41:04.319 +whatever your day job is + +00:41:04.320 --> 00:41:09.399 +maybe you're a mathematician at an insurance company + +00:41:09.400 --> 00:41:14.319 +so you will probably have insurance related domain darlings pouring in + +00:41:14.320 --> 00:41:18.119 +and some academic darlings falling off the bandwagon + +00:41:18.120 --> 00:41:21.119 +because no time for these maybe other hobbies come in + +00:41:21.120 --> 00:41:25.919 +like i didn't have anything related to child Rearing, + +00:41:25.920 --> 00:41:28.999 +bearing is when you produce them + +00:41:29.000 --> 00:41:30.199 +and put them into the wild, right? + +00:41:30.200 --> 00:41:34.639 +Rearing is when you let them grow up, I don't know + +00:41:34.640 --> 00:41:36.959 +Like when you have children and make them not die + +00:41:36.960 --> 00:41:42.039 +and get larger and do stuff, right? + +00:41:42.040 --> 00:41:44.079 +I did have a couple of things in advance, but + +00:41:44.080 --> 00:41:47.919 +That was not a daily concern. Now it is. + +00:41:47.920 --> 00:41:50.999 +Now I'm a father and that's a new concern in my life. + +00:41:51.000 --> 00:41:54.599 +Getting things done also tackled this, right? + +00:41:54.600 --> 00:41:56.239 +If you remember getting things done, everyone, + +00:41:56.240 --> 00:41:58.559 +you had areas of responsibility. + +00:41:58.560 --> 00:42:00.999 +It's a new area of responsibility and you could represent, + +00:42:01.000 --> 00:42:06.599 +sorry, you could represent these in your Zettelkasten, + +00:42:06.600 --> 00:42:10.239 +if you find that you can spell out your areas of responsibility + +00:42:10.240 --> 00:42:12.799 +well, then you can see, well, I've learned something new, + +00:42:12.800 --> 00:42:14.719 +can I become a better person + +00:42:14.720 --> 00:42:16.879 +in one of my core areas of responsibility? + +00:42:16.880 --> 00:42:18.679 +Yes or no? Why not? + +00:42:18.680 --> 00:42:21.279 +Then you will use these more than the other notes. + +00:42:21.280 --> 00:42:25.159 +Like the weird thing you found last month. + +00:42:25.160 --> 00:42:29.079 +Last month, you will probably not reference that weird thing every day. + +00:42:29.080 --> 00:42:32.359 +Natural process. But it's there. + +00:42:32.360 --> 00:42:34.799 +And eventually you get back to something, + +00:42:34.800 --> 00:42:38.999 +and then you serve access to this like that's the that + +00:42:39.000 --> 00:42:43.599 +and whatever this changes like going through these processes + +00:42:43.600 --> 00:42:51.399 +change you if I if I spend a month getting nerd sniped on + +00:42:51.400 --> 00:42:56.679 +I don't know chocolate manufacturing or something + +00:42:56.680 --> 00:43:00.759 +then I don't need this ever these things ever again most likely + +00:43:00.760 --> 00:43:02.999 +but going through the procedure of + +00:43:03.000 --> 00:43:06.199 +becoming the master chocolate manufacturer of my town, + +00:43:06.200 --> 00:43:10.159 +at least in theory, will do something with me + +00:43:10.160 --> 00:43:12.719 +when I encounter the next topic. + +00:43:12.720 --> 00:43:14.959 +I will think of chocolate manufacturing. + +00:43:14.960 --> 00:43:17.359 +I wouldn't have thought of chocolate manufacturing before. + +00:43:17.360 --> 00:43:18.919 +In fact, I didn't think about chocolate + +00:43:18.920 --> 00:43:21.719 +manufacturing yesterday. I just made this up on the spot. + +00:43:21.720 --> 00:43:23.679 +What does this say about me today? + +00:43:23.680 --> 00:43:26.159 +Maybe because we were out of chocolate, + +00:43:26.160 --> 00:43:30.279 +maybe because I don't know, + +00:43:30.280 --> 00:43:33.159 +maybe there's nothing that looks like chocolate here + +00:43:33.160 --> 00:43:36.359 +I don't know so it just came up and now it's there + +00:43:36.360 --> 00:43:39.159 +and things have changed for the better, + +00:43:39.160 --> 00:43:41.359 +for the worse, I don't know but they've changed + +00:43:41.360 --> 00:43:43.719 +and that's the real takeaway there + +00:43:43.720 --> 00:43:44.959 +where do you put the effort? + +00:43:44.960 --> 00:43:48.759 +where do you want to put the effort? and will it pay off? + +00:43:48.760 --> 00:43:54.479 +maybe if not, then maybe spend the time on something else + +00:43:54.480 --> 00:43:57.119 +like don't try to Zettelkastenify something you hate + +00:43:57.120 --> 00:43:59.519 +just to I don't know, + +00:43:59.520 --> 00:44:04.479 +do your due diligence if you don't want to + +00:44:04.480 --> 00:44:06.719 +because then you'll hate the process + +00:44:06.720 --> 00:44:15.279 +that's worse than not using notes a lot. Next question. + +NOTE Q: How are notes structured and accessed when the notes grow from 10K to 100K notes? + +00:44:15.280 --> 00:44:17.719 +How are notes structured and accessed + +00:44:17.720 --> 00:44:20.639 +when the notes grow from 10k to 100k notes? + +00:44:20.640 --> 00:44:22.119 +yes, that's a field of exploration, + +00:44:22.120 --> 00:44:25.919 +I mean that the lower realm there I don't know anybody + +00:44:25.920 --> 00:44:32.359 +who's using a hyperlinked 100k note archive. + +00:44:32.360 --> 00:44:37.239 +I do know people who have a lot of text files + +00:44:37.240 --> 00:44:38.919 +like the Evernote style + +00:44:38.920 --> 00:44:42.799 +they capture everything and put the verbatim copy into their stuff + +00:44:42.800 --> 00:44:47.519 +and then they have a lot more items of course + +00:44:47.520 --> 00:44:51.359 +but these don't really count, + +00:44:51.360 --> 00:44:54.599 +these are like web clippings of websites themselves + +00:44:54.600 --> 00:44:58.119 +I've read how many hundreds of websites today + +00:44:58.120 --> 00:45:02.919 +I could have captured everything automatically, + +00:45:02.920 --> 00:45:07.119 +but they wouldn't, like the files there, the clippings, + +00:45:07.120 --> 00:45:10.559 +they wouldn't have contributed + +00:45:10.560 --> 00:45:12.439 +anything meaningfully to my knowledge base, + +00:45:12.440 --> 00:45:14.479 +because I'm not thinking about the stuff, + +00:45:14.480 --> 00:45:16.399 +I'm thinking about the stuff that I'm spending time on. + +00:45:16.400 --> 00:45:18.839 +What about that? + +00:45:18.840 --> 00:45:20.639 +Yeah, how are notes structured and accessed + +00:45:20.640 --> 00:45:22.919 +when the notes go from one to 100k? + +00:45:22.920 --> 00:45:31.399 +I will imagine that it becomes a matter that's speculation. + +00:45:31.400 --> 00:45:34.759 +We'll see. My speculation is this. + +00:45:34.760 --> 00:45:40.639 +it's going to be self-similar, like Mandelbrot images, + +00:45:40.640 --> 00:45:43.199 +where you have recursive patterns. + +00:45:43.200 --> 00:45:46.519 +First, you have a couple of notes. + +00:45:46.520 --> 00:45:49.759 +You can leave through them digitally or physically easily. + +00:45:49.760 --> 00:45:52.559 +And then eventually, you need to rely on structures + +00:45:52.560 --> 00:45:54.079 +or some kinds of entry points, + +00:45:54.080 --> 00:45:55.679 +which we usually call structures, + +00:45:55.680 --> 00:46:03.359 +thanks to Sascha. Perfect. Thank you. + +00:46:03.360 --> 00:46:04.799 +And the clue there is, + +00:46:04.800 --> 00:46:10.159 +Eventually, you have hundreds or maybe thousands, + +00:46:10.160 --> 00:46:12.359 +not hundreds or thousands, of structure notes. + +00:46:12.360 --> 00:46:13.959 +And then you have the same problem + +00:46:13.960 --> 00:46:16.039 +that you had on the lower base layer. + +00:46:16.040 --> 00:46:19.199 +And now you will probably look for another tool. + +00:46:19.200 --> 00:46:22.759 +But there is nothing else that's not also a structure note + +00:46:22.760 --> 00:46:25.799 +but is structuring other structures mostly + +00:46:25.800 --> 00:46:28.119 +instead of structuring the low-level notes. + +00:46:28.120 --> 00:46:31.719 +But this distinction, I want to point out, doesn't pay off. + +00:46:31.720 --> 00:46:34.879 +it seems like it doesn't pay off + +00:46:34.880 --> 00:46:37.319 +to say hey I have these foundational permanent notes + +00:46:37.320 --> 00:46:38.759 +And then I have these meta notes, + +00:46:38.760 --> 00:46:40.519 +these maps and structures + +00:46:40.520 --> 00:46:42.759 +and then I have these super mega structures + +00:46:42.760 --> 00:46:44.159 +which are not permanent, + +00:46:44.160 --> 00:46:45.519 +which are not structures, which are not... + +00:46:45.520 --> 00:46:47.919 +I don't know... This doesn't seem to pay off, + +00:46:47.920 --> 00:46:51.079 +because eventually there is another level and another level + +00:46:51.080 --> 00:46:53.519 +and also sometimes you want to talk + +00:46:53.520 --> 00:46:56.159 +about a structure as a data point + +00:46:56.160 --> 00:46:58.079 +like hey I did this writing project + +00:46:58.080 --> 00:47:00.159 +once it was really cool link to writing project + +00:47:00.160 --> 00:47:04.959 +and the writing project is a table of contents huge hierarchy or whatever. + +00:47:04.960 --> 00:47:06.959 +Is it not a link to a thing? + +00:47:06.960 --> 00:47:10.759 +Back then you get into all these weird academic questions + +00:47:10.760 --> 00:47:12.799 +about the nature of links + +00:47:12.800 --> 00:47:17.719 +and there's no gold at the end of that rainbow, let's say. + +00:47:17.720 --> 00:47:21.159 +At least I've never seen anyone come back with any gold. + +00:47:21.160 --> 00:47:24.199 +I've seen people come back with very long faces + +00:47:24.200 --> 00:47:26.559 +and sadness in their eyes + +00:47:26.560 --> 00:47:31.239 +because all the effort, all the metadata was for naught. + +00:47:31.240 --> 00:47:32.919 +So, how do you do this? + +00:47:32.920 --> 00:47:36.119 +You figure out, when you get to 10k, + +00:47:36.120 --> 00:47:37.759 +you will probably have figured, + +00:47:37.760 --> 00:47:40.839 +and if you do 10k, not like web clippings, + +00:47:40.840 --> 00:47:42.759 +but really like you did put in effort to get there + +00:47:42.760 --> 00:47:46.879 +and type everything yourself in one way or another + +00:47:46.880 --> 00:47:47.999 +you would have figured out something + +00:47:48.000 --> 00:47:52.599 +that kind of sort of works for you around that milestone. + +00:47:52.600 --> 00:47:53.439 +And then I believe in you, + +00:47:53.440 --> 00:47:58.839 +you will be equipped to get to 20k, 30k, + +00:47:58.840 --> 00:48:00.799 +because you feel comfortable in your notes. + +00:48:00.800 --> 00:48:02.399 +And then you can expand further. + +00:48:02.400 --> 00:48:03.719 +And it will probably look different + +00:48:03.720 --> 00:48:06.639 +for someone in STEM fields than for an artist. + +00:48:06.640 --> 00:48:09.079 +Maybe, maybe not. I don't know. + +00:48:09.080 --> 00:48:14.639 +Maybe a fine arts artist would woodcrafter, + +00:48:14.640 --> 00:48:17.359 +maybe these kinds of folks will have different structures + +00:48:17.360 --> 00:48:22.519 +and rely more on visuals, schemas, + +00:48:22.520 --> 00:48:28.559 +whole part relationships, whereas mathematicians may not. + +00:48:28.560 --> 00:48:31.359 +but I don't know, I don't know, we need to compare + +00:48:31.360 --> 00:48:33.639 +and this will be the interesting like + +00:48:33.640 --> 00:48:36.159 +if the internet survives and we all survive + +00:48:36.160 --> 00:48:40.239 +and also Zettelkasten as an idea sticks on + +00:48:40.240 --> 00:48:43.039 +I hope we can have this discussion + +00:48:43.040 --> 00:48:44.839 +every year in five years, in ten years + +00:48:44.840 --> 00:48:50.039 +and then see how people transparently evolve + +00:48:50.040 --> 00:48:55.159 +their gardens, their processes, their note-taking systems + +NOTE Q: I would be very interested in your thought on this video by Westenberg - https://www.youtube.com/watch?v=CjSWwmg-JRM (Why I Deleted My Second Brain: A Journey Back to Real Thinking) + +00:48:55.160 --> 00:49:00.319 +next question not a question but i would be very interested + +00:49:00.320 --> 00:49:01.559 +in your thoughts on this video + +00:49:01.560 --> 00:49:07.039 +by Westenberg. Okay. This is not spam. + +00:49:07.040 --> 00:49:13.959 +I don't... Uh, there's Joe Westenberg's Youtube channel, + +00:49:13.960 --> 00:49:15.319 +"Why I Deleted My Second Brain: + +00:49:15.320 --> 00:49:22.679 +A Journey Back to Real Thinking." + +00:49:22.680 --> 00:49:30.319 +I think I didn't watch the video but read an article. + +00:49:30.320 --> 00:49:34.360 +Not sure where. Let me check my Zettelkasten. + +00:49:34.383 --> 00:49:36.215 +It's not on screen sharing. That was stupid. + +00:49:36.216 --> 00:49:48.239 +I'm probably not going to watch it right now with everyone here, + +00:49:48.240 --> 00:49:51.659 +so my thoughts on deleting and stuff like that. + +00:49:51.660 --> 00:49:58.679 +I do remember there was a very cleverly written, well-written post + +00:49:58.680 --> 00:50:02.719 +and the claim was, from my perspective, + +00:50:02.720 --> 00:50:04.919 +and that's not doing the work of... + +00:50:04.920 --> 00:50:13.199 +It's not doing the work of the author justice. + +00:50:13.200 --> 00:50:19.839 +But the shortest summary is that there seems to be false contradiction, + +00:50:19.840 --> 00:50:24.759 +where the contradiction stems from how the opposite side, + +00:50:24.760 --> 00:50:27.079 +the note taking, the deliberate note taking, + +00:50:27.080 --> 00:50:28.159 +taking a lot of notes, + +00:50:28.160 --> 00:50:31.479 +all the notes every time, stuff, like how this is presented. + +00:50:31.480 --> 00:50:34.639 +I would say this is more on the collecting + +00:50:34.640 --> 00:50:36.519 +and not on the connecting side of things. + +00:50:36.520 --> 00:50:42.119 +So like I mentioned for the, some 30 minutes ago + +00:50:42.120 --> 00:50:45.039 +when I talked about Roam, Roam Research. + +00:50:45.040 --> 00:50:47.439 +If you start your day with a daily note, + +00:50:47.440 --> 00:50:50.679 +journal style, and then branch out from there, + +00:50:50.680 --> 00:50:53.759 +you do at least have time as a structure + +00:50:53.760 --> 00:50:57.039 +that helps you to organize what you put in. + +00:50:57.040 --> 00:50:59.319 +But also, it can get very messy + +00:50:59.320 --> 00:51:01.239 +and very weirdly interconnected, + +00:51:01.240 --> 00:51:04.239 +like this meme of the with a guy + +00:51:04.240 --> 00:51:10.919 +standing in front of a board + +00:51:10.920 --> 00:51:14.439 +with all these lines connecting things + +00:51:14.440 --> 00:51:17.239 +and just, you know, with the madness in his eyes + +00:51:17.240 --> 00:51:23.439 +you can do a lot of stuff in there. + +00:51:23.440 --> 00:51:27.839 +But at a certain point, it gets hard + +00:51:27.840 --> 00:51:30.799 +to also get out of your own head, let's say. + +00:51:30.800 --> 00:51:33.079 +If you do it in this kind of style, + +00:51:33.080 --> 00:51:35.679 +it can get hard to get off your own head. + +00:51:35.680 --> 00:51:39.919 +And one litmus test that you may find enjoyable + +00:51:39.920 --> 00:51:41.119 +if you struggle with this + +00:51:41.120 --> 00:51:46.199 +is to publish more. Because having access + +00:51:46.200 --> 00:51:49.199 +to a very deeply interconnected web of stuff + +00:51:49.200 --> 00:51:52.919 +thoughts, ideas, notes, wisdoms, whatever + +00:51:52.920 --> 00:51:55.079 +very deeply connected, + +00:51:55.080 --> 00:52:02.359 +like not a pile, yarn, wool, what's the ball? + +00:52:02.360 --> 00:52:06.519 +Ball of yarn? No, that's boring. + +00:52:06.520 --> 00:52:09.239 +Let's say like you have a lot of yarn + +00:52:09.240 --> 00:52:11.519 +and then you just create chaos and entropy + +00:52:11.520 --> 00:52:13.239 +and can't untangle it. It's a very tangled mess. + +00:52:13.240 --> 00:52:15.479 +So it's a very dense, dense thingy + +00:52:15.480 --> 00:52:18.639 +that's now its own kind of structure. Like if you have this + +00:52:18.640 --> 00:52:21.519 +And in your head, when you think about your notes, + +00:52:21.520 --> 00:52:24.639 +you may have some interesting pathways there. + +00:52:24.640 --> 00:52:28.999 +But you need to serialize and put into a linear order + +00:52:29.000 --> 00:52:30.079 +in order to communicate. + +00:52:30.080 --> 00:52:32.799 +Otherwise, people cannot follow your thought. + +00:52:32.800 --> 00:52:36.119 +it's a pity because we still rely + +00:52:36.120 --> 00:52:39.159 +on the book style of writing + +00:52:39.160 --> 00:52:42.639 +and also hypertext which is making navigation easy + +00:52:42.640 --> 00:52:47.439 +but not telling a story easier in our modern times + +00:52:47.440 --> 00:52:49.999 +but we still rely a lot on books + +00:52:50.000 --> 00:52:54.199 +which take take a lot of intertwined stuff, + +00:52:54.200 --> 00:52:58.759 +put it into one order so you can read from start to finish. + +00:52:58.760 --> 00:53:01.319 +But then, in order for you to make sense of this, + +00:53:01.320 --> 00:53:02.439 +you need to chop it up, + +00:53:02.440 --> 00:53:04.439 +associate with things you already know, + +00:53:04.440 --> 00:53:07.159 +and then attach things and create a new kind of structure + +00:53:07.160 --> 00:53:08.399 +through the narrative, + +00:53:08.400 --> 00:53:11.079 +because it's only one kind of presentation + +00:53:11.080 --> 00:53:12.079 +that's given to you. + +00:53:12.080 --> 00:53:14.919 +And there may also be different kinds of presentations, + +00:53:14.920 --> 00:53:16.599 +like I also mentioned for the STEM fields, + +00:53:16.600 --> 00:53:18.359 +where you have different textbooks + +00:53:18.360 --> 00:53:21.199 +from different eras of mathematics foundations, + +00:53:21.200 --> 00:53:24.140 +and then you see, hey, this one clicks, this one doesn't. + +00:53:24.120 --> 00:53:27.879 +Why? It's the same stuff, but they present it differently. + +00:53:27.880 --> 00:53:30.639 +And the presentation matters. The presentation matters. + +00:53:30.640 --> 00:53:33.119 +And if you only deal with the chaos, + +00:53:33.120 --> 00:53:34.399 +the weird entanglement, + +00:53:34.400 --> 00:53:36.479 +if you capture everything and anything, + +00:53:36.480 --> 00:53:41.239 +how many, I don't know, how many hairs you lost that day or whatever. + +00:53:41.240 --> 00:53:43.559 +If you capture everything in there, + +00:53:43.560 --> 00:53:45.119 +you don't create the kind of value + +00:53:45.120 --> 00:53:47.159 +that is linearizable into thought, + +00:53:47.160 --> 00:53:49.599 +which also makes reading your own stuff later, + +00:53:49.600 --> 00:53:55.839 +maybe unbearable, maybe at least hard and making sense. + +00:53:55.840 --> 00:53:57.719 +Now we come back to one of the earlier questions, + +00:53:57.720 --> 00:54:00.399 +like, why do I not use outlines? + +00:54:00.400 --> 00:54:03.039 +Because Org-node allows me to do outlines. + +00:54:03.040 --> 00:54:06.319 +Well, I try to write my notes as blog posts, + +00:54:06.320 --> 00:54:09.599 +very short blog posts, microblogging, if you will, + +00:54:09.600 --> 00:54:11.439 +paragraphs, a couple of paragraphs. + +00:54:11.440 --> 00:54:14.279 +Maybe it's also more nested because it's a huge topic. + +00:54:14.280 --> 00:54:16.199 +It's a complex topic. That also happens. + +00:54:16.200 --> 00:54:18.039 +But then it's more like an article, + +00:54:18.040 --> 00:54:21.279 +a long blog post, or an essay, + +00:54:21.280 --> 00:54:26.279 +but never just vomiting thought out onto the page, + +00:54:26.280 --> 00:54:28.559 +because then you will get back to the note + +00:54:28.560 --> 00:54:31.199 +and you will find, hey, there's a lot of vomit. + +00:54:31.200 --> 00:54:36.759 +But you never follow this kind of phrase with nice. + +00:54:36.760 --> 00:54:40.880 +I enjoyed reading that. It's always me. + +00:54:40.880 --> 00:54:43.239 +Oppressing because of its mass, + +00:54:43.240 --> 00:54:46.279 +it's also getting in the way of having new ideas + +00:54:46.280 --> 00:54:48.719 +because whatever is there and you need to tangle it + +00:54:48.720 --> 00:54:52.759 +and then you lost your new genuine idea, + +00:54:52.760 --> 00:54:56.319 +this can also happen. + +00:54:56.320 --> 00:55:00.759 +So I'm not sure what the Westenberg video contains, + +00:55:00.760 --> 00:55:03.799 +but the sentiment there of deleting everything, + +00:55:03.800 --> 00:55:06.999 +it makes sense if you find yourself in a situation + +00:55:07.000 --> 00:55:09.359 +where you don't have a productive system. + +00:55:09.360 --> 00:55:13.199 +and the notes from 2009 in my own Zettelkasten + +00:55:13.200 --> 00:55:15.159 +aren't of the highest quality standards + +00:55:15.160 --> 00:55:17.959 +I rewrite most of them when I encounter them, + +00:55:17.960 --> 00:55:23.399 +but I can still use a couple as is and sometimes they're just garbage, + +00:55:23.400 --> 00:55:28.119 +but as Luhmann said garbage like trickles to the ground + +00:55:28.120 --> 00:55:34.599 +and forms a nice sediment layer there in the septic tank of your thought machine, + +00:55:34.600 --> 00:55:36.439 +your thought thinking environment. + +00:55:36.440 --> 00:55:40.319 +But clear water separates and then rises to the top + +00:55:40.320 --> 00:55:42.439 +and that's what you work with. + +00:55:42.440 --> 00:55:47.759 +it's never going to be 100% useful. But if it's 90% garbage + +00:55:47.760 --> 00:55:51.479 +and if the water is, if the septic tank is never clearing, + +00:55:51.480 --> 00:55:54.399 +then you probably need to start + +00:55:54.400 --> 00:55:55.559 +over and rethink your approach. + +00:55:55.560 --> 00:55:57.319 +Maybe there was just too much garbage, + +00:55:57.320 --> 00:56:01.559 +too much toxic waste in there, whatever that means, right? + +00:56:01.560 --> 00:56:07.839 +So I do understand this, but also I would say + +00:56:07.840 --> 00:56:11.479 +maybe maybe they tried to do too much with a different mindset + +00:56:11.480 --> 00:56:24.839 +and it just didn't click and then they, + +00:56:24.840 --> 00:56:25.519 +you know next question is there a danger? + +00:56:25.520 --> 00:56:34.340 +also, wait a second, answer do not probably a lot of collection, + +00:56:34.341 --> 00:56:52.359 +not a lot of thinking in the Zettelkasten to some purpose. + +00:56:52.360 --> 00:56:58.700 +Usually. Conflation was the word I was fishing for. + +00:56:58.701 --> 00:57:02.840 +Usually posts videos like this. + +00:57:02.841 --> 00:57:15.049 +Conflate note taking as a dumping ground for stuff + +00:57:15.050 --> 00:57:22.174 +with something that is valuable in the long term. + +00:57:22.175 --> 00:57:27.599 +Also, if this was our dear friend Westenberg + +00:57:27.600 --> 00:57:30.439 +I think the note count also was higher, + +00:57:30.440 --> 00:57:33.519 +but I might confuse them with someone else. + +00:57:33.520 --> 00:57:36.959 +The note count was way higher than mine. Note count. + +00:57:36.960 --> 00:57:41.239 +But then also, you know, there's the sign + +00:57:41.240 --> 00:57:44.159 +of going for quantity in... + +00:57:44.160 --> 00:57:47.719 +just capture anything, like capturing, + +00:57:47.720 --> 00:57:48.799 +that's not the bottleneck. + +00:57:48.800 --> 00:57:52.479 +The bottleneck is finding, making connections happen, + +00:57:52.480 --> 00:57:55.919 +having thoughts and working on problems + +00:57:55.920 --> 00:57:57.279 +you really want to solve in the long term. + +00:57:57.280 --> 00:57:59.159 +So next question. + +NOTE Q: Is there a danger that with the Zettelkasten process, that the process gets a bit in the way of the content? + +00:57:59.160 --> 00:58:02.359 +Is there a danger that with the Zettelkasten process, + +00:58:02.360 --> 00:58:05.679 +that the process gets a bit in the way of the content? + +00:58:05.680 --> 00:58:12.279 +yes, especially if you do it like old school style + +00:58:12.280 --> 00:58:14.639 +if you find that your handwriting sucks + +00:58:14.640 --> 00:58:16.079 +and you want to type things + +00:58:16.080 --> 00:58:19.199 +on a typewriter like that kind of process + +00:58:19.200 --> 00:58:20.479 +definitely gets in the way + +00:58:20.480 --> 00:58:21.759 +that's going to be your bottleneck + +00:58:21.760 --> 00:58:24.679 +you can't find black paper + +00:58:24.680 --> 00:58:30.759 +and put it into your typewriter and then like that's not the speed of thought + +00:58:30.760 --> 00:58:35.959 +that's the speed of, I don't know, my long deceased grandmother + +00:58:35.960 --> 00:58:54.479 +but yeah it's not like a strive for speed of thought tools + +00:58:54.480 --> 00:59:00.439 +not needing a typewriter + +00:59:00.440 --> 00:59:10.519 +and then next step reduce ritual reduce rituals and ceremony + +00:59:10.520 --> 00:59:15.239 +What I mean by that is if you find yourself doing the same moves + +00:59:15.240 --> 00:59:16.799 +or similar moves over and over again, + +00:59:16.800 --> 00:59:19.439 +but they don't contribute + +00:59:19.440 --> 00:59:23.479 +to having more cool ideas per week, then maybe ditch these, + +00:59:23.480 --> 00:59:26.639 +apart from the day timestamp, + +00:59:26.640 --> 00:59:28.479 +having a title, hashtags, and content, + +00:59:28.480 --> 00:59:32.399 +and also being very, very careful about quoting my sources. + +00:59:32.400 --> 00:59:35.639 +I don't do much with my Zettelkasten. + +00:59:35.640 --> 00:59:37.679 +I cannot give up quoting my sources + +00:59:37.680 --> 00:59:39.399 +because then I'm plagiarizing, stealing, + +00:59:39.400 --> 00:59:41.879 +forgetting where I get ideas from and confuse. + +00:59:41.880 --> 00:59:44.599 +And I get out because I'm aware of the problem there. + +00:59:44.600 --> 00:59:49.439 +I'm also not trusting my own notes anymore. + +00:59:49.440 --> 00:59:51.159 +I would not be trusting my own notes anymore. + +00:59:51.160 --> 00:59:53.919 +I need to properly cite so then I can see, hey, + +00:59:53.920 --> 00:59:56.559 +this block has no quotations, that's mine, + +00:59:56.560 --> 01:00:00.559 +and I can trust this. It's not like, hey, this is maybe mine, + +01:00:00.560 --> 01:00:04.039 +maybe this is a verbatim quote from a book. Like this + +01:00:04.040 --> 01:00:05.799 +is not helping. That's a ceremony + +01:00:05.800 --> 01:00:09.039 +that's paying off in the long term also, + +01:00:09.040 --> 01:00:11.319 +so that when you write something, + +01:00:11.320 --> 01:00:15.159 +you have all the sources at hand. + +01:00:15.160 --> 01:00:16.882 +That's a useful ceremony. + +01:00:16.883 --> 01:00:20.799 +Title is just a way of summarizing the content. + +01:00:20.800 --> 01:00:25.119 +Do it like an excerpt, right? + +01:00:25.120 --> 01:00:26.919 +You have the whole content, that's your Zettel. + +01:00:26.920 --> 01:00:29.879 +Do a short summary, that may be your introduction. + +01:00:29.880 --> 01:00:33.239 +So have a way to quickly get a glimpse of the relevance + +01:00:33.240 --> 01:00:35.919 +before having to read the whole Zettel + +01:00:35.920 --> 01:00:38.719 +when you encounter it years from now. + +01:00:38.720 --> 01:00:41.319 +And then have a one, that's one sentence summary, + +01:00:41.320 --> 01:00:44.159 +and then have an even more condensed form that's a title. + +01:00:44.160 --> 01:00:45.679 +The title is basically your API, + +01:00:45.680 --> 01:00:49.359 +the interface for you and your notes. + +01:00:49.360 --> 01:00:54.879 +And it needs to uphold some kind of contract. + +01:00:54.880 --> 01:00:57.319 +And if it just is, like, this is my second note, + +01:00:57.320 --> 01:01:00.239 +that's not useful. This is just a technical limitation + +01:01:00.240 --> 01:01:02.839 +because you can't have the same file name twice. + +01:01:02.840 --> 01:01:05.639 +That's not going to be useful. + +01:01:05.640 --> 01:01:09.519 +But if you give yourself the permission to take time + +01:01:09.520 --> 01:01:12.919 +of titling your notes in one way and also changing titles, + +01:01:12.920 --> 01:01:16.199 +because you will know from writing introductions + +01:01:16.200 --> 01:01:18.679 +the further you get along, + +01:01:18.680 --> 01:01:22.279 +the more and more you need to rewrite your introductions + +01:01:22.280 --> 01:01:24.639 +because your understanding changes same for titles + +01:01:24.640 --> 01:01:28.319 +titles don't always stay consistent or constant + +01:01:28.320 --> 01:01:31.079 +that's why I don't link by title, because I would then need + +01:01:31.080 --> 01:01:39.299 +to go through my note archive and also need to go to + +01:01:39.300 --> 01:01:41.090 +my note archive and need to correct all the links. + +01:01:41.091 --> 01:01:44.039 +That's a janitorial task I like to not do, if I can. + +01:01:44.040 --> 01:01:49.759 +So answer here, less ceremony, fewer ceremonies, plural. + +01:01:49.760 --> 01:01:54.359 +Try to only do the minimum possible, minimum viable thing. + +01:01:54.360 --> 01:01:57.599 +And using Emacs and Denote, you get a lot of defaults. + +01:01:57.600 --> 01:01:58.719 +And then you need to worry + +01:01:58.720 --> 01:02:01.199 +not about IDs and tags that much, + +01:02:01.200 --> 01:02:04.159 +or where to put them and how to put them. + +01:02:04.160 --> 01:02:06.439 +You can omit keywords. You can leave keywords out. + +01:02:06.440 --> 01:02:08.159 +They don't scale anyway. + +01:02:08.160 --> 01:02:12.079 +But they may be interesting as a way to group, + +01:02:12.080 --> 01:02:19.959 +but also Sascha from zettelkasten.de, from our website, + +01:02:19.960 --> 01:02:23.279 +Sascha also found that, I believe, he, + +01:02:23.280 --> 01:02:28.119 +structures win in the long term. + +01:02:28.120 --> 01:02:30.719 +Manual created hubs and overviews + +01:02:30.720 --> 01:02:34.639 +win over machine generated lumps. + +01:02:34.640 --> 01:02:37.959 +Because you need to reorient yourself + +01:02:37.960 --> 01:02:42.239 +in the search results all the time. + +01:02:42.240 --> 01:02:45.679 +That's not as useful as having a pathway + +01:02:45.680 --> 01:02:49.559 +through your notes that you can follow. + +01:02:49.560 --> 01:02:52.039 +It may not be a pathway through all of your notes, of course, + +01:02:52.040 --> 01:02:56.159 +but it may be a pathway from entry point into some topic. + +01:02:56.160 --> 01:03:01.839 +That's why some things are essential and others aren't. + +01:03:01.840 --> 01:03:06.239 +And the essential stuff, try to do it quickly, get better at it, + +01:03:06.240 --> 01:03:08.799 +practice the movements, then they get out of the way, + +01:03:08.800 --> 01:03:10.919 +and then you can focus on having ideas + +01:03:10.920 --> 01:03:12.119 +and typing them at speed of thought, + +01:03:12.120 --> 01:03:15.239 +more or less, and then you're good. + +01:03:15.240 --> 01:03:20.639 +I hope. Wishing you all the best. Next and last question. + +NOTE Q: How do you navigate looking at all posts with certain tags + +01:03:20.640 --> 01:03:24.519 +How do you navigate looking at all posts with certain tags? + +01:03:24.520 --> 01:03:26.679 +This might be an emacs, already new to emacs. + +01:03:26.680 --> 01:03:28.679 +I just may have answered this. + +01:03:28.680 --> 01:03:31.799 +How do you navigate looking at all posts with certain tags? + +01:03:31.800 --> 01:03:43.215 +Let me go to my actual note archive, + +01:03:43.216 --> 01:03:55.919 +and then php, no, language learning, ah, + +01:03:55.920 --> 01:03:59.319 +this is not a nice setup. I'm very clumsy. + +01:03:59.320 --> 01:04:03.119 +I'm sorry, I don't know, swift, language learning, + +01:04:03.120 --> 01:04:28.465 +ah that's a boring one, php. By this time, I could have also, + +01:04:28.466 --> 01:04:35.299 +ah, there's the model. This would be an entry point + +01:04:35.300 --> 01:04:39.159 +into my PHP atom molecule organism learning journey + +01:04:39.160 --> 01:04:43.159 +where I tried to practice, what's visual line mode, sorry, + +01:04:43.160 --> 01:04:48.919 +where I tried to practice this atom molecule thing on something new. + +01:04:48.920 --> 01:04:51.879 +I haven't used PHP in a long time + +01:04:51.880 --> 01:04:59.199 +and found that I wasn't, yeah, you can see it on the screen also + +01:04:59.200 --> 01:05:01.439 +like language primitives are the atoms, + +01:05:01.440 --> 01:05:08.759 +I think molecules are more like idioms or patterns that are PHP special in PHP + +01:05:08.760 --> 01:05:10.599 +and different in other languages in Python + +01:05:10.600 --> 01:05:13.759 +would be list comprehension that's in a molecule + +01:05:13.760 --> 01:05:16.319 +and but also you can make a point for hey, + +01:05:16.320 --> 01:05:18.519 +this comprehension is more like a syntactical thing, + +01:05:18.520 --> 01:05:23.439 +no no get out of here, like the for loop is the syntactical atom + +01:05:23.440 --> 01:05:25.039 +and the molecule is using the for loop + +01:05:25.040 --> 01:05:26.559 +with weird other stuff + +01:05:26.560 --> 01:05:28.199 +to then make the list comprehension happen. + +01:05:28.200 --> 01:05:33.679 +That's my argument there, okay? So what do we do with this? + +01:05:33.680 --> 01:05:38.519 +I use this as an entry point if I want to see, + +01:05:38.520 --> 01:05:41.639 +hey, what kind of stuff did I take notes on + +01:05:41.640 --> 01:05:43.439 +to get a better understanding + +01:05:43.440 --> 01:05:45.239 +on multiple levels of the language. + +01:05:45.240 --> 01:05:47.479 +And project structure conventions + +01:05:47.480 --> 01:05:49.319 +and usually another language + +01:05:49.320 --> 01:05:53.239 +that I use more here would be, but I can't remember now. + +01:05:53.240 --> 01:05:57.479 +Funny, right? I can't remember how I would need to look, + +01:05:57.480 --> 01:05:58.959 +but I think I'm too clumsy in Emacs + +01:05:58.960 --> 01:06:00.639 +to do it live on camera, sorry. + +01:06:00.640 --> 01:06:05.759 +But the organisms part here would also be like my own inventions, + +01:06:05.760 --> 01:06:06.559 +let's say in code, + +01:06:06.560 --> 01:06:11.119 +like my own discoveries where I found that in Swift, for example, + +01:06:11.120 --> 01:06:13.359 +you can express things on the type level + +01:06:13.360 --> 01:06:15.639 +in a very sexy way sometimes. + +01:06:15.640 --> 01:06:19.439 +And then I would put these there as well. + +01:06:19.440 --> 01:06:20.959 +So these are also, + +01:06:20.960 --> 01:06:26.559 +There are organisms to discover in the language reference, + +01:06:26.560 --> 01:06:30.599 +but there are also organisms to discover in the world, + +01:06:30.600 --> 01:06:32.559 +and then they are your own inventions, + +01:06:32.560 --> 01:06:36.519 +discoveries, more or less. And that's a sign of mastery. + +01:06:36.520 --> 01:06:38.719 +If you work more on these things, + +01:06:38.720 --> 01:06:40.959 +then you don't need to worry + +01:06:40.960 --> 01:06:42.399 +about the basics of the language anymore. + +01:06:42.400 --> 01:06:46.239 +So I can use this as an entry point + +01:06:46.240 --> 01:06:51.039 +to get into things that are very PHP-esque. + +01:06:51.040 --> 01:06:54.359 +When do I need this? When I want to talk about PHP, + +01:06:54.360 --> 01:06:55.359 +like I do now. + +01:06:55.360 --> 01:06:59.359 +Why do I show this when the question is about tags? + +01:06:59.360 --> 01:07:10.919 +Because if I search for... Which one do I take? + +01:07:10.920 --> 01:07:22.719 +Let's try grep. php. Yep, grep exited abnormally. + +01:07:22.720 --> 01:07:28.039 +Dang, why? Option requires an argument. + +01:07:28.040 --> 01:07:36.159 +Yes, eshell is there. + +01:07:36.160 --> 01:07:43.919 +So let's just use rg, ripgrep and then ripgrep for php. + +01:07:43.920 --> 01:07:50.879 +And you see I get, I can do filenames only, right? + +01:07:50.880 --> 01:07:56.599 +Let's not worry. I get a lot of, let's just scroll up. + +01:07:56.600 --> 01:08:03.239 +I get a lot more hits here for the PHP tech, + +01:08:03.240 --> 01:08:06.759 +which is only about PHP specific things, + +01:08:06.760 --> 01:08:09.559 +not about anything that I do in PHP. + +01:08:09.560 --> 01:08:15.279 +Like, I don't know, I don't take Laravel or Filament, + +01:08:15.280 --> 01:08:17.879 +which are frameworks, libraries in PHP, + +01:08:17.880 --> 01:08:21.199 +the Zend library or whatever, I don't know many. + +01:08:21.200 --> 01:08:23.199 +Like I wouldn't take everything + +01:08:23.200 --> 01:08:26.999 +and anything that is related to the php ecosystem + +01:08:27.000 --> 01:08:28.399 +with the php hashtag. + +01:08:28.400 --> 01:08:30.679 +Why? Because then the tag becomes useless. + +01:08:30.680 --> 01:08:33.439 +I only tag things that are about the language. + +01:08:33.440 --> 01:08:39.159 +Like how do I pass variables to php includes that's php related. + +01:08:39.160 --> 01:08:44.879 +And you see these are... I'm still not at the top. + +01:08:44.880 --> 01:08:48.399 +now i'm at the top these are a lot more findings than you could + +01:08:48.400 --> 01:08:49.879 +these don't fit on the screen + +01:08:49.880 --> 01:08:51.919 +these are three pages i believe + +01:08:51.920 --> 01:08:55.039 +and the note about my language learning journey was + +01:08:55.040 --> 01:08:58.999 +wasn't even one full page here's white space + +01:08:59.000 --> 01:09:02.799 +there wasn't okay right but still there's much more stuff + +01:09:02.800 --> 01:09:07.479 +the hashtag I don't use for navigating. + +01:09:07.480 --> 01:09:10.839 +I only use this, let's say, the shotgun approach. + +01:09:10.840 --> 01:09:14.239 +I think Sascha on our Zettelkasten blog post, + +01:09:14.240 --> 01:09:16.359 +don't remember which post, mentioned this as well. + +01:09:16.360 --> 01:09:18.079 +Sometimes you need a sniper rifle. + +01:09:18.080 --> 01:09:21.319 +Sometimes you need a shotgun. + +01:09:21.320 --> 01:09:27.199 +And the hashtag-based search would be I don't know what I'm looking for. + +01:09:27.200 --> 01:09:32.959 +It was PHP related. I hope I use the hashtag correctly + +01:09:32.960 --> 01:09:36.879 +and then kill all these notes from my archive. + +01:09:36.880 --> 01:09:38.959 +The metaphor doesn't work that way, + +01:09:38.960 --> 01:09:41.279 +but still you get a lot of results here + +01:09:41.280 --> 01:09:45.959 +and you could use this as a way to filter from 11,000 notes + +01:09:45.960 --> 01:09:53.559 +down to 50 or so, maybe less. + +01:09:53.560 --> 01:09:58.999 +And if you got this far, then you can start to do it in a mechanical way again. + +01:09:59.000 --> 01:10:05.279 +But wait, if you have 100 or 1000 notes in the results there, + +01:10:05.280 --> 01:10:08.279 +then you can't mechanically go through all the notes again. + +01:10:08.280 --> 01:10:09.919 +You can maybe skim and look + +01:10:09.920 --> 01:10:11.159 +for something that catches your eye, + +01:10:11.160 --> 01:10:14.159 +if you're lucky, and if that's the thing + +01:10:14.160 --> 01:10:15.039 +that works for you. + +01:10:15.040 --> 01:10:21.319 +but usually no, like usually the text become useless + +01:10:21.320 --> 01:10:24.079 +then maybe tag groups become more useful + +01:10:24.080 --> 01:10:28.039 +like PHP and LSP which is on screen here + +01:10:28.040 --> 01:10:30.799 +like then maybe the combination of two tags + +01:10:30.800 --> 01:10:32.519 +that reduces the search terms enough + +01:10:32.520 --> 01:10:36.639 +like this is basically glorified full text search + +01:10:36.640 --> 01:10:41.359 +where you highlight certain terms of importance that's it, + +01:10:41.360 --> 01:10:44.999 +I wouldn't use I wouldn't put more effort in there + +01:10:45.000 --> 01:10:48.639 +It's also maybe useful to group things by topic. + +01:10:48.640 --> 01:10:52.399 +For example, study notes like, I don't know, + +01:10:52.400 --> 01:10:56.759 +this is my undergrad, third semester, + +01:10:56.760 --> 01:11:01.279 +what do you do in the third semester, I don't know, + +01:11:01.280 --> 01:11:06.399 +history of philosophy of science of birds, + +01:11:06.400 --> 01:11:10.959 +very long course name, and then week 10. + +01:11:10.960 --> 01:11:13.199 +And then you assemble everything + +01:11:13.200 --> 01:11:15.479 +with this very technical tagging. + +01:11:15.480 --> 01:11:18.239 +Then you can use these folders + +01:11:18.240 --> 01:11:20.999 +to loosely group stuff together + +01:11:21.000 --> 01:11:23.119 +that happened during that week. + +01:11:23.120 --> 01:11:26.519 +And if you have 10 required readings and then do five of them, + +01:11:26.520 --> 01:11:28.879 +but they're also not closely interrelated, + +01:11:28.880 --> 01:11:33.639 +you will have read five to 10 different sources that you could process. + +01:11:33.640 --> 01:11:36.319 +You could maybe then also create an overview note + +01:11:36.320 --> 01:11:38.359 +as a preparation for the seminar + +01:11:38.360 --> 01:11:44.799 +whatever happens at university. + +01:11:44.800 --> 01:11:51.199 +Then the hashtag becomes just a way to group things. + +01:11:51.200 --> 01:11:52.479 +But once you create the structure note, + +01:11:52.480 --> 01:11:55.039 +you don't need the hashtags to navigate anymore. + +01:11:55.040 --> 01:11:57.679 +You could then maybe use the hashtags not to navigate + +01:11:57.680 --> 01:12:02.919 +but to to clump, to create collections, + +01:12:02.920 --> 01:12:07.759 +pre-assembled to some degree collections of things that exist already, + +01:12:07.760 --> 01:12:09.559 +get them out there and then review them. + +01:12:09.560 --> 01:12:13.319 +Like Twyla Tharp again, dumping all the notes on a table, + +01:12:13.320 --> 01:12:15.519 +all the stuff on the table, + +01:12:15.520 --> 01:12:17.759 +not just notes, all the clippings and so on and so on, + +01:12:17.760 --> 01:12:18.959 +and then making sense of them. + +01:12:18.960 --> 01:12:21.639 +That's what you can use a hashtag search for in the longterm. + +01:12:21.640 --> 01:12:27.799 +And I'm not convinced about navigational use in the longterm. + +01:12:27.800 --> 01:12:31.439 +which doesn't mean that it won't work for you, + +01:12:31.440 --> 01:12:32.799 +but I can't recommend it. + +01:12:32.800 --> 01:12:34.899 +I can't recommend trying to do it that way. + +01:12:34.900 --> 01:12:37.882 +So my answer is going to be, how do you navigate + +01:12:37.883 --> 01:12:45.507 +looking at all posts with certain tags? I don't. + +01:12:45.508 --> 01:12:53.439 +Tags are just a way to loosely group notes and stuff in general + +01:12:53.440 --> 01:13:05.519 +so that you can find potentially, PP, why doesn't P work? + +01:13:05.520 --> 01:13:14.919 +Potentially relevant pieces of information more quickly. + +01:13:14.920 --> 01:13:34.959 +Navigational aids. Create navigational aids + +01:13:34.960 --> 01:13:38.049 +things that help you navigate like this is for a week + +01:13:38.050 --> 01:13:42.479 +what did I say 10 of semester three + +01:13:42.480 --> 01:13:44.632 +uh the history of the sociology + +01:13:44.633 --> 01:13:46.799 +of the philosophy of science of birds + +01:13:46.800 --> 01:13:51.559 +or something lump things together there then you have a + +01:13:51.560 --> 01:13:54.119 +then you have a scratch pad to think on you do this + +01:13:54.120 --> 01:13:59.279 +did do this when you went to university with paper anyway, right? + +01:13:59.280 --> 01:14:01.039 +You would get your college book or whatever + +01:14:01.040 --> 01:14:04.439 +and then you would take notes and these like that location + +01:14:04.440 --> 01:14:07.159 +of that piece of paper in your college book + +01:14:07.160 --> 01:14:09.959 +in your whatever notes folder + +01:14:09.960 --> 01:14:15.039 +that's the important piece of information + +01:14:15.040 --> 01:14:20.079 +and the scratchpad, the thinking environment for this course + +01:14:20.080 --> 01:14:22.679 +and if you have all the other things + +01:14:22.680 --> 01:14:24.679 +that you ever did at your disposal as well + +01:14:24.680 --> 01:14:26.839 +maybe pull them in maybe pull them in + +01:14:26.840 --> 01:14:28.759 +and then bring them to the discussion + +01:14:28.760 --> 01:14:31.479 +with your professor or your teaching assistant + +01:14:31.480 --> 01:14:35.199 +and asking about, well, I read these five books + +01:14:35.200 --> 01:14:37.159 +that you recommended for this week. + +01:14:37.160 --> 01:14:40.439 +Thank you for recommending five whole books + +01:14:40.440 --> 01:14:45.399 +for one week of reading. I really enjoyed that. Long pause. + +01:14:45.400 --> 01:14:50.599 +And then you say, I also thought about other topics + +01:14:50.600 --> 01:14:54.359 +and brought them into a, I don't know, dialectic or position. + +01:14:54.360 --> 01:14:58.959 +What do you think about foxes in that regard + +01:14:58.960 --> 01:15:01.599 +and their own history and subjectivity + +01:15:01.600 --> 01:15:08.639 +when it comes to the bird's point of view or something, right? + +01:15:08.640 --> 01:15:10.999 +You can only do this if you either know this by heart + +01:15:11.000 --> 01:15:12.999 +because you do this a lot, + +01:15:13.000 --> 01:15:15.279 +think a lot about this stuff or you do this, + +01:15:15.280 --> 01:15:18.799 +you stumble upon this and then look for oppositions, + +01:15:18.800 --> 01:15:19.959 +look for certain patterns in your notes + +01:15:19.960 --> 01:15:22.479 +and then try to pull them in and represent them again + +01:15:22.480 --> 01:15:26.239 +so they actually do exist and then you can work with this, + +01:15:26.240 --> 01:15:27.399 +you can get on people's nerves + +01:15:27.400 --> 01:15:30.959 +you can write weird papers, essays + +01:15:30.960 --> 01:15:33.719 +and then get through your university studies quickly + +01:15:33.720 --> 01:15:35.959 +maybe also become an interesting columnist, + +01:15:35.960 --> 01:15:39.319 +I don't know, I've never been a columnist Right. + +01:15:39.320 --> 01:15:44.079 +I think these are all the questions. + +01:15:44.080 --> 01:15:47.159 +I'm going to delete the leftover ones. + +01:15:47.160 --> 01:15:54.719 +I hope you enjoyed some of the answers. + +01:15:54.720 --> 01:16:01.174 +Thank you so much. Thank you. That's a lot. + +01:16:01.175 --> 01:16:04.674 +We'll go back and get everything transcribed as well, + +01:16:04.675 --> 01:16:08.599 +and then you can turn that into other articles in the future, + +01:16:08.600 --> 01:16:10.119 +because that's how this all works, right? + +01:16:10.120 --> 01:16:14.319 +It all turns into writing. It all does. + +01:16:14.320 --> 01:16:15.999 +All the rest is garbage. + +01:16:16.000 --> 01:16:20.799 +I don't know why we invented anything else. + +01:16:20.800 --> 01:16:23.919 +It's only useful to transfer language before writing, + +01:16:23.920 --> 01:16:26.279 +but now you can just read. + +01:16:26.280 --> 01:16:29.719 +We have two people in the Big Blue Button room + +01:16:29.720 --> 01:16:33.799 +who are still around, but I think they've got their, like, + +01:16:33.800 --> 01:16:35.719 +they don't have microphones set up. + +01:16:35.720 --> 01:16:40.679 +So I don't know if you want to just, like, CryptKNFL, + +01:16:40.680 --> 01:16:44.339 +if you want to just follow up through the Etherpadmp, + +01:16:44.340 --> 01:16:47.639 +or email, I guess, in case you have further questions. + +01:16:47.640 --> 01:16:50.119 +But yeah, if you want to wrap up, + +01:16:50.120 --> 01:16:52.799 +I know it's getting a little bit late over there, + +01:16:52.800 --> 01:16:55.919 +you're in your time zone. Thank you so much. + +01:16:55.920 --> 01:16:59.679 +Yeah, all right. Thank you. You're welcome. + +01:16:59.680 --> 01:17:02.719 +Thanks for joining and listening. + +01:17:02.720 --> 01:17:07.640 +Okay, I'll wrap it up here then. diff --git a/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--main--chapters.vtt b/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--main--chapters.vtt new file mode 100644 index 00000000..6c0f7fed --- /dev/null +++ b/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--main--chapters.vtt @@ -0,0 +1,47 @@ +WEBVTT + + +00:00:01.400 --> 00:01:25.533 +Introduction + +00:01:25.534 --> 00:02:29.679 +Advocating Freedoms + +00:02:29.680 --> 00:04:36.533 +What Is This About? + +00:04:36.534 --> 00:05:09.600 +Write - Essential Mechanic + +00:05:09.601 --> 00:05:34.267 +Connect - Essential Mechanic + +00:05:34.268 --> 00:06:49.433 +Correct - Essential Habit + +00:06:49.434 --> 00:07:43.919 +Design for Use - Habit + +00:07:43.920 --> 00:08:47.967 +Create Structure - Mechanic + +00:08:47.968 --> 00:09:32.400 +Start in the Zettelkasten - Mechanic + +00:09:32.401 --> 00:09:54.567 +Start with a Link - Mechanic + +00:09:54.568 --> 00:13:22.033 +Recap + +00:13:22.034 --> 00:14:46.139 +Facilitate Growth + +00:14:46.140 --> 00:20:39.067 +Emacs demo + +00:20:39.068 --> 00:22:45.296 +Learn, Share, Grow + +00:22:45.297 --> 00:23:18.360 +Outro diff --git a/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--main.vtt b/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--main.vtt new file mode 100644 index 00000000..c90596e8 --- /dev/null +++ b/2025/captions/emacsconf-2025-zettelkasten--zettelkasten-for-regular-emacs-hackers--christian-tietze--main.vtt @@ -0,0 +1,1492 @@ +WEBVTT captioned by sachac + +NOTE Introduction + +00:00:01.400 --> 00:00:03.938 +Hello there, fellow basement dwellers. + +00:00:03.939 --> 00:00:05.958 +I'm Christian and you are watching " + +00:00:05.959 --> 00:00:08.519 +Zettelkasten for Regular Emacs Hackers," + +00:00:08.520 --> 00:00:12.920 +my Emacs Conference 2025 talk submission. + +00:00:12.921 --> 00:00:14.000 +In this presentation, + +00:00:14.001 --> 00:00:15.700 +I'll be showing you a couple of things + +00:00:15.701 --> 00:00:18.701 +about Zettelkasten, very basic mechanics and habits + +00:00:18.702 --> 00:00:21.622 +that you can pick up and implement in Emacs, + +00:00:21.623 --> 00:00:24.442 +the most malleable of all environments, + +00:00:24.443 --> 00:00:27.823 +to make a thinking environment happen in your life + +00:00:27.824 --> 00:00:32.434 +that stays with you potentially forever. + +00:00:32.435 --> 00:00:36.055 +The subtitle "For Regular Emacs Hackers" implies at least + +00:00:36.056 --> 00:00:38.356 +the possibility of irregular Emacs hackers + +00:00:38.357 --> 00:00:42.498 +and regular Emacs non-hackers, so the target audience here + +00:00:42.499 --> 00:00:45.119 +is people who are comfortable tweaking their setup + +00:00:45.120 --> 00:00:47.980 +when they run into issues and use Emacs to write, + +00:00:47.981 --> 00:00:49.980 +no matter if it's prose or code. + +00:00:49.981 --> 00:00:53.631 +So that's regular Emacs hacking. + +00:00:53.632 --> 00:00:55.614 +You don't need to be an irregular Emacs hacker, + +00:00:55.615 --> 00:00:58.759 +for example, being a core maintainer or whatever. + +00:00:58.760 --> 00:01:01.243 +You just need to be a normal user + +00:01:01.244 --> 00:01:06.679 +who also modifies the setup. + +00:01:06.680 --> 00:01:10.301 +However, you should probably not be an Emacs non-hacker. + +00:01:10.302 --> 00:01:12.781 +Or maybe you shouldn't stay an Emacs non-hacker, + +00:01:12.782 --> 00:01:16.002 +someone who is not tweaking their setup ever. + +00:01:16.003 --> 00:01:18.820 +So, if you just open your application + +00:01:18.821 --> 00:01:20.240 +to write with a double click, + +00:01:20.241 --> 00:01:23.283 +and it happens to be Emacs, this may not be for you, + +00:01:23.284 --> 00:01:25.533 +but you ultimately be the judge there. + +NOTE Advocating Freedoms + +00:01:25.534 --> 00:01:28.744 +It is my sacred duty to, of course, + +00:01:28.745 --> 00:01:32.665 +advocate all the essential freedoms during this presentation. + +00:01:32.666 --> 00:01:34.507 +These are the following. + +00:01:34.508 --> 00:01:37.389 +You shall not be shackled by a proprietary tool. + +00:01:37.390 --> 00:01:40.791 +(You shall be shackled by Emacs. (Which is free software.)) + +00:01:40.792 --> 00:01:44.114 +You shall also not be shackled by an esoteric method + +00:01:44.115 --> 00:01:45.275 +that turns out to be a grift + +00:01:45.276 --> 00:01:47.897 +where you need to visit annual workshops, walk on broken glass + +00:01:47.898 --> 00:01:50.399 +and stuff to be a true ""knower"". + +00:01:50.400 --> 00:01:52.880 +You shall be empowered to do great things + +00:01:52.881 --> 00:01:55.883 +for the rest of your life after this session alone. + +00:01:55.884 --> 00:01:58.870 +This is not a sales pitch. + +00:01:58.871 --> 00:02:00.651 +Finally, you should also not be shackled + +00:02:00.652 --> 00:02:05.039 +by whichever sources of information you rely on in the future. + +00:02:05.040 --> 00:02:07.853 +You shall be free to think and explore new ideas, + +00:02:07.854 --> 00:02:12.175 +ideally forever, in an environment you built to your liking, + +00:02:12.176 --> 00:02:15.796 +without the degrading web searches and the dead internet + +00:02:15.797 --> 00:02:18.857 +getting in your way. No libraries, no dead trees. + +00:02:18.858 --> 00:02:21.538 +It's you and your knowledge base + +00:02:21.539 --> 00:02:29.679 +that can truly produce magnificent things. + +NOTE What Is This About? + +00:02:29.680 --> 00:02:33.586 +So what is this about? In the teaser text for this session, + +00:02:33.587 --> 00:02:36.148 +I brought up that when people talk about Emacs + +00:02:36.149 --> 00:02:38.931 +pulling in everything that people do on their computer, + +00:02:38.932 --> 00:02:42.614 +it's usually things they used other software for in the past. + +00:02:42.615 --> 00:02:46.057 +Like email, chat, playing music, browsing the web, + +00:02:46.058 --> 00:02:48.819 +managing tasks, you know, stuff like that. + +00:02:48.820 --> 00:02:51.761 +We don't have a good blueprint for thinking environments though. + +00:02:51.762 --> 00:02:53.263 +So it's not a trivial task, + +00:02:53.264 --> 00:02:54.744 +just port this or that to Emacs + +00:02:54.745 --> 00:02:56.705 +and then you'll be happy and productive. + +00:02:56.706 --> 00:02:58.199 +That's different from doing your emails + +00:02:58.200 --> 00:03:00.328 +or task management or writing in Emacs, + +00:03:00.329 --> 00:03:02.950 +where we have a lot of experience with existing software + +00:03:02.951 --> 00:03:06.413 +to adapt and deviate from, where we can essentially + +00:03:06.414 --> 00:03:09.855 +port the task to Emacs. We can practice to think, + +00:03:09.856 --> 00:03:12.998 +purposefully and productively, on complex things + +00:03:12.999 --> 00:03:14.459 +over long periods of time + +00:03:14.460 --> 00:03:19.059 +when we create bespoke environments that help with that. + +00:03:19.060 --> 00:03:20.467 +The first assumption is this: + +00:03:20.468 --> 00:03:24.058 +Writing is very important to form complex thought. + +00:03:24.059 --> 00:03:26.279 +Without writing, you won't be able to cross + +00:03:26.280 --> 00:03:28.760 +a certain complexity threshold. + +00:03:28.761 --> 00:03:31.921 +Thinking in your head alone without any externalization + +00:03:31.922 --> 00:03:34.261 +makes you prone to loops, repetitions, + +00:03:34.262 --> 00:03:36.142 +and worst of all: jumps. + +00:03:36.143 --> 00:03:38.562 +Jumps that get you to a point, + +00:03:38.563 --> 00:03:40.723 +but not backed by reason or argument. + +00:03:40.724 --> 00:03:46.501 +So you and your future and others cannot follow. + +00:03:46.502 --> 00:03:48.362 +Written words direct thought. + +00:03:48.363 --> 00:03:51.984 +The linearization or sequence-making of thoughts + +00:03:51.985 --> 00:03:55.306 +frames your next idea. That's the same for reading, + +00:03:55.307 --> 00:03:57.307 +which enables you to pick up existing ideas + +00:03:57.308 --> 00:04:00.249 +and continue to write about them later. + +00:04:00.250 --> 00:04:02.810 +So for "good thinking", writing, reading, + +00:04:02.811 --> 00:04:05.072 +and writing is mandatory. + +00:04:05.073 --> 00:04:07.193 +Emacs is good at showing text to read. + +00:04:07.194 --> 00:04:09.634 +It's good at processing keyboard inputs to write. + +00:04:09.635 --> 00:04:13.176 +So let's go. Let's set up an environment within Emacs + +00:04:13.177 --> 00:04:16.319 +to make this thinking thing happen. + +00:04:16.320 --> 00:04:18.059 +I'll walk you through some mechanics + +00:04:18.060 --> 00:04:20.881 +of the Zettelkasten machine and habits for you, + +00:04:20.882 --> 00:04:22.900 +dear thinker and regular Emacs hacker. + +00:04:22.901 --> 00:04:25.885 +And for your reference, highlight these things + +00:04:25.886 --> 00:04:30.468 +as I present them in the bottom left corner of the screen. + +00:04:30.469 --> 00:04:33.190 +So working with Zettelkasten as a thinking environment + +00:04:33.191 --> 00:04:36.533 +only requires very simple mechanics. + +NOTE Write - Essential Mechanic + +00:04:36.534 --> 00:04:39.639 +First one is to write. I mentioned this. + +00:04:39.640 --> 00:04:42.488 +It could be one large text file, could be many small ones. + +00:04:42.489 --> 00:04:46.359 +We use the power of Emacs and small files because Emacs is cool, + +00:04:46.360 --> 00:04:49.354 +and individual files put boundaries around ideas + +00:04:49.355 --> 00:04:52.662 +that force you to decide what goes where. + +00:04:52.663 --> 00:04:55.686 +Most importantly though, write like you mean it. + +00:04:55.687 --> 00:04:58.510 +The principle of "garbage in and garbage out" holds. + +00:04:58.511 --> 00:05:01.374 +You don't need to use your novelist voice when taking notes, + +00:05:01.375 --> 00:05:04.137 +but it also shouldn't be shorthand only, + +00:05:04.138 --> 00:05:06.794 +so that your future you has an easy time + +00:05:06.795 --> 00:05:09.600 +reading and digesting what you wrote. + +NOTE Connect - Essential Mechanic + +00:05:09.601 --> 00:05:13.524 +Next mechanic, which is also essential, is to connect. + +00:05:13.525 --> 00:05:14.999 +We think in associations. + +00:05:15.000 --> 00:05:18.639 +Connect notes to capture the associations that come to mind + +00:05:18.640 --> 00:05:20.916 +and that you want the reader, which is the future you, + +00:05:20.917 --> 00:05:24.074 +to make. Traveling a path of connections + +00:05:24.075 --> 00:05:25.835 +indirectly via tags or keywords + +00:05:25.836 --> 00:05:27.096 +and directly with links + +00:05:27.097 --> 00:05:30.720 +can feel like reading an essay you make up as you go. + +00:05:30.721 --> 00:05:34.267 +That's where connections show their power. + +NOTE Correct - Essential Habit + +00:05:34.268 --> 00:05:38.260 +The next essential habit is to read and correct + +00:05:38.261 --> 00:05:40.180 +and reconnect as you go. + +00:05:40.181 --> 00:05:42.311 +You spend time and effort at the writing stage, + +00:05:42.312 --> 00:05:43.792 +you are the primary audience, + +00:05:43.793 --> 00:05:46.895 +so do your past self a favor and read what you wrote. + +00:05:46.896 --> 00:05:50.478 +And then as you read it, make it better. + +00:05:50.479 --> 00:05:52.340 +Make it better, continuously make things better + +00:05:52.341 --> 00:05:55.222 +and capture new ideas as they come up as you read. + +00:05:55.223 --> 00:05:57.784 +And things you can only now remember + +00:05:57.785 --> 00:06:00.927 +because you learned about things in the meantime. + +00:06:00.928 --> 00:06:03.429 +You'll also get better at this whole thing with practice. + +00:06:03.430 --> 00:06:05.866 +So improve old notes when you find them lacking in detail, + +00:06:05.867 --> 00:06:08.575 +their tone pretentious, their mere existence + +00:06:08.576 --> 00:06:10.895 +an insult to your intelligence. + +00:06:10.896 --> 00:06:11.735 +Pay [knocks on table] attention [knocks again] + +00:06:11.736 --> 00:06:13.639 +to pain points in using notes. + +00:06:13.640 --> 00:06:16.559 +Yes, I knocked on my desk to emphasize. + +00:06:16.560 --> 00:06:18.601 +And fix things on the fly. + +00:06:18.602 --> 00:06:19.802 +From this principle follows + +00:06:19.803 --> 00:06:22.063 +a lot of common practices and tips. + +00:06:22.064 --> 00:06:24.125 +This principle truly is essential. + +00:06:24.126 --> 00:06:25.546 +Too long and you didn't read it? + +00:06:25.547 --> 00:06:27.227 +Add a summary at the beginning. + +00:06:27.228 --> 00:06:30.089 +You can't understand what you wrote a year ago? + +00:06:30.090 --> 00:06:32.511 +Do your best to rewrite it in your own words. + +00:06:32.512 --> 00:06:35.099 +It only gets worse if you wait longer. + +00:06:35.100 --> 00:06:37.115 +Can't find anything in the mess? + +00:06:37.116 --> 00:06:39.137 +Collect links to what you could find + +00:06:39.138 --> 00:06:41.659 +in a new "meta" note so next time, + +00:06:41.660 --> 00:06:43.240 +you have a navigational help. + +00:06:43.241 --> 00:06:44.861 +This practice will form the basis + +00:06:44.862 --> 00:06:46.733 +for structure notes, maps, and overviews, + +00:06:46.734 --> 00:06:49.433 +which we will come to later. + +NOTE Design for Use - Habit + +00:06:49.434 --> 00:06:52.071 +The next habit, non-essential though, + +00:06:52.072 --> 00:06:55.332 +is to create notes with intent to use them. + +00:06:55.333 --> 00:06:58.133 +It's one thing to write about facts, capture information, + +00:06:58.134 --> 00:07:01.354 +but all this is just collecting stuff. + +00:07:01.355 --> 00:07:03.615 +It's another thing altogether to write about + +00:07:03.616 --> 00:07:06.556 +a train of thought, about an argument you found compelling, + +00:07:06.557 --> 00:07:09.858 +about a model to understand the world, or yourself, + +00:07:09.859 --> 00:07:12.899 +in a better way. So collect to remember, + +00:07:12.900 --> 00:07:16.260 +but work in your Zettelkasten to think. + +00:07:16.261 --> 00:07:18.221 +What does that even mean, though? + +00:07:18.222 --> 00:07:19.822 +Recreate how intriguing books + +00:07:19.823 --> 00:07:21.803 +lay out their premises and arguments, for example. + +00:07:21.804 --> 00:07:24.885 +First this, then that, also that supports the premise, + +00:07:24.886 --> 00:07:27.407 +and so on. That's the structure of an argument. + +00:07:27.408 --> 00:07:30.549 +You can recreate it in list form, as a graph, + +00:07:30.550 --> 00:07:33.500 +you can draw and import the image, whatever. + +00:07:33.501 --> 00:07:36.112 +The structure of that argument is one thing, + +00:07:36.113 --> 00:07:38.333 +and the details, like the evidence for each claim, + +00:07:38.334 --> 00:07:39.999 +can be separate things. + +00:07:40.000 --> 00:07:43.919 +These can become their own sub-networks over time. + +NOTE Create Structure - Mechanic + +00:07:43.920 --> 00:07:45.470 +To facilitate all that, + +00:07:45.471 --> 00:07:47.931 +you will be needing to create structures. + +00:07:47.932 --> 00:07:50.612 +You've connected notes, so links already leave trails + +00:07:50.613 --> 00:07:52.519 +to traverse between your notes. + +00:07:52.520 --> 00:07:55.929 +Structures can emerge from these with a sheer volume, + +00:07:55.930 --> 00:07:58.616 +but they also can be designed by you to be + +00:07:58.617 --> 00:08:02.258 +navigational hubs of similar shape and form over time. + +00:08:02.259 --> 00:08:04.240 +Patterns like that reduce confusion + +00:08:04.241 --> 00:08:05.800 +and improve feeling at home + +00:08:05.801 --> 00:08:09.222 +and finding your way around, so that's worth investing in. + +00:08:09.223 --> 00:08:13.404 +For example, use outlines for complex topics. + +00:08:13.405 --> 00:08:15.247 +Tables of contents of a book, for example, + +00:08:15.248 --> 00:08:17.319 +that you love and processed in great detail. + +00:08:17.320 --> 00:08:19.492 +Just recreate the table of contents, + +00:08:19.493 --> 00:08:23.037 +the nested structure of it, in your notes, + +00:08:23.038 --> 00:08:28.196 +and then you have something to hang your future thoughts onto. + +00:08:28.197 --> 00:08:31.517 +Another example is a pro/contra table or list + +00:08:31.518 --> 00:08:35.478 +to discuss opposing facets and perspective of a thing. + +00:08:35.479 --> 00:08:37.830 +Another example would be models or metaphors + +00:08:37.831 --> 00:08:39.060 +like the iceberg model + +00:08:39.061 --> 00:08:42.181 +where you point out something has a hidden depth to it + +00:08:42.182 --> 00:08:44.381 +or the metaphor of a tree to model a thing + +00:08:44.382 --> 00:08:47.967 +as a branching and growing idea. + +NOTE Start in the Zettelkasten - Mechanic + +00:08:47.968 --> 00:08:50.434 +Another habit which is also not essential + +00:08:50.435 --> 00:08:52.454 +is to start in your Zettelkasten. + +00:08:52.455 --> 00:08:55.255 +Starting in your Zettelkasten removes the cost of deciding + +00:08:55.256 --> 00:08:57.516 +what goes in there and what doesn't. + +00:08:57.517 --> 00:08:59.636 +It gets you moving and up to speed + +00:08:59.637 --> 00:09:03.277 +with the method and the tool much easier. + +00:09:03.278 --> 00:09:05.078 +Importing stuff later into the Zettelkasten + +00:09:05.079 --> 00:09:06.198 +can feel like a chore, + +00:09:06.199 --> 00:09:09.259 +but starting the work you need to do anyway in it? + +00:09:09.260 --> 00:09:11.560 +That reduces the mental hurdle. + +00:09:11.561 --> 00:09:12.921 +As a regular Emacs hacker, + +00:09:12.922 --> 00:09:14.582 +you'll eventually develop your own tools + +00:09:14.583 --> 00:09:17.303 +to make initial exploration smoother over time, + +00:09:17.304 --> 00:09:19.544 +like do you start in a particular place + +00:09:19.545 --> 00:09:22.519 +or just create a new note from scratch somewhere. + +00:09:22.520 --> 00:09:25.026 +You won't know this until you experience this stuff + +00:09:25.027 --> 00:09:26.867 +for a while and try different things. + +00:09:26.868 --> 00:09:32.400 +So don't worry and be open for change. + +NOTE Start with a Link - Mechanic + +00:09:32.401 --> 00:09:36.369 +The final habit, also non-essential, is to start with a link + +00:09:36.370 --> 00:09:38.451 +and not with the creation of a new file. + +00:09:38.452 --> 00:09:40.512 +Start with a link, create the file later. + +00:09:40.513 --> 00:09:42.473 +This avoids orphaned notes. + +00:09:42.474 --> 00:09:45.896 +Orphaned notes are those no others are linking to. + +00:09:45.897 --> 00:09:48.457 +To these you can only get with a full-text search + +00:09:48.458 --> 00:09:51.299 +or maybe by accident when you browse your notes, + +00:09:51.300 --> 00:09:54.567 +but there is no orderly way to get to them. + +NOTE Recap + +00:09:54.568 --> 00:09:58.533 +To recap: Write. Don't be sloppy. + +00:09:58.534 --> 00:10:00.600 +Put in effort early to get faster at this. + +00:10:00.601 --> 00:10:04.159 +This is essential, because without putting effort + +00:10:04.160 --> 00:10:08.133 +into writing, you won't have anything to use. + +00:10:08.134 --> 00:10:10.500 +Connect and leave trails to navigate. + +00:10:10.501 --> 00:10:13.619 +That can tell a story when you traverse the trail later. + +00:10:13.620 --> 00:10:16.540 +This is essential because without connection, + +00:10:16.541 --> 00:10:18.600 +you will not get anywhere. + +00:10:18.601 --> 00:10:20.300 +Correct and improve things as you go. + +00:10:20.301 --> 00:10:21.839 +The last essential thing: well, + +00:10:21.840 --> 00:10:24.141 +don't worry about perfection, and then, + +00:10:24.142 --> 00:10:25.802 +be gentle to your past self. + +00:10:25.803 --> 00:10:27.976 +Adapt to what you learn along the way. + +00:10:27.977 --> 00:10:31.124 +It's essential, because without this attitude, + +00:10:31.125 --> 00:10:33.745 +you can easily get stuck in analysis paralysis, + +00:10:33.746 --> 00:10:35.039 +like where do I need to put this, + +00:10:35.040 --> 00:10:37.367 +or what would be the perfect way to phrase this. + +00:10:37.368 --> 00:10:40.733 +Design for use. This helps both finding your voice, + +00:10:40.734 --> 00:10:42.819 +and to have criteria for selecting + +00:10:42.820 --> 00:10:45.233 +what to spend time and effort on in the first place. + +00:10:45.234 --> 00:10:47.349 +It takes into account the opportunity cost + +00:10:47.350 --> 00:10:50.250 +of high quality work from writing and connecting. + +00:10:50.251 --> 00:10:53.333 +Create structures. You won't be able to scale + +00:10:53.334 --> 00:10:55.876 +and stay organized and find your way around + +00:10:55.877 --> 00:10:58.539 +without structures. You can practice this early + +00:10:58.540 --> 00:11:00.599 +and design structures deliberately, + +00:11:00.600 --> 00:11:03.984 +but it's also okay to ignore this for a while and wing it. + +00:11:03.985 --> 00:11:05.746 +So it's not marked essential, + +00:11:05.747 --> 00:11:08.939 +although it may hurt you sooner than later. + +00:11:08.940 --> 00:11:10.891 +The habit to start in the Zettelkasten? + +00:11:10.892 --> 00:11:13.793 +Well, do the work you need to do in a place + +00:11:13.794 --> 00:11:15.479 +that can pay back dividends + +00:11:15.480 --> 00:11:16.715 +on the effort you put in. + +00:11:16.716 --> 00:11:19.257 +That's powerful, but also not essential. + +00:11:19.258 --> 00:11:21.619 +You could just as well continue to write and think + +00:11:21.620 --> 00:11:23.460 +and scribble somewhere else, + +00:11:23.461 --> 00:11:27.423 +and then do the Zettelkasten importing stuff later. + +00:11:27.424 --> 00:11:28.439 +Start with a link. + +00:11:28.440 --> 00:11:30.245 +That's really useful practice, + +00:11:30.246 --> 00:11:33.206 +but more like a lifehack and not an essential habit. + +00:11:33.207 --> 00:11:35.347 +So you can also create new files from scratch + +00:11:35.348 --> 00:11:38.049 +for ideas that come up as they come up + +00:11:38.050 --> 00:11:39.610 +and then try to connect them later. + +00:11:39.611 --> 00:11:42.731 +Well, that's better than not writing at all, right? + +00:11:42.732 --> 00:11:44.747 +So if you look at this, you may ask yourself, + +00:11:44.748 --> 00:11:48.319 +why is this create structure thing a mechanic and not a habit? + +00:11:48.320 --> 00:11:50.876 +What's the difference? It seems kind of random. + +00:11:50.877 --> 00:11:53.918 +Well, do create structures as an imperative + +00:11:53.919 --> 00:11:55.279 +is a good habit, yes. + +00:11:55.280 --> 00:11:57.981 +Structures facilitate growth of the Zettelkasten + +00:11:57.982 --> 00:11:59.562 +and help you discover useful patterns + +00:11:59.563 --> 00:12:00.679 +and the things you care about. + +00:12:00.680 --> 00:12:03.444 +Patterns that work for you personally, + +00:12:03.445 --> 00:12:04.724 +which make navigation easier + +00:12:04.725 --> 00:12:07.605 +because they fit your personal expectations + +00:12:07.606 --> 00:12:10.586 +for what is and what is not. + +00:12:10.587 --> 00:12:13.847 +That's something for you to do. That's a process. + +00:12:13.848 --> 00:12:18.148 +But from the perspective of the Zettelkasten as a system, + +00:12:18.149 --> 00:12:20.609 +that's a mechanic or rather dynamic, + +00:12:20.610 --> 00:12:23.149 +the Zettelkasten grows organically. + +00:12:23.150 --> 00:12:25.310 +Thanks to your constant intervention and usage of course. + +00:12:25.311 --> 00:12:27.631 +That's how time passes in your Zettelkasten. + +00:12:27.632 --> 00:12:32.272 +That's how a process of transformation enters the system. + +00:12:32.273 --> 00:12:34.800 +The transformation affects the network. + +00:12:34.801 --> 00:12:36.255 +Every new or updated note, + +00:12:36.256 --> 00:12:38.557 +every new connection changes the network. + +00:12:38.558 --> 00:12:40.718 +The existing network then imposes demands + +00:12:40.719 --> 00:12:43.679 +for new stuff to fit in, slowly solidifying + +00:12:43.680 --> 00:12:47.363 +how things are organized to be perceived as orderly. + +00:12:47.364 --> 00:12:49.084 +This is calcifying. + +00:12:49.085 --> 00:12:52.326 +That's emergent creation of structure from use. + +00:12:52.327 --> 00:12:56.268 +Structure here is expectation for what could come next. + +00:12:56.269 --> 00:12:58.649 +On top of this interplay of emergent structure + +00:12:58.650 --> 00:13:00.190 +in your notes and processes + +00:13:00.191 --> 00:13:01.871 +that operate these constraints, + +00:13:01.872 --> 00:13:04.372 +you can design and influence and architect + +00:13:04.373 --> 00:13:06.873 +and have explicit structures and patterns, + +00:13:06.874 --> 00:13:09.633 +and therefore you can influence what is expected, + +00:13:09.634 --> 00:13:11.836 +what is unexpected and what fits + +00:13:11.837 --> 00:13:14.257 +and what needs to change to fit in. + +00:13:14.258 --> 00:13:18.139 +So the time you spend designing these things + +00:13:18.140 --> 00:13:20.300 +will influence how the Zettelkasten + +00:13:20.301 --> 00:13:22.033 +will behave in the future. + +NOTE Facilitate Growth + +00:13:22.034 --> 00:13:24.061 +To prepare for growth + +00:13:24.062 --> 00:13:27.533 +you will probably encounter thresholds along your journey. + +00:13:27.534 --> 00:13:29.267 +Like 1-10 notes, well, + +00:13:29.268 --> 00:13:31.300 +you can easily remember all of them. + +00:13:31.301 --> 00:13:34.333 +10-100, you will have forgotten some details, + +00:13:34.334 --> 00:13:37.067 +but will probably remember writing most of these notes + +00:13:37.068 --> 00:13:40.239 +in some way. 100-1000? + +00:13:40.240 --> 00:13:42.919 +Bad luck, you will have a hard time going through everything + +00:13:42.920 --> 00:13:46.439 +one by one to find what you have. You will have to rely on + +00:13:46.440 --> 00:13:50.087 +filtering results. For example, with a full text search, + +00:13:50.088 --> 00:13:53.492 +you will crave to use tags and keywords more + +00:13:53.493 --> 00:14:02.039 +to group notes into more manageable departments or collections. + +00:14:02.040 --> 00:14:05.879 +By this mark, search results produce way too many results. + +00:14:05.880 --> 00:14:07.967 +Popular tags become overcrowded, + +00:14:07.968 --> 00:14:10.069 +and you have the same problem you had in the last stage, + +00:14:10.070 --> 00:14:12.519 +but for each of these tags. + +00:14:12.520 --> 00:14:15.779 +So manual structures will take you through this. + +00:14:15.780 --> 00:14:18.919 +Anticipate growth pains by starting from structures. + +00:14:18.920 --> 00:14:22.119 +That's the recommendation here. Design your entry points + +00:14:22.120 --> 00:14:24.167 +into your current projects and research topics + +00:14:24.168 --> 00:14:28.159 +and interests as 'departments' of your Zettelkasten. + +00:14:28.160 --> 00:14:31.161 +Keep a list of, for example, 12 darlings, + +00:14:31.162 --> 00:14:34.124 +like Feynman did: a list of 12 things + +00:14:34.125 --> 00:14:35.485 +that you can check mechanically + +00:14:35.486 --> 00:14:36.926 +where you capture something new, + +00:14:36.927 --> 00:14:39.889 +and then you can see whether the newfound knowledge + +00:14:39.890 --> 00:14:46.139 +can also push one of your darling projects forward. + +NOTE Emacs demo + +00:14:46.140 --> 00:14:50.222 +Now, finally, let's get to the demonstration in Emacs. + +00:14:50.223 --> 00:14:52.334 +Here is a very minimal init file. + +00:14:52.335 --> 00:14:55.738 +I will share it with you in the show notes. + +00:14:55.739 --> 00:14:59.539 +And this is the Denote default configuration. + +00:14:59.540 --> 00:15:02.439 +Here I'm using the shortcut to create a new note + +00:15:02.440 --> 00:15:08.594 +immediately for this talk. And there you see. + +00:15:08.595 --> 00:15:10.496 +That's an empty new note. Here, + +00:15:10.497 --> 00:15:16.420 +sped up like two or three times the normal typing speed of me, + +00:15:16.421 --> 00:15:21.785 +is how I would process this very Emacs conference talk. + +00:15:21.786 --> 00:15:25.668 +The essential mechanics and habits, additional habits, + +00:15:25.669 --> 00:15:30.111 +mechanics, and then from there after I capture everything. + +00:15:30.112 --> 00:15:32.053 +Make sure that I have a reference. + +00:15:32.054 --> 00:15:36.136 +This is not a thought-out implementation in Emacs, + +00:15:36.137 --> 00:15:39.039 +so this is just plain text. Christian Tietze, + +00:15:39.040 --> 00:15:42.146 +Zettelkasten for Regular Emacs Hackers at the bottom. + +00:15:42.147 --> 00:15:46.585 +You can use reference management systems that you like, + +00:15:46.586 --> 00:15:49.233 +but I don't want to get into these details. + +00:15:49.234 --> 00:15:54.367 +Here I'm creating a note with the denote shortcut. + +00:15:54.368 --> 00:15:56.399 +Based on the selected text, + +00:15:56.400 --> 00:16:01.099 +I'm starting a link. This link is creating the note for me. + +00:16:01.100 --> 00:16:04.640 +It's also default Denote functionality + +00:16:04.641 --> 00:16:05.720 +and garbage in garbage out. + +00:16:05.721 --> 00:16:08.022 +I needed to edit the title because the selected text + +00:16:08.023 --> 00:16:10.043 +became the note title. Didn't want that. + +00:16:10.044 --> 00:16:13.335 +That was the abbreviation. + +00:16:13.336 --> 00:16:16.220 +Notice that the default configuration does not in fact + +00:16:16.221 --> 00:16:20.527 +include auto-fill-mode, so the lines get infinitely long. + +00:16:20.528 --> 00:16:23.653 +Looks a bit weird. Just garbage in, garbage out. + +00:16:23.654 --> 00:16:27.920 +Processing this from Wikipedia. + +00:16:27.921 --> 00:16:31.863 +So we have a detail note from this overview. + +00:16:31.864 --> 00:16:34.265 +So that's an overview with one link already. + +00:16:34.266 --> 00:16:38.668 +Starting from here, now I want to write more about my talk. + +00:16:38.669 --> 00:16:43.772 +And next we create structure, types of structures, etc. + +00:16:43.773 --> 00:16:46.835 +It creates a weird link, but I can edit this easily + +00:16:46.836 --> 00:16:51.922 +thanks to Emacs being so nice to work with. + +00:16:51.923 --> 00:16:55.323 +A couple of examples. I mentioned some of these + +00:16:55.324 --> 00:16:58.604 +in previous minutes of this conference talk, + +00:16:58.605 --> 00:17:00.584 +like position pair, one note for the pair, + +00:17:00.585 --> 00:17:03.921 +one note per pro and contra, table of contents, + +00:17:03.922 --> 00:17:06.405 +like lists of things you like, + +00:17:06.406 --> 00:17:10.607 +to talk about recreating a book's content, + +00:17:10.608 --> 00:17:14.308 +table of contents so you can process the book in detail, + +00:17:14.309 --> 00:17:16.839 +argument structures, I believe I mentioned these. + +00:17:16.840 --> 00:17:19.370 +Look at this up if you're not into arguments, + +00:17:19.371 --> 00:17:22.912 +but arguments are very well structured, usually. + +00:17:22.913 --> 00:17:26.133 +A table of things like two-dimensional table or grid. + +00:17:26.134 --> 00:17:28.334 +Graphics. You can also include graphics, images, + +00:17:28.335 --> 00:17:31.636 +and then write about these. And then there are metaphors. + +00:17:31.637 --> 00:17:33.797 +And into one metaphor that I'm presenting here, + +00:17:33.798 --> 00:17:37.538 +iceberg, black box, and then atom, molecule, and organism, + +00:17:37.539 --> 00:17:40.400 +I want to get into this. Atom, molecule, organism. + +00:17:40.401 --> 00:17:43.923 +That's a composition and recursion + +00:17:43.924 --> 00:17:47.799 +because I have Big Ideas there. Atom, smallest part; + +00:17:47.800 --> 00:17:49.567 +molecule, comprised of atoms; + +00:17:49.568 --> 00:17:51.968 +and organism is comprised of molecules. + +00:17:51.969 --> 00:17:56.432 +Different level of analysis. Because this is irreducible. + +00:17:56.433 --> 00:17:59.154 +In fact, if you have no clue about reducibility, + +00:17:59.155 --> 00:18:02.196 +irreducibility -- that doesn't mean much to you? -- + +00:18:02.197 --> 00:18:05.978 +but look this up. You can go very deep + +00:18:05.979 --> 00:18:10.617 +with this kind of stuff. It's basically that if you + +00:18:10.618 --> 00:18:12.522 +decompose organs into atoms, + +00:18:12.523 --> 00:18:14.125 +you cannot get back to the organs. + +00:18:14.126 --> 00:18:17.072 +You just have a bunch of atoms. There's information loss, + +00:18:17.073 --> 00:18:19.879 +more or less. + +00:18:19.880 --> 00:18:24.246 +Here you see that I create a new thing at the end + +00:18:24.247 --> 00:18:26.949 +so that I can write about Denote. The tool doesn't matter, + +00:18:26.950 --> 00:18:31.834 +but when you use Emacs, use Denote because, well, why? + +00:18:31.835 --> 00:18:35.457 +Let's get into this. Fix the link. + +00:18:35.458 --> 00:18:37.279 +These are good reasons to use Denote. + +00:18:37.280 --> 00:18:44.379 +Denote is very simple. Denote has a couple of sane defaults. + +00:18:44.380 --> 00:18:47.078 +That makes life easier. Backlinks. + +00:18:47.079 --> 00:18:51.140 +We will see a backlink view at the end. + +00:18:51.141 --> 00:18:52.397 +I have to create a couple of things. + +00:18:52.398 --> 00:18:55.964 +I'm copying the source code there, the Elisp source, + +00:18:55.965 --> 00:19:01.667 +so that you can see, hey, this is just an Org Mode file. + +00:19:01.668 --> 00:19:03.629 +You can style it to your liking + +00:19:03.630 --> 00:19:06.751 +and then you can even execute the code if you want. + +00:19:06.752 --> 00:19:13.294 +Very powerful. Create notes as links first to avoid orphans. + +00:19:13.295 --> 00:19:14.675 +Forward link again. + +00:19:14.676 --> 00:19:16.015 +At least I wanted to create a forward link. + +00:19:16.016 --> 00:19:17.036 +I pressed the wrong shortcut. + +00:19:17.037 --> 00:19:19.737 +But anyway, I can fix this easily. + +00:19:19.738 --> 00:19:23.479 +You see, there's no link. Dammit. + +00:19:23.480 --> 00:19:26.761 +Now I need to create the link after the fact. + +00:19:26.762 --> 00:19:33.279 +Here's a list of shortcuts. The denote keymap. + +00:19:33.280 --> 00:19:35.165 +It's a recommended practice by me, + +00:19:35.166 --> 00:19:36.766 +starting your note with a link. + +00:19:36.767 --> 00:19:40.639 +You've heard this all just a couple of minutes ago. + +00:19:40.640 --> 00:19:42.854 +It reduces orphans and supposedly teaches you + +00:19:42.855 --> 00:19:45.574 +about thinking in connections early. + +00:19:45.575 --> 00:19:53.099 +It's a good practice to practice. + +00:19:53.100 --> 00:19:55.938 +So with that note, trying to switch back. + +00:19:55.939 --> 00:20:00.119 +Denote note switching, that wasn't as smooth, + +00:20:00.120 --> 00:20:01.319 +but inserting links is. + +00:20:01.320 --> 00:20:10.179 +And there you go. Here's a backlink view. And that's it. + +00:20:10.180 --> 00:20:12.651 +In a somewhat self-documenting way, + +00:20:12.652 --> 00:20:14.867 +here you see a structure note + +00:20:14.868 --> 00:20:17.682 +which is an overview that represents the gist + +00:20:17.683 --> 00:20:19.563 +of this Emacs conference talk, + +00:20:19.564 --> 00:20:21.839 +with a couple of links to details. + +00:20:21.840 --> 00:20:24.107 +From these details, as you've seen, + +00:20:24.108 --> 00:20:27.891 +you can go into even more detail. That's all there is to it. + +00:20:27.892 --> 00:20:30.133 +Repeat this for infinity, + +00:20:30.134 --> 00:20:32.875 +and you get really really complex networks + +00:20:32.876 --> 00:20:35.858 +and can do a lot of amazing things in parallel + +00:20:35.859 --> 00:20:39.067 +without interference. + +NOTE Learn, Share, Grow + +00:20:39.068 --> 00:20:42.439 +I just want to stress that the Zettelkasten + +00:20:42.440 --> 00:20:47.032 +can help you to learn when you publish, when you share, + +00:20:47.033 --> 00:20:51.181 +and when you grow it and yourself in the process. + +00:20:51.182 --> 00:20:54.083 +Again, design the Zettelkasten to be used. + +00:20:54.084 --> 00:20:58.159 +Publish something, write a blog, share stuff with co-workers. + +00:20:58.160 --> 00:21:00.485 +That's powerful and that's so rewarding. + +00:21:00.486 --> 00:21:04.039 +This can in turn influence how you do it + +00:21:04.040 --> 00:21:06.033 +the next time in your Zettelkasten, + +00:21:06.034 --> 00:21:09.380 +because now you can anticipate these kinds of arguments, + +00:21:09.381 --> 00:21:11.979 +maybe I can do this early on, + +00:21:11.980 --> 00:21:15.133 +and then you're prepared even more for the future + +00:21:15.134 --> 00:21:17.479 +to share what you learn. + +00:21:17.480 --> 00:21:20.159 +You are also invited very warmly to our + +00:21:20.160 --> 00:21:23.319 +community of practice in the Zettelkasten forums. + +00:21:23.320 --> 00:21:26.155 +Just share your journey, write about your projects, + +00:21:26.156 --> 00:21:29.793 +ask questions. Everyone's welcome, newbie to pro. + +00:21:29.794 --> 00:21:32.674 +Just get in touch with people, talk about the processes, + +00:21:32.675 --> 00:21:35.361 +improve them, and eventually you'll figure out, well, + +00:21:35.362 --> 00:21:39.979 +reaching enlightenment in that regard may not be that hard after all, + +00:21:39.980 --> 00:21:42.953 +and then you're fine and good to go for the next projects + +00:21:42.954 --> 00:21:48.559 +that you tackle. Most importantly is to make this thing your own. + +00:21:48.560 --> 00:21:50.746 +The Zettelkasten, the method, the environment. + +00:21:50.747 --> 00:21:53.474 +Create a thinking environment for you. + +00:21:53.475 --> 00:21:56.877 +Create your own tools to think with. + +00:21:56.878 --> 00:21:59.378 +This goes back to the meme of Shuhari, + +00:21:59.379 --> 00:22:02.800 +which is basically imitate and then deviate and innovate. + +00:22:02.801 --> 00:22:07.123 +And this invitation here is to imitate what I just laid out. + +00:22:07.124 --> 00:22:10.586 +Imitate for a couple of years. One, two, three years. + +00:22:10.587 --> 00:22:12.927 +The time goes by faster [snaps fingers] than you think. + +00:22:12.928 --> 00:22:16.448 +And then figure out ways to deviate from the doctrine, + +00:22:16.449 --> 00:22:18.909 +to figure out ways to improve + +00:22:18.910 --> 00:22:22.030 +and change the processes to fit you better. + +00:22:22.031 --> 00:22:24.451 +But you need to try to manifest + +00:22:24.452 --> 00:22:26.652 +the best practices in your life first, + +00:22:26.653 --> 00:22:28.833 +for a while, to then figure out, well, + +00:22:28.834 --> 00:22:30.853 +they are not that best after all + +00:22:30.854 --> 00:22:33.054 +and I need to change some of them. + +00:22:33.055 --> 00:22:37.064 +But you wouldn't know if you didn't try. So do try. + +00:22:37.065 --> 00:22:38.639 +Yeah, and with that I want to thank you. + +00:22:38.640 --> 00:22:40.249 +Thank you so much for watching. That's it. + +00:22:40.250 --> 00:22:41.531 +That was the conference talk, + +00:22:41.532 --> 00:22:45.296 +my short introduction to the Zettelkasten mechanics and habits. + +NOTE Outro + +00:22:45.297 --> 00:22:46.678 +I want to thank you so much for watching + +00:22:46.679 --> 00:22:48.380 +and spending time with me on this topic, + +00:22:48.381 --> 00:22:50.143 +on these two topics actually, + +00:22:50.144 --> 00:22:52.546 +that are very near and dear to my heart. + +00:22:52.547 --> 00:22:55.399 +Do share questions, ask questions in the etherpad. + +00:22:55.400 --> 00:22:57.608 +And if you watch this after the conference + +00:22:57.609 --> 00:23:01.190 +and all the live participation is long over, + +00:23:01.191 --> 00:23:04.632 +step into the forums and ask around there. + +00:23:04.633 --> 00:23:09.234 +Thanks also to Sacha and team for organizing EmacsConf 2025, + +00:23:09.235 --> 00:23:11.595 +for having me. Well, I'm looking forward to hearing from + +00:23:11.596 --> 00:23:14.256 +every one of you. So that's it. + +00:23:14.257 --> 00:23:18.360 +Peace out and see you in the next one. |
