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.