diff options
Diffstat (limited to '2023/captions')
3 files changed, 2353 insertions, 56 deletions
diff --git a/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt b/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt new file mode 100644 index 00000000..3bd5b01b --- /dev/null +++ b/2023/captions/emacsconf-2023-repl--repls-in-strange-places-lua-latex-lpeg-lpegrex-tikz--eduardo-ochs--main.vtt @@ -0,0 +1,2219 @@ +WEBVTT + +00:00.000 --> 00:04.880 +Hi, my name is Eduard Duax, and the title of this talk is + +00:04.880 --> 00:09.680 +Rapples in Strange Places, Lua, LaTeX, LPEG, LPEG-REX, and TIX. + +00:10.720 --> 00:17.200 +I'm the author of an MX package called EEV, and this is a talk at the MXConf 2023 + +00:17.200 --> 00:20.880 +that is happening in December 2023 at the Internets. + +00:21.680 --> 00:25.920 +And this is one of the examples of diagrams that we are going to see. + +00:25.920 --> 00:27.680 +Let me show how I generate it. + +00:28.640 --> 00:32.240 +One second. I have to use a smaller font here. + +00:35.600 --> 00:41.920 +This is a file called parse32.lua. Let me go back to this block of tests again. + +00:42.720 --> 00:50.320 +And now if I run this, we get these outputs here at the right. + +00:52.000 --> 00:54.960 +And then in this line here, it generates a PDF. + +00:55.520 --> 01:01.440 +And if I type f8 here, it shows the PDF in the lower right window. + +01:04.240 --> 01:07.600 +Let me start by explaining briefly what is EEV. + +01:09.920 --> 01:14.560 +First, it's something that appeared by accident in the mid-90s. + +01:14.560 --> 01:19.920 +I explained this story in my presentation at the MXConf 2019. + +01:20.720 --> 01:25.520 +It's a package. It's an MX package that is part of ELPA. + +01:25.520 --> 01:31.440 +It has at least 10 users. Those are the ones that I know by name. + +01:33.360 --> 01:36.320 +EEV means MX Execute Verbosely. + +01:37.360 --> 01:42.640 +EEV is something that treats eval as the central feature of MX. + +01:43.680 --> 01:46.800 +EEV blurs the distinction between programmers and users, + +01:47.520 --> 01:50.080 +and it replaces the slogan, + +01:50.080 --> 01:55.360 +users should not be forced to see Lisp, that is something that Richard Stallman told me once, + +01:55.360 --> 01:59.280 +by users should see Lisp instead of buttons, + +01:59.280 --> 02:02.400 +and new users should see Lisp in the first five minutes. + +02:04.240 --> 02:07.120 +I'm going to show some examples of that soon. + +02:08.800 --> 02:12.880 +EEV uses code in comments a lot, and also tests in comments. + +02:13.600 --> 02:21.040 +I changed my way of presenting it, and it became very REPL-centric in the last few years, + +02:21.040 --> 02:28.240 +in the sense that I start by explaining its main features by its support for REPLs. + +02:30.320 --> 02:34.320 +EEV supposes that we want to keep executable notes of everything. + +02:34.320 --> 02:37.040 +I'm also going to show examples of this in a second. + +02:38.080 --> 02:41.600 +EEV has lots of videos for people who hate videos, + +02:42.240 --> 02:47.520 +and it tries to do everything with very little magic and without black boxes. + +02:47.520 --> 02:50.240 +I'm going to explain many of these things very soon. + +02:52.880 --> 02:58.160 +This is a figure that I'm going to show in detail soon, + +02:58.160 --> 03:01.520 +that is about something important about Lua. + +03:01.520 --> 03:05.280 +Oops, the font is very bad now, so let me change the font. + +03:05.280 --> 03:07.840 +The figure is this one, and + +03:08.560 --> 03:13.440 +what most people do when they visit a file with something interesting on it + +03:13.440 --> 03:16.640 +is that they just go there, and they set a bookmark there, + +03:16.640 --> 03:19.760 +or they put the position in the register. + +03:21.760 --> 03:28.480 +But I prefer to keep links to everything that is interesting as a list of hyperlinks. + +03:28.480 --> 03:32.640 +So, for example, this is an at least hyperlink to the file + +03:32.640 --> 03:36.480 +that goes to this anchor here, and to this string I've added. + +03:36.480 --> 03:38.560 +And to this string after this anchor. + +03:39.760 --> 03:45.760 +This is a variant that opens that file in the window at the right here. + +03:47.440 --> 03:53.520 +And this is a sexpid that changes the font. + +03:53.520 --> 03:57.680 +I have a command with a very short name that does that, + +03:58.400 --> 04:02.880 +but I prefer to keep that as a one-liner. + +04:03.840 --> 04:11.440 +About the videos, we can see the list of first-class videos of Eevee by executing this, + +04:11.440 --> 04:16.960 +meta-x, find first-class videos, or by running this alias here, + +04:16.960 --> 04:20.320 +meta-x1c, and then what we see is this. + +04:21.520 --> 04:25.440 +The first sexpid here regenerates this buffer, + +04:25.440 --> 04:28.960 +so we can make a mess here and then run this, + +04:29.040 --> 04:33.040 +and the original buffer is regenerated again in a clean way. + +04:34.880 --> 04:42.000 +Each of these things here opens a buffer with information about a video. + +04:42.000 --> 04:44.400 +Let me take a specific example here. + +04:46.080 --> 04:50.720 +This video here is about one of the ancestors of this talk, + +04:50.720 --> 04:52.960 +that is a library that I wrote for + +04:53.920 --> 05:01.120 +creating diagrams in LaTeX using a package called pic2e, using repls. + +05:02.320 --> 05:10.720 +Anyway, the thing is that if we run a sexpid like this one, + +05:10.720 --> 05:13.440 +and we don't have a local copy of the video, + +05:14.080 --> 05:16.320 +Eevee will try to load the local copy, + +05:16.320 --> 05:19.600 +and instead of doing that and by asking something like, + +05:19.680 --> 05:20.720 +asking something like, + +05:20.720 --> 05:24.560 +do you want me to download the local copy, blah, blah, blah, blah, + +05:25.680 --> 05:28.720 +it simply opens a buffer like this. + +05:28.720 --> 05:32.480 +I mean, if we don't have a local copy yet, + +05:32.480 --> 05:34.400 +it will open a buffer like this one, + +05:35.440 --> 05:41.760 +in which these things here in comments are links to the documentation. + +05:41.760 --> 05:48.240 +I mean, this thing here explains the idea of local copies of files from the internet, + +05:48.880 --> 05:52.960 +uh, there are more details here and here, + +05:53.840 --> 05:59.280 +and this is a script that we can execute line by line. + +05:59.280 --> 06:04.080 +So, instead of this script being hidden behind the button that we just + +06:04.960 --> 06:07.360 +press after a question like, + +06:07.360 --> 06:09.920 +do you want me to do something, blah, blah, blah, yes or no, + +06:11.200 --> 06:15.120 +the script is visible here, and we can execute it step by step. + +06:15.200 --> 06:22.080 +It creates a terminal with a shell here in the right window, + +06:22.080 --> 06:28.880 +and when we type f8 in these lines here, the lines are sent to this line. + +06:30.080 --> 06:33.920 +So, this is going to download the copy of the video, + +06:33.920 --> 06:39.360 +the wget says that I already have a copy of the video in its subtitles, and so on. + +06:39.920 --> 06:47.600 +And after getting a copy of the video, we can run this exp here, and it displays the video. + +06:52.880 --> 06:57.840 +I said that Eevee has lots of videos for people who hate videos, + +06:57.840 --> 07:02.960 +and the idea is that very few people are going to watch the videos in real time, + +07:03.920 --> 07:10.480 +and most of the people that I know, or most of the people that are interested in Eevee in some way, + +07:10.480 --> 07:15.280 +they are going to watch just small sections of the video, + +07:15.280 --> 07:18.720 +and most of the time they're just going to read the subtitles of the video. + +07:19.680 --> 07:25.760 +So, for each one of the videos, we have a page about the video. + +07:25.760 --> 07:28.400 +Let me see if I have internet here. + +07:28.400 --> 07:29.680 +Yes, this is a page, + +07:29.920 --> 07:36.080 +and usually these pages have a link to another page, + +07:36.080 --> 07:42.880 +the page that has all the subtitles of the video, wherever. + +07:42.880 --> 07:46.960 +In this one, it's not so visible, but anyway, + +07:46.960 --> 07:50.480 +there are several ways of accessing the subtitles of the video, + +07:50.480 --> 07:54.720 +and one of the ways is by running this exp here, + +07:55.040 --> 07:57.280 +is by running this exp here, + +07:59.440 --> 08:03.680 +that opens a file in Lua that is what I use to generate the subtitles. + +08:04.880 --> 08:13.760 +Anyway, by the way, each one of these things here is hyperlinked to a position of the video, + +08:14.400 --> 08:19.280 +so if I type this in the right way, it goes to that position. + +08:20.160 --> 08:21.280 +Anyway, let me go back. + +08:21.920 --> 08:26.640 +Also, the tutorials of Eevee, the intros of Eevee, + +08:26.640 --> 08:30.560 +let's start with find, and with intro, + +08:30.560 --> 08:35.760 +they have lots of blocks that say video links, like this one, + +08:36.800 --> 08:40.080 +and these blocks have links to the positions in videos, + +08:40.080 --> 08:43.600 +and if we don't have a local copy of the video yet, + +08:44.480 --> 08:48.800 +the thing shows us a script that lets us download the local copy. + +08:48.880 --> 08:56.720 +Anyway, I said that I was going to explain what I mean by magic and black boxes. + +08:59.360 --> 09:02.080 +This is something that I've been trying to explain for a long time, + +09:02.080 --> 09:05.840 +and I think that I got a very good explanation about that + +09:05.840 --> 09:09.440 +in a video that I made about something called Eevee wconfig, + +09:09.440 --> 09:15.120 +that is a tool for configuring Eevee on Windows without magic, + +09:15.840 --> 09:20.320 +on Windows without magic, without buttons that do things + +09:21.040 --> 09:22.720 +without explaining what they are doing. + +09:24.080 --> 09:26.720 +This is a part of the subtitles of the video. + +09:26.720 --> 09:27.680 +Let me read that. + +09:30.080 --> 09:32.640 +Eevee wconfig is an attempt to solve the problem + +09:32.640 --> 09:35.040 +of how to install these things on Windows, + +09:35.040 --> 09:38.240 +both without magic and with very little magic. + +09:39.520 --> 09:40.640 +Remember this slogan, + +09:41.200 --> 09:45.760 +any sufficiently advanced technology is indistinguishable from magic. + +09:47.280 --> 09:51.600 +Here in this video, I'm going to use the term magic as a shorthand + +09:51.600 --> 09:55.520 +for sufficiently advanced technology, + +09:55.520 --> 09:59.040 +that is something that is complex and non-obvious, + +09:59.040 --> 10:01.840 +and that is indistinguishable from magic + +10:01.840 --> 10:04.640 +in the sense of being almost impossible to understand. + +10:05.600 --> 10:10.720 +And I'm also going to use the term black box as a near synonym for magic, + +10:11.360 --> 10:15.360 +and sometimes the term black box is more convenient, + +10:15.360 --> 10:18.800 +even though it's a bit longer, it has more letters, + +10:18.800 --> 10:20.880 +because when I use the term black box, + +10:20.880 --> 10:25.440 +it invites us to use expressions like opening the black box, + +10:25.440 --> 10:27.840 +and I'm going to use that expression a lot. + +10:34.640 --> 10:37.360 +Now, let me try to explain what is... + +10:37.360 --> 10:40.400 +Sorry, let me change the font. + +10:44.000 --> 10:44.800 +What is Lua? + +10:46.000 --> 10:51.840 +Lua is a minimalistic language in the sense of batteries not included. + +10:52.880 --> 10:56.640 +It uses associative tables for most of its data structures, + +10:58.800 --> 11:02.240 +and it's so minimalistic that it's the default print function. + +11:03.120 --> 11:09.280 +When we create an associative table and we ask it to print... + +11:11.760 --> 11:14.560 +We ask print to print an associative table, + +11:14.560 --> 11:17.280 +it just prints the address of the table. + +11:17.280 --> 11:18.480 +Here are some examples. + +11:19.920 --> 11:23.760 +Here is a table, and when we ask print to print it, + +11:23.760 --> 11:26.720 +it just says that it's the table at this address here. + +11:27.440 --> 11:32.400 +So, one of the things that most people do when they start using Lua + +11:32.400 --> 11:36.320 +is that either they download a package with a print to printing function, + +11:36.320 --> 11:38.720 +or they write their own print to printing functions. + +11:39.360 --> 11:42.000 +My own print to printing function is called pp, + +11:42.000 --> 11:45.840 +with uppercase letters, and it works like this, + +11:47.600 --> 11:50.880 +and it prints associative tables in a way like this. + +11:50.880 --> 11:54.800 +It says that for the key 1, + +11:55.200 --> 11:57.280 +the value associated to it is 2, + +11:57.280 --> 11:59.200 +for the key 2, the value is 3, + +11:59.200 --> 12:01.760 +and for the key 3, the value is 5. + +12:08.960 --> 12:12.160 +When I started using Lua, one of my favorite languages + +12:12.160 --> 12:15.600 +was also a language that used associative tables a lot. + +12:15.600 --> 12:16.720 +It was called Icon, + +12:18.400 --> 12:22.640 +and I had to write my own print to printing functions for Icon. + +12:22.720 --> 12:28.800 +So, I just had to port my print to printing functions to Lua, + +12:28.800 --> 12:31.600 +and my first version looked something like this. + +12:32.240 --> 12:36.560 +It just had some global functions, lots of them actually, + +12:39.680 --> 12:41.840 +and after a while I rewrote it, + +12:41.840 --> 12:44.320 +and I rewrote it again, and again, and again, + +12:44.320 --> 12:49.200 +and this is one of the versions that is not even the default at this point. + +12:50.000 --> 12:53.920 +TOS is for toString, + +12:56.800 --> 12:57.920 +and this is a demo. + +12:58.800 --> 13:04.560 +It's very modular, so it's easy to replace parts of it or to toggle flags, + +13:04.560 --> 13:05.760 +and this is an example. + +13:05.760 --> 13:10.320 +If I try to print the table of methods for a certain class, + +13:11.760 --> 13:13.040 +I'll need a smaller font, + +13:14.320 --> 13:16.480 +it prints the table like this, + +13:16.480 --> 13:18.480 +with the names of the methods, + +13:18.560 --> 13:21.520 +and then links to the source code of the functions. + +13:22.080 --> 13:25.360 +These links only make sense in Emacs and in Eevee, + +13:26.000 --> 13:28.560 +and when we run a link like this one, + +13:29.840 --> 13:33.920 +it shows the source code in the window at the right. + +13:33.920 --> 13:37.760 +So, for some functions, the source code is three lines, + +13:37.760 --> 13:40.400 +for other ones it's one line, and whatever. + +13:41.920 --> 13:43.200 +Anyway, let me go back. + +13:45.360 --> 13:48.000 +Lua can be used in many different styles. + +13:48.000 --> 13:50.160 +Most people hate other people's styles. + +13:51.920 --> 13:56.080 +When I started using it in the year 2000, + +13:56.080 --> 13:59.040 +I learned most of the basic language in a single day. + +13:59.040 --> 14:02.000 +It was very similar to things that I was already using, + +14:02.800 --> 14:08.560 +and then I rewrote the mini language that I was using + +14:08.560 --> 14:14.800 +to generate the HTML for my pages in Lua. + +14:14.800 --> 14:16.960 +Actually, I had to rewrite it many times, + +14:16.960 --> 14:20.880 +but the first version I certainly did in my first weeks + +14:20.880 --> 14:22.480 +or first months using Lua. + +14:25.520 --> 14:29.040 +In the beginning, I was just using it for writing programs + +14:29.040 --> 14:32.160 +that either didn't take in any input at all, + +14:32.160 --> 14:35.280 +because the input was already in the source file, + +14:35.280 --> 14:39.200 +or that worked as a Unix function, + +14:39.200 --> 14:42.960 +the Unix programs that would read files + +14:42.960 --> 14:46.160 +and process these files in some way and output something. + +14:47.840 --> 14:52.480 +I mentioned the basic language here. + +14:52.480 --> 14:55.520 +I only learned how to use closures, metatables, + +14:55.520 --> 14:58.240 +and coroutines many years later. + +15:00.320 --> 15:02.240 +In the beginning, when I started using Lua, + +15:02.240 --> 15:04.080 +it didn't have a package manager. + +15:04.080 --> 15:05.200 +It appeared later. + +15:05.200 --> 15:06.560 +It is called Lua-rocks. + +15:07.680 --> 15:11.600 +It has had this package manager for several years. + +15:12.720 --> 15:15.520 +Most of the rocks for Lua-rocks are poorly documented, + +15:16.480 --> 15:19.040 +documented, and hacker-unfriendly, + +15:19.040 --> 15:21.600 +so you can't rely just on the documentation, + +15:22.160 --> 15:24.320 +and you can't rely just on the source code, + +15:24.320 --> 15:28.320 +because, I mean, if you're a genius, of course you can, + +15:28.320 --> 15:32.320 +but for people who are either lazy or dumb or whatever, + +15:32.320 --> 15:33.920 +like me, or unfocused, + +15:35.120 --> 15:37.120 +the source code is hard to understand + +15:37.120 --> 15:38.800 +and hard to tinker with. + +15:41.440 --> 15:43.040 +Some rocks are excellent. + +15:43.040 --> 15:46.640 +The best rocks are well documented, + +15:46.640 --> 15:48.640 +but they are hacker-unfriendly, + +15:48.640 --> 15:51.840 +in the sense that I hope that I'll be able to explain soon. + +15:53.440 --> 15:58.560 +The best rocks use local variables and metatables a lot, + +15:59.280 --> 16:03.120 +so if you are a beginner learning Lua, + +16:03.120 --> 16:06.080 +you're not going to understand what their source codes do. + +16:06.080 --> 16:08.320 +They use lots of dirty tricks. + +16:08.640 --> 16:12.240 +Let me talk a bit about object orientation in Lua. + +16:12.240 --> 16:13.840 +It can be done in many ways. + +16:15.360 --> 16:18.000 +The main book about Lua, called Programming in Lua, + +16:18.000 --> 16:20.240 +by one of the authors of the language, + +16:21.120 --> 16:22.320 +Roberto Ierzalimschi, + +16:23.200 --> 16:26.960 +presents several ways of doing object orientation in Lua. + +16:26.960 --> 16:29.040 +I hated all of these ways, + +16:29.840 --> 16:32.720 +and also the ways that I tried from the rocks. + +16:34.400 --> 16:36.880 +And then I wrote my own way, + +16:37.360 --> 16:40.160 +wrote my own way of doing object orientation in Lua. + +16:40.160 --> 16:41.440 +It's very minimalistic. + +16:42.000 --> 16:45.120 +It's in this file here, eoo.lua. + +16:47.040 --> 16:49.440 +The main code is just these five lines here, + +16:50.640 --> 16:53.120 +and here's an example of how it works. + +16:56.080 --> 17:02.640 +Here we define a class vector with some metamethods. + +17:02.640 --> 17:07.920 +This metamethod here will tell Lua what to do + +17:07.920 --> 17:11.040 +when the user asks to add two vectors. + +17:11.600 --> 17:14.320 +This one here tells Lua what to do + +17:14.320 --> 17:18.320 +when the user asks Lua to convert a vector to a string, + +17:18.880 --> 17:20.640 +and whatever. + +17:20.640 --> 17:23.920 +This one is something that I'm going to explain in a second. + +17:25.360 --> 17:28.240 +So here we create a vector with these coordinates, + +17:28.240 --> 17:29.360 +three and four. + +17:29.360 --> 17:31.360 +Here we create another vector. + +17:31.360 --> 17:35.200 +If we print here, then Lua uses the function here + +17:35.200 --> 17:36.160 +in the toString. + +17:37.200 --> 17:40.880 +If we add two vectors, it uses the function here + +17:40.880 --> 17:42.400 +in the add metamethod. + +17:42.960 --> 17:45.280 +And if we run the method norm, + +17:45.280 --> 17:49.760 +it is defined here in the table index. + +17:51.280 --> 17:51.780 +Anyway. + +17:52.740 --> 17:54.740 +Even this thing being so small, + +17:54.740 --> 17:58.500 +I used to forget how it's in odds worked all the time. + +17:58.500 --> 18:01.700 +Actually, I always forget how things work, + +18:01.700 --> 18:03.940 +and I have to remember them somehow. + +18:03.940 --> 18:07.940 +And I have to have tricks for remembering + +18:07.940 --> 18:11.940 +and tricks for summarizing things and diagrams and so on. + +18:13.540 --> 18:15.940 +And every time that I forgot how to do it, + +18:15.940 --> 18:17.220 +I just go back to the code. + +18:17.220 --> 18:18.420 +I just go back to the code. + +18:18.500 --> 18:23.140 +And every time that I forgot how this thing worked, + +18:23.140 --> 18:25.540 +I went back to the source code, + +18:25.540 --> 18:27.380 +and then I looked at the diagrams. + +18:27.380 --> 18:29.940 +Or, of course, in the first time, + +18:29.940 --> 18:31.460 +I had to draw the diagrams. + +18:32.260 --> 18:34.420 +And I run the examples. + +18:34.420 --> 18:35.780 +And, of course, in the beginning, + +18:35.780 --> 18:37.460 +I thought that the code was clear. + +18:37.460 --> 18:38.900 +My examples were very brief. + +18:38.900 --> 18:42.820 +And so I had to rewrite the examples many times + +18:42.820 --> 18:46.420 +until they became, let's say, perfect. + +18:48.660 --> 18:53.220 +And I was saying that Lua can be used in many ways. + +18:53.780 --> 18:57.700 +And in my way of using Lua, my favorite way, + +18:57.700 --> 19:02.020 +everything can be inspected and modified from REPLs, + +19:03.140 --> 19:07.140 +like we can do in MX and in Smalltalk, or sort of. + +19:07.860 --> 19:09.940 +So in my favorite way of using Lua, + +19:09.940 --> 19:11.860 +there's no security at all. + +19:11.860 --> 19:14.740 +Everything can be changed at all times. + +19:15.140 --> 19:16.980 +Of course, most people hate that. + +19:17.780 --> 19:20.180 +My init file has lots of classes. + +19:20.820 --> 19:24.100 +And, by the way, instead of keeping many small files + +19:24.100 --> 19:25.140 +with many things, + +19:25.140 --> 19:29.300 +I put lots of stuff in just one big init file. + +19:31.060 --> 19:33.860 +My init file has lots of classes + +19:33.860 --> 19:36.660 +and lots of global functions and lots of crafts. + +19:36.660 --> 19:40.020 +So people hate that, of course. + +19:41.380 --> 19:42.580 +This is an example. + +19:43.460 --> 19:44.500 +This is an example. + +19:44.500 --> 19:48.260 +This is the index at the top of my init file. + +19:50.580 --> 19:52.820 +The classes start here. + +19:55.060 --> 19:57.220 +And then we have some functions. + +19:57.780 --> 20:02.500 +And then we have functions that load certain packages. + +20:02.500 --> 20:03.540 +And then we have craft. + +20:04.260 --> 20:04.760 +Whatever. + +20:06.180 --> 20:08.580 +Most people think that my style of using Lua + +20:08.580 --> 20:10.340 +is dirty and dangerous. + +20:10.340 --> 20:11.860 +And they wouldn't touch my Lua code. + +20:12.100 --> 20:13.140 +With a 10-feet pole. + +20:14.740 --> 20:18.100 +But most of the things that I'm going to present here + +20:18.100 --> 20:20.740 +in this presentation are ideas that should be easy + +20:20.740 --> 20:24.180 +to port to other environments and other languages. + +20:24.180 --> 20:25.780 +Especially the diagrams. + +20:25.780 --> 20:27.620 +So the code is not so important. + +20:30.740 --> 20:33.140 +Now let me talk a bit about LaTeX. + +20:33.140 --> 20:33.860 +Lua LaTeX. + +20:33.860 --> 20:38.820 +That is LaTeX with the Lua interpreter embedded inside. + +20:39.380 --> 20:43.300 +And two ways of generating pictures in LaTeX. + +20:43.300 --> 20:44.820 +Text that is very famous. + +20:44.820 --> 20:47.300 +And picture that is not very famous. + +20:47.300 --> 20:48.900 +And that is very low level. + +20:48.900 --> 20:51.700 +And I think that not many people use. + +20:53.700 --> 20:57.300 +I said before that when I learned Lua, + +20:57.300 --> 21:01.540 +I realized that it was very good for writing little languages. + +21:03.220 --> 21:05.220 +I was doing my PhD at the time. + +21:05.300 --> 21:11.220 +And typesetting the diagrams for my PhD thesis was very boring. + +21:11.220 --> 21:14.100 +So one of the things that I did was that I created + +21:14.980 --> 21:17.540 +a little language for typesetting the diagrams for me. + +21:19.140 --> 21:20.900 +It was called DEDNOT. + +21:20.900 --> 21:25.300 +Because initially it only generated diagrams + +21:25.300 --> 21:26.820 +for natural deduction. + +21:26.820 --> 21:28.580 +And then it had several versions. + +21:30.180 --> 21:34.420 +These are the slides for my presentation about DEDNOT6. + +21:34.420 --> 21:39.140 +And DEDNOT6 is an extensible semi-preprocessor for Lua LaTeX + +21:39.140 --> 21:41.780 +that understands diagrams in ASCII art. + +21:42.340 --> 21:48.740 +In the sense that when I have a LaTeX file that has this. + +21:49.380 --> 21:51.860 +And when DEDNOT6 is loaded. + +21:53.220 --> 21:58.820 +When I give the right commands, DEDNOT6 interprets this block here + +21:58.820 --> 22:00.980 +as something that defines this diagram. + +22:02.260 --> 22:03.540 +Oops, sorry. + +22:05.380 --> 22:07.540 +It interprets this diagram here. + +22:08.340 --> 22:10.900 +This diagram in the comments here + +22:11.460 --> 22:14.260 +as something that defines a diagram called foo, + +22:14.260 --> 22:16.100 +a deduction called foo. + +22:16.100 --> 22:19.140 +And it generates this code here. + +22:19.940 --> 22:27.300 +So that we can just invoke the definition of the deduction + +22:27.300 --> 22:30.260 +by typing backslash DED foo. + +22:31.220 --> 22:37.140 +And DEDNOT6 also supports another language + +22:37.140 --> 22:39.860 +for typesetting bi-dimensional diagrams + +22:39.860 --> 22:42.660 +with arrows and stuff for category theory and blah blah. + +22:44.180 --> 22:46.900 +The specifications of these diagrams look like this. + +22:49.540 --> 22:53.540 +Here is a very good example. + +22:55.540 --> 22:56.980 +This is a huge diagram. + +22:58.420 --> 22:59.460 +Sorry, one second. + +23:00.740 --> 23:03.620 +So the source code that generates this diagram here + +23:03.620 --> 23:05.140 +is just this thing at the left. + +23:07.220 --> 23:08.340 +So it's very visual. + +23:09.220 --> 23:12.340 +We can typeset the diagram in ASCII art here. + +23:12.340 --> 23:13.780 +And then in this part here, + +23:13.780 --> 23:16.660 +we tell how the nodes are to be joined, + +23:17.620 --> 23:20.660 +which arrows have to have annotations and so on. + +23:22.420 --> 23:25.460 +And this language is extensible in the sense that... + +23:25.780 --> 23:26.580 +Where is that? + +23:32.020 --> 23:32.520 +Here. + +23:34.420 --> 23:36.660 +Comments that start with percent colon + +23:37.940 --> 23:41.620 +are interpreted as definitions for three diagrams. + +23:43.620 --> 23:47.220 +Lines that start with percent uppercase D + +23:47.220 --> 23:52.260 +define 2D diagrams with arrows and stuff. + +23:52.740 --> 23:58.020 +And lines that start with comment uppercase L + +23:58.660 --> 24:00.580 +contain blocks of Lua code + +24:00.580 --> 24:04.180 +that we can use to extend the interpreter on the flag. + +24:06.020 --> 24:09.860 +Anyway, here are some recent examples of diagrams + +24:09.860 --> 24:14.580 +that I used DEDNOT6 to typeset. + +24:15.780 --> 24:17.220 +This diagram here + +24:17.780 --> 24:20.580 +was generated by this specification here. + +24:23.460 --> 24:26.980 +And this diagram here with the curved arrows + +24:27.780 --> 24:30.580 +was generated by this specification here. + +24:34.180 --> 24:37.220 +So DEDNOT6 was very easy to extend. + +24:37.220 --> 24:38.260 +At that some point, + +24:38.260 --> 24:42.820 +I started to use it to generate diagrams using Peaked Chewy, + +24:42.820 --> 24:45.540 +mainly for the classes that I gave you. + +24:45.540 --> 24:48.420 +For the classes that I give at the university. + +24:48.420 --> 24:50.900 +I teach mathematics and whatever. + +24:51.860 --> 24:52.900 +In a bad place. + +24:52.900 --> 24:53.400 +Whatever. + +24:56.260 --> 24:58.500 +Let me show an animation. + +24:59.060 --> 25:02.420 +Here is a diagram that I generated with DEDNOT6. + +25:02.980 --> 25:05.300 +And it is a flipbook animation. + +25:05.300 --> 25:08.740 +Like we type page up and page down + +25:08.740 --> 25:10.660 +and we go to the next page of the book + +25:10.660 --> 25:12.340 +and to the previous page of the book. + +25:13.060 --> 25:15.940 +And here is the source code that generates that. + +25:16.980 --> 25:19.140 +This source code is not very visual. + +25:19.140 --> 25:22.740 +So it's quite clumsy to edit a diagram + +25:22.740 --> 25:25.460 +directly in the tag file like that. + +25:28.020 --> 25:31.860 +These diagrams were inspired by something called Manim. + +25:32.500 --> 25:33.000 +That's... + +25:34.580 --> 25:36.340 +Oh, I've forgotten the name of the guy. + +25:36.340 --> 25:39.300 +But it's a guy that makes many videos about mathematics. + +25:39.300 --> 25:41.780 +And he created this library called Manim + +25:41.780 --> 25:43.460 +for generating his animations. + +25:45.540 --> 25:51.460 +Other people adapted his library to make it more accessible. + +25:52.580 --> 25:53.700 +I tried to learn it. + +25:53.700 --> 25:55.700 +But each animation, + +25:57.060 --> 25:59.220 +even an animation with very few frames, + +25:59.220 --> 26:01.300 +each animation took ages to render. + +26:01.300 --> 26:03.060 +So it wasn't fun. + +26:03.700 --> 26:07.060 +And animations and PDFs can be rendered in seconds. + +26:07.940 --> 26:11.060 +So these things were fun for me + +26:11.060 --> 26:15.300 +because my laptop is very slow and Manim was not fun. + +26:20.100 --> 26:26.020 +Anyway, writing code like this inside the attack file + +26:26.020 --> 26:29.620 +was not very fun because it was hard to debug. + +26:30.500 --> 26:35.860 +So in 2022, I started to play with ways + +26:35.860 --> 26:40.340 +of generating these diagrams from REPLs. + +26:40.980 --> 26:44.500 +And I found a way for PIC2E and a way for TIX. + +26:45.380 --> 26:47.780 +Each one of these ways became a video. + +26:48.740 --> 26:53.780 +If you go to the list of first class videos of EEV, + +26:53.780 --> 26:57.540 +you're going to see that there's a video about PIC2E here + +26:57.540 --> 26:58.740 +and a video about TIX. + +27:00.340 --> 27:07.540 +Here you have some information like length and explanation, etc. + +27:08.180 --> 27:10.420 +And here are the pages for these videos. + +27:12.420 --> 27:15.860 +My page about the video, about PIC2E is like this. + +27:15.860 --> 27:18.740 +It has some diagrams, whatever. + +27:18.740 --> 27:20.980 +And this one is much nicer. + +27:20.980 --> 27:26.100 +And a lot of people watched that video. + +27:26.100 --> 27:30.260 +I mean, I thought that 250 people watched it. + +27:30.900 --> 27:33.940 +For me, that's a million of people. + +27:36.660 --> 27:42.900 +And this video is about how to extract diagrams from the TIX manual + +27:42.900 --> 27:47.700 +and how to run those examples in a REPL + +27:47.700 --> 27:49.780 +and modify them bit by bit. + +27:49.780 --> 27:51.380 +This is a screenshot. + +27:52.100 --> 27:53.620 +But let me go back. + +27:56.420 --> 27:59.700 +At that point, these things were just prototypes. + +27:59.700 --> 28:01.460 +The code was not very nice. + +28:02.020 --> 28:10.500 +And in this year, I was able to unify those two ways of generating PDFs, + +28:11.380 --> 28:14.100 +the one for TIX and the one for PIC2E. + +28:14.100 --> 28:18.740 +And I unified them with many other things that generated diagrams. + +28:19.220 --> 28:27.460 +The basis of these things is something called showchew.lua. + +28:27.460 --> 28:31.380 +I'm not going to show its details now. + +28:32.100 --> 28:40.420 +But its extension that generates TIX code is just this. + +28:40.420 --> 28:45.540 +So we can specify a diagram with just a block like this. + +28:46.260 --> 28:54.180 +And then if we run show00 and it returns a string + +28:54.180 --> 28:58.580 +that is just the inner body of the TIX file. + +28:59.220 --> 29:02.020 +If we run this, we see the whole TIX file. + +29:02.020 --> 29:04.340 +And if we run this, we save the TIX file + +29:04.340 --> 29:08.420 +and we compile the TIX file to generate a PDF. + +29:08.420 --> 29:14.180 +And if we run this, we show the PDF in the lower right window. + +29:16.020 --> 29:20.740 +And that's the same thing for all my recent programs that generate PDFs. + +29:21.620 --> 29:22.980 +They are all integrated. + +29:24.500 --> 29:30.660 +Here is the one that the basis for all my modules that generate diagrams with PIC2E. + +29:33.060 --> 29:34.980 +Its demos are not very interesting. + +29:34.980 --> 29:39.700 +So let me show some demos of extensions that do interesting things. + +29:40.660 --> 29:47.220 +So this is a diagram that I created by editing it in a REPL. + +29:48.820 --> 29:51.220 +I create several PIC2E objects here. + +29:52.500 --> 29:58.660 +And if I execute this, it compiles the object, generates a PDF. + +29:58.660 --> 30:03.860 +And if I tap this, here is the PDF. + +30:04.740 --> 30:10.020 +And if I just ask Lua to display what is books here, + +30:11.700 --> 30:17.220 +it shows the source code in PIC2E of the diagram. + +30:17.940 --> 30:20.340 +And the nice thing is that it is indented. + +30:20.340 --> 30:23.460 +So it's easy to debug the PIC2E code. + +30:24.340 --> 30:30.180 +If anyone is interested, the module that does the tricks for indentation + +30:30.180 --> 30:31.460 +is very easy to understand. + +30:31.540 --> 30:34.500 +It has lots of tests and test blocks. + +30:34.500 --> 30:39.060 +And I think that its data structures are easy to understand. + +30:42.500 --> 30:44.820 +Anyway, here is another example. + +30:50.260 --> 30:51.620 +The show is here. + +30:53.460 --> 30:56.340 +It generates a 3D diagram. + +31:02.420 --> 31:08.500 +Now let me talk about parsers and REPLs in a very strange place. + +31:09.140 --> 31:18.340 +I mean, using REPLs to build parsers step by step and replacing parts by more complex parts. + +31:21.060 --> 31:23.780 +So I said that Lua is very minimalistic. + +31:25.780 --> 31:30.660 +And everybody knows that implementations of regular expressions + +31:30.740 --> 31:31.780 +are big and complex. + +31:33.060 --> 31:39.220 +So instead of coming with full regular expressions, Lua comes with something called patterns + +31:39.220 --> 31:43.620 +and a library function called string.match. + +31:45.380 --> 31:54.420 +Here is a copy of the part of the manual that explains a part of the syntax of patterns. + +31:56.260 --> 32:00.100 +Here's how string.match is described in the manual. + +32:01.220 --> 32:02.500 +It's just this. + +32:02.500 --> 32:06.260 +Looks for the first match of pattern in the string as blah, blah, blah. + +32:07.220 --> 32:11.300 +And then we have to go to the other section of the manual that explains patterns. + +32:17.780 --> 32:26.500 +Lua patterns are so simple, so limited, that they don't even have the alternation operator. + +32:27.220 --> 32:31.460 +Here is how it is described in the ELLISP manual. + +32:33.300 --> 32:37.780 +Backslash pipe specifies an alternative, blah, blah, blah. + +32:40.820 --> 32:47.940 +When we want to build more complex regular expressions, patterns, grammars, etc., + +32:47.940 --> 32:51.780 +we have to use an external library for that. + +32:52.740 --> 32:59.140 +No, sorry, a library that is external, but that was written by one of the authors of Lua itself. + +33:00.340 --> 33:05.380 +This library is called LPEG, and its manual says, + +33:06.180 --> 33:11.940 +LPEG is a new pattern matching library for Lua based on parsing expression grammars, PEGs. + +33:14.900 --> 33:17.460 +The manual is very terse. + +33:18.180 --> 33:20.500 +I found it incredibly hard to read. + +33:20.900 --> 33:22.740 +It doesn't have any diagrams. + +33:22.740 --> 33:24.420 +It has some examples, though. + +33:26.180 --> 33:34.420 +And the Lua wiki has a big page called LPEG tutorial with lots of examples. + +33:35.700 --> 33:42.020 +But it also doesn't have diagrams, and I found some things incredibly hard to understand. + +33:42.020 --> 33:48.500 +For example, this is something that is in the manual of LPEG that I saw and I thought, + +33:49.460 --> 33:53.060 +wow, great, this makes all sense, and this is going to be very useful. + +33:53.060 --> 33:57.300 +It's a way to build grammars that can be recursive, + +33:57.300 --> 34:02.020 +and they sort of can encode BNF grammars. + +34:02.020 --> 34:06.980 +We just have to translate the BNF a bit to get rid of some recursions + +34:06.980 --> 34:08.820 +and to translate them to something else. + +34:10.580 --> 34:13.620 +And the manual also has some things that I thought, + +34:13.620 --> 34:16.580 +oh, no, I don't have any idea of what this thing does. + +34:17.380 --> 34:22.020 +And in fact, I saw these things for the first time more than 10 years ago, + +34:22.020 --> 34:26.020 +and they only started to make sense one year ago. + +34:28.420 --> 34:30.340 +One example is group captures. + +34:33.380 --> 34:37.620 +LPEG also comes with a module called the RE module. + +34:37.620 --> 34:40.180 +Let me pronounce it in Portuguese, the RE module. + +34:40.660 --> 34:45.540 +And its manual says, the RE module provided by the file repo.luen + +34:45.540 --> 34:48.100 +in the distribution supports a somewhat conventional + +34:48.980 --> 34:54.420 +regular expression syntax for pattern usage within LPEG. + +34:55.140 --> 34:57.460 +And this is a quick reference. + +35:00.500 --> 35:02.820 +And this thing is very brief. + +35:02.820 --> 35:06.420 +It has some nice examples, but it's hard to understand in a way. + +35:06.660 --> 35:12.500 +And here are some comments about my attempts to learn HerdotLua. + +35:14.020 --> 35:15.220 +This is a class. + +35:15.220 --> 35:17.060 +In this case, it's a very small class. + +35:18.180 --> 35:21.940 +And this file implements a PM method. + +35:23.540 --> 35:26.980 +I'm going to show examples of other PM methods very soon. + +35:28.020 --> 35:33.380 +So this is a PM method for HerdotLua that lets us compare the syntax + +35:33.620 --> 35:39.460 +of Lua patterns, LPEG, and HerdotLua. + +35:41.620 --> 35:43.060 +See this example here. + +35:43.700 --> 35:49.940 +So if we run this, it loads my version of LPEG. + +35:50.660 --> 35:52.740 +No, sorry, my version of LPEG-REX. + +35:54.820 --> 36:00.180 +And it shows that when we apply the PM method to this Lua pattern, + +36:00.740 --> 36:07.380 +this LPEG pattern, and this RE pattern, they all get the same results. + +36:07.380 --> 36:12.820 +So we can use this thing, this kind of thing here to show how to translate from + +36:14.420 --> 36:20.180 +Lua patterns that are familiar because they are similar to regular expressions, only weaker, + +36:22.260 --> 36:27.620 +to LPEG that is super weird, and to RE that is not so weird. + +36:28.580 --> 36:37.940 +Anyway, the comment says that in 2012, I had a project that needed a precedence parser that + +36:37.940 --> 36:42.900 +could parse arithmetical expressions with the right precedences. + +36:44.580 --> 36:50.180 +And at that point, I was still struggling with pure LPEG, and I couldn't do much with it. + +36:50.180 --> 36:55.300 +So I tried to learn HerdotLua instead, and I wrote this old class here. + +36:56.260 --> 36:59.620 +That allowed me to use preprocessor on patterns for Lua. + +36:59.620 --> 37:04.980 +And the thing is that with this preprocessor, I could specify precedence grammars using this + +37:04.980 --> 37:12.900 +thing here that worked, but it was super clumsy, and I gave up after a few attempts. + +37:14.900 --> 37:21.300 +And in 2022, I heard about something called LPEG-REX that was an + +37:22.260 --> 37:28.740 +a kind of extension of Re, and it was much more powerful than HerdotLua, but after a while, + +37:28.740 --> 37:32.660 +I realized that it had the same defects as HerdotLua. + +37:32.660 --> 37:41.620 +And let me explain that because it has all to do with the things about black boxes and magic + +37:41.620 --> 37:42.980 +that I told in the beginning. + +37:43.380 --> 37:50.100 +Both, I mean, sorry, neither HerdotLua or LPEG-REX had some features that I needed. + +37:51.620 --> 37:57.940 +They didn't let us explain, sorry, they received a pattern that was specified as a string, + +37:57.940 --> 38:04.740 +and it converted that into an LPEG pattern, but it didn't let us explore the LPEG patterns + +38:04.740 --> 38:05.540 +that it was using. + +38:05.540 --> 38:12.900 +So I had to use the LPEG-REX, and it didn't let me explore the LPEG patterns that it was + +38:12.900 --> 38:13.540 +generated. + +38:16.420 --> 38:21.060 +Their code was written in a way that was REPL unfriendly. + +38:21.060 --> 38:28.580 +I couldn't modify parts of the code bit by bit in a REPL and try to change the code + +38:29.700 --> 38:31.620 +without changing the original file, say. + +38:33.300 --> 38:37.220 +The code was very hard to explore, to hack, and to extend, in my opinion. + +38:37.780 --> 38:39.700 +The documentation was not very clear. + +38:40.580 --> 38:50.660 +And I sent one or two messages to the developer of LPEG-REX, and he was too busy to help me. + +38:50.660 --> 38:55.460 +He answered very briefly, and to be honest, I felt rejected. + +38:55.460 --> 38:58.580 +I felt that I wasn't doing anything interesting. + +38:58.580 --> 38:59.380 +Whatever, whatever. + +39:00.340 --> 39:11.940 +So, in 2022, I was trying to learn LPEG-REX, because I was thinking that it would solve + +39:11.940 --> 39:13.780 +my problems, but it didn't. + +39:14.500 --> 39:20.900 +It didn't have the features that I needed, and it was hard to extend, and hard to explore, + +39:20.900 --> 39:22.100 +and hard to debug. + +39:22.980 --> 39:32.420 +I decided to rewrite it in a more hacker-friendly way, in the sense that it was modular, and + +39:32.420 --> 39:35.460 +I could replace any part of the module from a REPL. + +39:37.300 --> 39:48.340 +My version of it was called lpeg1.lua, and I decided that in my version, I wouldn't have + +39:49.060 --> 39:55.460 +the part that receives a grammar specified as a string and converts that to LPEG. + +39:55.460 --> 40:03.780 +I would just have the backend part that are the functions in LPEG that let us specify + +40:04.340 --> 40:05.380 +powerful grammars. + +40:10.340 --> 40:11.540 +So, let me go back. + +40:12.260 --> 40:14.260 +Let me explain a bit about LPEG. + +40:14.900 --> 40:16.180 +Lua has coercions. + +40:18.660 --> 40:22.740 +The plus expects to receive two numbers. + +40:22.740 --> 40:29.860 +If one of its arguments, or both of them, are strings, it converts the strings to numbers. + +40:29.860 --> 40:39.220 +So, in this case here, 2 plus string 3 returns the number 5, and this is the concatenation + +40:39.220 --> 40:39.860 +operator. + +40:40.820 --> 40:42.820 +It expects to receive strings. + +40:43.780 --> 40:49.860 +So, in this case, it will convert the number 2 to the string 2, and the concatenation of + +40:49.860 --> 40:51.700 +these two things will be 23. + +40:52.420 --> 40:54.420 +Sorry, 23 as a string. + +40:56.260 --> 40:58.420 +LPEG also has some coercions. + +41:00.260 --> 41:09.620 +I usually set these globals to let me write my grammars in a very compact way. + +41:10.260 --> 41:17.460 +So, instead of lpeg.p, lpeg.c, etc., I use these globals like uppercase B, uppercase + +41:17.460 --> 41:18.420 +C, and so on. + +41:19.540 --> 41:27.540 +And with these globals, I can write things like this, c1 times string underscore. + +41:28.420 --> 41:40.820 +And LPEG knows that lpeg.c, sorry, it sort of expands these to lpeg.c, but lpeg.c expects + +41:40.820 --> 41:47.380 +to receive an LPEG pattern, and one is not yet an LPEG pattern, so it is coerced into + +41:47.380 --> 41:50.900 +an LPEG pattern by calling lpeg.p. + +41:51.220 --> 42:02.740 +So, this shorting here becomes equivalent to lpeg.c, lpeg.p1, and the multiplication, + +42:02.740 --> 42:09.940 +when at least one of its arguments is an LPEG pattern, it expects to receive two LPEG patterns, + +42:09.940 --> 42:15.700 +and in this case, the one at the right is just a string, so it is coerced to an LPEG + +42:15.700 --> 42:17.620 +pattern by using lpeg.p. + +42:18.180 --> 42:22.180 +With this idea, we can sort of understand this comparison here. + +42:22.900 --> 42:24.980 +I mean, let me run it again. + +42:24.980 --> 42:33.620 +This first part is very similar to a regular expression here at the left, and when we apply + +42:33.620 --> 42:45.940 +this LPEG, sorry, this Lua pattern to this subject here, the result is that the Lua pattern + +42:46.740 --> 42:53.540 +the result is this thing here, this thing, this thing, and this thing. + +42:53.540 --> 43:00.580 +I'm going to call each one of these results captures, so each of these things between + +43:00.580 --> 43:08.020 +parentheses captures a substring of the original string, and these captured substrings are + +43:08.020 --> 43:09.460 +returned in a certain order. + +43:10.420 --> 43:12.740 +Here is how to express the same thing in LPEG. + +43:13.540 --> 43:22.660 +It's very cryptic, but it's a good way to understand some basic operators of LPEG. + +43:22.660 --> 43:34.900 +I mean, we can look at the menu and understand what C, S, and R do, and also exponentiation. + +43:35.860 --> 43:43.060 +And this strange thing here receives this string here, runs a function that I have defined + +43:43.060 --> 43:50.260 +that converts it to an object of a certain class, and that class represents He patterns. + +43:50.260 --> 43:56.900 +So this thing is treated as a pattern for He.Lua, and it is matched against the string, + +43:56.900 --> 43:59.300 +and it returns the same thing as the other one. + +43:59.860 --> 44:06.260 +Also, this thing here also has a comparison with LPEG-REGS, but these patterns are very + +44:06.260 --> 44:06.820 +trivial. + +44:06.820 --> 44:10.180 +They don't do anything very strange. + +44:10.180 --> 44:14.260 +So let's go back and see what kinds of very strange things there are. + +44:16.660 --> 44:23.620 +Here is the page of LPEG-REGS at GitHub. + +44:24.260 --> 44:25.860 +Here's the documentation. + +44:27.940 --> 44:29.380 +It's relatively brief. + +44:29.380 --> 44:35.300 +It explains LPEG-REGS as being an extension of He.Lua. + +44:36.500 --> 44:40.100 +So it explains mainly the additional features. + +44:40.100 --> 44:44.180 +Here is a quick reference that explains only the additional features. + +44:46.820 --> 44:53.380 +Some of these things I was able to understand by using the LPEG-REGS. + +44:54.340 --> 45:02.820 +I was struggling a lot, and some I wasn't able to, even by spending several evenings + +45:02.820 --> 45:04.420 +trying to build examples. + +45:08.260 --> 45:10.900 +And this is something very nice. + +45:12.100 --> 45:19.700 +LPEG-REGS comes with some example parsers, and here is a parser that parses the Lua grammar. + +45:19.700 --> 45:28.100 +I mean, this is the grammar for Lua 5.4 at the end of the reference manual. + +45:28.660 --> 45:35.860 +It's just this, and this is a kind of the BNF, and this is the BNF translated to + +45:37.300 --> 45:39.860 +the language of LPEG-REGS. + +45:40.420 --> 45:47.300 +So this thing uses many constructions that are in He.Lua and some extra constructions + +45:47.300 --> 45:49.460 +that are described here. + +45:50.260 --> 45:58.980 +And with these examples, I was able to understand some of these things here that are described + +45:58.980 --> 46:02.660 +here in the quick reference, but not all. + +46:06.660 --> 46:15.300 +So I wasn't able to use LPEG-REGS by itself because some things didn't make much sense, + +46:15.300 --> 46:18.900 +and I decided to reimplement it in my own style. + +46:20.900 --> 46:27.860 +Because that would be a way to map, at the very least, map what I understood and what + +46:27.860 --> 46:32.980 +I didn't, and learn one feature at a time, do comparisons, and so on. + +46:35.380 --> 46:38.900 +Here, I pointed to two features of LPEG. + +46:38.900 --> 46:44.820 +One, I said, oh great, this thing can be used to define grammars, even recursive + +46:44.900 --> 46:46.020 +grammars, and so on. + +46:46.740 --> 46:52.820 +And this is an oh-no feature, one thing that didn't make any sense at all, group captures. + +46:55.380 --> 47:01.620 +One thing that I did to understand group captures was to represent them as diagrams. + +47:01.620 --> 47:08.020 +Of course, in the beginning, I was drawing these diagrams by hand, but then I realized + +47:08.020 --> 47:15.220 +that I could use the bits of LPEG that I already knew to build a grammar that would + +47:15.220 --> 47:19.380 +parse a little language and generate these diagrams in LaTeX. + +47:20.340 --> 47:21.940 +And I was able to make this. + +47:24.180 --> 47:34.500 +In this diagram here, this thing above the arrow is a piece of Lua code that specifies + +47:34.500 --> 47:36.100 +an LPEG pattern. + +47:36.820 --> 47:43.540 +This thing here at the top is the string that is being matched, and the things below the + +47:43.540 --> 47:51.220 +under braces are the captures that each thing, sorry, each thing captures. + +47:54.580 --> 48:02.100 +And for example, this under brace here corresponds to this pattern here that parses a single + +48:02.100 --> 48:05.060 +character but doesn't return any captures. + +48:05.140 --> 48:10.420 +This thing here parses a single B and doesn't return any captures. + +48:10.420 --> 48:16.740 +This thing here parses a single character and captures it, and this thing here parses + +48:17.620 --> 48:19.700 +the character D and captures it. + +48:20.340 --> 48:29.220 +And this other thing here that transforms this pattern into another pattern returns + +48:29.780 --> 48:36.500 +first a capture with all the string that was parsed by this pattern here, and then all + +48:36.500 --> 48:41.380 +the captures returned by this thing here before the column. + +48:43.380 --> 48:50.900 +So this was a way to build concrete examples for things that the LPEG manual was explaining + +48:50.900 --> 48:53.940 +in a very terse way, and it worked for me. + +48:54.740 --> 49:01.540 +Some things that were very mysterious started to make sense, and I started to have intelligent + +49:01.540 --> 49:03.300 +questions to ask in the mailing list. + +49:07.700 --> 49:16.980 +And with that, I was able to understand what are group captures and group captures that + +49:16.980 --> 49:17.860 +receive a name. + +49:20.900 --> 49:23.140 +Well, let me explain what this does. + +49:23.220 --> 49:30.180 +This thing here captures, sorry, parses the empty string and returns this as a constant. + +49:30.180 --> 49:35.860 +So this is something that doesn't exist in regular expressions. + +49:36.980 --> 49:40.180 +It parses nothing and returns this as a capture. + +49:40.820 --> 49:48.580 +Then this thing here returns these two constants here and parses the empty string, and this + +49:48.660 --> 49:56.500 +thing here, d, converts the results of this thing here into a group capture and stores + +49:56.500 --> 49:58.020 +it in the label d. + +50:01.380 --> 50:03.860 +And then here's another constant capture. + +50:03.860 --> 50:11.460 +And I realized that these things here were similar to how Lua specifies building lists. + +50:11.780 --> 50:16.580 +When we build, sorry, a table, when we build a table and we say that the first element + +50:16.580 --> 50:20.420 +of the table is here, this element is put at the end of the table. + +50:21.140 --> 50:30.820 +When after that we say d equals to, say, 42, we are putting the 42 in the slot whose key + +50:30.820 --> 50:31.380 +is d. + +50:33.380 --> 50:37.860 +This was happening with LPEG captures, but there was something very strange. + +50:37.860 --> 50:46.260 +These group captures could hold more than one capture, more than one value. + +50:46.260 --> 50:50.340 +So there was something between lists and tables. + +50:51.300 --> 51:00.740 +I started to use this notation to explain in my notation what they were doing. + +51:02.340 --> 51:04.900 +Many things start, things stop. + +51:05.220 --> 51:08.900 +Many things start, things started to make sense. + +51:08.900 --> 51:14.420 +Many mysterious sentences in the manual started to make sense, but some didn't. + +51:16.100 --> 51:25.060 +But at least I was able to send some intelligent questions to the mailing list, and the author + +51:25.060 --> 51:27.540 +of Lua and LPEG answered some of them. + +51:29.700 --> 51:31.860 +He was not very happy about my questions. + +51:32.020 --> 51:40.100 +He told me that those diagrams were a waste of time, that the manual was perfectly clear, + +51:40.100 --> 51:42.900 +and so on, whatever. + +51:42.900 --> 51:51.620 +But I was able to, so it was weird, but I was able to understand lots of things from + +51:51.620 --> 51:52.340 +his answers. + +51:53.940 --> 51:57.380 +So this is a copy of one of my messages. + +51:57.380 --> 51:59.300 +Then there's another one, another one. + +51:59.300 --> 52:04.580 +Some were the diagrams, then he complained about these diagrams. + +52:04.580 --> 52:12.980 +He said that these things here that look like table constructions do not exist, whatever. + +52:15.380 --> 52:23.220 +Anyway, once I understood group captures, many features were very, very easy to understand, + +52:23.780 --> 52:28.260 +and I started to be able to use LPEG to build some very interesting things. + +52:30.260 --> 52:36.340 +I was able to reproduce some of the features that I saw in LPEG-REX. + +52:38.420 --> 52:40.980 +Remember that this, where is that? + +52:42.420 --> 52:44.020 +This is a syntax of Lua. + +52:45.860 --> 52:54.820 +Here, I was able to understand how these things here were translated to LPEG code, to LPEG + +52:54.820 --> 52:58.340 +patterns by using group captures in a certain way. + +52:59.460 --> 53:05.060 +And I was able to implement them in lpeg1.lua. + +53:06.340 --> 53:14.180 +And after some time, I was able to use lpeg1.lua to build grammars that were able to parse + +53:17.300 --> 53:19.860 +arithmetical expressions with the right precedence. + +53:19.860 --> 53:25.700 +And here's an example in which I built the grammar step by step, and I test the current + +53:25.700 --> 53:29.300 +grammar, and I replace a bit, and then I test the new grammar, and so on. + +53:31.780 --> 53:38.580 +And you can see that the result is always a tree that is drawn in a nice two-dimensional way. + +53:42.580 --> 53:52.340 +At this point, these powers here are returned as a list, as an operation + +53:52.900 --> 53:56.260 +pow with several arguments here. + +53:56.820 --> 54:04.820 +And then I apply a kind of parsing combinator here that transforms these trees into other trees. + +54:05.540 --> 54:14.180 +And with these combinators here, I can specify that the power is associative in a certain + +54:14.180 --> 54:20.340 +direction, the division is associative in another direction, the minus is associative, + +54:20.420 --> 54:24.420 +so it uses the same direction as a division, and so on. + +54:24.420 --> 54:26.020 +And they have the right precedences. + +54:28.660 --> 54:30.020 +So here are the tests. + +54:33.700 --> 54:37.140 +So here's my file lpeg1.lua. + +54:37.140 --> 54:38.340 +It has several classes. + +54:38.980 --> 54:42.980 +Each class has tests after it. + +54:43.940 --> 54:51.780 +I was able to implement something that lpeg-reqs has that's called keywords. + +54:51.780 --> 54:56.980 +That's very useful for parsing programs in programming languages. + +54:56.980 --> 55:06.580 +I was able to implement something similar to the debugger, to the PEG debugger that lpeg uses, + +55:07.220 --> 55:12.740 +but I was frustrated by some limitations of that debugger, + +55:12.740 --> 55:16.180 +and I implemented my own that is much better. + +55:17.700 --> 55:23.860 +And let me show something else. + +55:23.860 --> 55:32.900 +I was able to translate a good part of the Lua parser here to lpeg1.lua. + +55:33.700 --> 55:39.940 +I haven't finished yet, but I have most of the translation here. + +55:43.140 --> 55:50.420 +And after having all that, I was able to build other grammars very quickly. + +55:51.380 --> 55:59.220 +Writing new parsers finally became fun, and here's one example that I showed in the beginning. + +56:03.620 --> 56:11.220 +If I remember correctly, I took a figure from the Wikipedia. + +56:11.220 --> 56:17.220 +I don't have its link now, but I specified a grammar that parses + +56:18.500 --> 56:21.140 +exactly the example that appears in the Wikipedia. + +56:21.140 --> 56:28.100 +So with my grammar, considering that the top-level entry is statement, + +56:28.100 --> 56:36.900 +when I parse this string here, the result is this tree. + +56:38.100 --> 56:41.780 +And I can do some operations on that. + +56:41.780 --> 56:45.780 +I can define how this thing is to be converted into LaTeX. + +56:47.460 --> 56:51.700 +I can define other operations that convert trees into other trees. + +56:52.580 --> 56:54.980 +And here are some tests of these operations. + +56:58.340 --> 57:00.660 +This is what I showed in the beginning. + +57:00.660 --> 57:04.100 +I'm not going to explain all the details of this thing now. + +57:07.460 --> 57:14.260 +This show converts this thing into LaTeX in the way specified by these instructions here. + +57:15.380 --> 57:16.340 +Let's say that... + +57:19.540 --> 57:20.260 +Well, whatever. + +57:22.740 --> 57:23.540 +Really, whatever. + +57:24.020 --> 57:28.500 +And here's the result, the LaTeX result. + +57:34.900 --> 57:46.260 +And these diagrams here are generated by this file here that defines a simple grammar that parses + +57:46.260 --> 57:53.460 +this thing here, and then LaTeX it in a certain way, and then also tests this thing. + +57:54.100 --> 58:00.900 +To check if this code here, that is Lua code that generates an LPEG grammar, + +58:02.900 --> 58:08.740 +parses this subject here and returns the expected result. + +58:12.740 --> 58:15.140 +So this is the code that I wanted to show. + +58:15.700 --> 58:21.700 +I wanted to show many more things, but I wasn't able to prepare them before the conference. + +58:22.580 --> 58:29.060 +And I hope that soon, for some value of soon, I'll be able to create + +58:29.620 --> 58:37.060 +REPL-based tutorials for LPEG here and lpeg1.lua, where LPEG is something very famous. + +58:37.060 --> 58:39.460 +Here is a module of LPEG. + +58:40.500 --> 58:48.100 +I could also do something like this for LPEG-REX, and lpeg1.lua is the thing that I wrote, + +58:48.820 --> 58:58.900 +the one that has tests in comments, and the tests usually generate trees, + +58:58.900 --> 59:00.900 +and sometimes they generate tag code. + +59:03.300 --> 59:04.420 +Yeah, so that's it. + +59:04.420 --> 59:07.860 +I wanted to present much more, but I wasn't able to prepare it. + +59:07.860 --> 59:08.660 +So sorry. + +59:08.660 --> 59:09.140 +Thanks. + +59:09.140 --> 59:10.260 +Bye. + diff --git a/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main--chapters.vtt b/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main--chapters.vtt new file mode 100644 index 00000000..aac6f54c --- /dev/null +++ b/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main--chapters.vtt @@ -0,0 +1,53 @@ +WEBVTT + + +00:00:00.000 --> 00:00:37.399 +Introduction + +00:00:37.400 --> 00:01:02.559 +Three activities in voice computing + +00:01:02.560 --> 00:01:53.519 +Talk is not about ... and about ... + +00:01:53.520 --> 00:03:33.239 +Motivations + +00:03:33.240 --> 00:03:58.679 +Data + +00:03:58.680 --> 00:04:25.627 +Voice In in the Chrome Store + +00:04:25.628 --> 00:05:16.879 +Works in web pages with text areas + +00:05:16.880 --> 00:06:41.739 +Built-in commands in Voice In Plus + +00:06:41.740 --> 00:08:14.759 +Common errors made by Voice In + +00:08:14.760 --> 00:09:59.419 +Custom speech-to-text commands + +00:09:59.420 --> 00:10:37.539 +Custom speech-to-commands + +00:10:37.540 --> 00:12:28.399 +Introducing Talon Voice + +00:12:28.400 --> 00:14:02.539 +Talon GUI + +00:14:02.540 --> 00:15:34.014 +Talon file with web scope + +00:15:34.015 --> 00:16:52.499 +Terminals on remote and virtual machines + +00:16:52.500 --> 00:18:17.719 +Recommendations + +00:18:17.720 --> 00:18:48.880 +Acknowledgements diff --git a/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main.vtt b/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main.vtt index 650d2d49..5ff59fdc 100644 --- a/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main.vtt +++ b/2023/captions/emacsconf-2023-voice--enhancing-productivity-with-voice-computing--blaine-mooers--main.vtt @@ -1,5 +1,7 @@ WEBVTT captioned by sachac +NOTE Introduction + 00:00:00.000 --> 00:00:04.359 Hi, I'm Blaine Mooers. I'm an associate professor @@ -33,6 +35,8 @@ I was seeking ways of using voice computing 00:00:33.040 --> 00:00:37.399 to try to enhance my productivity. +NOTE Three activities in voice computing + 00:00:37.400 --> 00:00:41.319 I divide voice computing into three activities, @@ -54,17 +58,19 @@ that are probably most broadly applicable 00:00:57.320 --> 00:01:02.559 to the workflows of people attending this conference. +NOTE Talk is not about ... and about ... + 00:01:02.560 --> 00:01:06.799 This talk will not be about Emacspeak. 00:01:06.800 --> 00:01:11.359 -This is a verbal program for converting text to speech. +This is a venerated program for converting text to speech. 00:01:11.360 --> 00:01:13.319 We're talking about the flow of information 00:01:13.320 --> 00:01:16.519 -opposite direction, speech-to-text. +in the opposite direction, speech-to-text. 00:01:16.520 --> 00:01:20.599 We need an Emacs Listens. We don't have one, @@ -99,7 +105,7 @@ and it's also great at speech-to-code. NOTE Motivations 00:01:53.520 --> 00:01:57.239 -So, the motivations are, obviously, as I mentioned already, +The motivations are, obviously, as I mentioned already, 00:01:57.240 --> 00:01:59.159 for improved productivity. @@ -209,7 +215,7 @@ I adopted the use of voice computing in the middle of August. As you can see, 00:03:53.920 --> 00:03:58.679 -I got a over three-fold increase in my output. +I got an over three-fold increase in my output. NOTE Voice In in the Chrome Store @@ -217,7 +223,7 @@ NOTE Voice In in the Chrome Store So this is the Chrome store website for voice-in. 00:04:07.120 --> 00:04:11.119 -So it's only available for Google Chrome. +It's only available for Google Chrome. 00:04:11.120 --> 00:04:13.239 You just hit the install button to install it. @@ -231,8 +237,13 @@ It has support for 40 languages 00:04:19.560 --> 00:04:23.119 and it supports about a dozen different dialects of English, -00:04:23.120 --> 00:04:29.959 -including Australian. It works on web pages with text areas, +00:04:23.120 --> 00:04:25.627 +including Australian. + +NOTE Works in web pages with text areas + +00:04:25.628 --> 00:04:29.959 +It works on web pages with text areas, 00:04:29.960 --> 00:04:33.319 so it works. I use it regularly @@ -265,15 +276,15 @@ I've mapped option-L to opening Voice In when the cursor is on a web page that has a text area. 00:05:09.120 --> 00:05:16.879 -So that's the main limiting factor. +So [the presence of a text area is] the main limiting factor. NOTE Built-in commands in Voice In Plus 00:05:16.880 --> 00:05:19.159 -So it has a number of built-in commands. +[Voice In] has a number of built-in commands. 00:05:19.160 --> 00:05:24.879 -You can turn it off by saying stop dictation. +You can turn it off by saying "stop dictation". 00:05:24.880 --> 00:05:26.119 It doesn't distinguish between @@ -282,16 +293,16 @@ It doesn't distinguish between a command mode and a dictation mode. 00:05:28.800 --> 00:05:33.599 -It has undo command. When you use a command, +It has undo command. You use the command 00:05:33.600 --> 00:05:36.919 -copy that to a copy of selection. +"copy that" to copy a selection. 00:05:36.920 --> 00:05:40.079 -And the `press` commands are used in the browser, +The "press" commands are used in the browser. 00:05:40.080 --> 00:05:44.839 -so you press Enter to issue a command or a text +You [say] "press enter" to issue a command or [submit] text 00:05:44.840 --> 00:05:50.319 that has been written in a web form, @@ -335,7 +346,7 @@ I also provide an Elisp version of this quiz, 00:06:35.600 --> 00:06:41.739 but it's a little slower to operate. -NOTE Common errors +NOTE Common errors made by Voice In 00:06:41.740 --> 00:06:43.399 These are some common errors @@ -368,7 +379,7 @@ It inserts the wrong word because it's not in the dictionary that was used to train it. So, for example, 00:07:22.620 --> 00:07:26.919 -the word PyMOL is the name of a lexicographic program +the word PyMOL is the name of a molecular graphics program 00:07:26.920 --> 00:07:31.639 that we use in our field. It doesn't recognize PyMOL. @@ -409,13 +420,13 @@ that's separate from a dictation mode. NOTE Custom speech-to-text commands 00:08:14.760 --> 00:08:20.319 -So you can set up through a very easy-to-use GUI +You can set up through a very easy-to-use GUI 00:08:20.320 --> 00:08:26.959 -custom voice commands mapped to what you want inserted. +custom voice commands mapped to what you want inserted, 00:08:26.960 --> 00:08:32.399 -So this is how misinterpreted words can be corrected. +so this is how misinterpreted words can be corrected. 00:08:32.400 --> 00:08:35.759 You just map the misinterpreted word to the intended word. @@ -427,7 +438,7 @@ You can also map the contractions to their expansions. I did this for 94 English contractions, 00:08:46.960 --> 00:08:50.139 -and you can find this on GitHub. +and you can find these on GitHub. 00:08:50.140 --> 00:08:56.079 You can also insert acronyms and expand those acronyms. @@ -439,19 +450,19 @@ I apply the same approach to the first names of colleagues. I say "expand Fred", for example, 00:09:03.760 --> 00:09:06.999 -to get Fred's first and last name with the spelling +to get Fred's first and last name 00:09:07.000 --> 00:09:12.599 -of his very long German name. +with the [correct] spelling of his very long German name. 00:09:12.600 --> 00:09:19.399 You can also insert other trivia like favorite URLs. 00:09:19.400 --> 00:09:24.559 -You can insert a lot of text snippets, +You can insert LaTeX snippets. 00:09:24.560 --> 00:09:34.799 -and so it handles correctly multi-line snippets. +It handles correctly multi-line snippets. 00:09:34.800 --> 00:09:39.419 You just have to enclose them in double quotes. @@ -465,11 +476,13 @@ that you use frequently. All fields 00:09:46.880 --> 00:09:59.419 have certain key references for certain methods or topics. +NOTE Custom speech-to-commands + 00:09:59.420 --> 00:10:05.079 Then it has a set of commands that you can customize 00:10:05.080 --> 00:10:08.199 -for the purpose of speech to commands +for the purpose of speech-to-commands 00:10:08.200 --> 00:10:09.679 to get the computer to do something @@ -477,22 +490,22 @@ to get the computer to do something 00:10:09.680 --> 00:10:15.399 like open up a specific website or save the current writing. -00:10:15.400 --> 00:10:19.919 -In this case, we have "press" is a mapping of +00:10:15.400 --> 00:10:23.540 +In this case, we have "press: command-s" -00:10:19.920 --> 00:10:27.759 -is applied to the command `s` for saving current writing. +00:10:23.541 --> 00:10:27.759 +for saving current writing. 00:10:27.760 --> 00:10:28.099 -You can change the language, +You can change the language [with "lang:"], 00:10:28.100 --> 00:10:37.539 -and you can change the case of the text. +and you can change the case of the text [with "case:"]. NOTE Introducing Talon Voice 00:10:37.540 --> 00:10:41.039 -But the speech to command repertoire is quite limited +But the speech-to-command repertoire is quite limited 00:10:41.040 --> 00:10:49.759 in Voice In, so it's now time to pick up on Talon Voice. @@ -537,10 +550,10 @@ You can activate it, and it'll be in a listening state asleep. 00:11:31.360 --> 00:11:36.279 -You just bark out Talon Wake to start to wake it up, +You just bark out "Talon Wake" to start to wake it up, 00:11:36.280 --> 00:11:43.799 -and Talon Sleep to have it go into a listening state. +and "Talon Sleep" to have it go into a listening state. 00:11:43.800 --> 00:11:47.919 It has a very welcoming community @@ -578,7 +591,7 @@ for which he's primarily developing Cursorless. NOTE Talon GUI 00:12:28.400 --> 00:12:35.519 -So, I followed the protocol outlined by Tara Roys. +I followed the [install] protocol outlined by Tara Roys. 00:12:35.520 --> 00:12:38.759 She has a collection of tutorials @@ -590,7 +603,7 @@ on YouTube as well as on GitHub that are quite helpful. I followed her tutorial for installing 00:12:49.480 --> 00:12:51.359 -Talend on macOS without any issues, +Talon on macOS without any issues, 00:12:51.360 --> 00:12:55.319 but allow for half an hour to an hour @@ -611,13 +624,13 @@ that means it's in the sleep state. So, this leads to cascading pull-down menus. 00:13:13.520 --> 00:13:19.639 -This is it for the GUI interface. +This is it for the GUI. 00:13:19.640 --> 00:13:26.519 -One of your first tasks is to select a large language model +One of your first tasks is to select 00:13:26.520 --> 00:13:30.439 -or language model that will be used to interpret +a language model that will be used to interpret 00:13:30.440 --> 00:13:35.179 the sounds that you generate as words. @@ -643,8 +656,10 @@ You do not have to restart Talon 00:13:57.600 --> 00:14:02.539 to get the change to take effect. +NOTE Talon file with web scope + 00:14:02.540 --> 00:14:04.759 -So, this is an example of a Talon file. +This is an example of a Talon file. 00:14:04.760 --> 00:14:10.499 It has two components. It has a header above the dash that describes @@ -706,20 +721,25 @@ it's an optional feature of Talon files, 00:15:29.600 --> 00:15:32.639 then the commands in the file will apply in all situations, -00:15:32.640 --> 00:15:36.959 -in all modes. Here we have two restrictions. +00:15:32.640 --> 00:15:34.014 +in all modes. + +NOTE Terminals on remote and virtual machines + +00:15:34.015 --> 00:15:36.959 +Here we have two restrictions. 00:15:36.960 --> 00:15:38.959 -This is only, these commands will only work +These commands will only work 00:15:38.960 --> 00:15:42.959 -when using the iTerm2 terminal emulator for the Mac, +when using the iTerm2 [ccc] terminal emulator for the Mac, 00:15:42.960 --> 00:15:48.239 and then only when the title of the window in iTerm2 00:15:48.240 --> 00:15:52.439 -has this particular address, which corresponds to, +has this particular address, 00:15:52.440 --> 00:15:55.559 which is what appears when I've logged into @@ -728,7 +748,7 @@ which is what appears when I've logged into the supercomputer at the University of Oklahoma. 00:16:00.060 --> 00:16:03.479 -So, one of the commands in this file is checkjobs. +One of the commands in this file is checkjobs. 00:16:03.480 --> 00:16:05.539 It's mapped to an alias, @@ -749,13 +769,13 @@ of the pending and running jobs on the supercomputer in a format that I find pleasing. 00:16:26.081 --> 00:16:34.559 -So, this backslash n after cj, new line character, +This `\n` after cj, the new line character, 00:16:34.560 --> 00:16:39.839 -enters the command. So, I don't have to do that +enters the command, so I don't have to do that 00:16:39.840 --> 00:16:43.799 -as an additional step. And then, likewise, +as an additional step. Likewise, 00:16:43.800 --> 00:16:46.799 here's a similar setup for interacting with @@ -766,7 +786,7 @@ a Ubuntu virtual machine. NOTE Recommendations 00:16:52.500 --> 00:16:55.919 -So, in terms of picking up voice computing, +In terms of picking up voice computing, 00:16:55.920 --> 00:16:57.479 these are my recommendations. @@ -822,20 +842,25 @@ versus Talon Voice where I think 00:17:56.320 --> 00:17:59.879 the error rate is closer to 5 percent. -00:18:00.840 --> 00:18:04.759 -I have put together contractions also for Talon, +00:18:00.840 --> 00:18:03.507 +I have put together [a library of English] contractions -00:18:04.760 --> 00:18:07.479 +00:18:03.508 --> 00:18:04.880 +[and their expansion] for Talon [too], + +00:18:04.881 --> 00:18:07.479 and they can be found here on GitHub. 00:18:07.480 --> 00:18:12.959 -And I also have a quiz of 600 questions +And I also have [posted] a quiz of 600 questions 00:18:12.960 --> 00:18:17.719 about some basic Talon commands. +NOTE Acknowledgements + 00:18:17.720 --> 00:18:20.999 -So, I'd like to thank the people who've helped me out +I'd like to thank the people who've helped me out 00:18:21.000 --> 00:18:22.159 on the Talon Slack channel @@ -856,7 +881,7 @@ I'd like to thank my friends at the Berlin and Austin Emacs Meetup 00:18:37.400 --> 00:18:42.659 -and at the M-x Research Slack channel. +and at the M-x research Slack channel. 00:18:42.660 --> 00:18:45.119 And I thank these grant funding agencies |