summaryrefslogtreecommitdiffstats
path: root/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt
diff options
context:
space:
mode:
Diffstat (limited to '2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt')
-rw-r--r--2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt2348
1 files changed, 2348 insertions, 0 deletions
diff --git a/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt
new file mode 100644
index 00000000..7f9550b2
--- /dev/null
+++ b/2022/captions/emacsconf-2022-orgvm--orgvm-a-simple-http-server-for-org--corwin-brust--answers.vtt
@@ -0,0 +1,2348 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:26.000
+ [MUSIC PLAYING]
+
+00:00:26.000 --> 00:00:36.000
+ [MUSIC PLAYING]
+
+00:00:36.000 --> 00:00:42.480
+ 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:46.480 --> 00:00:49.760
+ into my thesis for those of you that
+
+00:00:49.760 --> 00:00:53.360
+ might be planning to duck out for the RMS talk,
+
+00:00:53.360 --> 00:00:55.520
+ starting in a little bit.
+
+00:00:55.520 --> 00:00:59.360
+ So essentially, my thesis here is really
+
+00:00:59.360 --> 00:01:04.800
+ that the Emacs toolchain can easily
+
+00:01:04.800 --> 00:01:10.280
+ be combined with other skills and used in kind of a Unix
+
+00:01:10.280 --> 00:01:13.280
+ paradigm of having sort of different tools
+
+00:01:13.280 --> 00:01:14.960
+ to do different steps.
+
+00:01:14.960 --> 00:01:17.760
+ We might actually use the same tool
+
+00:01:17.760 --> 00:01:19.240
+ to implement a couple of steps.
+
+00:01:19.240 --> 00:01:22.080
+ 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:24.960 --> 00:01:26.400
+ and replaced.
+
+00:01:26.400 --> 00:01:29.560
+ So over the course of the talk, hopefully I'll
+
+00:01:29.560 --> 00:01:31.080
+ 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
+
+00:01:35.800 --> 00:01:37.040
+ orgvm?
+
+00:01:37.040 --> 00:01:39.560
+ So this is a very simple proof of concept program.
+
+00:01:39.560 --> 00:01:44.200
+ We'll just jump over to perhaps a prettier view of the
+
+00:01:44.200 --> 00:01:44.880
+ source
+
+00:01:44.880 --> 00:01:45.520
+ code for it.
+
+00:01:45.520 --> 00:01:49.200
+ This is implemented-- oops.
+
+00:01:49.200 --> 00:01:53.160
+ 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.
+
+00:01:56.560 --> 00:01:58.120
+ And we'll be jumping back and forth
+
+00:01:58.120 --> 00:02:01.880
+ between the code and the documentation.
+
+00:02:01.880 --> 00:02:04.080
+ 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.
+
+00:02:05.960 --> 00:02:08.600
+ But I think you'll find it'd be pretty trivial to implement
+
+00:02:08.600 --> 00:02:10.840
+ in any language.
+
+00:02:10.840 --> 00:02:13.960
+ 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
+
+00:02:17.920 --> 00:02:20.080
+ and things like that.
+
+00:02:20.080 --> 00:02:21.680
+ Of course, bug reports.
+
+00:02:21.680 --> 00:02:25.760
+ 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
+
+00:02:28.760 --> 00:02:29.600
+ that's even cooler.
+
+00:02:29.600 --> 00:02:32.160
+ And we can learn from each other.
+
+00:02:32.160 --> 00:02:34.200
+ If you heard one of my talks before,
+
+00:02:34.200 --> 00:02:36.200
+ you probably recognize a common theme.
+
+00:02:36.200 --> 00:02:40.320
+ 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:43.540 --> 00:02:44.120
+ culture.
+
+00:02:44.120 --> 00:02:49.560
+ All right, so let's come back to orgvm.
+
+00:02:49.560 --> 00:02:52.280
+ First of all, we'll start with the itch I was trying to
+
+00:02:52.280 --> 00:02:52.840
+ scratch.
+
+00:02:52.840 --> 00:02:58.240
+ I wanted to be able to quickly use a web browser
+
+00:02:58.240 --> 00:03:00.680
+ 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:03.530 --> 00:03:03.960
+ cross
+
+00:03:03.960 --> 00:03:05.640
+ links to each other.
+
+00:03:05.640 --> 00:03:10.080
+ That meant I wanted to automatically export,
+
+00:03:10.080 --> 00:03:12.280
+ particularly to HTML.
+
+00:03:12.280 --> 00:03:17.280
+ But it made sense for me to include Markdown, PDF,
+
+00:03:17.280 --> 00:03:18.880
+ or whatever format I want.
+
+00:03:18.880 --> 00:03:22.760
+ 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.
+
+00:03:29.480 --> 00:03:33.240
+ And then finally, it should be, therefore,
+
+00:03:33.240 --> 00:03:36.840
+ pretty easy to download the document rather than view it
+
+00:03:36.840 --> 00:03:38.320
+ once I'm done.
+
+00:03:38.320 --> 00:03:42.200
+ 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.
+
+00:03:44.760 --> 00:03:45.960
+ 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
+
+00:03:52.320 --> 00:03:53.320
+ is fire up the program.
+
+00:03:53.320 --> 00:04:00.200
+ Actually, for simplicity, let's just
+
+00:04:00.200 --> 00:04:01.760
+ 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
+
+00:04:19.760 --> 00:04:21.520
+ to get the application running.
+
+00:04:22.680 --> 00:04:22.680
+
+
+00:04:22.680 --> 00:04:25.960
+ So with that done, then, I can run out to my local host.
+
+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
+.
+
+00:04:37.560 --> 00:04:45.820
+ So I've got a little org file that I prepared that just
+
+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:49.040 --> 00:04:53.560
+ And you can see, as imagined, we're automatically
+
+00:04:53.560 --> 00:04:54.640
+ turning that org file.
+
+00:04:54.640 --> 00:04:56.320
+ Let's just take a quick look at it.
+
+00:04:56.320 --> 00:05:10.280
+ And here's that file now.
+
+00:05:10.280 --> 00:05:11.960
+ But 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:14.000 --> 00:05:16.560
+ use for testing this program.
+
+00:05:16.560 --> 00:05:17.640
+ Images work.
+
+00:05:17.640 --> 00:05:21.800
+ We've got some nicely syntax highlighted code
+
+00:05:21.800 --> 00:05:25.560
+ blocks in a couple different languages.
+
+00:05:25.560 --> 00:05:29.760
+ And not really that much going on there.
+
+00:05:29.760 --> 00:05:33.760
+ All right, let's come back to the documentation.
+
+00:05:33.760 --> 00:05:36.680
+ 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.
+
+00:05:39.720 --> 00:05:43.640
+ 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.
+
+00:05:46.000 --> 00:05:50.320
+ 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,
+
+00:05:55.120 --> 00:05:57.080
+ as well as recent builds of 29.
+
+00:05:57.080 --> 00:06:02.560
+ There's some quick start instructions here,
+
+00:06:02.560 --> 00:06:03.900
+ 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:09.160 --> 00:06:11.920
+ involves starting the program.
+
+00:06:11.920 --> 00:06:13.520
+ You do-- I will call out Yale.
+
+00:06:13.520 --> 00:06:15.320
+ 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.
+
+00:06:20.080 --> 00:06:23.240
+ That'll bring in express.js, which the JavaScript we're
+
+00:06:23.240 --> 00:06:24.920
+ about to look at is built on.
+
+00:06:24.920 --> 00:06:33.480
+ 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
+
+00:06:35.920 --> 00:06:42.760
+ 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
+
+00:06:46.960 --> 00:06:50.800
+ 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
+
+00:06:52.960 --> 00:06:55.880
+ that nothing in this program protects you
+
+00:06:55.880 --> 00:06:57.240
+ from damaging yourself.
+
+00:06:57.240 --> 00:07:00.560
+ 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:03.290 --> 00:07:04.840
+ files
+
+00:07:04.840 --> 00:07:06.520
+ and roll them up to yourself.
+
+00:07:06.520 --> 00:07:08.680
+ 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
+
+00:07:12.240 --> 00:07:14.720
+ 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.
+
+00:07:22.960 --> 00:07:26.240
+ But we also can modify the response format.
+
+00:07:26.240 --> 00:07:29.800
+ 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]
+
+00:07:45.040 --> 00:07:48.040
+ --type, OK.
+
+00:07:48.040 --> 00:07:50.680
+ Not sure what's going on there.
+
+00:07:50.680 --> 00:07:57.080
+ OK, well, there goes my demo.
+
+00:07:57.080 --> 00:07:59.440
+ Shows me for doing my talk live.
+
+00:08:03.920 --> 00:08:06.960
+ But this, fortunately, this error message
+
+00:08:06.960 --> 00:08:08.840
+ 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,
+
+00:08:10.240 --> 00:08:13.520
+ hopefully bringing me back to that thesis.
+
+00:08:13.520 --> 00:08:17.760
+ 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.
+
+00:08:21.640 --> 00:08:24.000
+ And you'll notice that's the stuff
+
+00:08:24.000 --> 00:08:27.600
+ I thought was important to produce as diagnostics
+
+00:08:27.600 --> 00:08:29.840
+ for the programs running as well.
+
+00:08:29.840 --> 00:08:34.000
+ So spoiler, this e-lisp is dynamically
+
+00:08:34.000 --> 00:08:35.400
+ generated by the program.
+
+00:08:35.400 --> 00:08:38.160
+ And that's really the core of the way
+
+00:08:38.160 --> 00:08:42.680
+ org VM or my org VM works.
+
+00:08:42.680 --> 00:08:47.360
+ 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.
+
+00:08:48.880 --> 00:08:51.840
+ You can see I've got some bases.
+
+00:08:51.840 --> 00:08:53.680
+ This is all hard-coded into the program,
+
+00:08:53.680 --> 00:08:56.720
+ nothing fancy going on here.
+
+00:08:56.720 --> 00:09:00.280
+ The debug is simply controlling that diagnostic output
+
+00:09:00.280 --> 00:09:01.560
+ that we looked at.
+
+00:09:01.560 --> 00:09:04.240
+ 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.
+
+00:09:09.160 --> 00:09:16.320
+ 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:21.840 --> 00:09:24.280
+ can generate dynamically.
+
+00:09:24.280 --> 00:09:27.400
+ So here, we're controlling the extension
+
+00:09:27.400 --> 00:09:29.360
+ that it should look for org files.
+
+00:09:29.360 --> 00:09:31.560
+ Hopefully not too many people out there
+
+00:09:31.560 --> 00:09:34.080
+ with a weird extension for the org files,
+
+00:09:34.080 --> 00:09:37.920
+ 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.
+
+00:09:40.120 --> 00:09:49.520
+ Then we define a list of additional export types.
+
+00:09:49.520 --> 00:09:50.760
+ 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
+
+
+00:09:54.720 --> 00:09:59.320
+ 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,
+
+00:10:00.680 --> 00:10:02.400
+ but now we can see that that's definitely
+
+00:10:02.400 --> 00:10:09.200
+ working for certain versions of working.
+
+00:10:09.200 --> 00:10:14.280
+ So this list of type parameters is
+
+00:10:14.280 --> 00:10:15.720
+ 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
+.
+
+00:10:18.800 --> 00:10:21.480
+ 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.
+
+00:10:23.480 --> 00:10:29.320
+ The fancy footwork here involves, first of all,
+
+00:10:29.320 --> 00:10:32.240
+ 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:36.520 --> 00:10:37.040
+ content
+
+00:10:37.040 --> 00:10:38.720
+ type.
+
+00:10:38.720 --> 00:10:40.920
+ We also have this replace variable.
+
+00:10:40.920 --> 00:10:44.000
+ 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:48.840 --> 00:10:53.520
+ there, but only if the original source org file hasn't
+
+00:10:53.520 --> 00:10:56.240
+ been modified since.
+
+00:10:56.240 --> 00:10:59.920
+ This replace effectively can turn that off.
+
+00:10:59.920 --> 00:11:03.040
+ If I remove the replace equals true attribute,
+
+00:11:03.040 --> 00:11:07.600
+ 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
+
+00:11:13.880 --> 00:11:16.560
+ got hand-tuned PDFs and you don't want to accidentally
+
+00:11:16.560 --> 00:11:17.200
+ overwrite them.
+
+00:11:19.120 --> 00:11:19.120
+
+
+00:11:19.120 --> 00:11:23.480
+ 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
+
+00:11:28.280 --> 00:11:32.520
+ and jump into the boring parts so that we have them
+
+00:11:32.520 --> 00:11:34.240
+ as context.
+
+00:11:34.240 --> 00:11:37.160
+ 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--
+
+00:11:41.880 --> 00:11:47.120
+ 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
+
+00:11:51.240 --> 00:11:52.480
+ that we support.
+
+00:11:52.480 --> 00:11:55.560
+ 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:59.600 --> 00:12:01.760
+ is just giving us a file name.
+
+00:12:01.760 --> 00:12:04.160
+ 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.
+
+00:12:08.520 --> 00:12:10.280
+ And assuming that that exists--
+
+00:12:15.600 --> 00:12:17.080
+ sorry, I've confused myself.
+
+00:12:17.080 --> 00:12:23.000
+ So this is the caching or the optimization
+
+00:12:23.000 --> 00:12:25.640
+ that I mentioned, sending the existing file.
+
+00:12:25.640 --> 00:12:31.360
+ This file exists is where the optimization is
+
+00:12:31.360 --> 00:12:38.680
+ that regenerates the file if the source
+
+00:12:38.680 --> 00:12:41.840
+ 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
+
+00:12:46.760 --> 00:12:49.320
+ 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.
+
+00:12:52.800 --> 00:12:56.040
+ 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.
+
+00:12:59.360 --> 00:13:01.000
+ I didn't understand that type.
+
+00:13:01.000 --> 00:13:02.080
+ I don't know the document.
+
+00:13:02.080 --> 00:13:03.040
+ I failed.
+
+00:13:03.040 --> 00:13:06.480
+ Otherwise, there's the caching.
+
+00:13:06.480 --> 00:13:14.520
+ And here's really where things get interesting,
+
+00:13:14.520 --> 00:13:19.200
+ where we've generated some ELISP,
+
+00:13:19.200 --> 00:13:22.280
+ 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.
+
+00:13:24.760 --> 00:13:27.800
+ 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.
+
+00:13:30.920 --> 00:13:33.760
+ All right, let's get to the interesting part.
+
+00:13:33.760 --> 00:13:37.320
+ Sorry, one more footnote.
+
+00:13:37.320 --> 00:13:39.320
+ There is a capability built in that will
+
+00:13:39.320 --> 00:13:41.040
+ 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
+
+
+00:13:44.800 --> 00:13:47.200
+ I'll remind myself how to do it.
+
+00:13:47.200 --> 00:13:49.560
+ It's run.
+
+00:13:49.560 --> 00:13:53.320
+ I think it's called test.
+
+00:13:53.320 --> 00:13:56.360
+ And that's returning a 500.
+
+00:13:56.360 --> 00:13:58.400
+ I'm suspecting that's running because I'm running
+
+00:13:58.400 --> 00:13:59.760
+ in command instead of bash.
+
+00:13:59.760 --> 00:14:06.040
+ Oh, yeah, so the failure is happening
+
+00:14:06.040 --> 00:14:07.720
+ after I generate the ELISP.
+
+00:14:07.720 --> 00:14:10.280
+ 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
+
+00:14:12.760 --> 00:14:19.280
+ and relaunch it in mingity-bash.
+
+00:14:19.280 --> 00:14:21.440
+ 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.
+
+00:14:24.200 --> 00:14:25.860
+ 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,
+
+00:14:28.120 --> 00:14:32.400
+ at least in trivial cases, this works pretty well.
+
+00:14:32.400 --> 00:14:37.800
+ 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:42.400 --> 00:14:46.480
+ 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
+
+00:14:49.840 --> 00:14:53.440
+ 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
+.
+
+00:15:01.960 --> 00:15:09.410
+ Here, you can see that I really don't have a whole lot of
+
+00:15:09.410 --> 00:15:09.720
+ code
+
+00:15:09.720 --> 00:15:11.280
+ around formatting LISP.
+
+00:15:11.280 --> 00:15:14.360
+ You can see that I've special-cased
+
+00:15:14.360 --> 00:15:19.840
+ whether the arguments that were passed
+
+00:15:19.840 --> 00:15:20.880
+ happen to be a function.
+
+00:15:20.880 --> 00:15:25.480
+ 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.
+
+00:15:31.720 --> 00:15:35.040
+ 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.
+
+00:15:40.960 --> 00:15:48.440
+ 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:53.440 --> 00:15:57.880
+ if I get formatting each element of the list of arguments
+
+00:15:57.880 --> 00:16:02.600
+ that this format LISP process calls
+
+00:16:02.600 --> 00:16:04.920
+ and separating them with spaces.
+
+00:16:04.920 --> 00:16:10.880
+ 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,
+
+00:16:14.000 --> 00:16:16.080
+ it calls that function.
+
+00:16:16.080 --> 00:16:19.320
+ Once that's handled or otherwise,
+
+00:16:19.320 --> 00:16:22.720
+ we simply walk the list, taking the arguments,
+
+00:16:22.720 --> 00:16:26.000
+ concatenating them on strings, and finally,
+
+00:16:26.000 --> 00:16:28.560
+ wrap the results in parentheses.
+
+00:16:28.560 --> 00:16:31.760
+ 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
+
+00:16:36.120 --> 00:16:38.600
+ will be subjected to the same treatment.
+
+00:16:38.600 --> 00:16:43.000
+ So this is a recursive sort of algorithm.
+
+00:16:43.000 --> 00:16:51.520
+ All right, so now when I go to export,
+
+00:16:51.520 --> 00:16:53.520
+ 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
+
+00:16:55.800 --> 00:16:58.840
+ and let's focus instead on the more interesting part
+
+00:16:58.840 --> 00:17:02.360
+ 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
+
+00:17:07.520 --> 00:17:10.320
+ 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:14.280 --> 00:17:15.320
+ function.
+
+00:17:15.320 --> 00:17:19.560
+ 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
+
+00:17:27.280 --> 00:17:29.760
+ how to call the export for it.
+
+00:17:29.760 --> 00:17:32.680
+ 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,
+
+00:17:35.720 --> 00:17:40.600
+ 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
+
+00:17:45.040 --> 00:17:48.000
+ 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:54.520 --> 00:17:55.400
+ property.
+
+00:17:55.400 --> 00:18:00.920
+ 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:06.760 --> 00:18:14.320
+ export to file function using the file name and an output
+
+00:18:14.320 --> 00:18:15.640
+ file name.
+
+00:18:15.640 --> 00:18:18.480
+ 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:22.950 --> 00:18:23.560
+ file.
+
+00:18:23.560 --> 00:18:25.800
+ 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.
+
+00:18:28.280 --> 00:18:30.760
+ This looks rather like--
+
+00:18:30.760 --> 00:18:37.240
+ 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]
+
+00:18:46.320 --> 00:18:47.720
+ And there, we can see--
+
+00:18:47.720 --> 00:18:49.840
+ - I'm going to make a quick announcement.
+
+00:18:49.840 --> 00:18:50.760
+ Can you hear me?
+
+00:18:50.760 --> 00:18:52.480
+ - Yes, go for it.
+
+00:18:52.480 --> 00:18:54.280
+ - OK, let me just show my face.
+
+00:18:54.280 --> 00:18:55.400
+ Oh, I'm not showing my face.
+
+00:18:55.400 --> 00:18:55.640
+ Damn it.
+
+00:18:55.640 --> 00:18:57.000
+ OK, I'll make the announcement.
+
+00:18:57.000 --> 00:18:58.600
+ You won't see my face quite yet.
+
+00:18:58.600 --> 00:19:00.360
+ We are about to get started.
+
+00:19:00.360 --> 00:19:02.440
+ Well, we actually just got started on dev
+
+00:19:02.440 --> 00:19:06.040
+ 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,
+
+00:19:08.920 --> 00:19:09.760
+ feel free to do so.
+
+00:19:09.760 --> 00:19:12.240
+ 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:14.520 --> 00:19:16.080
+ you can feel free to go now.
+
+00:19:16.080 --> 00:19:18.560
+ - OK, bye, everybody.
+
+00:19:18.560 --> 00:19:22.800
+ And for those sticking around, I'm
+
+00:19:22.800 --> 00:19:25.040
+ just going to keep pressing on with this.
+
+00:19:25.040 --> 00:19:30.240
+ 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
+
+00:19:35.400 --> 00:19:37.400
+ this export functionality works.
+
+00:19:37.400 --> 00:19:41.400
+ 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
+
+00:19:44.440 --> 00:19:49.320
+ is generating some ELISP and then passing it
+
+00:19:49.320 --> 00:19:51.680
+ to Emacs in batch mode.
+
+00:19:51.680 --> 00:19:53.280
+ 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.
+
+00:19:57.240 --> 00:19:59.240
+ The rest of the implementation is just
+
+00:19:59.240 --> 00:20:01.840
+ 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.
+
+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
+
+00:20:16.220 --> 00:20:16.560
+ org
+
+00:20:16.560 --> 00:20:17.320
+ documents.
+
+00:20:17.320 --> 00:20:24.440
+ And I will also interrupt myself to just pull up
+
+00:20:24.440 --> 00:20:28.040
+ the etherpad real quick.
+
+00:20:28.040 --> 00:20:29.600
+ 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
+
+00:20:34.720 --> 00:20:36.400
+ 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,
+
+00:20:44.520 --> 00:20:48.480
+ if there are any questions for me.
+
+00:20:48.480 --> 00:20:49.720
+ Are you hanging out with me?
+
+00:20:49.720 --> 00:20:53.360
+ Instead of watching RMS, you can go.
+
+00:20:53.360 --> 00:20:54.600
+ I'm teasing.
+
+00:20:54.600 --> 00:20:58.840
+ No, I mean, we know that some people can
+
+00:20:58.840 --> 00:21:00.000
+ have both streams open.
+
+00:21:00.000 --> 00:21:01.560
+ It's fine.
+
+00:21:01.560 --> 00:21:03.320
+ And right now, it's not the Q&A with RMS.
+
+00:21:03.320 --> 00:21:04.640
+ It's just the presentation.
+
+00:21:04.640 --> 00:21:07.040
+ So feel free to hang out a little longer
+
+00:21:07.040 --> 00:21:09.080
+ if you just want the live stuff.
+
+00:21:09.080 --> 00:21:09.960
+ Don't worry about it.
+
+00:21:09.960 --> 00:21:10.760
+ You're fine.
+
+00:21:10.760 --> 00:21:13.720
+ Yeah, and forgive me, everybody.
+
+00:21:13.720 --> 00:21:16.280
+ 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.
+
+00:21:18.960 --> 00:21:23.240
+ 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
+
+00:21:26.840 --> 00:21:29.800
+ and haven't come back to yet, you should, by all means,
+
+00:21:29.800 --> 00:21:30.320
+ prompt me.
+
+00:21:30.320 --> 00:21:33.800
+ A comment I might do--
+
+00:21:33.800 --> 00:21:35.400
+ 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.
+
+00:21:38.640 --> 00:21:43.120
+ 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.
+
+00:21:44.280 --> 00:21:46.160
+ 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
+
+00:21:47.960 --> 00:21:50.240
+ 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.
+
+00:21:52.160 --> 00:21:53.760
+ I've got my pad up now.
+
+00:21:53.760 --> 00:21:55.160
+ Thank you, Chancellor.
+
+00:21:55.160 --> 00:21:58.040
+ 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.
+
+00:22:03.360 --> 00:22:06.400
+ 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.
+
+00:22:07.640 --> 00:22:09.360
+ So you can't see me giving you the thumbs up.
+
+00:22:09.360 --> 00:22:09.860
+ OK, good.
+
+00:22:09.860 --> 00:22:16.000
+ All right, so let's just walk through,
+
+00:22:16.000 --> 00:22:18.400
+ because it's sort of an interesting code.
+
+00:22:18.400 --> 00:22:20.560
+ Let's just take a look real quick
+
+00:22:20.560 --> 00:22:24.720
+ at how we generated our e-list here,
+
+00:22:24.720 --> 00:22:26.520
+ because it is--
+
+00:22:26.520 --> 00:22:27.640
+ there we go.
+
+00:22:27.640 --> 00:22:29.240
+ It is a little bit interesting.
+
+00:22:29.240 --> 00:22:32.040
+ So here is the method.
+
+00:22:32.040 --> 00:22:34.080
+ 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:37.680 --> 00:22:38.920
+ document.
+
+00:22:38.920 --> 00:22:42.260
+ It has the static debug property that, as you might imagine
+
+00:22:42.260 --> 00:22:42.400
+,
+
+00:22:42.400 --> 00:22:45.480
+ can be overridden by that debug setting
+
+00:22:45.480 --> 00:22:48.440
+ we looked at in the defaults.
+
+00:22:48.440 --> 00:22:51.440
+ We also have a static variable that--
+
+00:22:51.440 --> 00:22:57.440
+ 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.
+
+00:23:00.360 --> 00:23:02.120
+ 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,
+
+00:23:09.520 --> 00:23:12.720
+ eval-ing some arbitrary list that's passed in.
+
+00:23:12.720 --> 00:23:20.480
+ All right, so the type--
+
+00:23:20.480 --> 00:23:23.080
+ this is where things start to get interesting.
+
+00:23:23.080 --> 00:23:26.480
+ So this is an implementation detail,
+
+00:23:26.480 --> 00:23:30.040
+ but-- that it's written as a static method.
+
+00:23:30.040 --> 00:23:32.160
+ But essentially, what's going on here
+
+00:23:32.160 --> 00:23:34.840
+ 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,
+
+00:23:37.480 --> 00:23:41.240
+ 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.
+
+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
+
+
+00:23:50.760 --> 00:23:51.260
+ All right.
+
+00:23:51.260 --> 00:24:04.200
+ Essentially, this program generates a program
+
+00:24:04.200 --> 00:24:10.840
+ 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
+
+00:24:15.920 --> 00:24:20.920
+ been customized in that type block,
+
+00:24:20.920 --> 00:24:25.000
+ or I think that's the only case I supported.
+
+00:24:25.000 --> 00:24:28.960
+ There was another complexity I removed.
+
+00:24:28.960 --> 00:24:32.000
+ So in that case, then I can simply
+
+00:24:32.000 --> 00:24:33.560
+ replace that program with a let.
+
+00:24:33.560 --> 00:24:41.680
+ Either way, I'm going to have everything I generate
+
+00:24:41.680 --> 00:24:45.840
+ be encapsulated in a single block.
+
+00:24:45.840 --> 00:24:49.240
+ The-- then I'm calling that format list process
+
+00:24:49.240 --> 00:24:52.760
+ that we talked about, appending to that--
+
+00:24:52.760 --> 00:25:01.680
+ or inserting into, you could say, the outer scope.
+
+00:25:01.680 --> 00:25:05.000
+ And we start by finding the file.
+
+00:25:05.000 --> 00:25:11.400
+ We then load any libraries that might be needed.
+
+00:25:11.400 --> 00:25:13.520
+ In some cases, the type might not
+
+00:25:13.520 --> 00:25:15.160
+ have any external libraries.
+
+00:25:15.160 --> 00:25:18.440
+ 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
+
+00:25:24.120 --> 00:25:27.160
+ that logic I mentioned before about selecting
+
+00:25:27.160 --> 00:25:30.160
+ either the default or export to file,
+
+00:25:30.160 --> 00:25:36.200
+ or else whatever elisp we've staged for exporting
+
+00:25:36.200 --> 00:25:38.160
+ that particular file type.
+
+00:25:38.160 --> 00:25:41.480
+ And again, in the case of PDF, there's
+
+00:25:41.480 --> 00:25:46.240
+ a special function 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.
+
+00:25:49.160 --> 00:25:50.840
+ There's intermediate forms there.
+
+00:25:50.840 --> 00:25:56.760
+ All right.
+
+00:25:56.760 --> 00:26:01.320
+ So just reminding myself if there's anything else
+
+00:26:01.320 --> 00:26:03.760
+ I have to cover on background.
+
+00:26:03.760 --> 00:26:07.440
+ And I think that pretty well covers the basics.
+
+00:26:07.440 --> 00:26:09.880
+ 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.
+
+00:26:14.600 --> 00:26:16.800
+ So here, rather than looking at the type
+
+00:26:16.800 --> 00:26:24.720
+ 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
+
+00:26:29.080 --> 00:26:30.840
+ that we want to create.
+
+00:26:30.840 --> 00:26:37.600
+ 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.
+
+00:26:40.520 --> 00:26:43.920
+ 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.
+
+00:26:49.600 --> 00:26:52.760
+ So here again, I wrap everything in a progon.
+
+00:26:52.760 --> 00:26:58.480
+ I start by preventing an interactive prompt
+
+00:26:58.480 --> 00:27:01.240
+ for the Babel execution.
+
+00:27:01.240 --> 00:27:04.960
+ And then we load languages.
+
+00:27:04.960 --> 00:27:12.240
+ This relates to another piece of our configuration
+
+00:27:12.240 --> 00:27:17.600
+ where we've specified a set of languages
+
+00:27:17.600 --> 00:27:19.920
+ that it's OK to execute.
+
+00:27:19.920 --> 00:27:24.120
+ 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
+
+00:27:28.800 --> 00:27:32.720
+ through our trivial little web server.
+
+00:27:32.720 --> 00:27:33.640
+ All right.
+
+00:27:33.640 --> 00:27:40.600
+ With that done, then, loading the selected language,
+
+00:27:40.600 --> 00:27:43.960
+ we then once again open the file.
+
+00:27:43.960 --> 00:27:46.360
+ And we're-- whoops.
+
+00:27:46.360 --> 00:27:51.800
+ 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:55.840 --> 00:27:58.040
+ 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
+
+00:28:05.160 --> 00:28:06.640
+ to a temporary file.
+
+00:28:06.640 --> 00:28:08.440
+ 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
+
+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
+.
+
+00:28:17.840 --> 00:28:20.480
+ So under-- this is another example of where it may not
+
+00:28:20.480 --> 00:28:22.520
+ be production-- well, it definitely
+
+00:28:22.520 --> 00:28:27.680
+ 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:30.860 --> 00:28:32.040
+ file,
+
+00:28:32.040 --> 00:28:34.120
+ 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--
+
+00:28:37.480 --> 00:28:42.560
+ this is basically variable interpolation,
+
+00:28:42.560 --> 00:28:47.680
+ 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,
+
+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]
+
+00:28:58.040 --> 00:29:15.000
+ Is there a problem?
+
+00:29:15.000 --> 00:29:15.760
+ No, I'm fine.
+
+00:29:15.760 --> 00:29:18.000
+ I'm just lost in my code.
+
+00:29:18.000 --> 00:29:19.040
+ OK, cool.
+
+00:29:19.040 --> 00:29:21.160
+ Oh, means, oh, I need to intervene.
+
+00:29:21.160 --> 00:29:22.240
+ What is going on?
+
+00:29:22.240 --> 00:29:23.200
+ Carry on, please.
+
+00:29:23.200 --> 00:29:24.120
+ No, I'm fine, Leo.
+
+00:29:24.120 --> 00:29:25.480
+ Thank you.
+
+00:29:25.480 --> 00:29:27.280
+ All right, so then--
+
+00:29:27.280 --> 00:29:28.680
+ so you can see we get--
+
+00:29:28.680 --> 00:29:36.720
+ we send the Babel file here, which
+
+00:29:36.720 --> 00:29:41.640
+ is calculated manually.
+
+00:29:41.640 --> 00:29:45.440
+ A bit sloppy there, since I have essentially the same--
+
+00:29:45.440 --> 00:29:47.000
+ 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.
+
+00:29:52.480 --> 00:29:54.720
+ Have I encouraged you to write your own yet?
+
+00:29:54.720 --> 00:29:56.440
+ Or send patches.
+
+00:29:56.440 --> 00:30:01.240
+ All right, so that's pretty much the nuts and bolts
+
+00:30:01.240 --> 00:30:02.400
+ 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.
+
+00:30:22.120 --> 00:30:22.620
+ All right.
+
+00:30:22.620 --> 00:30:45.880
+ 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.
+
+00:30:49.560 --> 00:30:52.680
+ 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
+
+00:30:59.920 --> 00:31:04.520
+ to make the program work.
+
+00:31:04.520 --> 00:31:07.160
+ 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.
+
+00:31:13.320 --> 00:31:14.800
+ And that, too, is failing.
+
+00:31:14.800 --> 00:31:18.040
+ So there's something unhappy in my local world.
+
+00:31:18.040 --> 00:31:19.040
+ 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
+
+00:31:26.600 --> 00:31:28.000
+ that.
+
+00:31:28.000 --> 00:31:30.640
+ Let's see.
+
+00:31:30.640 --> 00:31:31.600
+ Control Enter.
+
+00:31:31.600 --> 00:31:40.200
+ Let's take a look at that generated ELS
+
+00:31:40.200 --> 00:31:42.840
+ and compare it to-- whoa--
+
+00:31:42.840 --> 00:31:44.000
+ and compare it to--
+
+00:31:44.000 --> 00:31:52.400
+ 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.
+
+00:31:56.000 --> 00:32:02.240
+ There we go.
+
+00:32:02.240 --> 00:32:07.960
+ All right.
+
+00:32:07.960 --> 00:32:13.120
+ 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
+
+00:32:16.200 --> 00:32:18.640
+ of the variables in.
+
+00:32:18.640 --> 00:32:24.360
+ 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,
+
+00:32:27.800 --> 00:32:32.040
+ to generate the text file.
+
+00:32:32.040 --> 00:32:32.880
+ All right.
+
+00:32:32.880 --> 00:32:34.760
+ 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.
+
+00:32:39.760 --> 00:32:43.760
+ So I hope I've convinced you that this was actually
+
+00:32:43.760 --> 00:32:45.480
+ rather easy to do.
+
+00:32:45.480 --> 00:32:52.440
+ 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
+.
+
+00:33:03.760 --> 00:33:06.840
+ It has only one dependency, the Express, which
+
+00:33:06.840 --> 00:33:08.240
+ really builds the web server.
+
+00:33:08.240 --> 00:33:11.520
+ Any language you'd rather implement this in
+
+00:33:11.520 --> 00:33:14.120
+ will have a similar capability for building
+
+00:33:14.120 --> 00:33:16.280
+ some type of trivial web server.
+
+00:33:16.280 --> 00:33:18.400
+ 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
+
+00:33:22.640 --> 00:33:28.080
+ is really making the errors meaningful,
+
+00:33:28.080 --> 00:33:32.420
+ 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
+
+00:33:41.160 --> 00:33:41.520
+ left
+
+00:33:41.520 --> 00:33:42.640
+ in here--
+
+00:33:42.640 --> 00:33:45.840
+ in other cases, just trapping different types
+
+00:33:45.840 --> 00:33:47.440
+ 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.
+
+00:33:54.000 --> 00:33:55.120
+ So let me jump in here.
+
+00:33:55.120 --> 00:33:58.880
+ [VIDEO PLAYBACK]
+
+00:33:58.880 --> 00:34:00.640
+ - Cohen, just to make sure, are you switching to Q&A?
+
+00:34:00.640 --> 00:34:02.380
+ 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.
+
+00:34:05.260 --> 00:34:08.420
+ 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--
+
+00:34:10.900 --> 00:34:12.140
+ you are in charge of the room.
+
+00:34:12.140 --> 00:34:14.060
+ 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,
+
+00:34:17.220 --> 00:34:18.700
+ feel free to come in.
+
+00:34:18.700 --> 00:34:22.780
+ And there was something else I needed to say.
+
+00:34:22.780 --> 00:34:24.620
+ Yes, Cohen, if there's any problem,
+
+00:34:24.620 --> 00:34:25.700
+ whisper to us on Mumble.
+
+00:34:25.700 --> 00:34:27.500
+ So you might want to unmute Mumble
+
+00:34:27.500 --> 00:34:29.620
+ and be able to listen to us over there.
+
+00:34:29.620 --> 00:34:32.480
+ - I can't do that, Leo.
+
+00:34:32.480 --> 00:34:36.440
+ If I unmute, Mumble is going to bleed through.
+
+00:34:36.440 --> 00:34:36.960
+ - OK, sure.
+
+00:34:36.960 --> 00:34:41.160
+ Well, if you have any problem, type in emacsconf-org.ch
+
+00:34:41.160 --> 00:34:41.160
+annel,
+
+00:34:41.160 --> 00:34:42.520
+ and we'll be with you, OK?
+
+00:34:42.520 --> 00:34:43.520
+ - Or I'll PM somebody.
+
+00:34:43.520 --> 00:34:45.760
+ 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.
+
+00:34:49.040 --> 00:34:50.400
+ How's that?
+
+00:34:50.400 --> 00:34:51.160
+ - Amazing, cool.
+
+00:34:51.160 --> 00:34:53.320
+ 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.
+
+00:34:56.800 --> 00:34:58.080
+ And whenever you're available--
+
+00:34:58.080 --> 00:35:02.180
+ - I'll shut off the recording when I close the room.
+
+00:35:02.180 --> 00:35:02.980
+ - OK, great.
+
+00:35:02.980 --> 00:35:04.460
+ Good luck, Cohen.
+
+00:35:04.460 --> 00:35:06.500
+ - Thank you.
+
+00:35:06.500 --> 00:35:09.780
+ All right, and if you're still with me, well, thanks.
+
+00:35:09.780 --> 00:35:13.620
+ I appreciate that.
+
+00:35:13.620 --> 00:35:16.740
+ 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,
+
+00:35:20.060 --> 00:35:23.540
+ 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
+
+00:35:26.980 --> 00:35:28.780
+ 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:34.750 --> 00:35:35.020
+ that.
+
+00:35:35.020 --> 00:35:37.940
+ Meanwhile, let me just jump over to the question
+
+00:35:37.940 --> 00:35:38.660
+ that I received.
+
+00:35:38.660 --> 00:35:46.460
+ I'll show the pad here so that I save myself
+
+00:35:46.460 --> 00:35:47.860
+ reading the question out.
+
+00:35:47.860 --> 00:35:48.940
+ But I'll paraphrase it.
+
+00:35:48.940 --> 00:35:52.660
+ 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.
+
+00:35:54.380 --> 00:35:57.100
+ I chose to build it in Node.js because that
+
+00:35:57.100 --> 00:35:58.460
+ was trivially easy for me.
+
+00:36:22.140 --> 00:36:24.780
+ 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.
+
+00:36:27.540 --> 00:36:30.660
+ 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]
+
+00:36:34.900 --> 00:36:56.180
+ 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
+
+00:37:02.820 --> 00:37:06.980
+ 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
+
+00:37:11.540 --> 00:37:15.620
+ 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:19.100 --> 00:37:22.260
+ 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.
+
+00:37:26.820 --> 00:37:29.540
+ God, the nicest part of doing my own talk
+
+00:37:29.540 --> 00:37:31.980
+ 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.
+
+00:37:35.460 --> 00:37:38.740
+ 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.
+
+00:37:43.100 --> 00:37:45.340
+ 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:49.020 --> 00:37:50.060
+ on webcam.
+
+00:37:50.060 --> 00:37:52.300
+ 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
+
+00:37:53.980 --> 00:37:56.740
+ and lost all my time to get my prereq working.
+
+00:37:56.740 --> 00:38:10.140
+ All right, so trying to think where I can take us
+
+00:38:10.140 --> 00:38:11.540
+ without my demo working.
+
+00:38:11.540 --> 00:38:14.540
+ I was really hoping to show the org Babel piece.
+
+00:38:14.540 --> 00:38:15.580
+ That's really fun.
+
+00:38:15.580 --> 00:38:20.420
+ 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.
+
+00:38:25.980 --> 00:38:27.700
+ And usually, it's a project.
+
+00:38:27.700 --> 00:38:32.900
+ 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.
+
+00:38:37.820 --> 00:38:43.540
+ And I'll have a meeting notes section.
+
+00:38:43.540 --> 00:38:44.980
+ 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--
+
+00:38:49.540 --> 00:38:50.740
+ I'm a solutions architect.
+
+00:38:50.740 --> 00:38:55.420
+ 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.
+
+00:39:01.740 --> 00:39:05.020
+ 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]
+
+00:39:26.620 --> 00:39:29.340
+ 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
+
+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
+
+00:39:38.470 --> 00:39:39.460
+ that.
+
+00:39:39.460 --> 00:39:43.580
+ All right, as my work goes on, then this
+
+00:39:43.580 --> 00:39:47.620
+ will start getting into more detail.
+
+00:39:47.620 --> 00:40:16.620
+ [AUDIO OUT]
+
+00:40:16.620 --> 00:40:18.660
+ And things of this nature.
+
+00:40:18.660 --> 00:40:20.180
+ As things get further and further,
+
+00:40:20.180 --> 00:40:21.740
+ I'll actually have documentation
+
+00:40:21.740 --> 00:40:22.820
+ that I'm adding in here.
+
+00:40:22.820 --> 00:40:28.900
+ Oh, I see.
+
+00:40:28.900 --> 00:40:29.740
+ It's a big mess.
+
+00:40:29.740 --> 00:40:32.140
+ All right, well, we'll just reuse this.
+
+00:40:32.140 --> 00:40:40.380
+ 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:44.140 --> 00:40:44.460
+ 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]
+
+00:40:49.940 --> 00:40:51.180
+ No.
+
+00:40:51.180 --> 00:40:52.900
+ All right, completely broken.
+
+00:40:52.900 --> 00:40:57.260
+ Let me drag.
+
+00:40:57.260 --> 00:41:05.180
+ All right, well, apologies again for the poor quality
+
+00:41:05.180 --> 00:41:06.260
+ of my demo today.
+
+00:41:06.260 --> 00:41:13.900
+ 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
+
+00:41:16.820 --> 00:41:18.140
+ 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.
+
+00:41:23.740 --> 00:41:33.180
+ 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.
+
+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]
+
+00:41:44.900 --> 00:41:56.620
+ 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.
+
+00:42:04.340 --> 00:42:07.980
+ As I mentioned, I'm a conference volunteer.
+
+00:42:07.980 --> 00:42:09.700
+ This is my third year volunteering
+
+00:42:09.700 --> 00:42:11.940
+ with the conference.
+
+00:42:11.940 --> 00:42:15.140
+ 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
+
+00:42:17.740 --> 00:42:18.500
+ for the conference.
+
+00:42:18.500 --> 00:42:19.900
+ It's fun.
+
+00:42:19.900 --> 00:42:23.500
+ 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:26.660 --> 00:42:29.260
+ with people that have very different perspectives
+
+00:42:29.260 --> 00:42:32.740
+ on Emacs, 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,
+
+00:42:40.220 --> 00:42:42.940
+ 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:47.660 --> 00:42:49.380
+ interact with a lot of people that
+
+00:42:49.380 --> 00:42:53.500
+ feel the same way about that.
+
+00:42:53.500 --> 00:42:57.420
+ 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
+
+00:43:01.340 --> 00:43:05.250
+ to know people that may not use Emacs the same way that you
+
+00:43:05.250 --> 00:43:05.540
+ do.
+
+00:43:08.380 --> 00:43:10.420
+ 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
+
+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
+.
+
+00:43:20.980 --> 00:43:23.780
+ 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
+
+00:43:27.700 --> 00:43:29.540
+ written
+
+00:43:29.540 --> 00:43:30.780
+ using Node.js.
+
+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:40.060 --> 00:43:44.060
+ 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:49.980 --> 00:43:52.900
+ capability.
+
+00:43:52.900 --> 00:43:54.660
+ 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:59.270 --> 00:43:59.580
+er.
+
+00:43:59.580 --> 00:44:03.220
+ And I'm rather pleased with the fact
+
+00:44:03.220 --> 00:44:07.340
+ that the entirety of that--
+
+00:44:07.340 --> 00:44:14.180
+ 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.
+
+00:44:20.420 --> 00:44:25.820
+ Albeit a nasty one-liner, that was pretty cool
+
+00:44:25.820 --> 00:44:28.180
+ 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.
+
+00:44:31.220 --> 00:44:32.940
+ If it's this easy in JavaScript, I
+
+00:44:32.940 --> 00:44:35.700
+ wouldn't expect it to be hard, any more difficult
+
+00:44:35.700 --> 00:44:36.860
+ in your favorite language.
+
+00:44:36.860 --> 00:44:41.140
+ Glance one more time to see if there
+
+00:44:41.140 --> 00:44:42.940
+ 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
+
+00:44:47.300 --> 00:44:49.500
+ wrapping up my chat now.
+
+00:44:49.500 --> 00:44:51.620
+ 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
+
+00:44:54.580 --> 00:44:56.460
+ 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
+
+00:44:59.740 --> 00:45:03.820
+ 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]
+