1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
|
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.
|