From aea2a4618f0762a559eea5de2748d9e4a1062606 Mon Sep 17 00:00:00 2001 From: Sacha Chua Date: Wed, 21 Dec 2022 12:41:06 -0500 Subject: Automated commit --- ...erver-for-org--corwin-brust--main--chapters.vtt | 80 + ...ple-http-server-for-org--corwin-brust--main.vtt | 1912 ++++++++++---------- 2022/info/orgvm-after.md | 739 ++++++++ 2022/info/orgvm-before.md | 44 +- 4 files changed, 1773 insertions(+), 1002 deletions(-) create mode 100644 2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt (limited to '2022') diff --git a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt new file mode 100644 index 00000000..b1835675 --- /dev/null +++ b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt @@ -0,0 +1,80 @@ +WEBVTT + + +00:00:36.000 --> 00:01:31.080 +Introduction + +00:01:31.080 --> 00:02:01.880 +What is orgvm? + +00:02:01.880 --> 00:02:49.560 +Nodejs + +00:02:49.560 --> 00:03:38.320 +The itch I was trying to scratch + +00:03:38.320 --> 00:05:29.760 +Demo + +00:05:29.760 --> 00:06:24.920 +Needs a relatively recent version of Emacs + +00:06:24.920 --> 00:08:13.520 +Usage patterns + +00:08:13.520 --> 00:09:09.160 +Emacs Lisp + +00:09:09.160 --> 00:10:38.720 +Variables + +00:10:38.720 --> 00:11:17.200 +Replace + +00:11:19.120 --> 00:13:06.480 +Getting into the code some more + +00:13:06.480 --> 00:13:37.320 +Generating Elisp + +00:13:37.320 --> 00:14:32.400 +Org blocks + +00:14:32.400 --> 00:16:43.000 +Building some Lisp + +00:16:43.000 --> 00:19:25.040 +How Elisp gets encoded + +00:19:25.040 --> 00:22:09.860 +How the export works + +00:22:09.860 --> 00:26:07.440 +Walking through the code + +00:26:07.440 --> 00:32:39.760 +Executing the source block + +00:32:39.760 --> 00:33:55.120 +Conclusion + +00:33:58.880 --> 00:35:48.940 +Questions and answers + +00:35:48.940 --> 00:35:58.460 +Why am I not running the web server in Emacs? + +00:36:22.140 --> 00:37:35.460 +Is this using org-info-js? + +00:37:35.460 --> 00:38:15.580 +EmacsConf + +00:38:15.580 --> 00:42:04.340 +How I'm using this at work + +00:42:04.340 --> 00:43:05.540 +Volunteering for EmacsConf + +00:43:08.380 --> 00:45:06.100 +It's easy to build a program that uses Emacs in the pipeline diff --git a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt index 7f9550b2..7ee7fca6 100644 --- a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt +++ b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt @@ -1,2348 +1,2258 @@ -WEBVTT +WEBVTT captioned by sachac -00:00:00.000 --> 00:00:26.000 - [MUSIC PLAYING] - -00:00:26.000 --> 00:00:36.000 - [MUSIC PLAYING] +NOTE Introduction 00:00:36.000 --> 00:00:42.480 - And so this little application-- +And so this little application-- -00:00:42.480 --> 00:00:46.480 - well, I'll skip that and just kind of jump right +00:00:42.480 --> 00:00:42.503 +well, I'll skip that and just kind of -00:00:46.480 --> 00:00:49.760 - into my thesis for those of you that +00:00:42.504 --> 00:00:49.142 +jump right into my thesis for those of you -00:00:49.760 --> 00:00:53.360 - might be planning to duck out for the RMS talk, +00:00:49.143 --> 00:00:53.360 +that might be planning to duck out for the RMS talk, 00:00:53.360 --> 00:00:55.520 - starting in a little bit. +starting in a little bit. -00:00:55.520 --> 00:00:59.360 - So essentially, my thesis here is really +00:00:55.520 --> 00:00:55.545 +So essentially, my thesis here is really that -00:00:59.360 --> 00:01:04.800 - that the Emacs toolchain can easily +00:00:55.546 --> 00:00:59.378 +the Emacs toolchain can easily be combined -00:01:04.800 --> 00:01:10.280 - be combined with other skills and used in kind of a Unix +00:00:59.379 --> 00:01:08.793 +with other skills and used in kind of -00:01:10.280 --> 00:01:13.280 - paradigm of having sort of different tools +00:01:08.794 --> 00:01:13.280 +a Unix paradigm of having sort of different tools 00:01:13.280 --> 00:01:14.960 - to do different steps. +to do different steps. 00:01:14.960 --> 00:01:17.760 - We might actually use the same tool +We might actually use the same tool 00:01:17.760 --> 00:01:19.240 - to implement a couple of steps. +to implement a couple of steps. 00:01:19.240 --> 00:01:22.080 - But with that paradigm, each step +But with that paradigm, each step -00:01:22.080 --> 00:01:24.960 - is an individual item that can be sort of dropped in +00:01:22.080 --> 00:01:22.086 +is an individual item that can be sort of -00:01:24.960 --> 00:01:26.400 - and replaced. +00:01:22.087 --> 00:01:26.400 +dropped in and replaced. -00:01:26.400 --> 00:01:29.560 - So over the course of the talk, hopefully I'll +00:01:26.400 --> 00:01:26.420 +So over the course of the talk, -00:01:29.560 --> 00:01:31.080 - come back to that thesis. +00:01:26.421 --> 00:01:31.080 +hopefully I'll come back to that thesis. -00:01:31.080 --> 00:01:35.800 - But I'll now jump back and start walking through what is +NOTE What is orgvm? -00:01:35.800 --> 00:01:37.040 - orgvm? +00:01:31.080 --> 00:01:31.086 +But I'll now jump back and start walking through -00:01:37.040 --> 00:01:39.560 - So this is a very simple proof of concept program. +00:01:31.087 --> 00:01:37.040 +what is orgvm? -00:01:39.560 --> 00:01:44.200 - We'll just jump over to perhaps a prettier view of the +00:01:37.040 --> 00:01:39.560 +So this is a very simple proof of concept program. -00:01:44.200 --> 00:01:44.880 - source +00:01:39.560 --> 00:01:39.586 +We'll just jump over to perhaps -00:01:44.880 --> 00:01:45.520 - code for it. +00:01:39.587 --> 00:01:45.520 +a prettier view of the source code for it. 00:01:45.520 --> 00:01:49.200 - This is implemented-- oops. +This is implemented-- oops. 00:01:49.200 --> 00:01:53.160 - There's some cruft, I think, in my local. +There's some cruft, I think, in my local. 00:01:53.160 --> 00:01:56.560 - All right, so there's config block at the top. +All right, so this config block at the top... 00:01:56.560 --> 00:01:58.120 - And we'll be jumping back and forth +And we'll be jumping back and forth 00:01:58.120 --> 00:02:01.880 - between the code and the documentation. +between the code and the documentation. + +NOTE Nodejs 00:02:01.880 --> 00:02:04.080 - So the first thing I want to point out +So the first thing I want to point out 00:02:04.080 --> 00:02:05.960 - is that this is written in Node.js. +is that this is written in Node.js, 00:02:05.960 --> 00:02:08.600 - But I think you'll find it'd be pretty trivial to implement +but I think you'll find it'd be pretty trivial to implement 00:02:08.600 --> 00:02:10.840 - in any language. +in any language. 00:02:10.840 --> 00:02:13.960 - Certainly, you're more than welcome to use this. +Certainly, you're more than welcome to use this. 00:02:13.960 --> 00:02:17.920 - I'd be happy to accept your patches or feature requests +I'd be happy to accept your patches or feature requests 00:02:17.920 --> 00:02:20.080 - and things like that. +and things like that. 00:02:20.080 --> 00:02:21.680 - Of course, bug reports. +Of course, bug reports. 00:02:21.680 --> 00:02:25.760 - But I'd also encourage others to roll their own. +But I'd also encourage others to roll their own. 00:02:25.760 --> 00:02:28.760 - You might well come up with a different version of this +You might well come up with a different version of this 00:02:28.760 --> 00:02:29.600 - that's even cooler. +that's even cooler. 00:02:29.600 --> 00:02:32.160 - And we can learn from each other. +And we can learn from each other. 00:02:32.160 --> 00:02:34.200 - If you heard one of my talks before, +If you heard one of my talks before, 00:02:34.200 --> 00:02:36.200 - you probably recognize a common theme. +you probably recognize a common theme. 00:02:36.200 --> 00:02:40.320 - I'm a big fan of head-first development +I'm a big fan of head-first development -00:02:40.320 --> 00:02:43.540 - as a way to get invested in both the tool chain and a +00:02:40.320 --> 00:02:40.336 +as a way to get invested in both -00:02:43.540 --> 00:02:44.120 - culture. +00:02:40.337 --> 00:02:44.120 +the tool chain and a culture. 00:02:44.120 --> 00:02:49.560 - All right, so let's come back to orgvm. +All right, so let's come back to orgvm. + +NOTE The itch I was trying to scratch -00:02:49.560 --> 00:02:52.280 - First of all, we'll start with the itch I was trying to +00:02:49.560 --> 00:02:49.586 +First of all, we'll start with -00:02:52.280 --> 00:02:52.840 - scratch. +00:02:49.587 --> 00:02:52.840 +the itch I was trying to scratch. 00:02:52.840 --> 00:02:58.240 - I wanted to be able to quickly use a web browser +I wanted to be able to quickly use a web browser 00:02:58.240 --> 00:03:00.680 - to browse my org documents. +to browse my Org documents. -00:03:00.680 --> 00:03:03.530 - It's particularly handy when the documents are full of +00:03:00.680 --> 00:03:01.420 +It's particularly handy when the documents -00:03:03.530 --> 00:03:03.960 - cross - -00:03:03.960 --> 00:03:05.640 - links to each other. +00:03:01.421 --> 00:03:05.640 +are full of cross links to each other. 00:03:05.640 --> 00:03:10.080 - That meant I wanted to automatically export, +That meant I wanted to automatically export, 00:03:10.080 --> 00:03:12.280 - particularly to HTML. +particularly to HTML. 00:03:12.280 --> 00:03:17.280 - But it made sense for me to include Markdown, PDF, +But it made sense for me to include Markdown, PDF, 00:03:17.280 --> 00:03:18.880 - or whatever format I want. +or whatever format I want. 00:03:18.880 --> 00:03:22.760 - Because many times, I'm going to look at that file +Because many times, I'm going to look at that file 00:03:22.760 --> 00:03:29.480 - and then pop it into an email or upload it somewhere. +and then pop it into an email or upload it somewhere. 00:03:29.480 --> 00:03:33.240 - And then finally, it should be, therefore, +And then finally, it should be, therefore, + +00:03:33.240 --> 00:03:33.753 +pretty easy to download the document -00:03:33.240 --> 00:03:36.840 - pretty easy to download the document rather than view it +00:03:33.754 --> 00:03:38.320 +rather than view it, once I'm done. -00:03:36.840 --> 00:03:38.320 - once I'm done. +NOTE Demo 00:03:38.320 --> 00:03:42.200 - So let's just run a quick demo. +So let's just run a quick demo. 00:03:42.200 --> 00:03:44.760 - You'll see I'm still a Windows user. +You'll see I'm still a Windows user. 00:03:44.760 --> 00:03:45.960 - Yeah, I'm working on it. +Yeah, I'm working on it. 00:03:45.960 --> 00:03:52.320 - So all right, first thing that we're going to do +So all right, first thing that we're going to do 00:03:52.320 --> 00:03:53.320 - is fire up the program. +is fire up the program. 00:03:53.320 --> 00:04:00.200 - Actually, for simplicity, let's just +Actually, for simplicity, let's just 00:04:00.200 --> 00:04:01.760 - admit we live in a DOS world. +admit we live in a DOS world. 00:04:01.760 --> 00:04:19.760 - And as you can see, there's not much to it +And as you can see, there's not much to it 00:04:19.760 --> 00:04:21.520 - to get the application running. - -00:04:22.680 --> 00:04:22.680 - +to get the application running. 00:04:22.680 --> 00:04:25.960 - So with that done, then, I can run out to my local host. +So with that done, then, I can run out to my localhost. 00:04:25.960 --> 00:04:36.780 - And we'll just start by plugging in the name of an org file - -00:04:36.780 --> 00:04:37.560 -. +And we'll just start by plugging in the name of an Org file. -00:04:37.560 --> 00:04:45.820 - So I've got a little org file that I prepared that just +00:04:37.560 --> 00:04:37.586 +So I've got a little Org file that I prepared -00:04:45.820 --> 00:04:46.640 - kind - -00:04:46.640 --> 00:04:49.040 - of provides a proof of concept to this. +00:04:37.587 --> 00:04:49.040 +that just kind of provides a proof of concept to this. 00:04:49.040 --> 00:04:53.560 - And you can see, as imagined, we're automatically +And you can see, as imagined, we're automatically 00:04:53.560 --> 00:04:54.640 - turning that org file. +turning that Org file... 00:04:54.640 --> 00:04:56.320 - Let's just take a quick look at it. +Let's just take a quick look at it. 00:04:56.320 --> 00:05:10.280 - And here's that file now. +And here's that file now. 00:05:10.280 --> 00:05:11.960 - But you can see nothing up my sleeve. +You can see, nothing up my sleeve. -00:05:11.960 --> 00:05:14.000 - This is a very basic org file that I +00:05:11.960 --> 00:05:11.961 +This is a very basic Org file -00:05:14.000 --> 00:05:16.560 - use for testing this program. +00:05:11.962 --> 00:05:16.560 +that I use for testing this program. 00:05:16.560 --> 00:05:17.640 - Images work. +Images work. -00:05:17.640 --> 00:05:21.800 - We've got some nicely syntax highlighted code +00:05:17.640 --> 00:05:21.836 +We've got some nicely syntax-highlighted code blocks -00:05:21.800 --> 00:05:25.560 - blocks in a couple different languages. +00:05:21.837 --> 00:05:25.560 +in a couple different languages, 00:05:25.560 --> 00:05:29.760 - And not really that much going on there. +and not really that much going on there. + +NOTE Needs a relatively recent version of Emacs 00:05:29.760 --> 00:05:33.760 - All right, let's come back to the documentation. +All right, let's come back to the documentation. 00:05:33.760 --> 00:05:36.680 - I pretty well covered this, I think. +I pretty well covered this, I think. 00:05:36.680 --> 00:05:39.720 - But you'll need a relatively recent version of Emacs. +But you'll need a relatively recent version of Emacs. 00:05:39.720 --> 00:05:43.640 - I haven't taken any pains to make this backward compatible. +I haven't taken any pains to make this backward compatible. 00:05:43.640 --> 00:05:46.000 - To be fair, I haven't tested it extensively. +To be fair, I haven't tested it extensively. 00:05:46.000 --> 00:05:50.320 - It may well work on Emacs 26 or older versions. +It may well work on Emacs 26 or older versions. 00:05:50.320 --> 00:05:55.120 - I'm personally running 27.1 and 28, +I'm personally running 27.1 and 28, 00:05:55.120 --> 00:05:57.080 - as well as recent builds of 29. +as well as recent builds of 29. 00:05:57.080 --> 00:06:02.560 - There's some quick start instructions here, +There's some quick start instructions here, 00:06:02.560 --> 00:06:03.900 - which I'm going to take as read. +which I'm going to take as read. -00:06:03.900 --> 00:06:09.160 - You probably saw the key element of this, which +00:06:03.900 --> 00:06:08.600 +You probably saw the key element of this, -00:06:09.160 --> 00:06:11.920 - involves starting the program. +00:06:08.601 --> 00:06:11.920 +which involves starting the program. 00:06:11.920 --> 00:06:13.520 - You do-- I will call out Yale. +You do-- I will call out Yale. 00:06:13.520 --> 00:06:15.320 - If you're trying to play with this yourself, +If you're trying to play with this yourself, 00:06:15.320 --> 00:06:20.080 - don't forget to run the npm install command. +don't forget to run the npm install command. + +00:06:20.080 --> 00:06:20.086 +That'll bring in express.js, -00:06:20.080 --> 00:06:23.240 - That'll bring in express.js, which the JavaScript we're +00:06:20.087 --> 00:06:24.920 +which the JavaScript we're about to look at is built on. -00:06:23.240 --> 00:06:24.920 - about to look at is built on. +NOTE Usage patterns 00:06:24.920 --> 00:06:33.480 - So let's just take a look at the usage patterns real quick. +So let's just take a look at the usage patterns real quick. 00:06:33.480 --> 00:06:35.920 - To use this, we're simply giving the document name +To use this, we're simply giving the document name 00:06:35.920 --> 00:06:42.760 - without the org extension in whatever file path-- +without the .org extension in whatever file path-- 00:06:42.760 --> 00:06:46.960 - or I'm sorry, whatever we've configured the server +or I'm sorry, whatever we've configured the server 00:06:46.960 --> 00:06:50.800 - to run on, in this case, port 3000. +to run on, in this case, port 3000. 00:06:50.800 --> 00:06:52.960 - I also want to call attention to the fact +I also want to call attention to the fact 00:06:52.960 --> 00:06:55.880 - that nothing in this program protects you +that nothing in this program protects you 00:06:55.880 --> 00:06:57.240 - from damaging yourself. +from damaging yourself. 00:06:57.240 --> 00:07:00.560 - This isn't meant as a production capability. +This isn't meant as a production capability. -00:07:00.560 --> 00:07:03.290 - This is something that's used to publish your own note +00:07:00.560 --> 00:07:00.586 +This is something that's used to publish -00:07:03.290 --> 00:07:04.840 - files +00:07:00.587 --> 00:07:04.840 +your own note files 00:07:04.840 --> 00:07:06.520 - and roll them up to yourself. +and roll them out to yourself. 00:07:06.520 --> 00:07:08.680 - That's something I'll definitely look at adding, +That's something I'll definitely look at adding, 00:07:08.680 --> 00:07:12.240 - but I want people to be careful of it +but I want people to be careful of it 00:07:12.240 --> 00:07:14.720 - while this is in an alpha state. +while this is in an alpha state. 00:07:14.720 --> 00:07:22.960 - So the default response is HTML, and we saw that here. +So the default response is HTML, and we saw that here. 00:07:22.960 --> 00:07:26.240 - But we also can modify the response format. +But we also can modify the response format. 00:07:26.240 --> 00:07:29.800 - We're currently supporting HTML, Markdown, and PDF. +We're currently supporting HTML, Markdown, and PDF. 00:07:29.800 --> 00:07:34.280 - And that's really enough to select a different format. - -00:07:34.280 --> 00:07:36.640 - That's really nothing more than adding-- - -00:07:36.640 --> 00:07:45.040 - [AUDIO OUT] +And that's really enough to select a different format. -00:07:45.040 --> 00:07:48.040 - --type, OK. +00:07:34.280 --> 00:07:48.040 +That's really nothing more than adding type. Okay. 00:07:48.040 --> 00:07:50.680 - Not sure what's going on there. +Not sure what's going on there. 00:07:50.680 --> 00:07:57.080 - OK, well, there goes my demo. +Okay, well, there goes my demo. 00:07:57.080 --> 00:07:59.440 - Shows me for doing my talk live. +Shows me for doing my talk live. 00:08:03.920 --> 00:08:06.960 - But this, fortunately, this error message +But this, fortunately, this error message 00:08:06.960 --> 00:08:08.840 - is a nice segue to the part of the talk +is a nice segue to the part of the talk 00:08:08.840 --> 00:08:10.240 - that I'd really like to focus on, +that I'd really like to focus on, 00:08:10.240 --> 00:08:13.520 - hopefully bringing me back to that thesis. +hopefully bringing me back to that thesis. + +NOTE Emacs Lisp 00:08:13.520 --> 00:08:17.760 - So as we start to look at code, what we're looking for +So as we start to look at code, what we're looking for 00:08:17.760 --> 00:08:21.640 - is really this Emacs Lisp that's getting generated here. +is really this Emacs Lisp that's getting generated here. 00:08:21.640 --> 00:08:24.000 - And you'll notice that's the stuff +And you'll notice that's the stuff 00:08:24.000 --> 00:08:27.600 - I thought was important to produce as diagnostics +I thought was important to produce as diagnostics 00:08:27.600 --> 00:08:29.840 - for the programs running as well. +for the programs running as well. 00:08:29.840 --> 00:08:34.000 - So spoiler, this e-lisp is dynamically +So, spoiler, this Elisp is dynamically 00:08:34.000 --> 00:08:35.400 - generated by the program. +generated by the program. 00:08:35.400 --> 00:08:38.160 - And that's really the core of the way +And that's really the core of the way 00:08:38.160 --> 00:08:42.680 - org VM or my org VM works. +orgvm or my orgvm works. 00:08:42.680 --> 00:08:47.360 - So this should look pretty similar to the view of the code +So this should look pretty similar to the view of the code 00:08:47.360 --> 00:08:48.880 - we had a moment ago. +we had a moment ago. 00:08:48.880 --> 00:08:51.840 - You can see I've got some bases. +You can see I've got some bases. 00:08:51.840 --> 00:08:53.680 - This is all hard-coded into the program, +This is all hard-coded into the program, 00:08:53.680 --> 00:08:56.720 - nothing fancy going on here. +nothing fancy going on here. 00:08:56.720 --> 00:09:00.280 - The debug is simply controlling that diagnostic output +The debug is simply controlling that diagnostic output 00:09:00.280 --> 00:09:01.560 - that we looked at. +that we looked at. 00:09:01.560 --> 00:09:04.240 - There's some other, hopefully fairly self-explanatory +There's some other, hopefully fairly self-explanatory 00:09:04.240 --> 00:09:09.160 - programs or properties, where to find Emacs and so forth. +programs or properties, where to find Emacs and so forth. + +NOTE Variables 00:09:09.160 --> 00:09:16.320 - And then finally, we come in to the meat of it, +And then finally, we come in to the meat of it, -00:09:16.320 --> 00:09:21.840 - the variables that are used to control what e-lisp we +00:09:16.320 --> 00:09:16.336 +the variables that are used to control what Elisp -00:09:21.840 --> 00:09:24.280 - can generate dynamically. +00:09:16.337 --> 00:09:24.280 +we can generate dynamically. 00:09:24.280 --> 00:09:27.400 - So here, we're controlling the extension +So here, we're controlling the extension 00:09:27.400 --> 00:09:29.360 - that it should look for org files. +that it should look for Org files. 00:09:29.360 --> 00:09:31.560 - Hopefully not too many people out there +Hopefully not too many people out there 00:09:31.560 --> 00:09:34.080 - with a weird extension for the org files, +with a weird extension for the Org files, 00:09:34.080 --> 00:09:37.920 - but this should support that. +but this should support that. 00:09:37.920 --> 00:09:40.120 - I'm afraid that is something I've been known to do. +I'm afraid that is something I've been known to do. 00:09:40.120 --> 00:09:49.520 - Then we define a list of additional export types. +Then we define a list of additional export types. 00:09:49.520 --> 00:09:50.760 - Here's one that ought to work. +Here's one that ought to work. 00:09:50.760 --> 00:09:53.200 - Let's take a look at type equals org. - -00:09:54.720 --> 00:09:54.720 - +Let's take a look at type=org. 00:09:54.720 --> 00:09:59.320 - And, aha, it's giving us the file. +And, aha, it's giving us the file. 00:09:59.320 --> 00:10:00.680 - So I'm not going to open that up, +So I'm not going to open that up, -00:10:00.680 --> 00:10:02.400 - but now we can see that that's definitely +00:10:00.680 --> 00:10:02.420 +but now we can see that that's definitely working, -00:10:02.400 --> 00:10:09.200 - working for certain versions of working. +00:10:02.421 --> 00:10:09.200 +for certain versions of working. 00:10:09.200 --> 00:10:14.280 - So this list of type parameters is +So this list of type parameters is 00:10:14.280 --> 00:10:15.720 - controlling the supported types. +controlling the supported types. 00:10:15.720 --> 00:10:18.550 - Hopefully it should be fairly easy to add in different ones - -00:10:18.550 --> 00:10:18.800 -. +Hopefully it should be fairly easy to add in different ones. 00:10:18.800 --> 00:10:21.480 - The fancy footwork here is just a list +The fancy footwork here is just a list 00:10:21.480 --> 00:10:23.480 - of the types that we're going to be using. +of the types that we're going to be using. 00:10:23.480 --> 00:10:29.320 - The fancy footwork here involves, first of all, +The fancy footwork here involves, first of all, 00:10:29.320 --> 00:10:32.240 - there's the extension and the MIME type. +there's the extension and the MIME type. -00:10:32.240 --> 00:10:36.520 - That's, as you might guess, used to control the response +00:10:32.240 --> 00:10:32.253 +That's, as you might guess, used to control -00:10:36.520 --> 00:10:37.040 - content +00:10:32.254 --> 00:10:38.720 +the response content type. -00:10:37.040 --> 00:10:38.720 - type. +NOTE Replace 00:10:38.720 --> 00:10:40.920 - We also have this replace variable. +We also have this replace variable. 00:10:40.920 --> 00:10:44.000 - This prevents-- there's an optimization +This prevents-- there's an optimization -00:10:44.000 --> 00:10:48.840 - to send an existing PDF or HTML file if that's already +00:10:44.000 --> 00:10:48.836 +to send an existing PDF or HTML file -00:10:48.840 --> 00:10:53.520 - there, but only if the original source org file hasn't +00:10:48.837 --> 00:10:50.463 +if that's already there, -00:10:53.520 --> 00:10:56.240 - been modified since. +00:10:50.464 --> 00:10:51.003 +but only if the original source Org file + +00:10:51.004 --> 00:10:56.240 +hasn't been modified since. 00:10:56.240 --> 00:10:59.920 - This replace effectively can turn that off. +This `replace` effectively can turn that off. 00:10:59.920 --> 00:11:03.040 - If I remove the replace equals true attribute, +If I remove the `replace: true` attribute, 00:11:03.040 --> 00:11:07.600 - then I'll be prevented from overwriting that. +then I'll be prevented from overwriting that. 00:11:07.600 --> 00:11:10.320 - In other words, I'll always send a cached version. - -00:11:10.320 --> 00:11:13.880 - That might be helpful if, for example, you've +In other words, I'll always send a cached version. -00:11:13.880 --> 00:11:16.560 - got hand-tuned PDFs and you don't want to accidentally +00:11:10.320 --> 00:11:13.878 +That might be helpful if, for example, -00:11:16.560 --> 00:11:17.200 - overwrite them. +00:11:13.879 --> 00:11:15.065 +you've got hand-tuned PDFs -00:11:19.120 --> 00:11:19.120 +00:11:15.066 --> 00:11:17.200 +and you don't want to accidentally overwrite them. +NOTE Getting into the code some more 00:11:19.120 --> 00:11:23.480 - All right, let's get into the code a little bit more. +All right, let's get into the code a little bit more. 00:11:23.480 --> 00:11:28.280 - I'm going to skip past the really good stuff +I'm going to skip past the really good stuff -00:11:28.280 --> 00:11:32.520 - and jump into the boring parts so that we have them +00:11:28.280 --> 00:11:28.295 +and jump into the boring parts -00:11:32.520 --> 00:11:34.240 - as context. +00:11:28.296 --> 00:11:34.240 +so that we have them as context. 00:11:34.240 --> 00:11:37.160 - Here's the default path. +Here's the default path. 00:11:37.160 --> 00:11:41.880 - And it is going to send me the readme from the project-- +And it is going to send me the readme from the project-- 00:11:41.880 --> 00:11:47.120 - from the project repo if I don't specify a path. +from the project repo if I don't specify a path. 00:11:47.120 --> 00:11:51.240 - And then we have a couple of different endpoints +And then we have a couple of different endpoints 00:11:51.240 --> 00:11:52.480 - that we support. +that we support. 00:11:52.480 --> 00:11:55.560 - We'll come back to this first one. +We'll come back to this first one. -00:11:55.560 --> 00:11:59.600 - For now, let's start with the more normal one, which +00:11:55.560 --> 00:11:55.586 +For now, let's start with the more normal one, -00:11:59.600 --> 00:12:01.760 - is just giving us a file name. +00:11:55.587 --> 00:12:01.760 +which is just giving us a file name. 00:12:01.760 --> 00:12:04.160 - So we can see we start by figuring out +So we can see we start by figuring out 00:12:04.160 --> 00:12:08.520 - what the physical file name should be called. +what the physical file name should be called. 00:12:08.520 --> 00:12:10.280 - And assuming that that exists-- +And assuming that that exists-- 00:12:15.600 --> 00:12:17.080 - sorry, I've confused myself. +sorry, I've confused myself. 00:12:17.080 --> 00:12:23.000 - So this is the caching or the optimization +So this is the caching or the optimization 00:12:23.000 --> 00:12:25.640 - that I mentioned, sending the existing file. +that I mentioned, sending the existing file. 00:12:25.640 --> 00:12:31.360 - This file exists is where the optimization is +This file exists is where the optimization is 00:12:31.360 --> 00:12:38.680 - that regenerates the file if the source +that regenerates the file if the source 00:12:38.680 --> 00:12:41.840 - or document for the HTML generator has changed. +or document for the HTML generator has changed. 00:12:45.080 --> 00:12:46.760 - Again, this is a short talk, so I'm not +Again, this is a short talk, so I'm not 00:12:46.760 --> 00:12:49.320 - going to go into all the nuances of this JavaScript code. +going to go into all the nuances of this JavaScript code. 00:12:49.320 --> 00:12:52.800 - It's pretty far from an Emacs-related thing. +It's pretty far from an Emacs-related thing. 00:12:52.800 --> 00:12:56.040 - So with that said, then, the rest of this program +So with that said, then, the rest of this program 00:12:56.040 --> 00:12:59.360 - is really mostly just handling the different error. +is really mostly just handling the different errors: 00:12:59.360 --> 00:13:01.000 - I didn't understand that type. +"I didn't understand that type." 00:13:01.000 --> 00:13:02.080 - I don't know the document. +"I don't know the document." 00:13:02.080 --> 00:13:03.040 - I failed. +"I failed." 00:13:03.040 --> 00:13:06.480 - Otherwise, there's the caching. +Otherwise, there's the caching. + +NOTE Generating Elisp 00:13:06.480 --> 00:13:14.520 - And here's really where things get interesting, +And here's really where things get interesting, 00:13:14.520 --> 00:13:19.200 - where we've generated some ELISP, +where we've generated some Elisp, 00:13:19.200 --> 00:13:22.280 - and then we're calling Emacs with that ELISP. +and then we're calling Emacs with that Elisp. 00:13:22.280 --> 00:13:24.760 - If everything works, we'll send the file. +If everything works, we'll send the file. 00:13:24.760 --> 00:13:27.800 - If it doesn't, we'll send the 500. +If it doesn't, we'll send the 500. 00:13:27.800 --> 00:13:30.920 - And we've already seen the 500, so we know that works. +And we've already seen the 500, so we know that works. 00:13:30.920 --> 00:13:33.760 - All right, let's get to the interesting part. +All right, let's get to the interesting part. 00:13:33.760 --> 00:13:37.320 - Sorry, one more footnote. +Sorry, one more footnote. + +NOTE Org blocks 00:13:37.320 --> 00:13:39.320 - There is a capability built in that will +There is a capability built in that will 00:13:39.320 --> 00:13:41.040 - allow us to execute an org block. +allow us to execute an Org block. 00:13:41.040 --> 00:13:42.840 - Let's see if that's working in our local. - -00:13:44.800 --> 00:13:44.800 - +Let's see if that's working in our local. 00:13:44.800 --> 00:13:47.200 - I'll remind myself how to do it. +I'll remind myself how to do it. 00:13:47.200 --> 00:13:49.560 - It's run. +It's run. 00:13:49.560 --> 00:13:53.320 - I think it's called test. +I think it's called test. 00:13:53.320 --> 00:13:56.360 - And that's returning a 500. +And that's returning a 500. 00:13:56.360 --> 00:13:58.400 - I'm suspecting that's running because I'm running +I'm suspecting that's running because I'm running 00:13:58.400 --> 00:13:59.760 - in command instead of bash. +in command instead of bash. 00:13:59.760 --> 00:14:06.040 - Oh, yeah, so the failure is happening +Oh, yeah, so the failure is happening 00:14:06.040 --> 00:14:07.720 - after I generate the ELISP. +after I generate the Elisp. 00:14:07.720 --> 00:14:10.280 - I'm pretty confident that is what the actual problem is. +I'm pretty confident that is what the actual problem is. 00:14:10.280 --> 00:14:12.760 - If we have time, I'll jump back over there +If we have time, I'll jump back over there 00:14:12.760 --> 00:14:19.280 - and relaunch it in mingity-bash. +and relaunch it in mingw bash. 00:14:19.280 --> 00:14:21.440 - And we can see it actually work. +And we can see it actually work. 00:14:21.440 --> 00:14:24.200 - But this works pretty well for me on my work laptop. +But this works pretty well for me on my work laptop. 00:14:24.200 --> 00:14:25.860 - I didn't have to make any changes to it. +I didn't have to make any changes to it. 00:14:25.860 --> 00:14:28.120 - So I have a fairly high amount of confidence, +So I have a fairly high amount of confidence, 00:14:28.120 --> 00:14:32.400 - at least in trivial cases, this works pretty well. +at least in trivial cases, this works pretty well. + +NOTE Building some Lisp 00:14:32.400 --> 00:14:37.800 - All right, so what I actually wanted to talk about today-- +All right, so what I actually wanted to talk about today-- -00:14:37.800 --> 00:14:42.400 - and I'm going to be kind of hand-waving around this ES5 +00:14:37.800 --> 00:14:41.730 +and I'm going to be kind of hand-waving around -00:14:42.400 --> 00:14:46.480 - class that I've got and kind of the way that works. +00:14:41.731 --> 00:14:46.480 +this ES5 class that I've got and kind of the way that works. 00:14:46.480 --> 00:14:49.840 - Hopefully, this will be pretty familiar to you +Hopefully, this will be pretty familiar to you 00:14:49.840 --> 00:14:53.440 - if you are a JavaScript programmer. +if you are a JavaScript programmer. 00:14:53.440 --> 00:14:58.660 - The interesting stuff comes when we want to build some LISP - -00:14:58.660 --> 00:14:59.000 -. +The interesting stuff comes when we want to build some Lisp. -00:15:01.960 --> 00:15:09.410 - Here, you can see that I really don't have a whole lot of +00:15:01.960 --> 00:15:01.961 +Here, you can see that I really don't have -00:15:09.410 --> 00:15:09.720 - code - -00:15:09.720 --> 00:15:11.280 - around formatting LISP. +00:15:01.962 --> 00:15:11.280 +a whole lot of code around formatting LISP. 00:15:11.280 --> 00:15:14.360 - You can see that I've special-cased +You can see that I've special-cased 00:15:14.360 --> 00:15:19.840 - whether the arguments that were passed +whether the arguments that were passed 00:15:19.840 --> 00:15:20.880 - happen to be a function. +happen to be a function. 00:15:20.880 --> 00:15:25.480 - If they are, I'm going to call that function. +If they are, I'm going to call that function. 00:15:25.480 --> 00:15:31.720 - And then the result will be formatted as LISP. +And then the result will be formatted as Lisp. 00:15:31.720 --> 00:15:35.040 - So this would be a recursive call here. +So this would be a recursive call here. 00:15:35.040 --> 00:15:40.960 - Otherwise, I'm just going to return the arguments. +Otherwise, I'm just going to return the arguments. 00:15:40.960 --> 00:15:48.440 - Sorry, otherwise, I will slap a pair of parentheses +Sorry, otherwise, I will slap a pair of parentheses -00:15:48.440 --> 00:15:53.440 - around the result of walking that list +00:15:48.440 --> 00:15:57.878 +around the result of walking that list if I get... -00:15:53.440 --> 00:15:57.880 - if I get formatting each element of the list of arguments +00:15:57.879 --> 00:15:57.880 +formatting each element of the list of arguments 00:15:57.880 --> 00:16:02.600 - that this format LISP process calls +that this `formatLisp` process calls 00:16:02.600 --> 00:16:04.920 - and separating them with spaces. +and separating them with spaces. 00:16:04.920 --> 00:16:10.880 - So in short form, this program walks through a list. +So in short form, this program walks through a list. 00:16:10.880 --> 00:16:14.000 - If the list it receives is a function, +If the list it receives is a function, 00:16:14.000 --> 00:16:16.080 - it calls that function. +it calls that function. 00:16:16.080 --> 00:16:19.320 - Once that's handled or otherwise, +Once that's handled or otherwise, 00:16:19.320 --> 00:16:22.720 - we simply walk the list, taking the arguments, +we simply walk the list, taking the arguments, 00:16:22.720 --> 00:16:26.000 - concatenating them on strings, and finally, +concatenating them on strings, and finally, 00:16:26.000 --> 00:16:28.560 - wrap the results in parentheses. +wrap the results in parentheses. 00:16:28.560 --> 00:16:31.760 - So what I didn't mention there but might be obvious +So what I didn't mention there but might be obvious 00:16:31.760 --> 00:16:36.120 - is if I have a nested list, the inner list +is if I have a nested list, the inner list 00:16:36.120 --> 00:16:38.600 - will be subjected to the same treatment. +will be subjected to the same treatment. 00:16:38.600 --> 00:16:43.000 - So this is a recursive sort of algorithm. +So this is a recursive sort of algorithm. + +NOTE How Elisp gets encoded 00:16:43.000 --> 00:16:51.520 - All right, so now when I go to export, +All right, so now when I go to export, 00:16:51.520 --> 00:16:53.520 - actually, in the interest of time, +actually, in the interest of time, 00:16:53.520 --> 00:16:55.800 - I'm going to avoid walking through that piece of code +I'm going to avoid walking through that piece of code 00:16:55.800 --> 00:16:58.840 - and let's focus instead on the more interesting part +and let's focus instead on the more interesting part 00:16:58.840 --> 00:17:02.360 - of how that LISP gets encoded. +of how that Lisp gets encoded. 00:17:02.360 --> 00:17:07.520 - So coming back to the PDF is a good example here +So coming back to the PDF is a good example here, 00:17:07.520 --> 00:17:10.320 - because it's got a special case. +because it's got a special case. -00:17:10.320 --> 00:17:14.280 - You can see I've specified this export fun or export +00:17:10.320 --> 00:17:10.336 +You can see I've specified this `exportFun` -00:17:14.280 --> 00:17:15.320 - function. +00:17:10.337 --> 00:17:15.320 +or export function. 00:17:15.320 --> 00:17:19.560 - That's a property none of these other types have. +That's a property none of these other types have. 00:17:22.400 --> 00:17:27.280 - And you can see it contains a meat LISP telling us +And you can see it contains some Elisp telling us 00:17:27.280 --> 00:17:29.760 - how to call the export for it. +how to call the export for it. 00:17:29.760 --> 00:17:32.680 - Let's go see how that's used. +Let's go see how that's used. 00:17:32.680 --> 00:17:35.720 - At the very end of what I just skipped over, +At the very end of what I just skipped over, 00:17:35.720 --> 00:17:40.600 - the detailed how the org export process works, +the detailed "how the Org export process works," 00:17:40.600 --> 00:17:45.040 - you'll see that I am ending with a step +you'll see that I am ending with a step 00:17:45.040 --> 00:17:48.000 - to call the export function. +to call the export function. -00:17:48.000 --> 00:17:54.520 - Here, I look to see whether I have an export function +00:17:48.000 --> 00:17:48.003 +Here, I look to see whether I have -00:17:54.520 --> 00:17:55.400 - property. +00:17:48.004 --> 00:17:55.400 +an export function property. 00:17:55.400 --> 00:18:00.920 - If I do, I call that function. +If I do, I call that function. -00:18:00.920 --> 00:18:06.760 - And if I don't, I build this list with the default org +00:18:00.920 --> 00:18:00.920 +And if I don't, I build this list with the default -00:18:06.760 --> 00:18:14.320 - export to file function using the file name and an output +00:18:00.921 --> 00:18:07.071 +`org-export-to-file` function -00:18:14.320 --> 00:18:15.640 - file name. +00:18:07.072 --> 00:18:15.640 +using the filename and an output filename. 00:18:15.640 --> 00:18:18.480 - So this, hopefully, is pretty familiar to anybody +So this, hopefully, is pretty familiar to anybody -00:18:18.480 --> 00:18:22.950 - that's manually messed around with calling org export to +00:18:18.480 --> 00:18:18.503 +that's manually messed around -00:18:22.950 --> 00:18:23.560 - file. +00:18:18.504 --> 00:18:23.560 +with calling `org-export-to-file`. 00:18:23.560 --> 00:18:25.800 - If it isn't, you can pretty well trust me for it. +If it isn't, you can pretty well trust me for it. 00:18:25.800 --> 00:18:28.280 - There's nothing very special going on. +There's nothing very special going on. 00:18:28.280 --> 00:18:30.760 - This looks rather like-- +This looks rather like... 00:18:30.760 --> 00:18:37.240 - poor example there. +Poor example there. 00:18:37.240 --> 00:18:38.960 - Let's go back to our markdown. - -00:18:38.960 --> 00:18:46.320 - [AUDIO OUT] +Let's go back to our markdown. 00:18:46.320 --> 00:18:47.720 - And there, we can see-- +And there, we can see-- 00:18:47.720 --> 00:18:49.840 - - I'm going to make a quick announcement. +[Leo]: I'm going to make a quick announcement. 00:18:49.840 --> 00:18:50.760 - Can you hear me? +Can you hear me? 00:18:50.760 --> 00:18:52.480 - - Yes, go for it. +[Corwin]: Yes, go for it. 00:18:52.480 --> 00:18:54.280 - - OK, let me just show my face. +[Leo]: OK, let me just show my face. 00:18:54.280 --> 00:18:55.400 - Oh, I'm not showing my face. +Oh, I'm not showing my face. 00:18:55.400 --> 00:18:55.640 - Damn it. +Damn it. 00:18:55.640 --> 00:18:57.000 - OK, I'll make the announcement. +OK, I'll make the announcement. 00:18:57.000 --> 00:18:58.600 - You won't see my face quite yet. +You won't see my face quite yet. 00:18:58.600 --> 00:19:00.360 - We are about to get started. +We are about to get started. 00:19:00.360 --> 00:19:02.440 - Well, we actually just got started on dev +Well, we actually just got started on dev 00:19:02.440 --> 00:19:06.040 - with the talk by RMS. +with the talk by RMS. 00:19:06.040 --> 00:19:08.920 - So if you want to hop over to watch the talk by RMS, +So if you want to hop over to watch the talk by RMS, 00:19:08.920 --> 00:19:09.760 - feel free to do so. +feel free to do so. 00:19:09.760 --> 00:19:12.240 - Otherwise, we will be continuing on Gen with Corwin +Otherwise, we will be continuing on Gen with Corwin -00:19:12.240 --> 00:19:14.520 - to finish his talk and have a Q&A. Corwin, +00:19:12.240 --> 00:19:12.253 +to finish his talk and have a Q&A. -00:19:14.520 --> 00:19:16.080 - you can feel free to go now. +00:19:12.254 --> 00:19:16.080 +Corwin, you can feel free to go now. 00:19:16.080 --> 00:19:18.560 - - OK, bye, everybody. +[Corwin]: Okay, bye, everybody. + +00:19:18.560 --> 00:19:22.795 +And for those sticking around, -00:19:18.560 --> 00:19:22.800 - And for those sticking around, I'm +00:19:22.796 --> 00:19:25.040 +I'm just going to keep pressing on with this. -00:19:22.800 --> 00:19:25.040 - just going to keep pressing on with this. +NOTE How the export works 00:19:25.040 --> 00:19:30.240 - In fact, I'm going to dive back into the part +In fact, I'm going to dive back into the part 00:19:30.240 --> 00:19:35.400 - that I skipped here, which is the rest of how +that I skipped here, which is the rest of how 00:19:35.400 --> 00:19:37.400 - this export functionality works. +this export functionality works. 00:19:37.400 --> 00:19:41.400 - So just to make sure the dot is tied together, +So just to make sure the dot is tied together, 00:19:41.400 --> 00:19:44.440 - the core of how this program works +the core of how this program works 00:19:44.440 --> 00:19:49.320 - is generating some ELISP and then passing it +is generating some Elisp and then passing it 00:19:49.320 --> 00:19:51.680 - to Emacs in batch mode. +to Emacs in batch mode. 00:19:51.680 --> 00:19:53.280 - So if that wasn't perfectly clear, +So if that wasn't perfectly clear, 00:19:53.280 --> 00:19:57.240 - that's really what's going on with this program. +that's really what's going on with this program. 00:19:57.240 --> 00:19:59.240 - The rest of the implementation is just +The rest of the implementation is just 00:19:59.240 --> 00:20:01.840 - a way to do that or certain features that +a way to do that or certain features that 00:20:01.840 --> 00:20:08.440 - are supported in that generated ELISP, if you will. +are supported in that generated Elisp, if you will. 00:20:08.440 --> 00:20:11.720 - So this is, you could say, the minimum implementation - -00:20:11.720 --> 00:20:16.220 - I could come up with to create a web server for my local +So this is, you could say, the minimum implementation -00:20:16.220 --> 00:20:16.560 - org +00:20:11.720 --> 00:20:11.753 +I could come up with to create a web server -00:20:16.560 --> 00:20:17.320 - documents. +00:20:11.754 --> 00:20:17.320 +for my local Org documents. 00:20:17.320 --> 00:20:24.440 - And I will also interrupt myself to just pull up +And I will also interrupt myself to just pull up 00:20:24.440 --> 00:20:28.040 - the etherpad real quick. +the Etherpad real quick. 00:20:28.040 --> 00:20:29.600 - Actually, if somebody is listening +Actually, if somebody is listening 00:20:29.600 --> 00:20:34.720 - and can share a link to that, I closed my browser window +and can share a link to that, I closed my browser window 00:20:34.720 --> 00:20:36.400 - with my links in it. +with my links in it. 00:20:36.400 --> 00:20:44.520 - But sure, I'm happy to take questions at any point, Leo, +But sure, I'm happy to take questions at any point, Leo, 00:20:44.520 --> 00:20:48.480 - if there are any questions for me. +if there are any questions for me. 00:20:48.480 --> 00:20:49.720 - Are you hanging out with me? +Are you hanging out with me, 00:20:49.720 --> 00:20:53.360 - Instead of watching RMS, you can go. +instead of watching RMS? You can go. 00:20:53.360 --> 00:20:54.600 - I'm teasing. +I'm teasing. 00:20:54.600 --> 00:20:58.840 - No, I mean, we know that some people can +[Leo]: No, I mean, we know that some people can 00:20:58.840 --> 00:21:00.000 - have both streams open. +have both streams open. 00:21:00.000 --> 00:21:01.560 - It's fine. +It's fine. 00:21:01.560 --> 00:21:03.320 - And right now, it's not the Q&A with RMS. +And right now, it's not the Q&A with RMS. 00:21:03.320 --> 00:21:04.640 - It's just the presentation. +It's just the presentation. 00:21:04.640 --> 00:21:07.040 - So feel free to hang out a little longer +So feel free to hang out a little longer 00:21:07.040 --> 00:21:09.080 - if you just want the live stuff. +if you just want the live stuff. 00:21:09.080 --> 00:21:09.960 - Don't worry about it. +Don't worry about it. 00:21:09.960 --> 00:21:10.760 - You're fine. +You're fine. 00:21:10.760 --> 00:21:13.720 - Yeah, and forgive me, everybody. +[Corwin]: Yeah, and forgive me, everybody, 00:21:13.720 --> 00:21:16.280 - If you were hoping for a quick, succinct talk, +if you were hoping for a quick, succinct talk. 00:21:16.280 --> 00:21:18.960 - I happen to know I was going to be opposite RMS. +I happen to know I was going to be opposite RMS, 00:21:18.960 --> 00:21:23.240 - So I awarded myself the liberty of rambling. +so I awarded myself the liberty of rambling. 00:21:23.240 --> 00:21:26.840 - So if you do have a question, something that I alluded to +So if you do have a question, something that I alluded to 00:21:26.840 --> 00:21:29.800 - and haven't come back to yet, you should, by all means, +and haven't come back to yet, you should, by all means, 00:21:29.800 --> 00:21:30.320 - prompt me. +prompt me. 00:21:30.320 --> 00:21:33.800 - A comment I might do-- +[Leo]: Corwin, I might do-- 00:21:33.800 --> 00:21:35.400 - I'm just giving you a little heads up. +I'm just giving you a little heads up. 00:21:35.400 --> 00:21:38.640 - I might need to go help at some point of a dev. +I might need to go help at some point of dev. 00:21:38.640 --> 00:21:43.120 - So if I need to do so, I will let you know right now +So if I need to do so, I will let you know right now 00:21:43.120 --> 00:21:44.280 - inside the BBB room. +inside the BBB room, 00:21:44.280 --> 00:21:46.160 - And you'll be on your own to manage the chat. +and you'll be on your own to manage the chat. 00:21:46.160 --> 00:21:47.960 - And you can just talk backstage to us +And you can just talk backstage to us 00:21:47.960 --> 00:21:50.240 - to manage what we do with the stream, OK? +to manage what we do with the stream, OK? 00:21:50.240 --> 00:21:52.160 - Yep, that should be no problem at all. +[Corwin]: Yep, that should be no problem at all. 00:21:52.160 --> 00:21:53.760 - I've got my pad up now. +I've got my pad up now. 00:21:53.760 --> 00:21:55.160 - Thank you, Chancellor. +Thank you, ??. 00:21:55.160 --> 00:21:58.040 - And I'm sorry about butchering your name there. +And I'm sorry about butchering your name there. 00:21:58.040 --> 00:22:03.360 - And yep, I've got my chat open. +And yep, I've got my chat open. 00:22:03.360 --> 00:22:06.400 - And I think I'm pretty well set to self-manage. +And I think I'm pretty well set to self-manage. 00:22:06.400 --> 00:22:07.640 - Oh, I don't have a camera on. +Oh, I don't have a camera on. 00:22:07.640 --> 00:22:09.360 - So you can't see me giving you the thumbs up. +So you can't see me giving you the thumbs up. 00:22:09.360 --> 00:22:09.860 - OK, good. +[Leo]: Okay, good. + +NOTE Walking through the code 00:22:09.860 --> 00:22:16.000 - All right, so let's just walk through, +All right, so let's just walk through, 00:22:16.000 --> 00:22:18.400 - because it's sort of an interesting code. +because it's sort of an interesting code. 00:22:18.400 --> 00:22:20.560 - Let's just take a look real quick +Let's just take a look real quick 00:22:20.560 --> 00:22:24.720 - at how we generated our e-list here, +at how we generated our Elisp here, 00:22:24.720 --> 00:22:26.520 - because it is-- +because it is-- 00:22:26.520 --> 00:22:27.640 - there we go. +there we go. 00:22:27.640 --> 00:22:29.240 - It is a little bit interesting. +It is a little bit interesting. 00:22:29.240 --> 00:22:32.040 - So here is the method. +So here is the method. 00:22:32.040 --> 00:22:34.080 - So I didn't get into detail on this. +So I didn't get into detail on this. -00:22:34.080 --> 00:22:37.680 - But there's an ES5 class that represents an org mode +00:22:34.080 --> 00:22:34.086 +But there's an ES5 class that represents -00:22:37.680 --> 00:22:38.920 - document. +00:22:34.087 --> 00:22:38.920 +an Org mode document. -00:22:38.920 --> 00:22:42.260 - It has the static debug property that, as you might imagine +00:22:38.920 --> 00:22:38.920 +It has the static debug property that, -00:22:42.260 --> 00:22:42.400 -, +00:22:38.921 --> 00:22:42.400 +as you might imagine, 00:22:42.400 --> 00:22:45.480 - can be overridden by that debug setting +can be overridden by that debug setting 00:22:45.480 --> 00:22:48.440 - we looked at in the defaults. +we looked at in the defaults. 00:22:48.440 --> 00:22:51.440 - We also have a static variable that-- +We also have a static variable that-- 00:22:51.440 --> 00:22:57.440 - a static property that does nothing more than getting +a static property that does nothing more than getting 00:22:57.440 --> 00:23:00.360 - the path to emacs out of those defaults. +the path to Emacs out of those defaults. 00:23:00.360 --> 00:23:02.120 - Similarly, we have a class method +Similarly, we have a class method 00:23:02.120 --> 00:23:09.520 - to spawn out an emacs, as I mentioned, in batch mode, +to spawn out an Emacs, as I mentioned, in batch mode, 00:23:09.520 --> 00:23:12.720 - eval-ing some arbitrary list that's passed in. +eval-ing some arbitrary Lisp that's passed in. 00:23:12.720 --> 00:23:20.480 - All right, so the type-- +All right, so the type-- 00:23:20.480 --> 00:23:23.080 - this is where things start to get interesting. +this is where things start to get interesting. 00:23:23.080 --> 00:23:26.480 - So this is an implementation detail, +So this is an implementation detail, 00:23:26.480 --> 00:23:30.040 - but-- that it's written as a static method. +but-- that it's written as a static method. 00:23:30.040 --> 00:23:32.160 - But essentially, what's going on here +But essentially, what's going on here 00:23:32.160 --> 00:23:34.840 - is looking up from that type list +is looking up from that type list 00:23:34.840 --> 00:23:37.480 - to try to find a type that's passed in, +to try to find a type that's passed in, 00:23:37.480 --> 00:23:41.240 - and that's returning one of these blocks. +and that's returning one of these blocks. 00:23:41.240 --> 00:23:44.800 - Let's say I requested HTML, which would be the default. +Let's say I requested HTML, which would be the default. 00:23:44.800 --> 00:23:48.760 - Then I'm going to get this set of properties back. - -00:23:50.760 --> 00:23:50.760 - +Then I'm going to get this set of properties back. 00:23:50.760 --> 00:23:51.260 - All right. +All right. 00:23:51.260 --> 00:24:04.200 - Essentially, this program generates a program +Essentially, this program generates a program 00:24:04.200 --> 00:24:10.840 - or a little block of executable elisp. +or a little block of executable elisp. 00:24:10.840 --> 00:24:15.920 - However, in some cases, where if the load path has +However, in some cases, where if the `load-path` has 00:24:15.920 --> 00:24:20.920 - been customized in that type block, +been customized in that type block, 00:24:20.920 --> 00:24:25.000 - or I think that's the only case I supported. +or I think that's the only case I supported. 00:24:25.000 --> 00:24:28.960 - There was another complexity I removed. +There was another complexity I removed. 00:24:28.960 --> 00:24:32.000 - So in that case, then I can simply +So in that case, then I can simply 00:24:32.000 --> 00:24:33.560 - replace that program with a let. +replace that program with a let. 00:24:33.560 --> 00:24:41.680 - Either way, I'm going to have everything I generate +Either way, I'm going to have everything I generate 00:24:41.680 --> 00:24:45.840 - be encapsulated in a single block. +be encapsulated in a single block. 00:24:45.840 --> 00:24:49.240 - The-- then I'm calling that format list process +The-- then I'm calling that formatLisp process 00:24:49.240 --> 00:24:52.760 - that we talked about, appending to that-- +that we talked about, appending to that-- 00:24:52.760 --> 00:25:01.680 - or inserting into, you could say, the outer scope. +or inserting into, you could say, the outer scope. 00:25:01.680 --> 00:25:05.000 - And we start by finding the file. +And we start by finding the file. 00:25:05.000 --> 00:25:11.400 - We then load any libraries that might be needed. +We then load any libraries that might be needed. 00:25:11.400 --> 00:25:13.520 - In some cases, the type might not +In some cases, the type might not 00:25:13.520 --> 00:25:15.160 - have any external libraries. +have any external libraries. 00:25:15.160 --> 00:25:18.440 - So we just-- so that's a no op. +So we just-- so that's a no-op. 00:25:18.440 --> 00:25:24.120 - And then finally, we're going to execute +And then finally, we're going to execute 00:25:24.120 --> 00:25:27.160 - that logic I mentioned before about selecting +that logic I mentioned before about selecting 00:25:27.160 --> 00:25:30.160 - either the default or export to file, +either the default org-export-to-file, 00:25:30.160 --> 00:25:36.200 - or else whatever elisp we've staged for exporting +or else whatever Elisp we've staged for exporting 00:25:36.200 --> 00:25:38.160 - that particular file type. +that particular file type. -00:25:38.160 --> 00:25:41.480 - And again, in the case of PDF, there's +00:25:38.160 --> 00:25:43.112 +And again, in the case of PDF, there's a special function -00:25:41.480 --> 00:25:46.240 - a special function that's used to trigger that export. +00:25:43.113 --> 00:25:46.240 +that's used to trigger that export. 00:25:46.240 --> 00:25:49.160 - Or you may be aware that that's a little more complicated. +Or you may be aware that that's a little more complicated. 00:25:49.160 --> 00:25:50.840 - There's intermediate forms there. +There's intermediate forms there. 00:25:50.840 --> 00:25:56.760 - All right. +All right. 00:25:56.760 --> 00:26:01.320 - So just reminding myself if there's anything else +So just reminding myself if there's anything else 00:26:01.320 --> 00:26:03.760 - I have to cover on background. +I have to cover on background. 00:26:03.760 --> 00:26:07.440 - And I think that pretty well covers the basics. +And I think that pretty well covers the basics. + +NOTE Executing the source block 00:26:07.440 --> 00:26:09.880 - All right, let's look at that source block execute. +All right, let's look at that source block execute. 00:26:09.880 --> 00:26:14.600 - This is the other use of the format list function. +This is the other use of the format list function. 00:26:14.600 --> 00:26:16.800 - So here, rather than looking at the type +So here, rather than looking at the type 00:26:16.800 --> 00:26:24.720 - and passing that through our org export method, +and passing that through our Org export method, 00:26:24.720 --> 00:26:29.080 - and then that type is used to get the list +and then that type is used to get the list 00:26:29.080 --> 00:26:30.840 - that we want to create. +that we want to create. 00:26:30.840 --> 00:26:37.600 - In the case of source block execute, +In the case of source block execute, 00:26:37.600 --> 00:26:40.520 - we're kind of rolling it a lot more by hand. +we're kind of rolling it a lot more by hand. 00:26:40.520 --> 00:26:43.920 - So this gives us a good chance to sort of unwind +So this gives us a good chance to sort of unwind 00:26:43.920 --> 00:26:49.600 - how that list looks when it's staged as JavaScript data. +how that list looks when it's staged as JavaScript data. 00:26:49.600 --> 00:26:52.760 - So here again, I wrap everything in a progon. +So here again, I wrap everything in a `progn`. 00:26:52.760 --> 00:26:58.480 - I start by preventing an interactive prompt +I start by preventing an interactive prompt 00:26:58.480 --> 00:27:01.240 - for the Babel execution. +for the Babel execution. 00:27:01.240 --> 00:27:04.960 - And then we load languages. +And then we load languages. 00:27:04.960 --> 00:27:12.240 - This relates to another piece of our configuration +This relates to another piece of our configuration 00:27:12.240 --> 00:27:17.600 - where we've specified a set of languages +where we've specified a set of languages 00:27:17.600 --> 00:27:19.920 - that it's OK to execute. +that it's OK to execute. 00:27:19.920 --> 00:27:24.120 - So if that type isn't in this list, +So if that type isn't in this list, 00:27:24.120 --> 00:27:28.800 - then we won't be able to execute it in line +then we won't be able to execute it in line 00:27:28.800 --> 00:27:32.720 - through our trivial little web server. +through our trivial little web server. 00:27:32.720 --> 00:27:33.640 - All right. +All right. 00:27:33.640 --> 00:27:40.600 - With that done, then, loading the selected language, +With that done, then, loading the selected language, 00:27:40.600 --> 00:27:43.960 - we then once again open the file. +we then once again open the file. 00:27:43.960 --> 00:27:46.360 - And we're-- whoops. +And we're-- whoops. 00:27:46.360 --> 00:27:51.800 - Let bind a return value, which is +Let-bind a return value, which is -00:27:51.800 --> 00:27:55.840 - calculated by using org source block execute on the name +00:27:51.800 --> 00:27:55.166 +calculated by using Org source block execute [`org-sbe`] -00:27:55.840 --> 00:27:58.040 - of the block that's given. +00:27:55.167 --> 00:27:58.040 +on the name of the block that's given. 00:27:58.040 --> 00:28:05.160 - And then we use a temp buffer to write that out +And then we use a temp buffer to write that out 00:28:05.160 --> 00:28:06.640 - to a temporary file. +to a temporary file. 00:28:06.640 --> 00:28:08.440 - This is actually a little clumsy, +This is actually a little clumsy, 00:28:08.440 --> 00:28:12.720 - but I haven't put the effort in to have this written out +but I haven't put the effort in to have this written out 00:28:12.720 --> 00:28:17.480 - to the standard output cleanly instead of using a temp file - -00:28:17.480 --> 00:28:17.840 -. +to the standard output cleanly instead of using a temp file. 00:28:17.840 --> 00:28:20.480 - So under-- this is another example of where it may not +So under-- this is another example of where it may not 00:28:20.480 --> 00:28:22.520 - be production-- well, it definitely +be production-- well, it definitely 00:28:22.520 --> 00:28:27.680 - is not production-worthy code in that under heavy load, +is not production-worthy code in that under heavy load, -00:28:27.680 --> 00:28:30.860 - this would certainly break with collisions on the Babel +00:28:27.680 --> 00:28:30.166 +this would certainly break with collisions -00:28:30.860 --> 00:28:32.040 - file, +00:28:30.167 --> 00:28:32.040 +on the Babel file, 00:28:32.040 --> 00:28:34.120 - the name of the Babel file. +the name of the Babel file. 00:28:34.120 --> 00:28:37.480 - In any case, once we've staged up our ELISP, which is-- +In any case, once we've staged up our Elisp, which is-- 00:28:37.480 --> 00:28:42.560 - this is basically variable interpolation, +this is basically variable interpolation, 00:28:42.560 --> 00:28:47.680 - then we just call emacs on that. +then we just call Emacs on that. 00:28:47.680 --> 00:28:49.720 - And if we look down to where that's called, +And if we look down to where that's called, 00:28:49.720 --> 00:28:54.640 - you can see that the org Babel file name calculated here. - -00:28:54.640 --> 00:28:58.040 - [AUDIO OUT] +you can see that the Org Babel filename calculated here. -00:28:58.040 --> 00:29:15.000 - Is there a problem? +00:29:12.795 --> 00:29:15.000 +[Leo]: Is there a problem? 00:29:15.000 --> 00:29:15.760 - No, I'm fine. +[Corwin]: No, I'm fine. 00:29:15.760 --> 00:29:18.000 - I'm just lost in my code. +I'm just lost in my code. 00:29:18.000 --> 00:29:19.040 - OK, cool. +[Leo]: OK, cool. 00:29:19.040 --> 00:29:21.160 - Oh, means, oh, I need to intervene. +Uh-oh means, oh, I need to intervene. 00:29:21.160 --> 00:29:22.240 - What is going on? +What is going on? 00:29:22.240 --> 00:29:23.200 - Carry on, please. +Carry on, please. 00:29:23.200 --> 00:29:24.120 - No, I'm fine, Leo. +[Corwin]: No, I'm fine, Leo. 00:29:24.120 --> 00:29:25.480 - Thank you. +Thank you. 00:29:25.480 --> 00:29:27.280 - All right, so then-- +All right, so then-- 00:29:27.280 --> 00:29:28.680 - so you can see we get-- +so you can see we get-- -00:29:28.680 --> 00:29:36.720 - we send the Babel file here, which +00:29:28.680 --> 00:29:35.537 +we send the Babel file here, -00:29:36.720 --> 00:29:41.640 - is calculated manually. +00:29:35.538 --> 00:29:41.640 +which is calculated manually. 00:29:41.640 --> 00:29:45.440 - A bit sloppy there, since I have essentially the same-- +A bit sloppy there, since I have essentially the same-- 00:29:45.440 --> 00:29:47.000 - I have two different places where +I have two different places where 00:29:47.000 --> 00:29:52.480 - I'm calculating the org doc file in two different ways. +I'm calculating the Org doc file in two different ways. 00:29:52.480 --> 00:29:54.720 - Have I encouraged you to write your own yet? +Have I encouraged you to write your own yet? 00:29:54.720 --> 00:29:56.440 - Or send patches. +Or send patches. 00:29:56.440 --> 00:30:01.240 - All right, so that's pretty much the nuts and bolts +All right, so that's pretty much the nuts and bolts 00:30:01.240 --> 00:30:02.400 - of this program. +of this program. 00:30:02.400 --> 00:30:06.720 - Let's go back to just seeing if we can't make it run. +Let's go back to just seeing if we can't make it run. 00:30:22.120 --> 00:30:22.620 - All right. +All right. 00:30:22.620 --> 00:30:45.880 - All right, well, I apologize for not +All right, well, I apologize for not 00:30:45.880 --> 00:30:49.560 - having taken the time to stage my demo this morning. +having taken the time to stage my demo this morning. 00:30:49.560 --> 00:30:52.680 - I'm going to try to make it better for you. +I'm going to try to make it better for you. 00:30:52.680 --> 00:30:59.920 - But apparently, it's going to be non-trivial +But apparently, it's going to be non-trivial 00:30:59.920 --> 00:31:04.520 - to make the program work. +to make the program work. 00:31:04.520 --> 00:31:07.160 - Let's just-- before I completely give up, +Let's just-- before I completely give up, 00:31:07.160 --> 00:31:13.320 - let's go ahead and try our Babel execute. +let's go ahead and try our Babel execute. 00:31:13.320 --> 00:31:14.800 - And that, too, is failing. +And that, too, is failing. 00:31:14.800 --> 00:31:18.040 - So there's something unhappy in my local world. +So there's something unhappy in my local world. 00:31:18.040 --> 00:31:19.040 - There it goes. +There it goes. 00:31:19.040 --> 00:31:26.600 - But in any case, let's go ahead and just take a look at +But in any case, let's go ahead and just take a look at 00:31:26.600 --> 00:31:28.000 - that. +that. 00:31:28.000 --> 00:31:30.640 - Let's see. +Let's see. 00:31:30.640 --> 00:31:31.600 - Control Enter. +Control Enter. -00:31:31.600 --> 00:31:40.200 - Let's take a look at that generated ELS +00:31:36.628 --> 00:31:40.200 +Let's take a look at that generated .el 00:31:40.200 --> 00:31:42.840 - and compare it to-- whoa-- +and compare it to-- whoa-- 00:31:42.840 --> 00:31:44.000 - and compare it to-- +and compare it to-- 00:31:44.000 --> 00:31:52.400 - I'm just going to format this manually, +I'm just going to format this manually, 00:31:52.400 --> 00:31:56.000 - because I've forgotten my key bindings to auto-format it. +because I've forgotten my key bindings to auto-format it. 00:31:56.000 --> 00:32:02.240 - There we go. +There we go. 00:32:02.240 --> 00:32:07.960 - All right. +All right. 00:32:07.960 --> 00:32:13.120 - So now we can see, as promised, there's really +So now we can see, as promised, there's really 00:32:13.120 --> 00:32:16.200 - nothing going on here other than the interpolation +nothing going on here other than the interpolation 00:32:16.200 --> 00:32:18.640 - of the variables in. +of the variables in. 00:32:18.640 --> 00:32:24.360 - We're inserting-- we're using an insert and write file +We're inserting-- we're using an insert and write file 00:32:24.360 --> 00:32:27.800 - method, which is, again, rather sloppy, +method, which is, again, rather sloppy, 00:32:27.800 --> 00:32:32.040 - to generate the text file. +to generate the text file. 00:32:32.040 --> 00:32:32.880 - All right. +All right. 00:32:32.880 --> 00:32:34.760 - Let's come back to our documentation +Let's come back to our documentation 00:32:34.760 --> 00:32:39.760 - and see if we can put a bow on the project. +and see if we can put a bow on the project. + +NOTE Conclusion 00:32:39.760 --> 00:32:43.760 - So I hope I've convinced you that this was actually +So I hope I've convinced you that this was actually 00:32:43.760 --> 00:32:45.480 - rather easy to do. +rather easy to do. 00:32:45.480 --> 00:32:52.440 - The entirety of my index.js file is 262 lines, +The entirety of my index.js file is 262 lines, 00:32:52.440 --> 00:32:59.810 - and that includes a good 40 of whitespace and configuration - -00:32:59.810 --> 00:33:00.280 -. +and that includes a good 40 of whitespace and configuration. -00:33:03.760 --> 00:33:06.840 - It has only one dependency, the Express, which +00:33:03.760 --> 00:33:06.505 +It has only one dependency, the Express, -00:33:06.840 --> 00:33:08.240 - really builds the web server. +00:33:06.506 --> 00:33:08.240 +which really builds the web server. 00:33:08.240 --> 00:33:11.520 - Any language you'd rather implement this in +Any language you'd rather implement this in 00:33:11.520 --> 00:33:14.120 - will have a similar capability for building +will have a similar capability for building 00:33:14.120 --> 00:33:16.280 - some type of trivial web server. +some type of trivial web server. 00:33:16.280 --> 00:33:18.400 - And I think you may find-- +And I think you may find-- 00:33:18.400 --> 00:33:22.640 - I certainly found that a large portion of the code base +I certainly found that a large portion of the code base 00:33:22.640 --> 00:33:28.080 - is really making the errors meaningful, +is really making the errors meaningful, 00:33:28.080 --> 00:33:32.420 - in that, in some cases, sending an appropriate HTTP status +in that, in some cases, sending an appropriate HTTP status 00:33:32.420 --> 00:33:34.360 - based on what happened. - -00:33:34.360 --> 00:33:41.160 - In other cases-- let's see if I've got an explicit throw +based on what happened. -00:33:41.160 --> 00:33:41.520 - left +00:33:34.360 --> 00:33:38.002 +In other cases-- let's see if -00:33:41.520 --> 00:33:42.640 - in here-- +00:33:38.003 --> 00:33:42.640 +I've got an explicit `throw` left in here-- 00:33:42.640 --> 00:33:45.840 - in other cases, just trapping different types +in other cases, just trapping different types 00:33:45.840 --> 00:33:47.440 - of failure conditions. +of failure conditions. 00:33:47.440 --> 00:33:54.000 - I'm going to look at my pad, and I do see a question here. +I'm going to look at my pad, and I do see a question here. 00:33:54.000 --> 00:33:55.120 - So let me jump in here. +So let me jump in here. -00:33:55.120 --> 00:33:58.880 - [VIDEO PLAYBACK] +NOTE Questions and answers 00:33:58.880 --> 00:34:00.640 - - Cohen, just to make sure, are you switching to Q&A? +[Leo]: Corwin, just to make sure, are you switching to Q&A? 00:34:00.640 --> 00:34:02.380 - Are you finished with your presentation? +Are you finished with your presentation? 00:34:02.380 --> 00:34:05.260 - - Well, as I said, I'm happy to take Q&A throughout. +[Corwin]: Well, as I said, I'm happy to take Q&A throughout. 00:34:05.260 --> 00:34:08.420 - But yes, let's say yes to that. +But yes, let's say yes to that. 00:34:08.420 --> 00:34:10.900 - - OK, so Cohen, what I'm going to need to do now-- +[Leo]: Okay, so Corwin, what I'm going to need to do now-- 00:34:10.900 --> 00:34:12.140 - you are in charge of the room. +you are in charge of the room. 00:34:12.140 --> 00:34:14.060 - We are going to open up the room so +We are going to open up the room so 00:34:14.060 --> 00:34:17.220 - that if people have questions watching right now on Gen, +that if people have questions watching right now on Gen, 00:34:17.220 --> 00:34:18.700 - feel free to come in. +feel free to come in. 00:34:18.700 --> 00:34:22.780 - And there was something else I needed to say. +And there was something else I needed to say. 00:34:22.780 --> 00:34:24.620 - Yes, Cohen, if there's any problem, +Yes, Corwin, if there's any problem, 00:34:24.620 --> 00:34:25.700 - whisper to us on Mumble. +whisper to us on Mumble. 00:34:25.700 --> 00:34:27.500 - So you might want to unmute Mumble +So you might want to unmute Mumble 00:34:27.500 --> 00:34:29.620 - and be able to listen to us over there. +and be able to listen to us over there. 00:34:29.620 --> 00:34:32.480 - - I can't do that, Leo. +[Corwin]: I can't do that, Leo. 00:34:32.480 --> 00:34:36.440 - If I unmute, Mumble is going to bleed through. +If I unmute, Mumble is going to bleed through. 00:34:36.440 --> 00:34:36.960 - - OK, sure. +[Leo]: Okay, sure. -00:34:36.960 --> 00:34:41.160 - Well, if you have any problem, type in emacsconf-org.ch +00:34:36.960 --> 00:34:39.416 +Well, if you have any problem, -00:34:41.160 --> 00:34:41.160 -annel, +00:34:39.417 --> 00:34:41.160 +type in #emacsconf-org channel, 00:34:41.160 --> 00:34:42.520 - and we'll be with you, OK? +and we'll be with you, OK? 00:34:42.520 --> 00:34:43.520 - - Or I'll PM somebody. +[Corwin]: Or I'll PM somebody. 00:34:43.520 --> 00:34:45.760 - But I don't anticipate having any problems. +But I don't anticipate having any problems. 00:34:45.760 --> 00:34:49.040 - I'll put something in org when I run out of steam here. +I'll put something in -org when I run out of steam here. 00:34:49.040 --> 00:34:50.400 - How's that? +How's that? 00:34:50.400 --> 00:34:51.160 - - Amazing, cool. +[Leo]: Amazing, cool. 00:34:51.160 --> 00:34:53.320 - So I will have to leave the room, though. +So I will have to leave the room, though. 00:34:53.320 --> 00:34:56.800 - I'm leaving the recording going so that we have your Q&A. +I'm leaving the recording going so that we have your Q&A. 00:34:56.800 --> 00:34:58.080 - And whenever you're available-- +And whenever you're available-- 00:34:58.080 --> 00:35:02.180 - - I'll shut off the recording when I close the room. +[Corwin]: I'll shut off the recording when I close the room. 00:35:02.180 --> 00:35:02.980 - - OK, great. +[Leo]: Okay, great. 00:35:02.980 --> 00:35:04.460 - Good luck, Cohen. +Good luck, Corwin. 00:35:04.460 --> 00:35:06.500 - - Thank you. +[Corwin]: Thank you. 00:35:06.500 --> 00:35:09.780 - All right, and if you're still with me, well, thanks. +All right, and if you're still with me, well, thanks. 00:35:09.780 --> 00:35:13.620 - I appreciate that. +I appreciate that. 00:35:13.620 --> 00:35:16.740 - I did offer to be opposite RMS. +I did offer to be opposite RMS. 00:35:16.740 --> 00:35:20.060 - And I'm in no way offended if people do want to jump over, +And I'm in no way offended if people do want to jump over, 00:35:20.060 --> 00:35:23.540 - especially as that starts to shift over to Q&A. +especially as that starts to shift over to Q&A. 00:35:23.540 --> 00:35:26.980 - I'm taking Leo's leaving as a pretty good indication +I'm taking Leo's leaving as a pretty good indication 00:35:26.980 --> 00:35:28.780 - that that's happening now-ish. +that that's happening now-ish. -00:35:28.780 --> 00:35:34.750 - So I totally understand if folks are more excited to do +00:35:28.780 --> 00:35:31.385 +So I totally understand -00:35:34.750 --> 00:35:35.020 - that. +00:35:31.386 --> 00:35:35.020 +if folks are more excited to do that. 00:35:35.020 --> 00:35:37.940 - Meanwhile, let me just jump over to the question +Meanwhile, let me just jump over to the question 00:35:37.940 --> 00:35:38.660 - that I received. +that I received. 00:35:38.660 --> 00:35:46.460 - I'll show the pad here so that I save myself +I'll show the pad here so that I save myself 00:35:46.460 --> 00:35:47.860 - reading the question out. +reading the question out. 00:35:47.860 --> 00:35:48.940 - But I'll paraphrase it. +But I'll paraphrase it. + +NOTE Why am I not running the web server in Emacs? 00:35:48.940 --> 00:35:52.660 - Why am I not running the web server in emacs? +Why am I not running the web server in Emacs? 00:35:52.660 --> 00:35:54.380 - That would be a great way to do it. +That would be a great way to do it. + +00:35:54.380 --> 00:35:56.340 +I chose to build it in Node.js -00:35:54.380 --> 00:35:57.100 - I chose to build it in Node.js because that +00:35:56.341 --> 00:35:58.460 +because that was trivially easy for me. -00:35:57.100 --> 00:35:58.460 - was trivially easy for me. +NOTE Is this using org-info-js? 00:36:22.140 --> 00:36:24.780 - And then finally, am I using org info.js? +And then finally, am I using org-info-js? 00:36:24.780 --> 00:36:27.540 - No, I learned about this essentially at this conference. +No, I learned about this essentially at this conference. 00:36:27.540 --> 00:36:30.660 - So that's something I'll be learning more about. +So that's something I'll be learning more about. 00:36:30.660 --> 00:36:32.460 - And it could well influence this project. - -00:36:32.460 --> 00:36:34.900 - [TYPING] +And it could well influence this project. 00:36:34.900 --> 00:36:56.180 - All right, and thanks for the questions. +All right, and thanks for the questions. 00:36:59.020 --> 00:37:02.820 - All right, I'm going to slow my roll just a little bit here +All right, I'm going to slow my roll just a little bit here 00:37:02.820 --> 00:37:06.980 - because I think I kind of have all the time in the world. +because I think I kind of have all the time in the world. 00:37:06.980 --> 00:37:11.540 - I will be wrapping up within about 15 or 20 minutes +I will be wrapping up within about 15 or 20 minutes 00:37:11.540 --> 00:37:15.620 - at the latest just to avoid stressing out +at the latest just to avoid stressing out -00:37:15.620 --> 00:37:19.100 - my fellow organizers, especially Leo and Sasha that +00:37:15.620 --> 00:37:18.827 +my fellow organizers, especially Leo and Sacha -00:37:19.100 --> 00:37:22.260 - have the bulk of the heavy lifting this year. +00:37:18.828 --> 00:37:22.260 +that have the bulk of the heavy lifting this year, 00:37:22.260 --> 00:37:26.820 - And amen, and really, thanks all to everybody. +and Amin, and really, thanks all to everybody. 00:37:26.820 --> 00:37:29.540 - God, the nicest part of doing my own talk +God, the nicest part of doing my own talk 00:37:29.540 --> 00:37:31.980 - is that I get to say that. +is that I get to say that. 00:37:31.980 --> 00:37:35.460 - It's just so much fun to contribute to emacsConf. +It's just so much fun to contribute to EmacsConf. + +NOTE EmacsConf 00:37:35.460 --> 00:37:38.740 - And if you're at all interested, there's +And if you're at all interested, there's 00:37:38.740 --> 00:37:43.100 - plenty of completely backstage, behind the curtain role. +plenty of completely backstage, behind the curtain role. 00:37:43.100 --> 00:37:45.340 - Behind the curtain roles doesn't mean +Behind the curtain roles doesn't mean -00:37:45.340 --> 00:37:49.020 - you have to be somebody that likes talking or being +00:37:45.340 --> 00:37:47.865 +you have to be somebody that likes -00:37:49.020 --> 00:37:50.060 - on webcam. +00:37:47.866 --> 00:37:50.060 +talking or being on webcam. 00:37:50.060 --> 00:37:52.300 - Sorry that my camera isn't working this year. +Sorry that my camera isn't working this year. 00:37:52.300 --> 00:37:53.980 - I spent quite a while fussing with that +I spent quite a while fussing with that 00:37:53.980 --> 00:37:56.740 - and lost all my time to get my prereq working. +and lost all my time to get my prerec working. 00:37:56.740 --> 00:38:10.140 - All right, so trying to think where I can take us +All right, so trying to think where I can take us 00:38:10.140 --> 00:38:11.540 - without my demo working. +without my demo working. 00:38:11.540 --> 00:38:14.540 - I was really hoping to show the org Babel piece. +I was really hoping to show the Org Babel piece. 00:38:14.540 --> 00:38:15.580 - That's really fun. +That's really fun. + +NOTE How I'm using this at work 00:38:15.580 --> 00:38:20.420 - So let me just mention briefly how I'm using this at work. +So let me just mention briefly how I'm using this at work. 00:38:20.420 --> 00:38:25.980 - So at work, I'll have some type of org document. +So at work, I'll have some type of Org document. 00:38:25.980 --> 00:38:27.700 - And usually, it's a project. +And usually, it's a project. 00:38:27.700 --> 00:38:32.900 - So the title of the document is My Project. +So the title of the document is My Project. 00:38:32.900 --> 00:38:37.820 - And then I'll have a requirements section. +And then I'll have a requirements section. 00:38:37.820 --> 00:38:43.540 - And I'll have a meeting notes section. +And I'll have a meeting notes section. 00:38:43.540 --> 00:38:44.980 - That's probably the key thing. +That's probably the key thing. 00:38:44.980 --> 00:38:49.540 - And then as the project goes on, I'll start having-- +And then as the project goes on, I'll start having-- 00:38:49.540 --> 00:38:50.740 - I'm a solutions architect. +I'm a solutions architect. 00:38:50.740 --> 00:38:55.420 - So my job is formalizing design in large part. +So my job is formalizing design in large part. 00:38:55.420 --> 00:39:01.740 - So then I'll have a design documents section. +So then I'll have a design documents section. 00:39:01.740 --> 00:39:05.020 - And this is where I'll be doing a lot of my work. +And this is where I'll be doing a lot of my work. 00:39:05.020 --> 00:39:07.220 - So I'll start out saying-- - -00:39:07.220 --> 00:39:26.620 - [AUDIO OUT] +So I'll start out saying-- 00:39:26.620 --> 00:39:29.340 - And maybe Bob is a subject matter expert +And maybe Bob is a subject matter expert 00:39:29.340 --> 00:39:32.460 - whose buy-in I need to have on how we're going +whose buy-in I need to have on how we're going 00:39:32.460 --> 00:39:34.820 - to do the high-level design. - -00:39:34.820 --> 00:39:38.470 - Maybe a lead engineer or a dev manager or something like +to do the high-level design. -00:39:38.470 --> 00:39:39.460 - that. +00:39:34.820 --> 00:39:37.296 +Maybe a lead engineer or a dev manager -00:39:39.460 --> 00:39:43.580 - All right, as my work goes on, then this +00:39:37.297 --> 00:39:39.460 +or something like that. -00:39:43.580 --> 00:39:47.620 - will start getting into more detail. +00:39:39.460 --> 00:39:42.653 +All right, as my work goes on, -00:39:47.620 --> 00:40:16.620 - [AUDIO OUT] +00:39:42.654 --> 00:39:47.620 +then this will start getting into more detail. 00:40:16.620 --> 00:40:18.660 - And things of this nature. +And things of this nature. 00:40:18.660 --> 00:40:20.180 - As things get further and further, +As things get further and further, 00:40:20.180 --> 00:40:21.740 - I'll actually have documentation +I'll actually have documentation 00:40:21.740 --> 00:40:22.820 - that I'm adding in here. +that I'm adding in here. 00:40:22.820 --> 00:40:28.900 - Oh, I see. +Oh, I see. 00:40:28.900 --> 00:40:29.740 - It's a big mess. +It's a big mess. 00:40:29.740 --> 00:40:32.140 - All right, well, we'll just reuse this. +All right, well, we'll just reuse this. 00:40:32.140 --> 00:40:40.380 - So I can insert those all in line. +So I can insert those all in line. -00:40:40.380 --> 00:40:44.140 - And now for the fun part, let's see if the most trivial +00:40:40.380 --> 00:40:42.157 +And now for the fun part, -00:40:44.140 --> 00:40:44.460 - case +00:40:42.158 --> 00:40:44.460 +let's see if the most trivial case 00:40:44.460 --> 00:40:45.460 - is working here. - -00:40:47.460 --> 00:40:47.460 - - -00:40:47.460 --> 00:40:49.940 - [CLICK] +is working here. 00:40:49.940 --> 00:40:51.180 - No. +No. 00:40:51.180 --> 00:40:52.900 - All right, completely broken. +All right, completely broken. 00:40:52.900 --> 00:40:57.260 - Let me drag. +Let me drag. 00:40:57.260 --> 00:41:05.180 - All right, well, apologies again for the poor quality +All right, well, apologies again for the poor quality 00:41:05.180 --> 00:41:06.260 - of my demo today. +of my demo today. 00:41:06.260 --> 00:41:13.900 - And let me just look real quick at my Etherpad once more. +And let me just look real quick at my Etherpad once more. 00:41:13.900 --> 00:41:16.820 - And I'll glance at BBB to see if there's anybody +And I'll glance at BBB to see if there's anybody 00:41:16.820 --> 00:41:18.140 - jumping in with questions. +jumping in with questions. 00:41:18.140 --> 00:41:23.740 - And then I'll go back to IRC and look for questions there. +And then I'll go back to IRC and look for questions there. 00:41:23.740 --> 00:41:33.180 - OK, and I don't see any additional questions on the pad. +OK, and I don't see any additional questions on the pad. 00:41:33.180 --> 00:41:35.780 - I'm just going to scan IRC real quick. +I'm just going to scan IRC real quick. 00:41:35.780 --> 00:41:42.460 - I suspect that the TreeSitter comment isn't for me. - -00:41:42.460 --> 00:41:44.900 - [CHUCKLES] +I suspect that the TreeSitter comment isn't for me. 00:41:44.900 --> 00:41:56.620 - All right, and I'm not seeing a lot of questions there. +All right, and I'm not seeing a lot of questions there. 00:41:56.620 --> 00:42:04.340 - So I'm just going to vamp for just a minute or two. +So I'm just going to vamp for just a minute or two. + +NOTE Volunteering for EmacsConf 00:42:04.340 --> 00:42:07.980 - As I mentioned, I'm a conference volunteer. +As I mentioned, I'm a conference volunteer. 00:42:07.980 --> 00:42:09.700 - This is my third year volunteering +This is my third year volunteering 00:42:09.700 --> 00:42:11.940 - with the conference. +with the conference. 00:42:11.940 --> 00:42:15.140 - And probably if you take one thing away from my talk, +And probably if you take one thing away from my talk, 00:42:15.140 --> 00:42:17.740 - it should be I really like volunteering +it should be I really like volunteering 00:42:17.740 --> 00:42:18.500 - for the conference. +for the conference. 00:42:18.500 --> 00:42:19.900 - It's fun. +It's fun. 00:42:19.900 --> 00:42:23.500 - It makes me feel sort of close to the pulse. +It makes me feel sort of close to the pulse. -00:42:23.500 --> 00:42:26.660 - And it gives me a chance to just interact +00:42:23.500 --> 00:42:27.296 +And it gives me a chance to just interact with people -00:42:26.660 --> 00:42:29.260 - with people that have very different perspectives +00:42:27.297 --> 00:42:30.106 +that have very different perspectives on Emacs, -00:42:29.260 --> 00:42:32.740 - on Emacs, which is something that I really value a lot. +00:42:30.107 --> 00:42:32.740 +which is something that I really value a lot. 00:42:32.740 --> 00:42:40.220 - Emacs, like anything else sort of in the internet world, +Emacs, like anything else sort of in the internet world, 00:42:40.220 --> 00:42:42.940 - has a real echo chamber factor. +has a real echo chamber factor. -00:42:42.940 --> 00:42:47.660 - If you do or don't use Package, you probably +00:42:42.940 --> 00:42:46.504 +If you do or don't like use-package, -00:42:47.660 --> 00:42:49.380 - interact with a lot of people that +00:42:46.505 --> 00:42:49.135 +you probably interact with a lot of people -00:42:49.380 --> 00:42:53.500 - feel the same way about that. +00:42:49.136 --> 00:42:53.500 +that feel the same way about that. 00:42:53.500 --> 00:42:57.420 - And so I really recommend volunteering for EmacsConf +And so I really recommend volunteering for EmacsConf 00:42:57.420 --> 00:43:01.340 - as a way to sort of mix it up and get +as a way to sort of mix it up and get -00:43:01.340 --> 00:43:05.250 - to know people that may not use Emacs the same way that you +00:43:01.340 --> 00:43:03.858 +to know people that may not use Emacs -00:43:05.250 --> 00:43:05.540 - do. +00:43:03.859 --> 00:43:05.540 +the same way that you do. + +NOTE It's easy to build a program that uses Emacs in the pipeline 00:43:08.380 --> 00:43:10.420 - Or perhaps more on topic, though, +Or perhaps more on topic, though, 00:43:10.420 --> 00:43:14.300 - the log line for this talk is it's really quite easy +the log line for this talk is it's really quite easy 00:43:14.300 --> 00:43:20.760 - to build a program that uses Emacs in a pipeline capability - -00:43:20.760 --> 00:43:20.980 -. +to build a program that uses Emacs in a pipeline capability. 00:43:20.980 --> 00:43:23.780 - I think there's a ton of opportunity in this space. +I think there's a ton of opportunity in this space. 00:43:23.780 --> 00:43:27.700 - This particular example is just a trivial web server +This particular example is just a trivial web server -00:43:27.700 --> 00:43:29.540 - written +00:43:27.700 --> 00:43:30.780 +written using Node.js. -00:43:29.540 --> 00:43:30.780 - using Node.js. +00:43:30.780 --> 00:43:31.545 +But as was pointed out, we could have used elnode -00:43:30.780 --> 00:43:39.660 - But as was pointed out, we could have used LNode as a web - -00:43:39.660 --> 00:43:40.060 - server +00:43:31.546 --> 00:43:40.060 +as a web server 00:43:40.060 --> 00:43:44.060 - and done the entire thing within Emacs Lisp. +and done the entire thing within Emacs Lisp. -00:43:44.060 --> 00:43:49.980 - Or really, almost any technology would get us this +00:43:44.060 --> 00:43:48.765 +Or really, almost any technology -00:43:49.980 --> 00:43:52.900 - capability. +00:43:48.766 --> 00:43:52.900 +would get us this capability. 00:43:52.900 --> 00:43:54.660 - From an implementation standpoint, +From an implementation standpoint, -00:43:54.660 --> 00:43:59.270 - I had a lot of fun building this trivial little e-lisp pars +00:43:54.660 --> 00:43:56.847 +I had a lot of fun building -00:43:59.270 --> 00:43:59.580 -er. +00:43:56.848 --> 00:43:59.580 +this trivial little Elisp parser, 00:43:59.580 --> 00:44:03.220 - And I'm rather pleased with the fact +and I'm rather pleased with the fact 00:44:03.220 --> 00:44:07.340 - that the entirety of that-- +that the entirety of that-- 00:44:07.340 --> 00:44:14.180 - the entire algorithm for turning JavaScript or JSON data, +the entire algorithm for turning JavaScript or JSON data, 00:44:14.180 --> 00:44:20.420 - we could say, into e-lisp is really a one-liner. +we could say, into Elisp is really a one-liner, 00:44:20.420 --> 00:44:25.820 - Albeit a nasty one-liner, that was pretty cool +albeit a nasty one-liner. That was pretty cool 00:44:25.820 --> 00:44:28.180 - to discover how simple that was. +to discover how simple that was. 00:44:28.180 --> 00:44:31.220 - So in my mind, that opens up a lot of possibility. +So in my mind, that opens up a lot of possibility. -00:44:31.220 --> 00:44:32.940 - If it's this easy in JavaScript, I +00:44:31.220 --> 00:44:32.889 +If it's this easy in JavaScript, -00:44:32.940 --> 00:44:35.700 - wouldn't expect it to be hard, any more difficult +00:44:32.890 --> 00:44:34.708 +I wouldn't expect it to be hard, -00:44:35.700 --> 00:44:36.860 - in your favorite language. +00:44:34.709 --> 00:44:36.860 +any more difficult in your favorite language. 00:44:36.860 --> 00:44:41.140 - Glance one more time to see if there +Glance one more time to see if there 00:44:41.140 --> 00:44:42.940 - happen to be any other questions. +happen to be any other questions. 00:44:42.940 --> 00:44:47.300 - And not seeing any, I'm going to go ahead and start +And not seeing any, I'm going to go ahead and start 00:44:47.300 --> 00:44:49.500 - wrapping up my chat now. +wrapping up my chat now. 00:44:49.500 --> 00:44:51.620 - It will take me a couple of minutes to do that. +It will take me a couple of minutes to do that. 00:44:51.620 --> 00:44:54.580 - So if you do have any other questions that you +So if you do have any other questions that you 00:44:54.580 --> 00:44:56.460 - want to drop into the pad or any comments, +want to drop into the pad or any comments, 00:44:56.460 --> 00:44:59.740 - you're more than welcome to hit me with those +you're more than welcome to hit me with those 00:44:59.740 --> 00:45:03.820 - as I coordinate closing this chat, this talk, +as I coordinate closing this chat, this talk, 00:45:03.820 --> 00:45:06.100 - with the organizer team. - -00:45:06.100 --> 00:45:09.580 - [AUDIO OUT] - -00:45:09.580 --> 00:45:12.580 - [AUDIO OUT] - -00:45:14.580 --> 00:45:14.580 - - -00:45:14.580 --> 00:45:17.580 - [AUDIO OUT] - -00:45:17.580 --> 00:45:20.580 - [AUDIO OUT] - -00:45:22.580 --> 00:45:22.580 - - -00:45:22.580 --> 00:45:25.580 - [AUDIO OUT] - -00:45:25.580 --> 00:45:33.580 - [AUDIO OUT] - -00:45:33.580 --> 00:45:44.580 - [AUDIO OUT] - -00:45:44.580 --> 00:45:47.620 - [AUDIO OUT] - -00:45:47.620 --> 00:45:50.620 - [AUDIO OUT] - -00:45:50.620 --> 00:45:53.620 - [AUDIO OUT] - -00:45:53.620 --> 00:45:56.620 - [AUDIO OUT] - -00:45:56.620 --> 00:45:59.620 - [AUDIO OUT] - -00:46:01.620 --> 00:46:01.620 - - -00:46:01.620 --> 00:46:04.620 - [AUDIO OUT] - +with the organizer team. diff --git a/2022/info/orgvm-after.md b/2022/info/orgvm-after.md index 7dd0db68..6e56988a 100644 --- a/2022/info/orgvm-after.md +++ b/2022/info/orgvm-after.md @@ -1,6 +1,745 @@ + +# Transcript + +[[!template new="1" text="""And so this little application--""" start="00:00:36.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""well, I'll skip that and just kind of""" start="00:00:42.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""jump right into my thesis for those of you""" start="00:00:42.504" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that might be planning to duck out for the RMS talk,""" start="00:00:49.143" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""starting in a little bit.""" start="00:00:53.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So essentially, my thesis here is really that""" start="00:00:55.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the Emacs toolchain can easily be combined""" start="00:00:55.546" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with other skills and used in kind of""" start="00:00:59.379" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""a Unix paradigm of having sort of different tools""" start="00:01:08.794" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to do different steps.""" start="00:01:13.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We might actually use the same tool""" start="00:01:14.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to implement a couple of steps.""" start="00:01:17.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But with that paradigm, each step""" start="00:01:19.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is an individual item that can be sort of""" start="00:01:22.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""dropped in and replaced.""" start="00:01:22.087" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So over the course of the talk,""" start="00:01:26.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""hopefully I'll come back to that thesis.""" start="00:01:26.421" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""But I'll now jump back and start walking through""" start="00:01:31.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""what is orgvm?""" start="00:01:31.087" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this is a very simple proof of concept program.""" start="00:01:37.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We'll just jump over to perhaps""" start="00:01:39.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""a prettier view of the source code for it.""" start="00:01:39.587" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is implemented-- oops.""" start="00:01:45.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There's some cruft, I think, in my local.""" start="00:01:49.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, so this config block at the top...""" start="00:01:53.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we'll be jumping back and forth""" start="00:01:56.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""between the code and the documentation.""" start="00:01:58.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""So the first thing I want to point out""" start="00:02:01.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is that this is written in Node.js,""" start="00:02:04.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but I think you'll find it'd be pretty trivial to implement""" start="00:02:05.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""in any language.""" start="00:02:08.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Certainly, you're more than welcome to use this.""" start="00:02:10.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'd be happy to accept your patches or feature requests""" start="00:02:13.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and things like that.""" start="00:02:17.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Of course, bug reports.""" start="00:02:20.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But I'd also encourage others to roll their own.""" start="00:02:21.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You might well come up with a different version of this""" start="00:02:25.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that's even cooler.""" start="00:02:28.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we can learn from each other.""" start="00:02:29.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If you heard one of my talks before,""" start="00:02:32.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you probably recognize a common theme.""" start="00:02:34.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm a big fan of head-first development""" start="00:02:36.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""as a way to get invested in both""" start="00:02:40.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the tool chain and a culture.""" start="00:02:40.337" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, so let's come back to orgvm.""" start="00:02:44.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""First of all, we'll start with""" start="00:02:49.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the itch I was trying to scratch.""" start="00:02:49.587" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I wanted to be able to quickly use a web browser""" start="00:02:52.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to browse my Org documents.""" start="00:02:58.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's particularly handy when the documents""" start="00:03:00.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""are full of cross links to each other.""" start="00:03:01.421" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That meant I wanted to automatically export,""" start="00:03:05.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""particularly to HTML.""" start="00:03:10.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But it made sense for me to include Markdown, PDF,""" start="00:03:12.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or whatever format I want.""" start="00:03:17.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Because many times, I'm going to look at that file""" start="00:03:18.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and then pop it into an email or upload it somewhere.""" start="00:03:22.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then finally, it should be, therefore,""" start="00:03:29.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""pretty easy to download the document""" start="00:03:33.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""rather than view it, once I'm done.""" start="00:03:33.754" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""So let's just run a quick demo.""" start="00:03:38.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You'll see I'm still a Windows user.""" start="00:03:42.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Yeah, I'm working on it.""" start="00:03:44.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So all right, first thing that we're going to do""" start="00:03:45.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is fire up the program.""" start="00:03:52.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Actually, for simplicity, let's just""" start="00:03:53.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""admit we live in a DOS world.""" start="00:04:00.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And as you can see, there's not much to it""" start="00:04:01.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to get the application running.""" start="00:04:19.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So with that done, then, I can run out to my localhost.""" start="00:04:22.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we'll just start by plugging in the name of an Org file.""" start="00:04:25.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I've got a little Org file that I prepared""" start="00:04:37.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that just kind of provides a proof of concept to this.""" start="00:04:37.587" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And you can see, as imagined, we're automatically""" start="00:04:49.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""turning that Org file...""" start="00:04:53.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's just take a quick look at it.""" start="00:04:54.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And here's that file now.""" start="00:04:56.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You can see, nothing up my sleeve.""" start="00:05:10.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is a very basic Org file""" start="00:05:11.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that I use for testing this program.""" start="00:05:11.962" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Images work.""" start="00:05:16.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We've got some nicely syntax-highlighted code blocks""" start="00:05:17.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""in a couple different languages,""" start="00:05:21.837" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and not really that much going on there.""" start="00:05:25.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""All right, let's come back to the documentation.""" start="00:05:29.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I pretty well covered this, I think.""" start="00:05:33.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But you'll need a relatively recent version of Emacs.""" start="00:05:36.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I haven't taken any pains to make this backward compatible.""" start="00:05:39.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""To be fair, I haven't tested it extensively.""" start="00:05:43.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It may well work on Emacs 26 or older versions.""" start="00:05:46.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm personally running 27.1 and 28,""" start="00:05:50.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""as well as recent builds of 29.""" start="00:05:55.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There's some quick start instructions here,""" start="00:05:57.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which I'm going to take as read.""" start="00:06:02.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You probably saw the key element of this,""" start="00:06:03.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which involves starting the program.""" start="00:06:08.601" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You do-- I will call out Yale.""" start="00:06:11.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If you're trying to play with this yourself,""" start="00:06:13.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""don't forget to run the npm install command.""" start="00:06:15.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That'll bring in express.js,""" start="00:06:20.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which the JavaScript we're about to look at is built on.""" start="00:06:20.087" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""So let's just take a look at the usage patterns real quick.""" start="00:06:24.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""To use this, we're simply giving the document name""" start="00:06:33.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""without the .org extension in whatever file path--""" start="00:06:35.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or I'm sorry, whatever we've configured the server""" start="00:06:42.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to run on, in this case, port 3000.""" start="00:06:46.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I also want to call attention to the fact""" start="00:06:50.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that nothing in this program protects you""" start="00:06:52.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""from damaging yourself.""" start="00:06:55.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This isn't meant as a production capability.""" start="00:06:57.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is something that's used to publish""" start="00:07:00.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""your own note files""" start="00:07:00.587" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and roll them out to yourself.""" start="00:07:04.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That's something I'll definitely look at adding,""" start="00:07:06.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but I want people to be careful of it""" start="00:07:08.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""while this is in an alpha state.""" start="00:07:12.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So the default response is HTML, and we saw that here.""" start="00:07:14.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But we also can modify the response format.""" start="00:07:22.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We're currently supporting HTML, Markdown, and PDF.""" start="00:07:26.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And that's really enough to select a different format.""" start="00:07:29.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That's really nothing more than adding type. Okay.""" start="00:07:34.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Not sure what's going on there.""" start="00:07:48.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Okay, well, there goes my demo.""" start="00:07:50.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Shows me for doing my talk live.""" start="00:07:57.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But this, fortunately, this error message""" start="00:08:03.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is a nice segue to the part of the talk""" start="00:08:06.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that I'd really like to focus on,""" start="00:08:08.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""hopefully bringing me back to that thesis.""" start="00:08:10.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""So as we start to look at code, what we're looking for""" start="00:08:13.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is really this Emacs Lisp that's getting generated here.""" start="00:08:17.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And you'll notice that's the stuff""" start="00:08:21.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I thought was important to produce as diagnostics""" start="00:08:24.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""for the programs running as well.""" start="00:08:27.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So, spoiler, this Elisp is dynamically""" start="00:08:29.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""generated by the program.""" start="00:08:34.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And that's really the core of the way""" start="00:08:35.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""orgvm or my orgvm works.""" start="00:08:38.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this should look pretty similar to the view of the code""" start="00:08:42.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we had a moment ago.""" start="00:08:47.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You can see I've got some bases.""" start="00:08:48.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is all hard-coded into the program,""" start="00:08:51.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""nothing fancy going on here.""" start="00:08:53.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The debug is simply controlling that diagnostic output""" start="00:08:56.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that we looked at.""" start="00:09:00.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There's some other, hopefully fairly self-explanatory""" start="00:09:01.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""programs or properties, where to find Emacs and so forth.""" start="00:09:04.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""And then finally, we come in to the meat of it,""" start="00:09:09.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the variables that are used to control what Elisp""" start="00:09:16.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we can generate dynamically.""" start="00:09:16.337" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So here, we're controlling the extension""" start="00:09:24.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that it should look for Org files.""" start="00:09:27.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Hopefully not too many people out there""" start="00:09:29.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with a weird extension for the Org files,""" start="00:09:31.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but this should support that.""" start="00:09:34.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm afraid that is something I've been known to do.""" start="00:09:37.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Then we define a list of additional export types.""" start="00:09:40.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Here's one that ought to work.""" start="00:09:49.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's take a look at type=org.""" start="00:09:50.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And, aha, it's giving us the file.""" start="00:09:54.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I'm not going to open that up,""" start="00:09:59.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but now we can see that that's definitely working,""" start="00:10:00.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""for certain versions of working.""" start="00:10:02.421" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this list of type parameters is""" start="00:10:09.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""controlling the supported types.""" start="00:10:14.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Hopefully it should be fairly easy to add in different ones.""" start="00:10:15.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The fancy footwork here is just a list""" start="00:10:18.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""of the types that we're going to be using.""" start="00:10:21.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The fancy footwork here involves, first of all,""" start="00:10:23.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""there's the extension and the MIME type.""" start="00:10:29.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That's, as you might guess, used to control""" start="00:10:32.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the response content type.""" start="00:10:32.254" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""We also have this replace variable.""" start="00:10:38.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This prevents-- there's an optimization""" start="00:10:40.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to send an existing PDF or HTML file""" start="00:10:44.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""if that's already there,""" start="00:10:48.837" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but only if the original source Org file""" start="00:10:50.464" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""hasn't been modified since.""" start="00:10:51.004" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This `replace` effectively can turn that off.""" start="00:10:56.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If I remove the `replace: true` attribute,""" start="00:10:59.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""then I'll be prevented from overwriting that.""" start="00:11:03.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""In other words, I'll always send a cached version.""" start="00:11:07.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That might be helpful if, for example,""" start="00:11:10.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you've got hand-tuned PDFs""" start="00:11:13.879" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and you don't want to accidentally overwrite them.""" start="00:11:15.066" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""All right, let's get into the code a little bit more.""" start="00:11:19.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm going to skip past the really good stuff""" start="00:11:23.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and jump into the boring parts""" start="00:11:28.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""so that we have them as context.""" start="00:11:28.296" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Here's the default path.""" start="00:11:34.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And it is going to send me the readme from the project--""" start="00:11:37.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""from the project repo if I don't specify a path.""" start="00:11:41.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then we have a couple of different endpoints""" start="00:11:47.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that we support.""" start="00:11:51.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We'll come back to this first one.""" start="00:11:52.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""For now, let's start with the more normal one,""" start="00:11:55.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which is just giving us a file name.""" start="00:11:55.587" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So we can see we start by figuring out""" start="00:12:01.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""what the physical file name should be called.""" start="00:12:04.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And assuming that that exists--""" start="00:12:08.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""sorry, I've confused myself.""" start="00:12:15.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this is the caching or the optimization""" start="00:12:17.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that I mentioned, sending the existing file.""" start="00:12:23.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This file exists is where the optimization is""" start="00:12:25.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that regenerates the file if the source""" start="00:12:31.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or document for the HTML generator has changed.""" start="00:12:38.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Again, this is a short talk, so I'm not""" start="00:12:45.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""going to go into all the nuances of this JavaScript code.""" start="00:12:46.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's pretty far from an Emacs-related thing.""" start="00:12:49.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So with that said, then, the rest of this program""" start="00:12:52.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is really mostly just handling the different errors:""" start="00:12:56.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text=""""I didn't understand that type."""" start="00:12:59.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text=""""I don't know the document."""" start="00:13:01.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text=""""I failed."""" start="00:13:02.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Otherwise, there's the caching.""" start="00:13:03.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""And here's really where things get interesting,""" start="00:13:06.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""where we've generated some Elisp,""" start="00:13:14.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and then we're calling Emacs with that Elisp.""" start="00:13:19.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If everything works, we'll send the file.""" start="00:13:22.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If it doesn't, we'll send the 500.""" start="00:13:24.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we've already seen the 500, so we know that works.""" start="00:13:27.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, let's get to the interesting part.""" start="00:13:30.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Sorry, one more footnote.""" start="00:13:33.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""There is a capability built in that will""" start="00:13:37.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""allow us to execute an Org block.""" start="00:13:39.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's see if that's working in our local.""" start="00:13:41.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'll remind myself how to do it.""" start="00:13:44.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's run.""" start="00:13:47.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I think it's called test.""" start="00:13:49.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And that's returning a 500.""" start="00:13:53.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm suspecting that's running because I'm running""" start="00:13:56.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""in command instead of bash.""" start="00:13:58.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Oh, yeah, so the failure is happening""" start="00:13:59.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""after I generate the Elisp.""" start="00:14:06.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm pretty confident that is what the actual problem is.""" start="00:14:07.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If we have time, I'll jump back over there""" start="00:14:10.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and relaunch it in mingw bash.""" start="00:14:12.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we can see it actually work.""" start="00:14:19.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But this works pretty well for me on my work laptop.""" start="00:14:21.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I didn't have to make any changes to it.""" start="00:14:24.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I have a fairly high amount of confidence,""" start="00:14:25.860" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""at least in trivial cases, this works pretty well.""" start="00:14:28.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""All right, so what I actually wanted to talk about today--""" start="00:14:32.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and I'm going to be kind of hand-waving around""" start="00:14:37.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""this ES5 class that I've got and kind of the way that works.""" start="00:14:41.731" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Hopefully, this will be pretty familiar to you""" start="00:14:46.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""if you are a JavaScript programmer.""" start="00:14:49.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The interesting stuff comes when we want to build some Lisp.""" start="00:14:53.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Here, you can see that I really don't have""" start="00:15:01.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""a whole lot of code around formatting LISP.""" start="00:15:01.962" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You can see that I've special-cased""" start="00:15:11.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""whether the arguments that were passed""" start="00:15:14.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""happen to be a function.""" start="00:15:19.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If they are, I'm going to call that function.""" start="00:15:20.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then the result will be formatted as Lisp.""" start="00:15:25.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this would be a recursive call here.""" start="00:15:31.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Otherwise, I'm just going to return the arguments.""" start="00:15:35.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Sorry, otherwise, I will slap a pair of parentheses""" start="00:15:40.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""around the result of walking that list if I get...""" start="00:15:48.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""formatting each element of the list of arguments""" start="00:15:57.879" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that this `formatLisp` process calls""" start="00:15:57.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and separating them with spaces.""" start="00:16:02.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So in short form, this program walks through a list.""" start="00:16:04.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If the list it receives is a function,""" start="00:16:10.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""it calls that function.""" start="00:16:14.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Once that's handled or otherwise,""" start="00:16:16.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we simply walk the list, taking the arguments,""" start="00:16:19.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""concatenating them on strings, and finally,""" start="00:16:22.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""wrap the results in parentheses.""" start="00:16:26.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So what I didn't mention there but might be obvious""" start="00:16:28.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is if I have a nested list, the inner list""" start="00:16:31.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""will be subjected to the same treatment.""" start="00:16:36.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this is a recursive sort of algorithm.""" start="00:16:38.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""All right, so now when I go to export,""" start="00:16:43.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""actually, in the interest of time,""" start="00:16:51.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm going to avoid walking through that piece of code""" start="00:16:53.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and let's focus instead on the more interesting part""" start="00:16:55.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""of how that Lisp gets encoded.""" start="00:16:58.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So coming back to the PDF is a good example here,""" start="00:17:02.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""because it's got a special case.""" start="00:17:07.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You can see I've specified this `exportFun`""" start="00:17:10.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or export function.""" start="00:17:10.337" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That's a property none of these other types have.""" start="00:17:15.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And you can see it contains some Elisp telling us""" start="00:17:22.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""how to call the export for it.""" start="00:17:27.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's go see how that's used.""" start="00:17:29.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""At the very end of what I just skipped over,""" start="00:17:32.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the detailed "how the Org export process works,"""" start="00:17:35.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you'll see that I am ending with a step""" start="00:17:40.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to call the export function.""" start="00:17:45.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Here, I look to see whether I have""" start="00:17:48.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""an export function property.""" start="00:17:48.004" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If I do, I call that function.""" start="00:17:55.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And if I don't, I build this list with the default""" start="00:18:00.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""`org-export-to-file` function""" start="00:18:00.921" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""using the filename and an output filename.""" start="00:18:07.072" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this, hopefully, is pretty familiar to anybody""" start="00:18:15.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that's manually messed around""" start="00:18:18.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with calling `org-export-to-file`.""" start="00:18:18.504" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If it isn't, you can pretty well trust me for it.""" start="00:18:23.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There's nothing very special going on.""" start="00:18:25.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This looks rather like...""" start="00:18:28.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Poor example there.""" start="00:18:30.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's go back to our markdown.""" start="00:18:37.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And there, we can see--""" start="00:18:46.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: I'm going to make a quick announcement.""" start="00:18:47.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Can you hear me?""" start="00:18:49.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Yes, go for it.""" start="00:18:50.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: OK, let me just show my face.""" start="00:18:52.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Oh, I'm not showing my face.""" start="00:18:54.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Damn it.""" start="00:18:55.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""OK, I'll make the announcement.""" start="00:18:55.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You won't see my face quite yet.""" start="00:18:57.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We are about to get started.""" start="00:18:58.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Well, we actually just got started on dev""" start="00:19:00.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with the talk by RMS.""" start="00:19:02.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So if you want to hop over to watch the talk by RMS,""" start="00:19:06.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""feel free to do so.""" start="00:19:08.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Otherwise, we will be continuing on Gen with Corwin""" start="00:19:09.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to finish his talk and have a Q&A.""" start="00:19:12.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Corwin, you can feel free to go now.""" start="00:19:12.254" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Okay, bye, everybody.""" start="00:19:16.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And for those sticking around,""" start="00:19:18.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm just going to keep pressing on with this.""" start="00:19:22.796" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""In fact, I'm going to dive back into the part""" start="00:19:25.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that I skipped here, which is the rest of how""" start="00:19:30.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""this export functionality works.""" start="00:19:35.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So just to make sure the dot is tied together,""" start="00:19:37.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the core of how this program works""" start="00:19:41.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is generating some Elisp and then passing it""" start="00:19:44.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to Emacs in batch mode.""" start="00:19:49.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So if that wasn't perfectly clear,""" start="00:19:51.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that's really what's going on with this program.""" start="00:19:53.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The rest of the implementation is just""" start="00:19:57.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""a way to do that or certain features that""" start="00:19:59.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""are supported in that generated Elisp, if you will.""" start="00:20:01.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this is, you could say, the minimum implementation""" start="00:20:08.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I could come up with to create a web server""" start="00:20:11.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""for my local Org documents.""" start="00:20:11.754" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I will also interrupt myself to just pull up""" start="00:20:17.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the Etherpad real quick.""" start="00:20:24.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Actually, if somebody is listening""" start="00:20:28.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and can share a link to that, I closed my browser window""" start="00:20:29.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with my links in it.""" start="00:20:34.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But sure, I'm happy to take questions at any point, Leo,""" start="00:20:36.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""if there are any questions for me.""" start="00:20:44.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Are you hanging out with me,""" start="00:20:48.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""instead of watching RMS? You can go.""" start="00:20:49.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm teasing.""" start="00:20:53.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: No, I mean, we know that some people can""" start="00:20:54.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""have both streams open.""" start="00:20:58.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's fine.""" start="00:21:00.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And right now, it's not the Q&A with RMS.""" start="00:21:01.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's just the presentation.""" start="00:21:03.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So feel free to hang out a little longer""" start="00:21:04.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""if you just want the live stuff.""" start="00:21:07.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Don't worry about it.""" start="00:21:09.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""You're fine.""" start="00:21:09.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Yeah, and forgive me, everybody,""" start="00:21:10.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""if you were hoping for a quick, succinct talk.""" start="00:21:13.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I happen to know I was going to be opposite RMS,""" start="00:21:16.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""so I awarded myself the liberty of rambling.""" start="00:21:18.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So if you do have a question, something that I alluded to""" start="00:21:23.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and haven't come back to yet, you should, by all means,""" start="00:21:26.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""prompt me.""" start="00:21:29.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Corwin, I might do--""" start="00:21:30.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm just giving you a little heads up.""" start="00:21:33.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I might need to go help at some point of dev.""" start="00:21:35.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So if I need to do so, I will let you know right now""" start="00:21:38.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""inside the BBB room,""" start="00:21:43.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and you'll be on your own to manage the chat.""" start="00:21:44.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And you can just talk backstage to us""" start="00:21:46.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to manage what we do with the stream, OK?""" start="00:21:47.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Yep, that should be no problem at all.""" start="00:21:50.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I've got my pad up now.""" start="00:21:52.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Thank you, ??.""" start="00:21:53.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I'm sorry about butchering your name there.""" start="00:21:55.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And yep, I've got my chat open.""" start="00:21:58.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I think I'm pretty well set to self-manage.""" start="00:22:03.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Oh, I don't have a camera on.""" start="00:22:06.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So you can't see me giving you the thumbs up.""" start="00:22:07.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Okay, good.""" start="00:22:09.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""All right, so let's just walk through,""" start="00:22:09.860" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""because it's sort of an interesting code.""" start="00:22:16.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's just take a look real quick""" start="00:22:18.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""at how we generated our Elisp here,""" start="00:22:20.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""because it is--""" start="00:22:24.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""there we go.""" start="00:22:26.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It is a little bit interesting.""" start="00:22:27.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So here is the method.""" start="00:22:29.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I didn't get into detail on this.""" start="00:22:32.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But there's an ES5 class that represents""" start="00:22:34.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""an Org mode document.""" start="00:22:34.087" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It has the static debug property that,""" start="00:22:38.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""as you might imagine,""" start="00:22:38.921" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""can be overridden by that debug setting""" start="00:22:42.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we looked at in the defaults.""" start="00:22:45.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We also have a static variable that--""" start="00:22:48.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""a static property that does nothing more than getting""" start="00:22:51.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the path to Emacs out of those defaults.""" start="00:22:57.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Similarly, we have a class method""" start="00:23:00.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to spawn out an Emacs, as I mentioned, in batch mode,""" start="00:23:02.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""eval-ing some arbitrary Lisp that's passed in.""" start="00:23:09.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, so the type--""" start="00:23:12.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""this is where things start to get interesting.""" start="00:23:20.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this is an implementation detail,""" start="00:23:23.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but-- that it's written as a static method.""" start="00:23:26.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But essentially, what's going on here""" start="00:23:30.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is looking up from that type list""" start="00:23:32.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to try to find a type that's passed in,""" start="00:23:34.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and that's returning one of these blocks.""" start="00:23:37.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's say I requested HTML, which would be the default.""" start="00:23:41.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Then I'm going to get this set of properties back.""" start="00:23:44.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right.""" start="00:23:50.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Essentially, this program generates a program""" start="00:23:51.260" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or a little block of executable elisp.""" start="00:24:04.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""However, in some cases, where if the `load-path` has""" start="00:24:10.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""been customized in that type block,""" start="00:24:15.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or I think that's the only case I supported.""" start="00:24:20.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There was another complexity I removed.""" start="00:24:25.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So in that case, then I can simply""" start="00:24:28.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""replace that program with a let.""" start="00:24:32.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Either way, I'm going to have everything I generate""" start="00:24:33.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""be encapsulated in a single block.""" start="00:24:41.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The-- then I'm calling that formatLisp process""" start="00:24:45.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that we talked about, appending to that--""" start="00:24:49.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or inserting into, you could say, the outer scope.""" start="00:24:52.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we start by finding the file.""" start="00:25:01.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We then load any libraries that might be needed.""" start="00:25:05.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""In some cases, the type might not""" start="00:25:11.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""have any external libraries.""" start="00:25:13.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So we just-- so that's a no-op.""" start="00:25:15.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then finally, we're going to execute""" start="00:25:18.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that logic I mentioned before about selecting""" start="00:25:24.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""either the default org-export-to-file,""" start="00:25:27.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or else whatever Elisp we've staged for exporting""" start="00:25:30.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that particular file type.""" start="00:25:36.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And again, in the case of PDF, there's a special function""" start="00:25:38.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that's used to trigger that export.""" start="00:25:43.113" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Or you may be aware that that's a little more complicated.""" start="00:25:46.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There's intermediate forms there.""" start="00:25:49.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right.""" start="00:25:50.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So just reminding myself if there's anything else""" start="00:25:56.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I have to cover on background.""" start="00:26:01.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I think that pretty well covers the basics.""" start="00:26:03.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""All right, let's look at that source block execute.""" start="00:26:07.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is the other use of the format list function.""" start="00:26:09.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So here, rather than looking at the type""" start="00:26:14.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and passing that through our Org export method,""" start="00:26:16.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and then that type is used to get the list""" start="00:26:24.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that we want to create.""" start="00:26:29.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""In the case of source block execute,""" start="00:26:30.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we're kind of rolling it a lot more by hand.""" start="00:26:37.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So this gives us a good chance to sort of unwind""" start="00:26:40.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""how that list looks when it's staged as JavaScript data.""" start="00:26:43.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So here again, I wrap everything in a `progn`.""" start="00:26:49.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I start by preventing an interactive prompt""" start="00:26:52.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""for the Babel execution.""" start="00:26:58.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then we load languages.""" start="00:27:01.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This relates to another piece of our configuration""" start="00:27:04.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""where we've specified a set of languages""" start="00:27:12.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that it's OK to execute.""" start="00:27:17.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So if that type isn't in this list,""" start="00:27:19.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""then we won't be able to execute it in line""" start="00:27:24.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""through our trivial little web server.""" start="00:27:28.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right.""" start="00:27:32.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""With that done, then, loading the selected language,""" start="00:27:33.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we then once again open the file.""" start="00:27:40.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And we're-- whoops.""" start="00:27:43.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let-bind a return value, which is""" start="00:27:46.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""calculated by using Org source block execute [`org-sbe`]""" start="00:27:51.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""on the name of the block that's given.""" start="00:27:55.167" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then we use a temp buffer to write that out""" start="00:27:58.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to a temporary file.""" start="00:28:05.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is actually a little clumsy,""" start="00:28:06.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""but I haven't put the effort in to have this written out""" start="00:28:08.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to the standard output cleanly instead of using a temp file.""" start="00:28:12.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So under-- this is another example of where it may not""" start="00:28:17.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""be production-- well, it definitely""" start="00:28:20.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is not production-worthy code in that under heavy load,""" start="00:28:22.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""this would certainly break with collisions""" start="00:28:27.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""on the Babel file,""" start="00:28:30.167" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the name of the Babel file.""" start="00:28:32.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""In any case, once we've staged up our Elisp, which is--""" start="00:28:34.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""this is basically variable interpolation,""" start="00:28:37.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""then we just call Emacs on that.""" start="00:28:42.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And if we look down to where that's called,""" start="00:28:47.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you can see that the Org Babel filename calculated here.""" start="00:28:49.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Is there a problem?""" start="00:29:12.795" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: No, I'm fine.""" start="00:29:15.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm just lost in my code.""" start="00:29:15.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: OK, cool.""" start="00:29:18.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Uh-oh means, oh, I need to intervene.""" start="00:29:19.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""What is going on?""" start="00:29:21.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Carry on, please.""" start="00:29:22.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: No, I'm fine, Leo.""" start="00:29:23.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Thank you.""" start="00:29:24.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, so then--""" start="00:29:25.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""so you can see we get--""" start="00:29:27.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we send the Babel file here,""" start="00:29:28.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which is calculated manually.""" start="00:29:35.538" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""A bit sloppy there, since I have essentially the same--""" start="00:29:41.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I have two different places where""" start="00:29:45.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm calculating the Org doc file in two different ways.""" start="00:29:47.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Have I encouraged you to write your own yet?""" start="00:29:52.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Or send patches.""" start="00:29:54.720" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, so that's pretty much the nuts and bolts""" start="00:29:56.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""of this program.""" start="00:30:01.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's go back to just seeing if we can't make it run.""" start="00:30:02.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right.""" start="00:30:22.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, well, I apologize for not""" start="00:30:22.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""having taken the time to stage my demo this morning.""" start="00:30:45.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm going to try to make it better for you.""" start="00:30:49.560" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But apparently, it's going to be non-trivial""" start="00:30:52.680" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to make the program work.""" start="00:30:59.920" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's just-- before I completely give up,""" start="00:31:04.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""let's go ahead and try our Babel execute.""" start="00:31:07.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And that, too, is failing.""" start="00:31:13.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So there's something unhappy in my local world.""" start="00:31:14.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There it goes.""" start="00:31:18.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But in any case, let's go ahead and just take a look at""" start="00:31:19.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that.""" start="00:31:26.600" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's see.""" start="00:31:28.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Control Enter.""" start="00:31:30.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's take a look at that generated .el""" start="00:31:36.628" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and compare it to-- whoa--""" start="00:31:40.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and compare it to--""" start="00:31:42.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm just going to format this manually,""" start="00:31:44.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""because I've forgotten my key bindings to auto-format it.""" start="00:31:52.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""There we go.""" start="00:31:56.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right.""" start="00:32:02.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So now we can see, as promised, there's really""" start="00:32:07.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""nothing going on here other than the interpolation""" start="00:32:13.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""of the variables in.""" start="00:32:16.200" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We're inserting-- we're using an insert and write file""" start="00:32:18.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""method, which is, again, rather sloppy,""" start="00:32:24.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to generate the text file.""" start="00:32:27.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right.""" start="00:32:32.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let's come back to our documentation""" start="00:32:32.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and see if we can put a bow on the project.""" start="00:32:34.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""So I hope I've convinced you that this was actually""" start="00:32:39.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""rather easy to do.""" start="00:32:43.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""The entirety of my index.js file is 262 lines,""" start="00:32:45.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and that includes a good 40 of whitespace and configuration.""" start="00:32:52.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It has only one dependency, the Express,""" start="00:33:03.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which really builds the web server.""" start="00:33:06.506" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Any language you'd rather implement this in""" start="00:33:08.240" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""will have a similar capability for building""" start="00:33:11.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""some type of trivial web server.""" start="00:33:14.120" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I think you may find--""" start="00:33:16.280" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I certainly found that a large portion of the code base""" start="00:33:18.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is really making the errors meaningful,""" start="00:33:22.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""in that, in some cases, sending an appropriate HTTP status""" start="00:33:28.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""based on what happened.""" start="00:33:32.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""In other cases-- let's see if""" start="00:33:34.360" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I've got an explicit `throw` left in here--""" start="00:33:38.003" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""in other cases, just trapping different types""" start="00:33:42.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""of failure conditions.""" start="00:33:45.840" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm going to look at my pad, and I do see a question here.""" start="00:33:47.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So let me jump in here.""" start="00:33:54.000" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""[Leo]: Corwin, just to make sure, are you switching to Q&A?""" start="00:33:58.880" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Are you finished with your presentation?""" start="00:34:00.640" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Well, as I said, I'm happy to take Q&A throughout.""" start="00:34:02.380" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But yes, let's say yes to that.""" start="00:34:05.260" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Okay, so Corwin, what I'm going to need to do now--""" start="00:34:08.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you are in charge of the room.""" start="00:34:10.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""We are going to open up the room so""" start="00:34:12.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that if people have questions watching right now on Gen,""" start="00:34:14.060" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""feel free to come in.""" start="00:34:17.220" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And there was something else I needed to say.""" start="00:34:18.700" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Yes, Corwin, if there's any problem,""" start="00:34:22.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""whisper to us on Mumble.""" start="00:34:24.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So you might want to unmute Mumble""" start="00:34:25.700" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and be able to listen to us over there.""" start="00:34:27.500" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: I can't do that, Leo.""" start="00:34:29.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If I unmute, Mumble is going to bleed through.""" start="00:34:32.480" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Okay, sure.""" start="00:34:36.440" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Well, if you have any problem,""" start="00:34:36.960" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""type in #emacsconf-org channel,""" start="00:34:39.417" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and we'll be with you, OK?""" start="00:34:41.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Or I'll PM somebody.""" start="00:34:42.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But I don't anticipate having any problems.""" start="00:34:43.520" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'll put something in -org when I run out of steam here.""" start="00:34:45.760" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""How's that?""" start="00:34:49.040" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Amazing, cool.""" start="00:34:50.400" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I will have to leave the room, though.""" start="00:34:51.160" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm leaving the recording going so that we have your Q&A.""" start="00:34:53.320" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And whenever you're available--""" start="00:34:56.800" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: I'll shut off the recording when I close the room.""" start="00:34:58.080" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Leo]: Okay, great.""" start="00:35:02.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Good luck, Corwin.""" start="00:35:02.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""[Corwin]: Thank you.""" start="00:35:04.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, and if you're still with me, well, thanks.""" start="00:35:06.500" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I appreciate that.""" start="00:35:09.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I did offer to be opposite RMS.""" start="00:35:13.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I'm in no way offended if people do want to jump over,""" start="00:35:16.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""especially as that starts to shift over to Q&A.""" start="00:35:20.060" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm taking Leo's leaving as a pretty good indication""" start="00:35:23.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that that's happening now-ish.""" start="00:35:26.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I totally understand""" start="00:35:28.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""if folks are more excited to do that.""" start="00:35:31.386" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Meanwhile, let me just jump over to the question""" start="00:35:35.020" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that I received.""" start="00:35:37.940" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'll show the pad here so that I save myself""" start="00:35:38.660" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""reading the question out.""" start="00:35:46.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But I'll paraphrase it.""" start="00:35:47.860" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""Why am I not running the web server in Emacs?""" start="00:35:48.940" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That would be a great way to do it.""" start="00:35:52.660" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I chose to build it in Node.js""" start="00:35:54.380" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""because that was trivially easy for me.""" start="00:35:56.341" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""And then finally, am I using org-info-js?""" start="00:36:22.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""No, I learned about this essentially at this conference.""" start="00:36:24.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So that's something I'll be learning more about.""" start="00:36:27.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And it could well influence this project.""" start="00:36:30.660" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, and thanks for the questions.""" start="00:36:34.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, I'm going to slow my roll just a little bit here""" start="00:36:59.020" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""because I think I kind of have all the time in the world.""" start="00:37:02.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I will be wrapping up within about 15 or 20 minutes""" start="00:37:06.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""at the latest just to avoid stressing out""" start="00:37:11.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""my fellow organizers, especially Leo and Sacha""" start="00:37:15.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that have the bulk of the heavy lifting this year,""" start="00:37:18.828" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and Amin, and really, thanks all to everybody.""" start="00:37:22.260" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""God, the nicest part of doing my own talk""" start="00:37:26.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is that I get to say that.""" start="00:37:29.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's just so much fun to contribute to EmacsConf.""" start="00:37:31.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""And if you're at all interested, there's""" start="00:37:35.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""plenty of completely backstage, behind the curtain role.""" start="00:37:38.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Behind the curtain roles doesn't mean""" start="00:37:43.100" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you have to be somebody that likes""" start="00:37:45.340" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""talking or being on webcam.""" start="00:37:47.866" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Sorry that my camera isn't working this year.""" start="00:37:50.060" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I spent quite a while fussing with that""" start="00:37:52.300" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and lost all my time to get my prerec working.""" start="00:37:53.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, so trying to think where I can take us""" start="00:37:56.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""without my demo working.""" start="00:38:10.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I was really hoping to show the Org Babel piece.""" start="00:38:11.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That's really fun.""" start="00:38:14.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""So let me just mention briefly how I'm using this at work.""" start="00:38:15.580" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So at work, I'll have some type of Org document.""" start="00:38:20.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And usually, it's a project.""" start="00:38:25.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So the title of the document is My Project.""" start="00:38:27.700" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then I'll have a requirements section.""" start="00:38:32.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I'll have a meeting notes section.""" start="00:38:37.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""That's probably the key thing.""" start="00:38:43.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then as the project goes on, I'll start having--""" start="00:38:44.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm a solutions architect.""" start="00:38:49.540" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So my job is formalizing design in large part.""" start="00:38:50.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So then I'll have a design documents section.""" start="00:38:55.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And this is where I'll be doing a lot of my work.""" start="00:39:01.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I'll start out saying--""" start="00:39:05.020" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And maybe Bob is a subject matter expert""" start="00:39:26.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""whose buy-in I need to have on how we're going""" start="00:39:29.340" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to do the high-level design.""" start="00:39:32.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Maybe a lead engineer or a dev manager""" start="00:39:34.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""or something like that.""" start="00:39:37.297" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, as my work goes on,""" start="00:39:39.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""then this will start getting into more detail.""" start="00:39:42.654" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And things of this nature.""" start="00:40:16.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""As things get further and further,""" start="00:40:18.660" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'll actually have documentation""" start="00:40:20.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that I'm adding in here.""" start="00:40:21.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Oh, I see.""" start="00:40:22.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's a big mess.""" start="00:40:28.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, well, we'll just reuse this.""" start="00:40:29.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I can insert those all in line.""" start="00:40:32.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And now for the fun part,""" start="00:40:40.380" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""let's see if the most trivial case""" start="00:40:42.158" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""is working here.""" start="00:40:44.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""No.""" start="00:40:49.940" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, completely broken.""" start="00:40:51.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Let me drag.""" start="00:40:52.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, well, apologies again for the poor quality""" start="00:40:57.260" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""of my demo today.""" start="00:41:05.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And let me just look real quick at my Etherpad once more.""" start="00:41:06.260" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And I'll glance at BBB to see if there's anybody""" start="00:41:13.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""jumping in with questions.""" start="00:41:16.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And then I'll go back to IRC and look for questions there.""" start="00:41:18.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""OK, and I don't see any additional questions on the pad.""" start="00:41:23.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I'm just going to scan IRC real quick.""" start="00:41:33.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I suspect that the TreeSitter comment isn't for me.""" start="00:41:35.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""All right, and I'm not seeing a lot of questions there.""" start="00:41:44.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So I'm just going to vamp for just a minute or two.""" start="00:41:56.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""As I mentioned, I'm a conference volunteer.""" start="00:42:04.340" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This is my third year volunteering""" start="00:42:07.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with the conference.""" start="00:42:09.700" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And probably if you take one thing away from my talk,""" start="00:42:11.940" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""it should be I really like volunteering""" start="00:42:15.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""for the conference.""" start="00:42:17.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It's fun.""" start="00:42:18.500" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It makes me feel sort of close to the pulse.""" start="00:42:19.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And it gives me a chance to just interact with people""" start="00:42:23.500" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that have very different perspectives on Emacs,""" start="00:42:27.297" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""which is something that I really value a lot.""" start="00:42:30.107" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Emacs, like anything else sort of in the internet world,""" start="00:42:32.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""has a real echo chamber factor.""" start="00:42:40.220" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If you do or don't like use-package,""" start="00:42:42.940" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you probably interact with a lot of people""" start="00:42:46.505" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that feel the same way about that.""" start="00:42:49.136" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And so I really recommend volunteering for EmacsConf""" start="00:42:53.500" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""as a way to sort of mix it up and get""" start="00:42:57.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to know people that may not use Emacs""" start="00:43:01.340" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the same way that you do.""" start="00:43:03.859" video="mainVideo-orgvm" id="subtitle"]] +[[!template new="1" text="""Or perhaps more on topic, though,""" start="00:43:08.380" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the log line for this talk is it's really quite easy""" start="00:43:10.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to build a program that uses Emacs in a pipeline capability.""" start="00:43:14.300" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I think there's a ton of opportunity in this space.""" start="00:43:20.980" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""This particular example is just a trivial web server""" start="00:43:23.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""written using Node.js.""" start="00:43:27.700" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""But as was pointed out, we could have used elnode""" start="00:43:30.780" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""as a web server""" start="00:43:31.546" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and done the entire thing within Emacs Lisp.""" start="00:43:40.060" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Or really, almost any technology""" start="00:43:44.060" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""would get us this capability.""" start="00:43:48.766" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""From an implementation standpoint,""" start="00:43:52.900" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I had a lot of fun building""" start="00:43:54.660" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""this trivial little Elisp parser,""" start="00:43:56.848" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""and I'm rather pleased with the fact""" start="00:43:59.580" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""that the entirety of that--""" start="00:44:03.220" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""the entire algorithm for turning JavaScript or JSON data,""" start="00:44:07.340" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""we could say, into Elisp is really a one-liner,""" start="00:44:14.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""albeit a nasty one-liner. That was pretty cool""" start="00:44:20.420" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""to discover how simple that was.""" start="00:44:25.820" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So in my mind, that opens up a lot of possibility.""" start="00:44:28.180" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""If it's this easy in JavaScript,""" start="00:44:31.220" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""I wouldn't expect it to be hard,""" start="00:44:32.890" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""any more difficult in your favorite language.""" start="00:44:34.709" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""Glance one more time to see if there""" start="00:44:36.860" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""happen to be any other questions.""" start="00:44:41.140" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""And not seeing any, I'm going to go ahead and start""" start="00:44:42.940" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""wrapping up my chat now.""" start="00:44:47.300" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""It will take me a couple of minutes to do that.""" start="00:44:49.500" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""So if you do have any other questions that you""" start="00:44:51.620" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""want to drop into the pad or any comments,""" start="00:44:54.580" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""you're more than welcome to hit me with those""" start="00:44:56.460" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""as I coordinate closing this chat, this talk,""" start="00:44:59.740" video="mainVideo-orgvm" id="subtitle"]] +[[!template text="""with the organizer team.""" start="00:45:03.820" video="mainVideo-orgvm" id="subtitle"]] + Questions or comments? Please e-mail [emacsconf-org-private@gnu.org](mailto:emacsconf-org-private@gnu.org?subject=Comment%20for%20EmacsConf%202022%20orgvm%3A%20orgvm%3A%20a%20simple%20HTTP%20server%20for%20org) diff --git a/2022/info/orgvm-before.md b/2022/info/orgvm-before.md index 1538baf7..e0ea2ac9 100644 --- a/2022/info/orgvm-before.md +++ b/2022/info/orgvm-before.md @@ -1,4 +1,46 @@ -
+ +The following image shows where the talk is in the schedule for Sun 2022-12-04. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.
+ Schedule for Sunday Sunday 9:00- 9:05 Sunday opening remarks sun-open 9:06- 9:26 Results of the 2022 Emacs Survey survey 9:35- 9:45 This Year in Org orgyear 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex rolodex 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten) orgsuperlinks 11:10-11:20 orgvm: a simple HTTP server for org orgvm 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode hyperorg 1:50- 2:15 Org workflows for developers workflows 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers grail 3:25- 3:45 Putting Org Mode on the Indieweb indieweb 4:05- 4:15 Emacs development updates devel 4:25- 4:35 Fanfare for the Common Emacs User fanfare 4:50- 5:00 Sunday closing remarks sun-close 10:00-10:25 rde Emacs introduction rde 10:50-11:05 justl: Driving recipes within Emacs justl 11:15-11:35 What I'd like to see in Emacs rms 1:01- 1:16 Getting detached from Emacs detached 1:40- 1:55 Top 10 reasons why you should be using Eshell eshell 2:20- 2:40 Emacs was async before async was cool async 3:15- 3:35 The Wheels on D-Bus dbus 4:00- 4:10 Pre-localizing Emacs localizing 4:30- 4:35 Short hyperlinks to Python docs python 9 AM 10 AM 11 AM 12 PM 1 PM 2 PM 3 PM 4 PM 5 PM +
+ +[[!toc ]] +Format: 47-min talk followed by included in main video Q&A (#emacsconf-gen) +Etherpad: +Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen) +Status: TO_INDEX_QA +
Times in different timezones:
Sunday, Dec 4 2022, ~11:10 AM - 11:20 AM EST (US/Eastern)
which is the same as:
Sunday, Dec 4 2022, ~10:10 AM - 10:20 AM CST (US/Central)
Sunday, Dec 4 2022, ~9:10 AM - 9:20 AM MST (US/Mountain)
Sunday, Dec 4 2022, ~8:10 AM - 8:20 AM PST (US/Pacific)
Sunday, Dec 4 2022, ~4:10 PM - 4:20 PM UTC
Sunday, Dec 4 2022, ~5:10 PM - 5:20 PM CET (Europe/Paris)
Sunday, Dec 4 2022, ~6:10 PM - 6:20 PM EET (Europe/Athens)
Sunday, Dec 4 2022, ~9:40 PM - 9:50 PM IST (Asia/Kolkata)
Monday, Dec 5 2022, ~12:10 AM - 12:20 AM +08 (Asia/Singapore)
Monday, Dec 5 2022, ~1:10 AM - 1:20 AM JST (Asia/Tokyo)
Find out how to watch and participate
+ + + +
[[!template id="chapters" vidid="orgvm-mainVideo" data=""" +00:36.000 Introduction +01:31.080 What is orgvm? +02:01.880 Nodejs +02:49.560 The itch I was trying to scratch +03:38.320 Demo +05:29.760 Needs a relatively recent version of Emacs +06:24.920 Usage patterns +08:13.520 Emacs Lisp +09:09.160 Variables +10:38.720 Replace +11:19.120 Getting into the code some more +13:06.480 Generating Elisp +13:37.320 Org blocks +14:32.400 Building some Lisp +16:43.000 How Elisp gets encoded +19:25.040 How the export works +22:09.860 Walking through the code +26:07.440 Executing the source block +32:39.760 Conclusion +33:58.880 Questions and answers +35:48.940 Why am I not running the web server in Emacs? +36:22.140 Is this using org-info-js? +37:35.460 EmacsConf +38:15.580 How I'm using this at work +42:04.340 Volunteering for EmacsConf +43:08.380 It's easy to build a program that uses Emacs in the pipeline + +"""]]
# Description \ No newline at end of file -- cgit v1.2.3