WEBVTT
00:02.560 --> 00:05.040
Hi! My name is Jan, and I'll be talking
00:05.040 --> 00:07.680
about using Emacs for technical writing.
00:07.680 --> 00:09.519
Let's first define what we mean by
00:09.519 --> 00:12.080
technical writing.
00:12.080 --> 00:13.679
At least, I mean with that, any kind of
00:13.679 --> 00:15.759
writing that involves computer systems.
00:15.759 --> 00:19.700
So, maybe a developer guide for a system,
00:19.700 --> 00:21.680
or a library you've been creating,
00:21.680 --> 00:23.433
maybe reference documentation
00:23.433 --> 00:25.833
or a user guide for a REST API
00:25.833 --> 00:27.934
that you offer as a cloud service,
00:27.934 --> 00:29.767
or doing a technical presentation
00:29.767 --> 00:30.700
exactly like this one
00:30.700 --> 00:32.239
that may actually include some live
00:32.239 --> 00:34.000
coding as well that you may want to do
00:34.000 --> 00:36.000
while you're showing the presentation
00:36.000 --> 00:39.040
without too much context switching.
00:39.040 --> 00:40.399
I've been doing a variety of these
00:40.399 --> 00:43.034
things in my professional life for a while now,
00:43.034 --> 00:43.840
and I found Emacs to be a
00:43.840 --> 00:46.879
really nice tool to help out with that,
00:46.879 --> 00:50.719
since it actually pulls in different languages.
00:50.719 --> 00:52.800
The ones I work with is Scala, Java, C++,
00:52.800 --> 00:54.480
and things like that, and everything
00:54.480 --> 00:56.160
works in the same way within Emacs,
00:56.160 --> 00:58.300
so you don't have to learn different tools
00:58.400 --> 00:59.840
to do the same thing.
00:59.840 --> 01:02.079
Doing all of this against Java looks the
01:02.079 --> 01:04.720
same as it would but with C++ except
01:04.720 --> 01:07.119
the language is different.
01:07.119 --> 01:08.640
A little refresher for people that might
01:08.640 --> 01:10.666
be viewing this out of context.
01:10.666 --> 01:13.280
Emacs is a very customizable text editor
01:13.280 --> 01:15.600
environment, and Org mode is a
01:15.600 --> 01:17.360
part of Emacs that allows you to deal
01:17.360 --> 01:18.734
with structured text.
01:18.734 --> 01:21.920
So, a plain text file containing headings,
01:21.920 --> 01:25.439
lists, tables, and even code blocks
01:25.439 --> 01:27.360
formatted in a particular way, so Org
01:27.360 --> 01:29.866
mode can help out with that.
01:29.866 --> 01:32.560
And Org babel is the particular part of Org mode
01:32.560 --> 01:34.400
that deals with executing those code
01:34.400 --> 01:37.000
blocks and actually interacting with,
01:37.000 --> 01:38.720
say, a Java or a Python environment
01:38.720 --> 01:40.720
underneath, and showing the results of
01:40.720 --> 01:43.840
that right inside the same Org file.
01:43.840 --> 01:44.966
Let's look at
01:44.966 --> 01:47.167
what are a couple of scenarios
01:47.167 --> 01:49.400
using this might actually look like.
01:49.400 --> 01:52.533
Let's start with imagining that
01:52.533 --> 01:55.000
we are writing a developer guide
01:55.000 --> 01:59.439
for a service or a library,
01:59.439 --> 02:02.560
or a computer program that we might be writing.
02:02.560 --> 02:04.560
And, imagine that we have some
02:04.560 --> 02:07.119
dependencies that the program requires
02:07.119 --> 02:09.520
that are configured using docker-compose,
02:09.520 --> 02:11.767
for those who don't know Docker, docker-compose,
02:11.767 --> 02:15.599
it's a way to quickly describe some Linux
02:15.599 --> 02:17.920
programs that can be immediately run
02:17.920 --> 02:21.280
without installing too much dependencies.
02:21.280 --> 02:23.040
You define these using a YAML file
02:23.040 --> 02:25.040
called the docker-compose file.
02:25.040 --> 02:26.959
Now, here inside Emacs we have a block
02:26.959 --> 02:29.280
that defines a YAML file, and we're
02:29.280 --> 02:30.900
actually saying this is called
02:30.900 --> 02:33.840
docker-compose.yaml
02:33.840 --> 02:36.400
with some content here, and you can see
02:36.400 --> 02:38.200
that even though we are in Org mode,
02:38.200 --> 02:40.959
Org mode knows that it can highlight this
02:40.959 --> 02:43.360
according to YAML and Org mode doesn't
02:43.360 --> 02:45.200
directly know about YAML, we just said hey
02:45.200 --> 02:47.360
this block has to do with YAML.
02:47.360 --> 02:51.467
Because there's a yaml-mode in Emacs,
02:51.467 --> 02:53.280
it will borrow from that mode to actually
02:53.280 --> 02:55.920
highlight this block.
02:55.920 --> 02:57.680
Now, the fun thing is that there's a
02:57.680 --> 03:00.080
feature in Org called tangling that
03:00.080 --> 03:02.159
allows you to take these kinds of blocks
03:02.159 --> 03:04.800
and actually export them to separate files.
03:04.800 --> 03:06.959
So, if we look at the
03:06.959 --> 03:08.720
directory that we're in right now, we see
03:08.720 --> 03:10.434
that we just got the presentation,
03:10.434 --> 03:12.239
there is no docker-compose file yet.
03:12.239 --> 03:16.000
If I say Control c Control v t (C-c C-v t)
03:16.000 --> 03:18.080
and I go back and refresh this directory,
03:18.080 --> 03:20.200
now we have a docker-compose file as well,
03:20.200 --> 03:22.000
which has the content in it that we
03:22.000 --> 03:23.334
just created here.
03:23.334 --> 03:25.200
That's very nice because
03:25.200 --> 03:26.560
conceptually we don't actually need to
03:26.560 --> 03:28.080
leave Org mode, we can say something
03:28.080 --> 03:29.760
about this file and have the contents of
03:29.760 --> 03:32.480
the file in the same descriptive document
03:32.480 --> 03:34.966
while also having some actual side effect
03:34.966 --> 03:36.159
of the file existing on disk and
03:36.159 --> 03:38.000
us being able to interact with it.
03:38.000 --> 03:40.000
For example, we could…, now that the file is
03:40.000 --> 03:42.319
there, invoke docker-compose and actually
03:42.319 --> 03:44.400
create the nginx web server that we're
03:44.400 --> 03:46.700
defining here. Let's do that.
03:46.700 --> 03:47.120
We have a little block
03:47.120 --> 03:49.599
here that runs the shell script if I
03:49.599 --> 03:51.920
invoke that from Org mode, we get the
03:51.920 --> 03:53.439
results here, we see that now we have a
03:53.439 --> 03:55.867
web server running on port 8080.
03:55.867 --> 03:56.767
That's, by the way,
03:56.767 --> 03:58.319
serving up the contents of
03:58.319 --> 04:00.799
the directory that we're in here
04:00.799 --> 04:02.799
on port 8080.
04:02.799 --> 04:06.000
So, that's already quite nice.
04:06.000 --> 04:08.959
Let's look at another scenario where we
04:08.959 --> 04:11.760
may be documenting a REST API.
04:11.760 --> 04:14.720
REST APIs use a lot of HTTP interactions
04:14.720 --> 04:17.199
typically describing an XML or JSON
04:17.199 --> 04:20.000
structure and which HTTP verb GET or PUT
04:20.000 --> 04:22.320
to use with that and the URL.
04:22.320 --> 04:25.919
There's actually a nice extension to
04:25.919 --> 04:28.240
Org babel called rest client that you
04:28.240 --> 04:30.000
can install, that allows you to describe
04:30.000 --> 04:33.360
these kind of requests right inside Emacs.
04:33.360 --> 04:35.360
First, let's make sure that our HTTP
04:35.360 --> 04:36.720
server has something to respond with,
04:36.720 --> 04:38.080
that's a little interesting, for example,
04:38.080 --> 04:40.433
an XML file. We already know how to do that.
04:40.433 --> 04:42.533
So, let's create a code block type xml
04:42.533 --> 04:43.600
that we can tangle to file called
04:43.600 --> 04:46.960
test.xml, Control c Control v t (C-c C-v t).
04:46.960 --> 04:52.067
Now, if we look at the directory again,
04:52.067 --> 04:55.120
we have a test.xml file.
04:55.120 --> 04:57.520
And, now we can have a new type of block
04:57.520 --> 04:59.600
called the restclient, which will invoke
04:59.600 --> 05:01.199
REST client, and anything you type into
05:01.199 --> 05:04.160
here will be sent as an HTTP request to
05:04.160 --> 05:05.600
the server that you specify.
05:05.600 --> 05:08.880
Right now it goes to localhost on 8080 and
05:08.880 --> 05:10.720
let's see if we can get our test.xml
05:10.720 --> 05:11.433
file back.
05:11.433 --> 05:13.600
I've just invoked this, and you can see
05:13.600 --> 05:16.479
we got the spec and the content type of
05:16.479 --> 05:17.680
the server, if we scroll down a little
05:17.680 --> 05:19.199
bit I think we see the headers here, yeah,
05:19.199 --> 05:22.080
so the server said it's text/xml and
05:22.080 --> 05:23.759
restclient is smart enough to actually
05:23.759 --> 05:27.966
invoke Emacs's sgml-mode to highlight it.
05:27.966 --> 05:28.639
I'm not exactly sure
05:28.639 --> 05:31.039
what's the difference is between sxml
05:31.039 --> 05:33.680
and xml-mode and there's a nxml-mode,
05:33.680 --> 05:35.600
they all pretty much know how to deal
05:35.600 --> 05:38.800
with XML. In this case sgml was
05:38.800 --> 05:41.600
chosen, which is fine.
05:41.600 --> 05:42.960
But you can see we just served up that
05:42.960 --> 05:45.680
test.xml file, and
05:45.680 --> 05:46.880
we can have some actual text here
05:46.880 --> 05:48.639
describing "Hey, if you do this request
05:48.639 --> 05:50.734
you might get a response like that,"
05:50.734 --> 05:53.199
and the server will actually serve that up
05:53.199 --> 05:56.233
and insert it right into the Org mode document.
05:56.233 --> 05:57.759
By the way, we're looking at
05:57.759 --> 06:00.720
this now inside Emacs rendered somewhat
06:00.720 --> 06:02.479
interestingly, but obviously you can
06:02.479 --> 06:05.280
export this to a PDF, or HTML, or in all
06:05.280 --> 06:06.880
sorts of nice and different ways as well
06:06.880 --> 06:09.759
depending on what your particular needs are.
06:09.759 --> 06:11.520
Of course, we can't just send GET
06:11.520 --> 06:14.080
requests, we can send PUT requests as
06:14.080 --> 06:16.400
well, and just like in plain HTTP you
06:16.400 --> 06:19.120
have the PUT method on the first line then
06:19.120 --> 06:20.600
your headers, and a blank line,
06:20.600 --> 06:22.000
and then the body.
06:22.000 --> 06:24.720
If we try and invoke this then
06:24.720 --> 06:27.440
nginx will say "405 Not Allowed"
06:27.440 --> 06:29.199
because, obviously, just running a plain
06:29.199 --> 06:30.319
web server will not allow you to
06:30.319 --> 06:32.080
actually upload any files,
06:32.080 --> 06:33.440
but this of course could have been any
06:33.440 --> 06:36.800
other response as well.
06:36.800 --> 06:39.759
Now, let's look at doing
06:39.759 --> 06:41.600
presentations themselves, like the one
06:41.600 --> 06:42.867
you're looking at.
06:42.867 --> 06:45.766
There's a package that I like to use a lot,
06:45.766 --> 06:47.520
which is called org-tree-slide.
06:47.520 --> 06:49.759
That's the one that's active right now,
06:49.759 --> 06:52.080
which takes an Org document and allows
06:52.080 --> 06:54.600
you to show one heading at a time.
06:54.600 --> 06:55.599
It doesn't matter whether it's the first
06:55.599 --> 06:57.280
level, second level, third level heading,
06:57.280 --> 07:00.319
they sort of fold into nice
07:00.319 --> 07:02.720
things at the top,
07:02.720 --> 07:03.919
where you can
07:03.919 --> 07:05.366
sort of go through a document
07:05.366 --> 07:07.680
one piece at a time.
07:07.680 --> 07:10.367
I actually do like to use
07:10.367 --> 07:12.319
Org babel at the same time to
07:12.319 --> 07:14.479
do some live coding in it as well.
07:14.479 --> 07:16.800
Actually there are two ways to go to a PDF,
07:16.800 --> 07:20.720
you can just use the normal Org export
07:20.720 --> 07:22.733
option to go to a PDF, which is
07:22.733 --> 07:25.120
Control c Control e, and then l p (C-c C-e l p),
07:25.120 --> 07:27.520
but if you use restclient, the
07:27.520 --> 07:30.960
LaTeX file underneath sometimes gets
07:30.960 --> 07:33.280
a little wonky because those things
07:33.280 --> 07:34.866
don't directly work together.
07:34.866 --> 07:36.166
I wrote a little bit of Lisp
07:36.166 --> 07:37.039
to help out with that,
07:37.039 --> 07:38.880
which you can look at if you check
07:38.880 --> 07:40.960
out my presentation later.
07:40.960 --> 07:45.919
There's another package for Org babel called
07:45.919 --> 07:48.800
beamer, or ox-beamer it's called,
07:48.800 --> 07:51.680
which uses a LaTeX style called beamer
07:51.680 --> 07:53.360
to create a PDF,
07:53.360 --> 07:57.400
and that one looks sort of…,
07:57.400 --> 07:58.000
that one tries to actually
07:58.000 --> 07:59.840
create one page per slide which you
07:59.840 --> 08:01.039
would actually have a PDF with the
08:01.039 --> 08:03.280
slides, but that one is a lot more picky
08:03.280 --> 08:06.160
on what your Org file is
08:06.160 --> 08:07.440
structured like, so you need to have all
08:07.440 --> 08:08.879
your leaf headings at the same level,
08:08.879 --> 08:11.360
which I typically don't do.
08:11.360 --> 08:12.800
So, I can show you what this one
08:12.800 --> 08:16.639
looks like.
08:16.639 --> 08:18.240
For this presentation you get a nice
08:18.240 --> 08:20.067
title slide, and then you get…,
08:20.067 --> 08:21.167
it tries to make an outline,
08:21.167 --> 08:23.360
which is the one level above.
08:23.360 --> 08:26.319
The slides sort of look okay, but as
08:26.319 --> 08:28.479
you go further they sort of start
08:28.479 --> 08:31.680
to run into, you know,
08:31.680 --> 08:34.633
things not flowing as they should.
08:34.633 --> 08:36.800
I'm sure with a lot more LaTeX
08:36.800 --> 08:37.919
knowledge you could make this
08:37.919 --> 08:40.640
look a lot nicer, but personally I tend
08:40.640 --> 08:44.080
to just create a normal PDF document
08:44.080 --> 08:46.399
that's just, you know, text
08:46.399 --> 08:48.560
with all the actual content of the
08:48.560 --> 08:50.560
document. Inside the text you can see the
08:50.560 --> 08:52.880
highlighting of especially restclient
08:52.880 --> 08:55.920
stuff that works just fine, and
08:55.920 --> 08:57.400
it's enough for my needs,
08:57.400 --> 09:00.959
so I just tend to make plain PDFs.
09:00.959 --> 09:02.959
Since we only have 10 minutes, I will
09:02.959 --> 09:05.200
not go into the detailed configuration,
09:05.200 --> 09:06.800
you can check out the presentation
09:06.800 --> 09:09.440
online to see how all these packages are
09:09.440 --> 09:13.440
configured and how I use them,
09:13.440 --> 09:18.000
but for now that's all I have.
09:18.000 --> 09:20.000
I do recommend you try this out yourself.
09:20.000 --> 09:22.240
If you have any kind of documentation
09:22.240 --> 09:24.399
or textual things to do,
09:24.399 --> 09:26.320
just pick one of these packages at a
09:26.320 --> 09:27.519
time, integrate them into your
09:27.519 --> 09:29.200
configuration if you haven't already.
09:29.200 --> 09:31.040
That's really the best way to go
09:31.040 --> 09:32.959
about this, and you know, Google is your
09:32.959 --> 09:34.240
friend, if you think "Hey how I would do
09:34.240 --> 09:35.467
this with these packages,"
09:35.567 --> 09:37.839
definitely do that.
09:37.839 --> 09:41.760
More things I will be looking at is
09:41.760 --> 09:44.000
using this concept to write unit or
09:44.000 --> 09:45.360
integration tests, you can imagine if you
09:45.360 --> 09:47.600
have a documentation in Org mode that
09:47.600 --> 09:50.800
describes your service as a
09:50.800 --> 09:53.360
function of its REST API, you may want to
09:53.360 --> 09:55.040
actually run all those commands as part
09:55.040 --> 09:56.480
of your build and check if all the
09:56.480 --> 09:58.399
documentation is still in order.
09:58.399 --> 09:59.680
I'm not doing that yet, but I'm
09:59.680 --> 10:01.033
definitely looking into that.
10:01.133 --> 10:03.667
I'm also writing some extensions
10:03.767 --> 10:06.000
to use Java and Scala
10:06.000 --> 10:08.720
in a somewhat higher level with Org mode.
10:08.720 --> 10:11.680
But that's not entirely working yet,
10:11.680 --> 10:12.959
and we don't have time to go into that
10:12.959 --> 10:14.240
today.
10:14.240 --> 10:16.666
That's it. Thanks a lot for your attention,
10:16.766 --> 10:21.880
and I'll be there for questions later.