summaryrefslogtreecommitdiffstats
path: root/2022
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2022-12-21 12:41:06 -0500
committerSacha Chua <sacha@sachachua.com>2022-12-21 12:41:06 -0500
commitaea2a4618f0762a559eea5de2748d9e4a1062606 (patch)
tree86a79ac7ce864eafcffa427844f0f9b6931cc857 /2022
parenta1373695f8c04ca98bb4f90d4a08f4b282c800f9 (diff)
downloademacsconf-wiki-aea2a4618f0762a559eea5de2748d9e4a1062606.tar.xz
emacsconf-wiki-aea2a4618f0762a559eea5de2748d9e4a1062606.zip
Automated commit
Diffstat (limited to '2022')
-rw-r--r--2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt80
-rw-r--r--2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.vtt1912
-rw-r--r--2022/info/orgvm-after.md739
-rw-r--r--2022/info/orgvm-before.md44
4 files changed, 1773 insertions, 1002 deletions
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 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="orgvm-mainVideo-transcript"></a>
+# 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="""&quot;I didn't understand that type.&quot;""" start="00:12:59.360" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""&quot;I don't know the document.&quot;""" start="00:13:01.000" video="mainVideo-orgvm" id="subtitle"]]
+[[!template text="""&quot;I failed.&quot;""" 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 &quot;how the Org export process works,&quot;""" 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 @@
<!-- Automatically generated by emacsconf-publish-before-page -->
-<div class="vid"><video controls preload="none" id="orgvm-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.webm" />${captions}<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.webm">Download --main.webm (159MB)</a></li><li><a href="https://toobnix.org/w/9Ybxov8eVA763kRvHuM6zY">View on Toobnix</a></li></ul></div></div>
+
+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.<div class="schedule-in-context schedule-svg-container" data-slug="orgvm">
+<svg width="800" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2022/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:05 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(5,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2022/talks/survey" title="Results of the 2022 Emacs Survey" data-slug="survey"> <title> 9:06- 9:26 Results of the 2022 Emacs Survey</title> <rect x="9" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(38,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> survey</text></g></a> <a href="/2022/talks/orgyear" title="This Year in Org" data-slug="orgyear"> <title> 9:35- 9:45 This Year in Org</title> <rect x="54" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(67,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgyear</text></g></a> <a href="/2022/talks/rolodex" title="Build a Zettelkasten with the Hyperbole Rolodex" data-slug="rolodex"> <title> 9:57-10:22 Build a Zettelkasten with the Hyperbole Rolodex</title> <rect x="89" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(126,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rolodex</text></g></a> <a href="/2022/talks/orgsuperlinks" title="Linking headings with org-super-links (poor-man's Zettelkasten)" data-slug="orgsuperlinks"> <title> 10:40-10:50 Linking headings with org-super-links (poor-man's Zettelkasten)</title> <rect x="156" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(169,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgsuperlinks</text></g></a> <a href="/2022/talks/orgvm" title="orgvm: a simple HTTP server for org" data-slug="orgvm"> <title> 11:10-11:20 orgvm: a simple HTTP server for org</title> <rect stroke-width="3" x="203" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(216,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> orgvm</text></g></a> <a href="/2022/talks/hyperorg" title="Powerful productivity with Hyperbole and Org Mode" data-slug="hyperorg"> <title> 1:00- 1:30 Powerful productivity with Hyperbole and Org Mode</title> <rect x="376" y="15" opacity="0.5" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(421,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperorg</text></g></a> <a href="/2022/talks/workflows" title="Org workflows for developers" data-slug="workflows"> <title> 1:50- 2:15 Org workflows for developers</title> <rect x="454" y="15" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(491,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> workflows</text></g></a> <a href="/2022/talks/grail" title="GRAIL---A Generalized Representation and Aggregation of Information Layers" data-slug="grail"> <title> 2:35- 2:55 GRAIL---A Generalized Representation and Aggregation of Information Layers</title> <rect x="525" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(554,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> grail</text></g></a> <a href="/2022/talks/indieweb" title="Putting Org Mode on the Indieweb" data-slug="indieweb"> <title> 3:25- 3:45 Putting Org Mode on the Indieweb</title> <rect x="603" y="15" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> indieweb</text></g></a> <a href="/2022/talks/devel" title="Emacs development updates" data-slug="devel"> <title> 4:05- 4:15 Emacs development updates</title> <rect x="666" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> devel</text></g></a> <a href="/2022/talks/fanfare" title="Fanfare for the Common Emacs User" data-slug="fanfare"> <title> 4:25- 4:35 Fanfare for the Common Emacs User</title> <rect x="698" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(711,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> fanfare</text></g></a> <a href="/2022/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <a href="/2022/talks/rde" title="rde Emacs introduction" data-slug="rde"> <title> 10:00-10:25 rde Emacs introduction</title> <rect x="94" y="75" opacity="0.5" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(131,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rde</text></g></a> <a href="/2022/talks/justl" title="justl: Driving recipes within Emacs" data-slug="justl"> <title> 10:50-11:05 justl: Driving recipes within Emacs</title> <rect x="172" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(193,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> justl</text></g></a> <a href="/2022/talks/rms" title="What I'd like to see in Emacs" data-slug="rms"> <title> 11:15-11:35 What I'd like to see in Emacs</title> <rect x="211" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(240,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rms</text></g></a> <a href="/2022/talks/detached" title="Getting detached from Emacs" data-slug="detached"> <title> 1:01- 1:16 Getting detached from Emacs</title> <rect x="378" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(399,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> detached</text></g></a> <a href="/2022/talks/eshell" title="Top 10 reasons why you should be using Eshell" data-slug="eshell"> <title> 1:40- 1:55 Top 10 reasons why you should be using Eshell</title> <rect x="439" y="75" opacity="0.5" width="23" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(460,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> eshell</text></g></a> <a href="/2022/talks/async" title="Emacs was async before async was cool" data-slug="async"> <title> 2:20- 2:40 Emacs was async before async was cool</title> <rect x="501" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(530,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> async</text></g></a> <a href="/2022/talks/dbus" title="The Wheels on D-Bus" data-slug="dbus"> <title> 3:15- 3:35 The Wheels on D-Bus</title> <rect x="588" y="75" opacity="0.5" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(617,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> dbus</text></g></a> <a href="/2022/talks/localizing" title="Pre-localizing Emacs" data-slug="localizing"> <title> 4:00- 4:10 Pre-localizing Emacs</title> <rect x="658" y="75" opacity="0.5" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(671,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> localizing</text></g></a> <a href="/2022/talks/python" title="Short hyperlinks to Python docs" data-slug="python"> <title> 4:30- 4:35 Short hyperlinks to Python docs</title> <rect x="705" y="75" opacity="0.5" width="7" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(710,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> python</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+</div>
+
+[[!toc ]]
+Format: 47-min talk followed by included in main video Q&A (<a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen">#emacsconf-gen</a>)
+Etherpad: <https://pad.emacsconf.org/2022-orgvm>
+Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
+Status: TO_INDEX_QA
+<div>Times in different timezones:</div><div class="times" start="2022-12-04T16:10:00Z" end="2022-12-04T16:20:00Z"><div class="conf-time">Sunday, Dec 4 2022, ~11:10 AM - 11:20 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Sunday, Dec 4 2022, ~10:10 AM - 10:20 AM CST (US/Central)<br />Sunday, Dec 4 2022, ~9:10 AM - 9:20 AM MST (US/Mountain)<br />Sunday, Dec 4 2022, ~8:10 AM - 8:20 AM PST (US/Pacific)<br />Sunday, Dec 4 2022, ~4:10 PM - 4:20 PM UTC <br />Sunday, Dec 4 2022, ~5:10 PM - 5:20 PM CET (Europe/Paris)<br />Sunday, Dec 4 2022, ~6:10 PM - 6:20 PM EET (Europe/Athens)<br />Sunday, Dec 4 2022, ~9:40 PM - 9:50 PM IST (Asia/Kolkata)<br />Monday, Dec 5 2022, ~12:10 AM - 12:20 AM +08 (Asia/Singapore)<br />Monday, Dec 5 2022, ~1:10 AM - 1:20 AM JST (Asia/Tokyo)</div></div><div><a href="/2022/watch/gen/">Find out how to watch and participate</a></div>
+
+
+
+<div class="vid"><video controls preload="none" id="orgvm-mainVideo"><source src="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.webm" />${captions}<track kind="chapters" label="Chapters" src="/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!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
+
+"""]]<div></div><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main.webm">Download --main.webm (159MB)</a></li><li><a href="https://media.emacsconf.org/2022/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://toobnix.org/w/9Ybxov8eVA763kRvHuM6zY">View on Toobnix</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file