summaryrefslogtreecommitdiffstats
path: root/2021/captions
diff options
context:
space:
mode:
Diffstat (limited to '2021/captions')
-rw-r--r--2021/captions/bindat.md621
-rw-r--r--2021/captions/clede.md419
-rw-r--r--2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main--main--chapters.vtt55
-rw-r--r--2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt34
-rw-r--r--2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt1855
-rw-r--r--2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt1421
-rw-r--r--2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt1397
-rw-r--r--2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt25
-rw-r--r--2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt43
-rw-r--r--2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt26
-rw-r--r--2021/captions/emacsconf-2021-erg--emacs-research-group-season-zero-what-we-did-together-with-emacs-in-2-hours-a-week-for-a-year--noorah-alhasan-joe-corneli-raymond-puzio-leo-vivier--main--chapters.vtt43
-rw-r--r--2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt31
-rw-r--r--2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt54
-rw-r--r--2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--main--chapters.vtt82
-rw-r--r--2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt61
-rw-r--r--2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt25
-rw-r--r--2021/captions/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main--chapters.vtt37
-rw-r--r--2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt22
-rw-r--r--2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers--chapters.vtt40
-rw-r--r--2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt64
-rw-r--r--2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt750
-rw-r--r--2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt46
-rw-r--r--2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers--chapters.vtt94
-rw-r--r--2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt2752
-rw-r--r--2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt34
-rw-r--r--2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main--chapters.vtt31
-rw-r--r--2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt25
-rw-r--r--2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt31
-rw-r--r--2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt16
-rw-r--r--2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt40
-rw-r--r--2021/captions/maintainers.md157
-rw-r--r--2021/captions/native.md920
-rw-r--r--2021/captions/omegat.md600
33 files changed, 9646 insertions, 2205 deletions
diff --git a/2021/captions/bindat.md b/2021/captions/bindat.md
new file mode 100644
index 00000000..062de190
--- /dev/null
+++ b/2021/captions/bindat.md
@@ -0,0 +1,621 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hi. So I'm going to talk today" start="00:00:01.360" video="mainVideo" id=subtitle]]
+[[!template text="about a fun rewrite I did of the BinDat package." start="00:00:04.180" video="mainVideo" id=subtitle]]
+[[!template text="I call this Turbo BinDat." start="00:00:10.000" video="mainVideo" id=subtitle]]
+[[!template text="Actually, the package hasn't changed name," start="00:00:12.400" video="mainVideo" id=subtitle]]
+[[!template text="it's just that the result happens to be faster." start="00:00:14.101" video="mainVideo" id=subtitle]]
+[[!template text="The point was not to make it faster though," start="00:00:16.901" video="mainVideo" id=subtitle]]
+[[!template text="and the point was not to make you understand" start="00:00:19.621" video="mainVideo" id=subtitle]]
+[[!template text="that data is not code." start="00:00:22.341" video="mainVideo" id=subtitle]]
+[[!template text="It's just one more experience I've had" start="00:00:23.540" video="mainVideo" id=subtitle]]
+[[!template text="where I've seen that treating data as code" start="00:00:27.120" video="mainVideo" id=subtitle]]
+[[!template text="is not always a good idea." start="00:00:31.381" video="mainVideo" id=subtitle]]
+[[!template text="It's important to keep the difference." start="00:00:33.622" video="mainVideo" id=subtitle]]
+[[!template text="So let's get started." start="00:00:36.162" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So what is BinDat anyway?" start="00:00:38.881" video="mainVideo" id=subtitle]]
+[[!template text="Here's just the overview of basically" start="00:00:40.742" video="mainVideo" id=subtitle]]
+[[!template text="what I'm going to present." start="00:00:43.602" video="mainVideo" id=subtitle]]
+[[!template text="So I'm first going to present BinDat itself" start="00:00:45.062" video="mainVideo" id=subtitle]]
+[[!template text="for those who don't know it," start="00:00:47.843" video="mainVideo" id=subtitle]]
+[[!template text="which is probably the majority of you." start="00:00:49.039" video="mainVideo" id=subtitle]]
+[[!template text="Then I'm going to talk about the actual problems" start="00:00:51.923" video="mainVideo" id=subtitle]]
+[[!template text="that I encountered with this package" start="00:00:55.363" video="mainVideo" id=subtitle]]
+[[!template text="that motivated me to rewrite it." start="00:00:58.882" video="mainVideo" id=subtitle]]
+[[!template text="Most of them were lack of flexibility," start="00:01:01.843" video="mainVideo" id=subtitle]]
+[[!template text="and some of it was just poor behavior" start="00:01:05.044" video="mainVideo" id=subtitle]]
+[[!template text="with respect to scoping and variables," start="00:01:09.924" video="mainVideo" id=subtitle]]
+[[!template text="which of course, you know, is bad --" start="00:01:13.364" video="mainVideo" id=subtitle]]
+[[!template text="basically uses of eval or, &quot ;eval is evil.&quot ;" start="00:01:16.424" video="mainVideo" id=subtitle]]
+[[!template text="Then I'm going to talk about the new design --" start="00:01:20.724" video="mainVideo" id=subtitle]]
+[[!template text="how I redesigned it" start="00:01:24.985" video="mainVideo" id=subtitle]]
+[[!template text="to make it both simpler and more flexible," start="00:01:28.105" video="mainVideo" id=subtitle]]
+[[!template text="and where the key idea was" start="00:01:31.365" video="mainVideo" id=subtitle]]
+[[!template text="to expose code as code" start="00:01:33.065" video="mainVideo" id=subtitle]]
+[[!template text="instead of having it as data," start="00:01:35.305" video="mainVideo" id=subtitle]]
+[[!template text="and so here the distinction between the two" start="00:01:37.625" video="mainVideo" id=subtitle]]
+[[!template text="is important and made things simpler." start="00:01:39.706" video="mainVideo" id=subtitle]]
+[[!template text="I tried to keep efficiency in mind," start="00:01:44.085" video="mainVideo" id=subtitle]]
+[[!template text="which resulted in some of the aspects of the design" start="00:01:46.405" video="mainVideo" id=subtitle]]
+[[!template text="which are not completely satisfactory," start="00:01:52.505" video="mainVideo" id=subtitle]]
+[[!template text="but the result is actually fairly efficient." start="00:01:54.886" video="mainVideo" id=subtitle]]
+[[!template text="Even though it was not the main motivation," start="00:01:57.146" video="mainVideo" id=subtitle]]
+[[!template text="it was one of the nice outcomes." start="00:01:59.287" video="mainVideo" id=subtitle]]
+[[!template text="And then I'm going to present some examples." start="00:02:02.967" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So first: what is BinDat?" start="00:02:06.007" video="mainVideo" id=subtitle]]
+[[!template text="Oh actually, rather than present THIS," start="00:02:08.267" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to go straight to the code," start="00:02:10.667" video="mainVideo" id=subtitle]]
+[[!template text="because BinDat actually had" start="00:02:12.507" video="mainVideo" id=subtitle]]
+[[!template text="an introduction which was fairly legible." start="00:02:14.346" video="mainVideo" id=subtitle]]
+[[!template text="So here we go: this is the old BinDat from Emacs 27" start="00:02:16.748" video="mainVideo" id=subtitle]]
+[[!template text="and the commentary starts by explaining" start="00:02:21.128" video="mainVideo" id=subtitle]]
+[[!template text="what is BinDat? Basically BinDat is a package" start="00:02:23.448" video="mainVideo" id=subtitle]]
+[[!template text="that lets you parse and unparse" start="00:02:25.948" video="mainVideo" id=subtitle]]
+[[!template text="basically binary data." start="00:02:30.247" video="mainVideo" id=subtitle]]
+[[!template text="The intent is to have typically network data" start="00:02:31.627" video="mainVideo" id=subtitle]]
+[[!template text="or something like this." start="00:02:34.749" video="mainVideo" id=subtitle]]
+[[!template text="So assuming you have network data," start="00:02:35.949" video="mainVideo" id=subtitle]]
+[[!template text="presented or defined" start="00:02:38.328" video="mainVideo" id=subtitle]]
+[[!template text="with some kind of C-style structs, typically," start="00:02:41.628" video="mainVideo" id=subtitle]]
+[[!template text="or something along these lines." start="00:02:44.669" video="mainVideo" id=subtitle]]
+[[!template text="So you presumably start with documentation" start="00:02:46.109" video="mainVideo" id=subtitle]]
+[[!template text="that presents something like those structs here," start="00:02:49.120" video="mainVideo" id=subtitle]]
+[[!template text="and you want to be able to generate such packets" start="00:02:52.810" video="mainVideo" id=subtitle]]
+[[!template text="and read such packets," start="00:02:57.230" video="mainVideo" id=subtitle]]
+[[!template text="so the way you do it is" start="00:03:00.349" video="mainVideo" id=subtitle]]
+[[!template text="you rewrite those specifications" start="00:03:02.190" video="mainVideo" id=subtitle]]
+[[!template text="into the BinDat syntax." start="00:03:04.670" video="mainVideo" id=subtitle]]
+[[!template text="So here's the BinDat syntax" start="00:03:06.110" video="mainVideo" id=subtitle]]
+[[!template text="for the the previous specification." start="00:03:07.529" video="mainVideo" id=subtitle]]
+[[!template text="So here, for example," start="00:03:10.491" video="mainVideo" id=subtitle]]
+[[!template text="you see the case for a data packet" start="00:03:11.610" video="mainVideo" id=subtitle]]
+[[!template text="which will have a 'type' field which is a byte" start="00:03:16.970" video="mainVideo" id=subtitle]]
+[[!template text="(an unsigned 8-bit entity)," start="00:03:20.411" video="mainVideo" id=subtitle]]
+[[!template text="then an 'opcode' which is also a byte," start="00:03:24.091" video="mainVideo" id=subtitle]]
+[[!template text="then a 'length' which is a 16-bit unsigned integer" start="00:03:26.411" video="mainVideo" id=subtitle]]
+[[!template text="in little endian order," start="00:03:30.732" video="mainVideo" id=subtitle]]
+[[!template text="and then some 'id' for this entry, which is" start="00:03:34.092" video="mainVideo" id=subtitle]]
+[[!template text="8 bytes containing a zero-terminated string," start="00:03:38.732" video="mainVideo" id=subtitle]]
+[[!template text="and then the actual data, basically the payload," start="00:03:43.531" video="mainVideo" id=subtitle]]
+[[!template text="which is in this case a vector of bytes," start="00:03:47.532" video="mainVideo" id=subtitle]]
+[[!template text="('bytes' here doesn't doesn't need to be specified)" start="00:03:51.453" video="mainVideo" id=subtitle]]
+[[!template text="and here we specify the length of this vector." start="00:03:54.812" video="mainVideo" id=subtitle]]
+[[!template text="This 'length' here" start="00:03:58.172" video="mainVideo" id=subtitle]]
+[[!template text="happens to be actually the name of THIS field," start="00:03:59.773" video="mainVideo" id=subtitle]]
+[[!template text="so the length of the data" start="00:04:02.252" video="mainVideo" id=subtitle]]
+[[!template text="is specified by the 'length' field here," start="00:04:03.854" video="mainVideo" id=subtitle]]
+[[!template text="and BinDat will understand this part," start="00:04:06.574" video="mainVideo" id=subtitle]]
+[[!template text="which is the the nice part of BinDat." start="00:04:08.574" video="mainVideo" id=subtitle]]
+[[!template text="And then you have an alignment field at the end," start="00:04:12.333" video="mainVideo" id=subtitle]]
+[[!template text="which is basically padding." start="00:04:15.774" video="mainVideo" id=subtitle]]
+[[!template text="It says that it is padded" start="00:04:18.253" video="mainVideo" id=subtitle]]
+[[!template text="until the next multiple of four." start="00:04:20.575" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So this works reasonably well." start="00:04:23.295" video="mainVideo" id=subtitle]]
+[[!template text="This is actually very nice." start="00:04:25.855" video="mainVideo" id=subtitle]]
+[[!template text="With this, you can then call" start="00:04:27.455" video="mainVideo" id=subtitle]]
+[[!template text="bindat-pack or bindat-unpack," start="00:04:30.335" video="mainVideo" id=subtitle]]
+[[!template text="passing it a string, or passing it an alist," start="00:04:32.975" video="mainVideo" id=subtitle]]
+[[!template text="to do the packing and unpacking." start="00:04:37.774" video="mainVideo" id=subtitle]]
+[[!template text="So, for example, if you take this string--" start="00:04:40.416" video="mainVideo" id=subtitle]]
+[[!template text="actually, in this case, it's a vector of bytes" start="00:04:43.296" video="mainVideo" id=subtitle]]
+[[!template text="but it works the same; it works in both ways--" start="00:04:45.856" video="mainVideo" id=subtitle]]
+[[!template text="if you pass this to bindat-unpack," start="00:04:49.456" video="mainVideo" id=subtitle]]
+[[!template text="it will presumably return you this structure" start="00:04:53.536" video="mainVideo" id=subtitle]]
+[[!template text="if you've given it the corresponding type." start="00:04:57.457" video="mainVideo" id=subtitle]]
+[[!template text="So it will extract--" start="00:05:00.017" video="mainVideo" id=subtitle]]
+[[!template text="you will see that there is an IP address," start="00:05:01.776" video="mainVideo" id=subtitle]]
+[[!template text="which is a destination IP, a source IP," start="00:05:05.617" video="mainVideo" id=subtitle]]
+[[!template text="and some port number," start="00:05:08.017" video="mainVideo" id=subtitle]]
+[[!template text="and some actual data here and there, etc." start="00:05:09.857" video="mainVideo" id=subtitle]]
+[[!template text="So this is quite convenient if you need to do this," start="00:05:12.977" video="mainVideo" id=subtitle]]
+[[!template text="and that's what it was designed for." start="00:05:18.018" video="mainVideo" id=subtitle]]
+[[!template text="So here we are. Let's go back to the actual talk." start="00:05:20.898" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I converted BinDat to lexical scoping at some point" start="00:05:27.538" video="mainVideo" id=subtitle]]
+[[!template text="and things seemed to work fine," start="00:05:34.339" video="mainVideo" id=subtitle]]
+[[!template text="except, at some point, probably weeks later," start="00:05:37.299" video="mainVideo" id=subtitle]]
+[[!template text="I saw a bug report" start="00:05:42.819" video="mainVideo" id=subtitle]]
+[[!template text="about the new version using lexical scoping" start="00:05:47.139" video="mainVideo" id=subtitle]]
+[[!template text="not working correctly with WeeChat." start="00:05:53.059" video="mainVideo" id=subtitle]]
+[[!template text="So here's the actual chunk of code" start="00:05:56.339" video="mainVideo" id=subtitle]]
+[[!template text="that appears in WeeChat." start="00:06:00.580" video="mainVideo" id=subtitle]]
+[[!template text="Here you see that they also define a BinDat spec." start="00:06:02.820" video="mainVideo" id=subtitle]]
+[[!template text="It's a packet that has a 32-bit unsigned length," start="00:06:08.421" video="mainVideo" id=subtitle]]
+[[!template text="then some compression byte/compression information," start="00:06:14.741" video="mainVideo" id=subtitle]]
+[[!template text="then an id which contains basically another struct" start="00:06:18.500" video="mainVideo" id=subtitle]]
+[[!template text="(which is specified elsewhere; doesn't matter here)," start="00:06:23.780" video="mainVideo" id=subtitle]]
+[[!template text="and after that, a vector" start="00:06:26.902" video="mainVideo" id=subtitle]]
+[[!template text="whose size is not just specified by 'length'," start="00:06:28.661" video="mainVideo" id=subtitle]]
+[[!template text="but is computed from 'length'." start="00:06:33.382" video="mainVideo" id=subtitle]]
+[[!template text="So here's how they used to compute it in WeeChat." start="00:06:35.142" video="mainVideo" id=subtitle]]
+[[!template text="So the length here can be specified in BinDat." start="00:06:39.142" video="mainVideo" id=subtitle]]
+[[!template text="Instead of having" start="00:06:42.822" video="mainVideo" id=subtitle]]
+[[!template text="just a reference to one of the fields," start="00:06:43.942" video="mainVideo" id=subtitle]]
+[[!template text="or having a constant, you can actually compute it," start="00:06:45.863" video="mainVideo" id=subtitle]]
+[[!template text="where you have to use this '(eval'," start="00:06:48.903" video="mainVideo" id=subtitle]]
+[[!template text="and then followed by the actual expression" start="00:06:52.502" video="mainVideo" id=subtitle]]
+[[!template text="where you say how you compute it." start="00:06:54.743" video="mainVideo" id=subtitle]]
+[[!template text="And here you see that it actually computes it" start="00:06:58.103" video="mainVideo" id=subtitle]]
+[[!template text="based on the 'length of the structure --" start="00:07:01.464" video="mainVideo" id=subtitle]]
+[[!template text="that's supposed to be this 'length' field here --" start="00:07:04.904" video="mainVideo" id=subtitle]]
+[[!template text="and it's referred to using the bindat-get-field" start="00:07:07.783" video="mainVideo" id=subtitle]]
+[[!template text="to extract the field from the variable 'struct'." start="00:07:11.223" video="mainVideo" id=subtitle]]
+[[!template text="And then it subtracts four, it subtracts one," start="00:07:14.503" video="mainVideo" id=subtitle]]
+[[!template text="and adds some other things" start="00:07:17.943" video="mainVideo" id=subtitle]]
+[[!template text="which depend on some field" start="00:07:19.468" video="mainVideo" id=subtitle]]
+[[!template text="that's found in this 'id' field here." start="00:07:22.185" video="mainVideo" id=subtitle]]
+[[!template text="And the problem with this code" start="00:07:26.905" video="mainVideo" id=subtitle]]
+[[!template text="was that it broke" start="00:07:28.425" video="mainVideo" id=subtitle]]
+[[!template text="because of this 'struct' variable here," start="00:07:30.425" video="mainVideo" id=subtitle]]
+[[!template text="because this 'struct' variable is not defined" start="00:07:32.745" video="mainVideo" id=subtitle]]
+[[!template text="anywhere in the specification of BinDat." start="00:07:35.145" video="mainVideo" id=subtitle]]
+[[!template text="It was used internally as a local variable," start="00:07:38.106" video="mainVideo" id=subtitle]]
+[[!template text="and because it was using dynamic scoping," start="00:07:41.866" video="mainVideo" id=subtitle]]
+[[!template text="it actually happened to be available here," start="00:07:45.306" video="mainVideo" id=subtitle]]
+[[!template text="but the documentation nowhere specifies it." start="00:07:47.386" video="mainVideo" id=subtitle]]
+[[!template text="So it was not exactly" start="00:07:50.826" video="mainVideo" id=subtitle]]
+[[!template text="a bug of the conversion to lexical scoping," start="00:07:52.506" video="mainVideo" id=subtitle]]
+[[!template text="but it ended up breaking this code." start="00:07:55.547" video="mainVideo" id=subtitle]]
+[[!template text="And there was no way to actually" start="00:07:58.906" video="mainVideo" id=subtitle]]
+[[!template text="fix the code within the specification of BinDat." start="00:08:01.226" video="mainVideo" id=subtitle]]
+[[!template text="You had to go outside the specification of BinDat" start="00:08:05.066" video="mainVideo" id=subtitle]]
+[[!template text="to fix this problem." start="00:08:08.287" video="mainVideo" id=subtitle]]
+[[!template text="This is basically how I started looking at BinDat." start="00:08:10.427" video="mainVideo" id=subtitle]]
+[[!template text="Then I went to actually investigate a bit more" start="00:08:14.347" video="mainVideo" id=subtitle]]
+[[!template text="what was going on," start="00:08:17.808" video="mainVideo" id=subtitle]]
+[[!template text="and the thing I noticed along the way" start="00:08:19.627" video="mainVideo" id=subtitle]]
+[[!template text="was basically that the specification of BinDat" start="00:08:22.108" video="mainVideo" id=subtitle]]
+[[!template text="is fairly complex and has a lot of eval" start="00:08:25.787" video="mainVideo" id=subtitle]]
+[[!template text="and things like this." start="00:08:29.528" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's take a look" start="00:08:30.749" video="mainVideo" id=subtitle]]
+[[!template text="at what the BinDat specification looks like." start="00:08:32.288" video="mainVideo" id=subtitle]]
+[[!template text="So here it's actually documented" start="00:08:35.068" video="mainVideo" id=subtitle]]
+[[!template text="as a kind of grammar rules." start="00:08:36.589" video="mainVideo" id=subtitle]]
+[[!template text="A specification is basically a sequence of items," start="00:08:40.269" video="mainVideo" id=subtitle]]
+[[!template text="and then each of the items is basically" start="00:08:45.308" video="mainVideo" id=subtitle]]
+[[!template text="a FIELD of a struct, so it has a FIELD name," start="00:08:47.389" video="mainVideo" id=subtitle]]
+[[!template text="and then a TYPE." start="00:08:51.249" video="mainVideo" id=subtitle]]
+[[!template text="Instead of a TYPE," start="00:08:53.249" video="mainVideo" id=subtitle]]
+[[!template text="it could have some other FORM for eval," start="00:08:54.510" video="mainVideo" id=subtitle]]
+[[!template text="which was basically never used as far as I know," start="00:08:56.590" video="mainVideo" id=subtitle]]
+[[!template text="or it can be some filler," start="00:08:58.989" video="mainVideo" id=subtitle]]
+[[!template text="or you can have some 'align' specification," start="00:09:00.190" video="mainVideo" id=subtitle]]
+[[!template text="or you can refer to another struct." start="00:09:02.750" video="mainVideo" id=subtitle]]
+[[!template text="It could also be some kind of union," start="00:09:05.150" video="mainVideo" id=subtitle]]
+[[!template text="or it can be some kind of repetition of something." start="00:09:07.391" video="mainVideo" id=subtitle]]
+[[!template text="And then you have the TYPE specified here," start="00:09:10.430" video="mainVideo" id=subtitle]]
+[[!template text="which can be some integers, strings, or a vector," start="00:09:12.430" video="mainVideo" id=subtitle]]
+[[!template text="and there are a few other special cases." start="00:09:18.271" video="mainVideo" id=subtitle]]
+[[!template text="And then the actual field itself" start="00:09:21.631" video="mainVideo" id=subtitle]]
+[[!template text="can be either a NAME, or something that's computed," start="00:09:25.311" video="mainVideo" id=subtitle]]
+[[!template text="and then everywhere here, you have LEN," start="00:09:28.192" video="mainVideo" id=subtitle]]
+[[!template text="which specifies the length of vectors," start="00:09:30.752" video="mainVideo" id=subtitle]]
+[[!template text="for example, or length of strings." start="00:09:32.480" video="mainVideo" id=subtitle]]
+[[!template text="This is actually either nil to mean one," start="00:09:34.672" video="mainVideo" id=subtitle]]
+[[!template text="or it can be an ARG," start="00:09:37.632" video="mainVideo" id=subtitle]]
+[[!template text="where ARG is defined to be" start="00:09:39.072" video="mainVideo" id=subtitle]]
+[[!template text="either an integer or DEREF," start="00:09:40.952" video="mainVideo" id=subtitle]]
+[[!template text="where DEREF is basically a specification" start="00:09:42.673" video="mainVideo" id=subtitle]]
+[[!template text="that can refer, for example, to the 'length' field" start="00:09:46.673" video="mainVideo" id=subtitle]]
+[[!template text="-- that's what we saw between parentheses: (length)" start="00:09:48.833" video="mainVideo" id=subtitle]]
+[[!template text="was this way to refer to the 'length' field." start="00:09:51.956" video="mainVideo" id=subtitle]]
+[[!template text="Or it can be an expression, which is what we saw" start="00:09:56.273" video="mainVideo" id=subtitle]]
+[[!template text="in the computation of the length for WeeChat," start="00:09:59.794" video="mainVideo" id=subtitle]]
+[[!template text="where you just had a '(eval'" start="00:10:02.834" video="mainVideo" id=subtitle]]
+[[!template text="and then some computation" start="00:10:04.914" video="mainVideo" id=subtitle]]
+[[!template text="of the length of the payload." start="00:10:06.334" video="mainVideo" id=subtitle]]
+[[!template text="And so if you look here, you see that" start="00:10:10.274" video="mainVideo" id=subtitle]]
+[[!template text="it is fairly large and complex," start="00:10:12.354" video="mainVideo" id=subtitle]]
+[[!template text="and it uses eval everywhere. And actually," start="00:10:14.674" video="mainVideo" id=subtitle]]
+[[!template text="it's not just that it has eval in its syntax," start="00:10:18.515" video="mainVideo" id=subtitle]]
+[[!template text="but the implementation has to use eval everywhere," start="00:10:20.675" video="mainVideo" id=subtitle]]
+[[!template text="because, if you go back" start="00:10:23.395" video="mainVideo" id=subtitle]]
+[[!template text="to see the kind of code we see," start="00:10:25.314" video="mainVideo" id=subtitle]]
+[[!template text="we see here we just define" start="00:10:27.475" video="mainVideo" id=subtitle]]
+[[!template text="weechat--relay-message-spec as a constant!" start="00:10:29.538" video="mainVideo" id=subtitle]]
+[[!template text="It's nothing than just data, right?" start="00:10:34.195" video="mainVideo" id=subtitle]]
+[[!template text="So within this data" start="00:10:37.315" video="mainVideo" id=subtitle]]
+[[!template text="there are things we need to evaluate," start="00:10:38.836" video="mainVideo" id=subtitle]]
+[[!template text="but it's pure data," start="00:10:41.076" video="mainVideo" id=subtitle]]
+[[!template text="so it will have to be evaluated" start="00:10:42.356" video="mainVideo" id=subtitle]]
+[[!template text="by passing it to eval. It can't be compiled," start="00:10:44.356" video="mainVideo" id=subtitle]]
+[[!template text="because it's within a quote, right?" start="00:10:46.596" video="mainVideo" id=subtitle]]
+[[!template text="And so for that reason, kittens really" start="00:10:50.196" video="mainVideo" id=subtitle]]
+[[!template text="suffer terribly with uses of BinDat." start="00:10:52.837" video="mainVideo" id=subtitle]]
+[[!template text="You really have to be very careful with that." start="00:10:55.956" video="mainVideo" id=subtitle]]
+[[!template text="More seriously," start="00:10:59.957" video="mainVideo" id=subtitle]]
+[[!template text="the 'struct' variable was not documented," start="00:11:02.037" video="mainVideo" id=subtitle]]
+[[!template text="and yet it's indispensable" start="00:11:05.157" video="mainVideo" id=subtitle]]
+[[!template text="for important applications," start="00:11:07.797" video="mainVideo" id=subtitle]]
+[[!template text="such as using in WeeChat." start="00:11:08.996" video="mainVideo" id=subtitle]]
+[[!template text="So clearly this needs to be fixed." start="00:11:11.158" video="mainVideo" id=subtitle]]
+[[!template text="Of course, we can just document 'struct'" start="00:11:13.078" video="mainVideo" id=subtitle]]
+[[!template text="as some variable that's used there," start="00:11:15.481" video="mainVideo" id=subtitle]]
+[[!template text="but of course we don't want to do that," start="00:11:18.038" video="mainVideo" id=subtitle]]
+[[!template text="because 'struct' is not obviously" start="00:11:19.798" video="mainVideo" id=subtitle]]
+[[!template text="a dynamically scoped variable," start="00:11:23.398" video="mainVideo" id=subtitle]]
+[[!template text="so it's not very clean." start="00:11:25.398" video="mainVideo" id=subtitle]]
+[[!template text="Also other problems I noticed was that the grammar" start="00:11:29.318" video="mainVideo" id=subtitle]]
+[[!template text="is significantly more complex than necessary." start="00:11:31.939" video="mainVideo" id=subtitle]]
+[[!template text="We have nine distinct non-terminals." start="00:11:35.239" video="mainVideo" id=subtitle]]
+[[!template text="There is ambiguity." start="00:11:38.199" video="mainVideo" id=subtitle]]
+[[!template text="If you try to use a field whose name is 'align'," start="00:11:39.639" video="mainVideo" id=subtitle]]
+[[!template text="or 'fill', or something like this," start="00:11:44.919" video="mainVideo" id=subtitle]]
+[[!template text="then it's going to be misinterpreted," start="00:11:48.680" video="mainVideo" id=subtitle]]
+[[!template text="or it can be misinterpreted." start="00:11:50.920" video="mainVideo" id=subtitle]]
+[[!template text="The vector length can be either an expression," start="00:11:54.920" video="mainVideo" id=subtitle]]
+[[!template text="or an integer, or a reference to a label," start="00:11:58.760" video="mainVideo" id=subtitle]]
+[[!template text="but the expression" start="00:12:02.280" video="mainVideo" id=subtitle]]
+[[!template text="should already be the general case," start="00:12:03.720" video="mainVideo" id=subtitle]]
+[[!template text="and this expression can itself be" start="00:12:06.361" video="mainVideo" id=subtitle]]
+[[!template text="just a constant integer," start="00:12:08.041" video="mainVideo" id=subtitle]]
+[[!template text="so this complexity is probably not indispensable," start="00:12:09.401" video="mainVideo" id=subtitle]]
+[[!template text="or it could be replaced with something simpler." start="00:12:13.961" video="mainVideo" id=subtitle]]
+[[!template text="That's what I felt like." start="00:12:15.641" video="mainVideo" id=subtitle]]
+[[!template text="And basically lots of places" start="00:12:17.401" video="mainVideo" id=subtitle]]
+[[!template text="allow an (eval EXP) form somewhere" start="00:12:19.161" video="mainVideo" id=subtitle]]
+[[!template text="to open up the door for more flexibility," start="00:12:21.721" video="mainVideo" id=subtitle]]
+[[!template text="but not all of them do," start="00:12:25.082" video="mainVideo" id=subtitle]]
+[[!template text="and we don't really want" start="00:12:26.922" video="mainVideo" id=subtitle]]
+[[!template text="to have this eval there, right?" start="00:12:29.482" video="mainVideo" id=subtitle]]
+[[!template text="It's not very convenient syntactically either." start="00:12:31.001" video="mainVideo" id=subtitle]]
+[[!template text="So it makes the uses of eval" start="00:12:33.802" video="mainVideo" id=subtitle]]
+[[!template text="a bit heavier than they need to be," start="00:12:36.042" video="mainVideo" id=subtitle]]
+[[!template text="and so I didn't really like this part." start="00:12:38.362" video="mainVideo" id=subtitle]]
+[[!template text="Another part is that" start="00:12:41.723" video="mainVideo" id=subtitle]]
+[[!template text="when I tried to figure out what was going on," start="00:12:42.603" video="mainVideo" id=subtitle]]
+[[!template text="dog barks and distracts Stefan" start="00:12:45.183" video="mainVideo" id=subtitle]]
+[[!template text="I had trouble... Winnie as well, as you can hear." start="00:12:46.666" video="mainVideo" id=subtitle]]
+[[!template text="She had trouble as well." start="00:12:50.043" video="mainVideo" id=subtitle]]
+[[!template text="But one of the troubles was that" start="00:12:50.923" video="mainVideo" id=subtitle]]
+[[!template text="there was no way to debug the code" start="00:12:53.083" video="mainVideo" id=subtitle]]
+[[!template text="via Edebug, because it's just data," start="00:12:55.002" video="mainVideo" id=subtitle]]
+[[!template text="so Edebug doesn't know that it has to look at it" start="00:12:57.562" video="mainVideo" id=subtitle]]
+[[!template text="and instrument it." start="00:13:00.524" video="mainVideo" id=subtitle]]
+[[!template text="And of course it was not conveniently extensible." start="00:13:02.683" video="mainVideo" id=subtitle]]
+[[!template text="That's also one of the things" start="00:13:05.644" video="mainVideo" id=subtitle]]
+[[!template text="I noticed along the way." start="00:13:07.164" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so here's an example of" start="00:13:09.084" video="mainVideo" id=subtitle]]
+[[!template text="problems not that I didn't just see there," start="00:13:12.844" video="mainVideo" id=subtitle]]
+[[!template text="but that were actually present in code." start="00:13:15.485" video="mainVideo" id=subtitle]]
+[[!template text="I went to look at code that was using BinDat" start="00:13:18.684" video="mainVideo" id=subtitle]]
+[[!template text="to see what uses looked like," start="00:13:22.124" video="mainVideo" id=subtitle]]
+[[!template text="and I saw that BinDat was not used very heavily," start="00:13:24.285" video="mainVideo" id=subtitle]]
+[[!template text="but some of the main uses" start="00:13:28.765" video="mainVideo" id=subtitle]]
+[[!template text="were just to read and write integers." start="00:13:30.365" video="mainVideo" id=subtitle]]
+[[!template text="And here you can see a very typical case." start="00:13:33.885" video="mainVideo" id=subtitle]]
+[[!template text="This is also coming from WeeChat." start="00:13:37.565" video="mainVideo" id=subtitle]]
+[[!template text="We do a bindat-get-field" start="00:13:41.726" video="mainVideo" id=subtitle]]
+[[!template text="of the length of some struct we read." start="00:13:43.565" video="mainVideo" id=subtitle]]
+[[!template text="Actually, the struct we read is here." start="00:13:48.445" video="mainVideo" id=subtitle]]
+[[!template text="It has a single field," start="00:13:50.685" video="mainVideo" id=subtitle]]
+[[!template text="because the only thing we want to do" start="00:13:51.647" video="mainVideo" id=subtitle]]
+[[!template text="is actually to unpack a 32-bit integer," start="00:13:53.006" video="mainVideo" id=subtitle]]
+[[!template text="but the only way we can do that" start="00:13:56.287" video="mainVideo" id=subtitle]]
+[[!template text="is by specifying a struct with one field." start="00:13:58.287" video="mainVideo" id=subtitle]]
+[[!template text="And so we have to extract this struct of one field," start="00:14:01.647" video="mainVideo" id=subtitle]]
+[[!template text="which constructs an alist" start="00:14:04.847" video="mainVideo" id=subtitle]]
+[[!template text="containing the actual integer," start="00:14:07.246" video="mainVideo" id=subtitle]]
+[[!template text="and then we just use get-field to extract it." start="00:14:09.648" video="mainVideo" id=subtitle]]
+[[!template text="So this doesn't seem very elegant" start="00:14:11.887" video="mainVideo" id=subtitle]]
+[[!template text="to have to construct an alist" start="00:14:15.007" video="mainVideo" id=subtitle]]
+[[!template text="just to then extract the integer from it." start="00:14:16.528" video="mainVideo" id=subtitle]]
+[[!template text="Same thing if you try to pack it:" start="00:14:20.368" video="mainVideo" id=subtitle]]
+[[!template text="you first have to construct the alist" start="00:14:21.648" video="mainVideo" id=subtitle]]
+[[!template text="to pass it to bindat-pack unnecessarily." start="00:14:25.007" video="mainVideo" id=subtitle]]
+[[!template text="Another problem that I saw in this case" start="00:14:31.248" video="mainVideo" id=subtitle]]
+[[!template text="(it was in the websocket package)" start="00:14:33.248" video="mainVideo" id=subtitle]]
+[[!template text="was here, where they actually have a function" start="00:14:35.729" video="mainVideo" id=subtitle]]
+[[!template text="where they need to write" start="00:14:39.568" video="mainVideo" id=subtitle]]
+[[!template text="an integer of a size that will vary" start="00:14:41.169" video="mainVideo" id=subtitle]]
+[[!template text="depending on the circumstances." start="00:14:43.888" video="mainVideo" id=subtitle]]
+[[!template text="And so they have to test the value of this integer," start="00:14:45.889" video="mainVideo" id=subtitle]]
+[[!template text="and depending on which one it is," start="00:14:49.650" video="mainVideo" id=subtitle]]
+[[!template text="they're going to use different types." start="00:14:52.210" video="mainVideo" id=subtitle]]
+[[!template text="So here it's a case" start="00:14:54.449" video="mainVideo" id=subtitle]]
+[[!template text="where we want to have some kind of way to eval --" start="00:14:56.290" video="mainVideo" id=subtitle]]
+[[!template text="to compute the length of the integer --" start="00:14:59.490" video="mainVideo" id=subtitle]]
+[[!template text="instead of it being predefined or fixed." start="00:15:02.531" video="mainVideo" id=subtitle]]
+[[!template text="So this is one of the cases" start="00:15:08.130" video="mainVideo" id=subtitle]]
+[[!template text="where the lack of eval was a problem." start="00:15:10.211" video="mainVideo" id=subtitle]]
+[[!template text="And actually in all of websocket," start="00:15:16.531" video="mainVideo" id=subtitle]]
+[[!template text="BinDat is only used to pack and unpack integers," start="00:15:20.051" video="mainVideo" id=subtitle]]
+[[!template text="even though there are many more opportunities" start="00:15:22.612" video="mainVideo" id=subtitle]]
+[[!template text="to use BinDat in there." start="00:15:24.612" video="mainVideo" id=subtitle]]
+[[!template text="But it's not very convenient to use BinDat," start="00:15:26.772" video="mainVideo" id=subtitle]]
+[[!template text="as it stands, for those other cases." start="00:15:29.331" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So what does the new design look like?" start="00:15:35.891" video="mainVideo" id=subtitle]]
+[[!template text="Well in the new design, here's the problematic code" start="00:15:39.733" video="mainVideo" id=subtitle]]
+[[!template text="for WeeChat." start="00:15:44.132" video="mainVideo" id=subtitle]]
+[[!template text="So we basically have the same fields as before," start="00:15:46.373" video="mainVideo" id=subtitle]]
+[[!template text="you just see that instead of u32," start="00:15:49.012" video="mainVideo" id=subtitle]]
+[[!template text="we now have 'uint 32' separately." start="00:15:50.853" video="mainVideo" id=subtitle]]
+[[!template text="The idea is that now this 32" start="00:15:53.733" video="mainVideo" id=subtitle]]
+[[!template text="can be an expression you can evaluate," start="00:15:55.332" video="mainVideo" id=subtitle]]
+[[!template text="and so the u8 is also replaced by 'uint 8'," start="00:15:59.094" video="mainVideo" id=subtitle]]
+[[!template text="and the id type is basically the same as before," start="00:16:04.054" video="mainVideo" id=subtitle]]
+[[!template text="and here another difference we see," start="00:16:07.253" video="mainVideo" id=subtitle]]
+[[!template text="and the main difference..." start="00:16:08.854" video="mainVideo" id=subtitle]]
+[[!template text="Actually, it's the second main difference." start="00:16:11.654" video="mainVideo" id=subtitle]]
+[[!template text="The first main difference is that" start="00:16:13.494" video="mainVideo" id=subtitle]]
+[[!template text="we don't actually quote this whole thing." start="00:16:15.175" video="mainVideo" id=subtitle]]
+[[!template text="Instead, we pass it to the bindat-type macro." start="00:16:18.694" video="mainVideo" id=subtitle]]
+[[!template text="So this is a macro" start="00:16:23.095" video="mainVideo" id=subtitle]]
+[[!template text="that's going to actually build the type." start="00:16:25.095" video="mainVideo" id=subtitle]]
+[[!template text="This is a big difference" start="00:16:27.574" video="mainVideo" id=subtitle]]
+[[!template text="in terms of performance also," start="00:16:29.254" video="mainVideo" id=subtitle]]
+[[!template text="because by making it a macro," start="00:16:30.535" video="mainVideo" id=subtitle]]
+[[!template text="we can pre-compute the code" start="00:16:32.695" video="mainVideo" id=subtitle]]
+[[!template text="that's going to pack and unpack this thing," start="00:16:34.296" video="mainVideo" id=subtitle]]
+[[!template text="instead of having to interpret it" start="00:16:37.255" video="mainVideo" id=subtitle]]
+[[!template text="every time we pack and unpack." start="00:16:38.936" video="mainVideo" id=subtitle]]
+[[!template text="So this macro will generate more efficient code" start="00:16:41.096" video="mainVideo" id=subtitle]]
+[[!template text="along the way." start="00:16:43.815" video="mainVideo" id=subtitle]]
+[[!template text="Also it makes the code that appears in here" start="00:16:45.815" video="mainVideo" id=subtitle]]
+[[!template text="visible to the compiler" start="00:16:48.695" video="mainVideo" id=subtitle]]
+[[!template text="because we can give an Edebug spec for it." start="00:16:50.297" video="mainVideo" id=subtitle]]
+[[!template text="And so here as an argument to vec," start="00:16:54.617" video="mainVideo" id=subtitle]]
+[[!template text="instead of having to specify" start="00:16:57.497" video="mainVideo" id=subtitle]]
+[[!template text="that this is an evaluated expression," start="00:16:59.016" video="mainVideo" id=subtitle]]
+[[!template text="we just write the expression directly," start="00:17:00.937" video="mainVideo" id=subtitle]]
+[[!template text="because all the expressions that appear there" start="00:17:02.777" video="mainVideo" id=subtitle]]
+[[!template text="will just be evaluated," start="00:17:05.096" video="mainVideo" id=subtitle]]
+[[!template text="and we don't need to use the 'struct' variable" start="00:17:07.418" video="mainVideo" id=subtitle]]
+[[!template text="and then extract the length field from it." start="00:17:11.418" video="mainVideo" id=subtitle]]
+[[!template text="We can just use length as a variable." start="00:17:14.137" video="mainVideo" id=subtitle]]
+[[!template text="So this variable 'length' here" start="00:17:16.938" video="mainVideo" id=subtitle]]
+[[!template text="will refer to this field here," start="00:17:18.698" video="mainVideo" id=subtitle]]
+[[!template text="and then this variable 'id' here" start="00:17:20.778" video="mainVideo" id=subtitle]]
+[[!template text="will refer to this field here," start="00:17:23.578" video="mainVideo" id=subtitle]]
+[[!template text="and so we can just use the field values" start="00:17:25.898" video="mainVideo" id=subtitle]]
+[[!template text="as local variables, which is very natural" start="00:17:27.738" video="mainVideo" id=subtitle]]
+[[!template text="and very efficient also," start="00:17:30.459" video="mainVideo" id=subtitle]]
+[[!template text="because the code would actually directly do that," start="00:17:31.679" video="mainVideo" id=subtitle]]
+[[!template text="and the code that unpacks those data" start="00:17:34.618" video="mainVideo" id=subtitle]]
+[[!template text="will just extract an integer" start="00:17:37.899" video="mainVideo" id=subtitle]]
+[[!template text="and bind it to the length variable," start="00:17:40.299" video="mainVideo" id=subtitle]]
+[[!template text="and so that makes it immediately available there." start="00:17:42.219" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, let's see also" start="00:17:47.580" video="mainVideo" id=subtitle]]
+[[!template text="what the actual documentation looks like." start="00:17:51.340" video="mainVideo" id=subtitle]]
+[[!template text="And so if we look at the doc of BinDat," start="00:17:54.220" video="mainVideo" id=subtitle]]
+[[!template text="we see the actual specification of the grammar." start="00:17:57.739" video="mainVideo" id=subtitle]]
+[[!template text="And so here we see instead of having" start="00:18:01.181" video="mainVideo" id=subtitle]]
+[[!template text="these nine different non-terminals," start="00:18:03.181" video="mainVideo" id=subtitle]]
+[[!template text="we basically have two:" start="00:18:06.461" video="mainVideo" id=subtitle]]
+[[!template text="we have the non-terminal for TYPE," start="00:18:08.061" video="mainVideo" id=subtitle]]
+[[!template text="which can be either a uint, a uintr, or a string," start="00:18:10.781" video="mainVideo" id=subtitle]]
+[[!template text="or bits, or fill, or align, or vec," start="00:18:15.021" video="mainVideo" id=subtitle]]
+[[!template text="or those various other forms;" start="00:18:17.421" video="mainVideo" id=subtitle]]
+[[!template text="or it can be a struct, in which case," start="00:18:19.902" video="mainVideo" id=subtitle]]
+[[!template text="in the case of struct," start="00:18:22.621" video="mainVideo" id=subtitle]]
+[[!template text="then it will be followed by a sequence --" start="00:18:23.981" video="mainVideo" id=subtitle]]
+[[!template text="a list of FIELDs, where each of the FIELDs" start="00:18:27.502" video="mainVideo" id=subtitle]]
+[[!template text="is basically a LABEL followed by another TYPE." start="00:18:30.142" video="mainVideo" id=subtitle]]
+[[!template text="And so this makes the whole specification" start="00:18:33.902" video="mainVideo" id=subtitle]]
+[[!template text="much simpler. We don't have any distinction now" start="00:18:37.343" video="mainVideo" id=subtitle]]
+[[!template text="between struct being a special case," start="00:18:39.823" video="mainVideo" id=subtitle]]
+[[!template text="as opposed to just the normal types." start="00:18:42.862" video="mainVideo" id=subtitle]]
+[[!template text="struct is just now one of the possible types" start="00:18:46.383" video="mainVideo" id=subtitle]]
+[[!template text="that can appear here." start="00:18:49.263" video="mainVideo" id=subtitle]]
+[[!template text="The other thing is that" start="00:18:52.543" video="mainVideo" id=subtitle]]
+[[!template text="the LABEL is always present in the structure," start="00:18:53.263" video="mainVideo" id=subtitle]]
+[[!template text="so there's no ambiguity." start="00:18:55.743" video="mainVideo" id=subtitle]]
+[[!template text="Also all the above things," start="00:18:58.384" video="mainVideo" id=subtitle]]
+[[!template text="like the BITLEN we have here," start="00:19:00.304" video="mainVideo" id=subtitle]]
+[[!template text="the LEN we have here," start="00:19:03.103" video="mainVideo" id=subtitle]]
+[[!template text="the COUNT for vector we have here," start="00:19:04.384" video="mainVideo" id=subtitle]]
+[[!template text="these are all plain Elisp expressions," start="00:19:07.504" video="mainVideo" id=subtitle]]
+[[!template text="so they are implicitly evaluated if necessary." start="00:19:10.224" video="mainVideo" id=subtitle]]
+[[!template text="If you want them to be constant," start="00:19:13.025" video="mainVideo" id=subtitle]]
+[[!template text="and really constant, you can just use quotes," start="00:19:14.705" video="mainVideo" id=subtitle]]
+[[!template text="for those rare cases where it's necessary." start="00:19:16.705" video="mainVideo" id=subtitle]]
+[[!template text="Another thing is that you can extend it" start="00:19:20.145" video="mainVideo" id=subtitle]]
+[[!template text="with with bindat-defmacro." start="00:19:21.905" video="mainVideo" id=subtitle]]
+[[!template text="Okay, let's go back here." start="00:19:25.505" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So what are the advantages of this approach?" start="00:19:30.226" video="mainVideo" id=subtitle]]
+[[!template text="As I said, one of the main advantages" start="00:19:32.706" video="mainVideo" id=subtitle]]
+[[!template text="is that we now have support for Edebug." start="00:19:34.625" video="mainVideo" id=subtitle]]
+[[!template text="We don't have 'struct', 'repeat', and 'align'" start="00:19:39.346" video="mainVideo" id=subtitle]]
+[[!template text="as special cases anymore." start="00:19:41.426" video="mainVideo" id=subtitle]]
+[[!template text="These are just normal types." start="00:19:42.946" video="mainVideo" id=subtitle]]
+[[!template text="Before, there was uint as type, int as type," start="00:19:44.625" video="mainVideo" id=subtitle]]
+[[!template text="and those kinds of things." start="00:19:48.067" video="mainVideo" id=subtitle]]
+[[!template text="'struct' and 'repeat' and 'align'" start="00:19:49.267" video="mainVideo" id=subtitle]]
+[[!template text="were in a different case." start="00:19:51.110" video="mainVideo" id=subtitle]]
+[[!template text="So there were" start="00:19:53.267" video="mainVideo" id=subtitle]]
+[[!template text="some subtle differences between those" start="00:19:54.387" video="mainVideo" id=subtitle]]
+[[!template text="that completely disappeared." start="00:19:56.787" video="mainVideo" id=subtitle]]
+[[!template text="Also in the special cases, there was 'union'," start="00:19:59.027" video="mainVideo" id=subtitle]]
+[[!template text="and union now has completely disappeared." start="00:20:02.626" video="mainVideo" id=subtitle]]
+[[!template text="We don't need it anymore, because instead," start="00:20:05.027" video="mainVideo" id=subtitle]]
+[[!template text="we can actually use code anywhere." start="00:20:07.828" video="mainVideo" id=subtitle]]
+[[!template text="That's one of the things I didn't mention here," start="00:20:09.588" video="mainVideo" id=subtitle]]
+[[!template text="but in this note here," start="00:20:11.908" video="mainVideo" id=subtitle]]
+[[!template text="that's one of the important notes." start="00:20:17.268" video="mainVideo" id=subtitle]]
+[[!template text="Not only are BITLEN, LEN, COUNT etc." start="00:20:19.747" video="mainVideo" id=subtitle]]
+[[!template text="Elisp expressions," start="00:20:21.987" video="mainVideo" id=subtitle]]
+[[!template text="but the type itself -- any type itself --" start="00:20:23.028" video="mainVideo" id=subtitle]]
+[[!template text="is basically an expression." start="00:20:26.789" video="mainVideo" id=subtitle]]
+[[!template text="And so you can, instead of having 'uint BITLEN'," start="00:20:29.029" video="mainVideo" id=subtitle]]
+[[!template text="you can have '(if blah-blah-blah uint string)'," start="00:20:32.709" video="mainVideo" id=subtitle]]
+[[!template text="and so you can have a field" start="00:20:36.628" video="mainVideo" id=subtitle]]
+[[!template text="that can be either string or an int," start="00:20:38.149" video="mainVideo" id=subtitle]]
+[[!template text="depending on some condition." start="00:20:40.549" video="mainVideo" id=subtitle]]
+[[!template text="And for that reason we don't need a union." start="00:20:44.790" video="mainVideo" id=subtitle]]
+[[!template text="Instead of having a union," start="00:20:46.869" video="mainVideo" id=subtitle]]
+[[!template text="we can just have a 'cond' or a 'pcase'" start="00:20:47.910" video="mainVideo" id=subtitle]]
+[[!template text="that will return the type we want to use," start="00:20:50.710" video="mainVideo" id=subtitle]]
+[[!template text="depending on the context," start="00:20:53.590" video="mainVideo" id=subtitle]]
+[[!template text="which will generally depend on some previous field." start="00:20:55.109" video="mainVideo" id=subtitle]]
+[[!template text="Also we don't need to use single-field structs" start="00:21:00.951" video="mainVideo" id=subtitle]]
+[[!template text="for simple types anymore," start="00:21:03.750" video="mainVideo" id=subtitle]]
+[[!template text="because there's no distinction between struct" start="00:21:05.351" video="mainVideo" id=subtitle]]
+[[!template text="and other types." start="00:21:09.271" video="mainVideo" id=subtitle]]
+[[!template text="So we can pass to bindat-pack and bindat-unpack" start="00:21:11.271" video="mainVideo" id=subtitle]]
+[[!template text="a specification which just says &quot ;here's an integer&quot ;" start="00:21:17.191" video="mainVideo" id=subtitle]]
+[[!template text="and we'll just pack and unpack the integer." start="00:21:20.952" video="mainVideo" id=subtitle]]
+[[!template text="And of course now all the code is exposed," start="00:21:24.392" video="mainVideo" id=subtitle]]
+[[!template text="so not only Edebug works, but also Flymake," start="00:21:26.472" video="mainVideo" id=subtitle]]
+[[!template text="and the compiler, etc. --" start="00:21:29.192" video="mainVideo" id=subtitle]]
+[[!template text="they can complain about it," start="00:21:30.392" video="mainVideo" id=subtitle]]
+[[!template text="and give you warnings and errors as we like them." start="00:21:33.111" video="mainVideo" id=subtitle]]
+[[!template text="And of course the kittens are much happier." start="00:21:38.872" video="mainVideo" id=subtitle]]
+[[!template text="Okay. This is going a bit over time," start="00:21:44.553" video="mainVideo" id=subtitle]]
+[[!template text="so let's try to go faster." start="00:21:48.153" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Here are some of the new features" start="00:21:51.273" video="mainVideo" id=subtitle]]
+[[!template text="that are introduced." start="00:21:53.753" video="mainVideo" id=subtitle]]
+[[!template text="I already mentioned briefly" start="00:21:54.794" video="mainVideo" id=subtitle]]
+[[!template text="that you can define new types with bindat-defmacro." start="00:21:56.314" video="mainVideo" id=subtitle]]
+[[!template text="that's one of the important novelties," start="00:22:00.633" video="mainVideo" id=subtitle]]
+[[!template text="and you can extend BinDat with new types this way." start="00:22:04.474" video="mainVideo" id=subtitle]]
+[[!template text="The other thing you can do is" start="00:22:08.794" video="mainVideo" id=subtitle]]
+[[!template text="you can control how values or packets" start="00:22:10.714" video="mainVideo" id=subtitle]]
+[[!template text="are unpacked, and how they are represented." start="00:22:16.234" video="mainVideo" id=subtitle]]
+[[!template text="In the old BinDat," start="00:22:20.315" video="mainVideo" id=subtitle]]
+[[!template text="the packet is necessarily represented," start="00:22:22.555" video="mainVideo" id=subtitle]]
+[[!template text="when you unpack it, as an alist, basically," start="00:22:24.315" video="mainVideo" id=subtitle]]
+[[!template text="or a struct becomes an alist," start="00:22:28.635" video="mainVideo" id=subtitle]]
+[[!template text="and that's all there is." start="00:22:30.396" video="mainVideo" id=subtitle]]
+[[!template text="You don't have any choice about it." start="00:22:31.676" video="mainVideo" id=subtitle]]
+[[!template text="With the new system," start="00:22:34.076" video="mainVideo" id=subtitle]]
+[[!template text="by default, it also returns just an alist," start="00:22:35.596" video="mainVideo" id=subtitle]]
+[[!template text="but you can actually control what it's unpacked as," start="00:22:38.076" video="mainVideo" id=subtitle]]
+[[!template text="or what it's packed from, using these keywords." start="00:22:41.916" video="mainVideo" id=subtitle]]
+[[!template text="With :unpack-val, you can give an expression" start="00:22:46.396" video="mainVideo" id=subtitle]]
+[[!template text="that will construct the unpacked value" start="00:22:49.597" video="mainVideo" id=subtitle]]
+[[!template text="from the various fields." start="00:22:53.357" video="mainVideo" id=subtitle]]
+[[!template text="And with :pack-val and :pack-var," start="00:22:56.957" video="mainVideo" id=subtitle]]
+[[!template text="you can specify how to extract the information" start="00:22:59.197" video="mainVideo" id=subtitle]]
+[[!template text="from the unpacked value" start="00:23:02.557" video="mainVideo" id=subtitle]]
+[[!template text="to generate the pack value." start="00:23:05.117" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So here are some examples." start="00:23:08.078" video="mainVideo" id=subtitle]]
+[[!template text="Here's an example taken from osc." start="00:23:12.637" video="mainVideo" id=subtitle]]
+[[!template text="osc actually doesn't use BinDat currently," start="00:23:15.358" video="mainVideo" id=subtitle]]
+[[!template text="but I have played with it" start="00:23:17.438" video="mainVideo" id=subtitle]]
+[[!template text="to see what it would look like" start="00:23:22.479" video="mainVideo" id=subtitle]]
+[[!template text="if we were to use BinDat." start="00:23:23.758" video="mainVideo" id=subtitle]]
+[[!template text="So here's the definition" start="00:23:26.159" video="mainVideo" id=subtitle]]
+[[!template text="of the timetag representation," start="00:23:28.638" video="mainVideo" id=subtitle]]
+[[!template text="which represents timestamps in osc." start="00:23:30.638" video="mainVideo" id=subtitle]]
+[[!template text="So you would use bindat-type" start="00:23:35.279" video="mainVideo" id=subtitle]]
+[[!template text="and then you have here :pack-var" start="00:23:37.998" video="mainVideo" id=subtitle]]
+[[!template text="basically gives a name" start="00:23:40.559" video="mainVideo" id=subtitle]]
+[[!template text="when we try to pack a timestamp." start="00:23:42.080" video="mainVideo" id=subtitle]]
+[[!template text="'time' will be the variable whose name contains" start="00:23:48.559" video="mainVideo" id=subtitle]]
+[[!template text="the actual timestamp we will receive." start="00:23:51.520" video="mainVideo" id=subtitle]]
+[[!template text="So we want to represent the unpacked value" start="00:23:54.159" video="mainVideo" id=subtitle]]
+[[!template text="as a normal Emacs timestamp," start="00:23:57.520" video="mainVideo" id=subtitle]]
+[[!template text="and then basically convert from this timestamp" start="00:24:00.240" video="mainVideo" id=subtitle]]
+[[!template text="to a string, or from a string to this timestamp." start="00:24:02.480" video="mainVideo" id=subtitle]]
+[[!template text="When we receive it, it will be called time," start="00:24:06.401" video="mainVideo" id=subtitle]]
+[[!template text="so we can refer to it," start="00:24:10.080" video="mainVideo" id=subtitle]]
+[[!template text="and so in order to actually encode it," start="00:24:12.240" video="mainVideo" id=subtitle]]
+[[!template text="we basically turn this timestamp into an integer --" start="00:24:15.360" video="mainVideo" id=subtitle]]
+[[!template text="that's what this :pack-val does." start="00:24:18.320" video="mainVideo" id=subtitle]]
+[[!template text="It says when we try to pack it," start="00:24:20.799" video="mainVideo" id=subtitle]]
+[[!template text="here's the the value that we should use." start="00:24:23.442" video="mainVideo" id=subtitle]]
+[[!template text="We turn it into an integer," start="00:24:26.082" video="mainVideo" id=subtitle]]
+[[!template text="and then this integer is going to be encoded" start="00:24:27.760" video="mainVideo" id=subtitle]]
+[[!template text="as a uint 64-bit. So a 64-bit unsigned integer." start="00:24:30.320" video="mainVideo" id=subtitle]]
+[[!template text="When we try to unpack the value," start="00:24:36.163" video="mainVideo" id=subtitle]]
+[[!template text="this 'ticks' field" start="00:24:38.960" video="mainVideo" id=subtitle]]
+[[!template text="will contain an unsigned int of 64 bits." start="00:24:40.720" video="mainVideo" id=subtitle]]
+[[!template text="We want to return instead a timestamp --" start="00:24:45.679" video="mainVideo" id=subtitle]]
+[[!template text="a time value -- from Emacs." start="00:24:50.559" video="mainVideo" id=subtitle]]
+[[!template text="Here we use the representation of time" start="00:24:53.924" video="mainVideo" id=subtitle]]
+[[!template text="as a pair of number of ticks" start="00:24:59.363" video="mainVideo" id=subtitle]]
+[[!template text="and the corresponding frequency of those ticks." start="00:25:02.799" video="mainVideo" id=subtitle]]
+[[!template text="So that's what we do here with :unpack-val," start="00:25:06.720" video="mainVideo" id=subtitle]]
+[[!template text="which is construct the cons corresponding to it." start="00:25:09.120" video="mainVideo" id=subtitle]]
+[[!template text="With this definition, bindat-pack/unpack" start="00:25:12.004" video="mainVideo" id=subtitle]]
+[[!template text="are going to convert to and from" start="00:25:16.400" video="mainVideo" id=subtitle]]
+[[!template text="proper time values on one side," start="00:25:19.039" video="mainVideo" id=subtitle]]
+[[!template text="and binary strings on the other." start="00:25:21.760" video="mainVideo" id=subtitle]]
+[[!template text="Note, of course," start="00:25:26.159" video="mainVideo" id=subtitle]]
+[[!template text="that I complained that the old BinDat" start="00:25:27.520" video="mainVideo" id=subtitle]]
+[[!template text="had to use single-field structs for simple types," start="00:25:30.320" video="mainVideo" id=subtitle]]
+[[!template text="and here, basically," start="00:25:36.080" video="mainVideo" id=subtitle]]
+[[!template text="I'm back using single-field structs as well" start="00:25:37.039" video="mainVideo" id=subtitle]]
+[[!template text="for this particular case --" start="00:25:39.840" video="mainVideo" id=subtitle]]
+[[!template text="actually a reasonably frequent case, to be honest." start="00:25:41.120" video="mainVideo" id=subtitle]]
+[[!template text="But at least this is not so problematic," start="00:25:44.640" video="mainVideo" id=subtitle]]
+[[!template text="because we actually control what is returned," start="00:25:49.279" video="mainVideo" id=subtitle]]
+[[!template text="so even though it's a single-field struct," start="00:25:51.840" video="mainVideo" id=subtitle]]
+[[!template text="it's not going to construct an alist" start="00:25:54.159" video="mainVideo" id=subtitle]]
+[[!template text="or force you to construct an alist." start="00:25:56.640" video="mainVideo" id=subtitle]]
+[[!template text="Instead, it really receives and takes a value" start="00:25:58.320" video="mainVideo" id=subtitle]]
+[[!template text="in the ideal representation that we chose." start="00:26:02.720" video="mainVideo" id=subtitle]]
+[[!template text="Here we have a more complex example," start="00:26:07.367" video="mainVideo" id=subtitle]]
+[[!template text="where the actual type is recursive," start="00:26:10.007" video="mainVideo" id=subtitle]]
+[[!template text="because it's representing those &quot ;LEB&quot ;..." start="00:26:12.488" video="mainVideo" id=subtitle]]
+[[!template text="I can't remember what &quot ;LEB&quot ; stands for," start="00:26:18.640" video="mainVideo" id=subtitle]]
+[[!template text="but it's a representation" start="00:26:20.400" video="mainVideo" id=subtitle]]
+[[!template text="for arbitrary length integers," start="00:26:22.559" video="mainVideo" id=subtitle]]
+[[!template text="where basically" start="00:26:25.600" video="mainVideo" id=subtitle]]
+[[!template text="every byte is either smaller than 128," start="00:26:27.520" video="mainVideo" id=subtitle]]
+[[!template text="in which case it's the end of the of the value," start="00:26:33.360" video="mainVideo" id=subtitle]]
+[[!template text="or it's a value bigger than 128," start="00:26:36.799" video="mainVideo" id=subtitle]]
+[[!template text="in which case there's an extra byte on the end" start="00:26:39.760" video="mainVideo" id=subtitle]]
+[[!template text="that's going to continue." start="00:26:42.159" video="mainVideo" id=subtitle]]
+[[!template text="Here we see the representation" start="00:26:44.490" video="mainVideo" id=subtitle]]
+[[!template text="is basically a structure that starts with a byte," start="00:26:46.640" video="mainVideo" id=subtitle]]
+[[!template text="which contains this value," start="00:26:52.240" video="mainVideo" id=subtitle]]
+[[!template text="which can be either the last value or not," start="00:26:53.679" video="mainVideo" id=subtitle]]
+[[!template text="and the tail, which will either be empty," start="00:26:56.000" video="mainVideo" id=subtitle]]
+[[!template text="or contain something else." start="00:26:59.770" video="mainVideo" id=subtitle]]
+[[!template text="The empty case is here;" start="00:27:01.279" video="mainVideo" id=subtitle]]
+[[!template text="if the head value is smaller than 128," start="00:27:04.000" video="mainVideo" id=subtitle]]
+[[!template text="then the type of this tail is going to be (unit 0)," start="00:27:07.039" video="mainVideo" id=subtitle]]
+[[!template text="so basically 'unit' is the empty type," start="00:27:11.840" video="mainVideo" id=subtitle]]
+[[!template text="and 0 is the value we will receive when we read it." start="00:27:16.492" video="mainVideo" id=subtitle]]
+[[!template text="And if not, then it has as type 'loop'," start="00:27:20.880" video="mainVideo" id=subtitle]]
+[[!template text="which is the type we're defining," start="00:27:25.520" video="mainVideo" id=subtitle]]
+[[!template text="so it's the recursive case," start="00:27:28.240" video="mainVideo" id=subtitle]]
+[[!template text="where then the rest of the type is the type itself." start="00:27:30.491" video="mainVideo" id=subtitle]]
+[[!template text="And so this lets us pack and unpack." start="00:27:35.132" video="mainVideo" id=subtitle]]
+[[!template text="We pass it an arbitrary size integer," start="00:27:37.120" video="mainVideo" id=subtitle]]
+[[!template text="and it's going to turn it into" start="00:27:39.600" video="mainVideo" id=subtitle]]
+[[!template text="this LEB128 binary representation, and vice versa." start="00:27:42.240" video="mainVideo" id=subtitle]]
+[[!template text="I have other examples if you're interested," start="00:27:48.492" video="mainVideo" id=subtitle]]
+[[!template text="but anyway, here's the conclusion." start="00:27:52.480" video="mainVideo" id=subtitle]]
+[[!template new="1" text="We have a simpler, more flexible," start="00:27:56.094" video="mainVideo" id=subtitle]]
+[[!template text="and more powerful BinDat now," start="00:27:58.320" video="mainVideo" id=subtitle]]
+[[!template text="which is also significantly faster." start="00:28:01.039" video="mainVideo" id=subtitle]]
+[[!template text="And I can't remember the exact speed-up," start="00:28:03.454" video="mainVideo" id=subtitle]]
+[[!template text="but it's definitely not a few percents." start="00:28:06.799" video="mainVideo" id=subtitle]]
+[[!template text="I vaguely remember about 4x faster in my tests," start="00:28:08.720" video="mainVideo" id=subtitle]]
+[[!template text="but it's probably very different in different cases" start="00:28:12.640" video="mainVideo" id=subtitle]]
+[[!template text="so it might be just 4x, 2x -- who knows?" start="00:28:16.815" video="mainVideo" id=subtitle]]
+[[!template text="Try it for yourself, but I was pretty pleased," start="00:28:20.159" video="mainVideo" id=subtitle]]
+[[!template text="because it wasn't the main motivation, so anyway..." start="00:28:23.374" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The negatives are here." start="00:28:28.336" video="mainVideo" id=subtitle]]
+[[!template text="In the new system, there's this bindat-defmacro" start="00:28:31.135" video="mainVideo" id=subtitle]]
+[[!template text="which lets us define, kind of, new types," start="00:28:34.480" video="mainVideo" id=subtitle]]
+[[!template text="and bindat-type also lets us define new types," start="00:28:36.720" video="mainVideo" id=subtitle]]
+[[!template text="and the distinction between them is a bit subtle;" start="00:28:40.895" video="mainVideo" id=subtitle]]
+[[!template text="it kind of depends on..." start="00:28:45.360" video="mainVideo" id=subtitle]]
+[[!template text="well it has an impact on efficiency" start="00:28:48.080" video="mainVideo" id=subtitle]]
+[[!template text="more than anything, so it's not very satisfactory." start="00:28:50.880" video="mainVideo" id=subtitle]]
+[[!template text="There's a bit of redundancy between the two." start="00:28:53.520" video="mainVideo" id=subtitle]]
+[[!template text="There is no bit-level control, just as before." start="00:28:56.737" video="mainVideo" id=subtitle]]
+[[!template text="We can only manipulate basically bytes." start="00:28:59.039" video="mainVideo" id=subtitle]]
+[[!template text="So this is definitely not usable" start="00:29:02.098" video="mainVideo" id=subtitle]]
+[[!template text="for a Huffman encoding kind of thing." start="00:29:03.360" video="mainVideo" id=subtitle]]
+[[!template text="Also, it's not nearly as flexible" start="00:29:09.058" video="mainVideo" id=subtitle]]
+[[!template text="as some of the alternatives." start="00:29:10.880" video="mainVideo" id=subtitle]]
+[[!template text="So you know GNU Poke" start="00:29:12.240" video="mainVideo" id=subtitle]]
+[[!template text="has been a vague inspiration for this work," start="00:29:13.760" video="mainVideo" id=subtitle]]
+[[!template text="and GNU Poke gives you a lot more power" start="00:29:20.018" video="mainVideo" id=subtitle]]
+[[!template text="in how to specify the types, etc." start="00:29:22.480" video="mainVideo" id=subtitle]]
+[[!template text="And of course one of the main downsides" start="00:29:25.059" video="mainVideo" id=subtitle]]
+[[!template text="is that it's still not used very much." start="00:29:26.579" video="mainVideo" id=subtitle]]
+[[!template text="Actually the new BinDat" start="00:29:28.018" video="mainVideo" id=subtitle]]
+[[!template text="is not used by any package" start="00:29:29.283" video="mainVideo" id=subtitle]]
+[[!template text="as far as I know right now," start="00:29:31.039" video="mainVideo" id=subtitle]]
+[[!template text="but even the old one is not used very often," start="00:29:33.059" video="mainVideo" id=subtitle]]
+[[!template text="so who knows" start="00:29:35.279" video="mainVideo" id=subtitle]]
+[[!template text="whether it's actually going to" start="00:29:36.799" video="mainVideo" id=subtitle]]
+[[!template text="work very much better or not?" start="00:29:38.799" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, this is it for this talk." start="00:29:41.520" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much. Have a nice day." start="00:29:44.399" video="mainVideo" id=subtitle]]
+[[!template text="(captions by John Cummings)" start="00:29:46.683" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/clede.md b/2021/captions/clede.md
new file mode 100644
index 00000000..b98e0820
--- /dev/null
+++ b/2021/captions/clede.md
@@ -0,0 +1,419 @@
+<a name="transcript"></a>
+# Transcript
+
+Thanks to Hannah Miller for these captions!
+
+[[!template text="My name is Fermin. I work as" start="00:00:04.467" video="mainVideo" id=subtitle]]
+[[!template text="a Common Lisp engineer at RavenPack," start="00:00:07.617" video="mainVideo" id=subtitle]]
+[[!template text="and today I'm going to talk about" start="00:00:09.817" video="mainVideo" id=subtitle]]
+[[!template text="CLEDE: the Common Lisp Emacs Development Environment." start="00:00:11.833" video="mainVideo" id=subtitle]]
+[[!template text="So what is CLEDE?" start="00:00:15.883" video="mainVideo" id=subtitle]]
+[[!template text="So CLEDE is a project" start="00:00:19.500" video="mainVideo" id=subtitle]]
+[[!template text="I've been working on this year" start="00:00:20.500" video="mainVideo" id=subtitle]]
+[[!template text="for better... well, yeah..." start="00:00:22.117" video="mainVideo" id=subtitle]]
+[[!template text="a better Common Lisp integration" start="00:00:24.750" video="mainVideo" id=subtitle]]
+[[!template text="for static tools and" start="00:00:27.217" video="mainVideo" id=subtitle]]
+[[!template text="for static and integrated Emacs tools." start="00:00:30.417" video="mainVideo" id=subtitle]]
+[[!template text="And to understand better what" start="00:00:33.350" video="mainVideo" id=subtitle]]
+[[!template text="CLEDE is, one first has to understand" start="00:00:35.467" video="mainVideo" id=subtitle]]
+[[!template text="the base that I use..." start="00:00:37.750" video="mainVideo" id=subtitle]]
+[[!template text="so the foundation that I use for CLEDE." start="00:00:40.233" video="mainVideo" id=subtitle]]
+[[!template text="Um, so it is CEDET--" start="00:00:43.867" video="mainVideo" id=subtitle]]
+[[!template text="and specifically Semantic--" start="00:00:46.150" video="mainVideo" id=subtitle]]
+[[!template text="so we first have to talk about and" start="00:00:47.517" video="mainVideo" id=subtitle]]
+[[!template text="understand what it is." start="00:00:49.833" video="mainVideo" id=subtitle]]
+[[!template text="So CEDET is a collection" start="00:00:50.517" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs development environment tools." start="00:00:53.917" video="mainVideo" id=subtitle]]
+[[!template text="It was created by Eric Ludlam" start="00:00:55.283" video="mainVideo" id=subtitle]]
+[[!template text="(I hope to say that name right)" start="00:00:57.333" video="mainVideo" id=subtitle]]
+[[!template text="in the late 90s, and" start="00:01:00.867" video="mainVideo" id=subtitle]]
+[[!template text="the idea was to create entire IDE for Emacs." start="00:01:02.433" video="mainVideo" id=subtitle]]
+[[!template text="CEDET is still integrated into Emacs," start="00:01:04.933" video="mainVideo" id=subtitle]]
+[[!template text="and it has a lot of interesting things" start="00:01:10.533" video="mainVideo" id=subtitle]]
+[[!template text="that are not used for too many people," start="00:01:11.817" video="mainVideo" id=subtitle]]
+[[!template text="so I'm going to explain some of those." start="00:01:14.133" video="mainVideo" id=subtitle]]
+[[!template text="First, let's go with the good ones that" start="00:01:16.267" video="mainVideo" id=subtitle]]
+[[!template text="one that I use for CLEDE and that can" start="00:01:18.517" video="mainVideo" id=subtitle]]
+[[!template text="be used for other projects as well." start="00:01:21.333" video="mainVideo" id=subtitle]]
+[[!template text="Some of the features that" start="00:01:23.267" video="mainVideo" id=subtitle]]
+[[!template text="CEDET has is parse generators" start="00:01:28.550" video="mainVideo" id=subtitle]]
+[[!template text="so we have Wisent and Bovine." start="00:01:32.550" video="mainVideo" id=subtitle]]
+[[!template text="Wisent is basically a Bison clone" start="00:01:35.317" video="mainVideo" id=subtitle]]
+[[!template text="that was written in Emacs Lisp" start="00:01:38.450" video="mainVideo" id=subtitle]]
+[[!template text="that you can also specify grammars." start="00:01:40.300" video="mainVideo" id=subtitle]]
+[[!template text="It's a really big and rather complex" start="00:01:43.217" video="mainVideo" id=subtitle]]
+[[!template text="tool to work with," start="00:01:45.717" video="mainVideo" id=subtitle]]
+[[!template text="and it's secretly used for, as far as" start="00:01:47.450" video="mainVideo" id=subtitle]]
+[[!template text="I know, two languages." start="00:01:49.283" video="mainVideo" id=subtitle]]
+[[!template text="They're not also well supported," start="00:01:51.767" video="mainVideo" id=subtitle]]
+[[!template text="but we'll get into that later." start="00:01:53.417" video="mainVideo" id=subtitle]]
+[[!template text="Also Bovine, which is a way more" start="00:01:55.417" video="mainVideo" id=subtitle]]
+[[!template text="simple tool, like you can..." start="00:01:58.233" video="mainVideo" id=subtitle]]
+[[!template text="you don't need grammar files," start="00:01:59.967" video="mainVideo" id=subtitle]]
+[[!template text="you can write just in plain Emacs Lisp." start="00:02:01.833" video="mainVideo" id=subtitle]]
+[[!template text="And you also have utilities to work with" start="00:02:07.450" video="mainVideo" id=subtitle]]
+[[!template text="those generated tag trees, so to say." start="00:02:11.017" video="mainVideo" id=subtitle]]
+[[!template text="These are not AST parsers like real Bison;" start="00:02:16.650" video="mainVideo" id=subtitle]]
+[[!template text="they are tag-based so they basically get" start="00:02:23.633" video="mainVideo" id=subtitle]]
+[[!template text="tags and extract information from them," start="00:02:25.717" video="mainVideo" id=subtitle]]
+[[!template text="and I can use that information" start="00:02:27.633" video="mainVideo" id=subtitle]]
+[[!template text="with Emacs Lisp" start="00:02:30.183" video="mainVideo" id=subtitle]]
+[[!template text="to contextually understand better" start="00:02:31.000" video="mainVideo" id=subtitle]]
+[[!template text="the language that you're parsing," start="00:02:33.667" video="mainVideo" id=subtitle]]
+[[!template text="but in general," start="00:02:36.367" video="mainVideo" id=subtitle]]
+[[!template text="this decision was made (as far as I know)" start="00:02:37.183" video="mainVideo" id=subtitle]]
+[[!template text="because of the Emacs Lisp" start="00:02:40.183" video="mainVideo" id=subtitle]]
+[[!template text="limitation of the time." start="00:02:43.317" video="mainVideo" id=subtitle]]
+[[!template text="So Emacs was a rather" start="00:02:44.317" video="mainVideo" id=subtitle]]
+[[!template text="slower Lisp-- slow Lisp--" start="00:02:50.333" video="mainVideo" id=subtitle]]
+[[!template text="so they decide to just use" start="00:02:52.267" video="mainVideo" id=subtitle]]
+[[!template text="tag-based thing instead of a parse--" start="00:02:55.950" video="mainVideo" id=subtitle]]
+[[!template text="I mean-- an AST-based one." start="00:02:58.850" video="mainVideo" id=subtitle]]
+[[!template text="And Semantic give you some utility with" start="00:03:02.433" video="mainVideo" id=subtitle]]
+[[!template text="that as Senator, for example, give you" start="00:03:05.267" video="mainVideo" id=subtitle]]
+[[!template text="some semantic navigation." start="00:03:06.350" video="mainVideo" id=subtitle]]
+[[!template text="So CEDET is way more than this," start="00:03:07.767" video="mainVideo" id=subtitle]]
+[[!template text="but this is not a CEDET talk." start="00:03:09.850" video="mainVideo" id=subtitle]]
+[[!template text="So if you want to get more information," start="00:03:12.533" video="mainVideo" id=subtitle]]
+[[!template text="you can go to the official webpage." start="00:03:14.083" video="mainVideo" id=subtitle]]
+[[!template text="I have to say that it is outdated, and" start="00:03:16.450" video="mainVideo" id=subtitle]]
+[[!template text="Emacs changed some things over the years" start="00:03:20.033" video="mainVideo" id=subtitle]]
+[[!template text="because CEDET was merged into Emacs" start="00:03:23.033" video="mainVideo" id=subtitle]]
+[[!template text="in 2011, as far as I know." start="00:03:24.167" video="mainVideo" id=subtitle]]
+[[!template text="You can also go to the official Emacs" start="00:03:27.867" video="mainVideo" id=subtitle]]
+[[!template text="documentation (the manual), which will get" start="00:03:30.517" video="mainVideo" id=subtitle]]
+[[!template text="more information about every tool," start="00:03:32.983" video="mainVideo" id=subtitle]]
+[[!template text="but it's a really interesting thing, and" start="00:03:35.417" video="mainVideo" id=subtitle]]
+[[!template text="I'm really sad that it is forgotten." start="00:03:38.417" video="mainVideo" id=subtitle]]
+[[!template text="So let's go with the bad things:" start="00:03:40.983" video="mainVideo" id=subtitle]]
+[[!template text="that CEDET is an abandoned project." start="00:03:43.333" video="mainVideo" id=subtitle]]
+[[!template text="This has some benefits like it's not" start="00:03:46.583" video="mainVideo" id=subtitle]]
+[[!template text="going to change that much," start="00:03:48.317" video="mainVideo" id=subtitle]]
+[[!template text="but it's, of course, not ideal." start="00:03:50.650" video="mainVideo" id=subtitle]]
+[[!template text="Most of the tooling that CEDET" start="00:03:52.467" video="mainVideo" id=subtitle]]
+[[!template text="have right now are surpassed" start="00:03:56.933" video="mainVideo" id=subtitle]]
+[[!template text="by other packages." start="00:03:58.200" video="mainVideo" id=subtitle]]
+[[!template text="And at first, I know Eric was working" start="00:03:59.733" video="mainVideo" id=subtitle]]
+[[!template text="with C at the time so he totally has" start="00:04:02.750" video="mainVideo" id=subtitle]]
+[[!template text="&quot ;real support&quot ; so you can use CEDET" start="00:04:07.567" video="mainVideo" id=subtitle]]
+[[!template text="for other languages, but" start="00:04:10.633" video="mainVideo" id=subtitle]]
+[[!template text="to work really like an IDE, more or less," start="00:04:13.133" video="mainVideo" id=subtitle]]
+[[!template text="it's all the..." start="00:04:15.483" video="mainVideo" id=subtitle]]
+[[!template text="C is the only language supported," start="00:04:17.117" video="mainVideo" id=subtitle]]
+[[!template text="and maybe some simple C++, but that's it." start="00:04:19.617" video="mainVideo" id=subtitle]]
+[[!template text="It needs more documentation." start="00:04:21.767" video="mainVideo" id=subtitle]]
+[[!template text="People really don't know how to use it" start="00:04:24.117" video="mainVideo" id=subtitle]]
+[[!template text="because, I have to say, rather complex" start="00:04:25.783" video="mainVideo" id=subtitle]]
+[[!template text="to get a project working with it," start="00:04:28.683" video="mainVideo" id=subtitle]]
+[[!template text="and then make use of Semantic" start="00:04:30.167" video="mainVideo" id=subtitle]]
+[[!template text="because it needs some maintenance and" start="00:04:33.817" video="mainVideo" id=subtitle]]
+[[!template text="to update the code." start="00:04:36.767" video="mainVideo" id=subtitle]]
+[[!template text="But I will argue that even with these" start="00:04:38.667" video="mainVideo" id=subtitle]]
+[[!template text="deficiencies, it's usable, and" start="00:04:41.183" video="mainVideo" id=subtitle]]
+[[!template text="I use the foundation of base for" start="00:04:44.483" video="mainVideo" id=subtitle]]
+[[!template text="parse infrastructure for other languages." start="00:04:47.617" video="mainVideo" id=subtitle]]
+[[!template text="I will say that with Common Lisp was" start="00:04:49.633" video="mainVideo" id=subtitle]]
+[[!template text="rather easy because" start="00:04:52.467" video="mainVideo" id=subtitle]]
+[[!template text="CEDET already have Emacs Lisp parser" start="00:04:54.083" video="mainVideo" id=subtitle]]
+[[!template text="even though it's not great." start="00:04:56.133" video="mainVideo" id=subtitle]]
+[[!template text="It's easy to adapt and to use." start="00:04:58.000" video="mainVideo" id=subtitle]]
+[[!template text="It's not used in an Emacs" start="00:05:00.583" video="mainVideo" id=subtitle]]
+[[!template text="right now because, well," start="00:05:04.100" video="mainVideo" id=subtitle]]
+[[!template text="Emacs know very well itself," start="00:05:05.533" video="mainVideo" id=subtitle]]
+[[!template text="but it's there." start="00:05:08.983" video="mainVideo" id=subtitle]]
+[[!template text="So these, of course, are static parsers" start="00:05:11.700" video="mainVideo" id=subtitle]]
+[[!template text="so you don't need to run any" start="00:05:17.683" video="mainVideo" id=subtitle]]
+[[!template text="other language-specific tools, which is" start="00:05:19.617" video="mainVideo" id=subtitle]]
+[[!template text="an advantage for some things." start="00:05:21.983" video="mainVideo" id=subtitle]]
+[[!template text="And this was basically CEDET is," start="00:05:24.500" video="mainVideo" id=subtitle]]
+[[!template text="and I use the parse infrastructure" start="00:05:27.233" video="mainVideo" id=subtitle]]
+[[!template text="and some tools" start="00:05:30.383" video="mainVideo" id=subtitle]]
+[[!template text="to create a parser for Common Lisp." start="00:05:31.433" video="mainVideo" id=subtitle]]
+[[!template text="Well, more or less. *laughs*" start="00:05:34.433" video="mainVideo" id=subtitle]]
+[[!template text="Let's go to details." start="00:05:36.800" video="mainVideo" id=subtitle]]
+[[!template text="So I will say that it's not a parser" start="00:05:38.000" video="mainVideo" id=subtitle]]
+[[!template text="by itself because, as we all know," start="00:05:39.950" video="mainVideo" id=subtitle]]
+[[!template text="to parse a macro-based language" start="00:05:42.533" video="mainVideo" id=subtitle]]
+[[!template text="is really hard." start="00:05:44.600" video="mainVideo" id=subtitle]]
+[[!template text="Mostly if you cannot have contextual" start="00:05:46.933" video="mainVideo" id=subtitle]]
+[[!template text="information because if you create code" start="00:05:48.550" video="mainVideo" id=subtitle]]
+[[!template text="at compile time or runtime is really hard" start="00:05:52.900" video="mainVideo" id=subtitle]]
+[[!template text="if you don't have run time, right?" start="00:05:56.133" video="mainVideo" id=subtitle]]
+[[!template text="Basically, CLEDE can be described" start="00:05:59.333" video="mainVideo" id=subtitle]]
+[[!template text="as a Semantic extension." start="00:06:01.050" video="mainVideo" id=subtitle]]
+[[!template text="So basically it's like," start="00:06:02.700" video="mainVideo" id=subtitle]]
+[[!template text="you can have Semantic" start="00:06:03.967" video="mainVideo" id=subtitle]]
+[[!template text="and use it with Common Lisp code" start="00:06:07.233" video="mainVideo" id=subtitle]]
+[[!template text="and some Common Lisp Emacs tools." start="00:06:09.917" video="mainVideo" id=subtitle]]
+[[!template text="So Bison (which is not Bison) is" start="00:06:11.700" video="mainVideo" id=subtitle]]
+[[!template text="Bovine, and Semantic and Senator" start="00:06:17.450" video="mainVideo" id=subtitle]]
+[[!template text="for navigating tags," start="00:06:21.750" video="mainVideo" id=subtitle]]
+[[!template text="and then communication with SLIME, SLY," start="00:06:24.850" video="mainVideo" id=subtitle]]
+[[!template text="and inferior Lisp." start="00:06:26.467" video="mainVideo" id=subtitle]]
+[[!template text="That means... I will show that later, but" start="00:06:28.833" video="mainVideo" id=subtitle]]
+[[!template text="basically, you can parse the buffer," start="00:06:30.550" video="mainVideo" id=subtitle]]
+[[!template text="get some tags," start="00:06:32.900" video="mainVideo" id=subtitle]]
+[[!template text="get information about the tags that you want," start="00:06:34.267" video="mainVideo" id=subtitle]]
+[[!template text="and then send some of that information" start="00:06:36.067" video="mainVideo" id=subtitle]]
+[[!template text="to the SLIME, SLY, or inferior Lisp REPL buffer," start="00:06:38.117" video="mainVideo" id=subtitle]]
+[[!template text="so you can get both things" start="00:06:44.000" video="mainVideo" id=subtitle]]
+[[!template text="at the same time." start="00:06:45.817" video="mainVideo" id=subtitle]]
+[[!template text="And given that it's a Lisp language," start="00:06:48.583" video="mainVideo" id=subtitle]]
+[[!template text="this can be pretty interesting." start="00:06:50.317" video="mainVideo" id=subtitle]]
+[[!template text="Also I wrote some common package integration," start="00:06:53.400" video="mainVideo" id=subtitle]]
+[[!template text="so even though there's not" start="00:06:57.700" video="mainVideo" id=subtitle]]
+[[!template text="a Common Lisp standard," start="00:06:59.317" video="mainVideo" id=subtitle]]
+[[!template text="there's some libraries that are used" start="00:07:00.400" video="mainVideo" id=subtitle]]
+[[!template text="by basically everyone." start="00:07:05.200" video="mainVideo" id=subtitle]]
+[[!template text="They're not part of the standard," start="00:07:07.683" video="mainVideo" id=subtitle]]
+[[!template text="but yeah." start="00:07:09.517" video="mainVideo" id=subtitle]]
+[[!template text="A lot of people use it: like `asdf`," start="00:07:11.100" video="mainVideo" id=subtitle]]
+[[!template text="which is the package manager," start="00:07:14.000" video="mainVideo" id=subtitle]]
+[[!template text="I will say it's `asdf` is the" start="00:07:15.650" video="mainVideo" id=subtitle]]
+[[!template text="definition packages, so to say," start="00:07:19.067" video="mainVideo" id=subtitle]]
+[[!template text="better than packages itself" start="00:07:21.883" video="mainVideo" id=subtitle]]
+[[!template text="and have more features." start="00:07:23.767" video="mainVideo" id=subtitle]]
+[[!template text="I wrote a nice integration with it" start="00:07:26.417" video="mainVideo" id=subtitle]]
+[[!template text="and also `fiveam`," start="00:07:28.483" video="mainVideo" id=subtitle]]
+[[!template text="which is a well-known test package." start="00:07:29.600" video="mainVideo" id=subtitle]]
+[[!template text="I just wrote this as an example" start="00:07:34.517" video="mainVideo" id=subtitle]]
+[[!template text="on how we can do with CLEDE." start="00:07:39.400" video="mainVideo" id=subtitle]]
+[[!template text="Let's look at the features," start="00:07:41.983" video="mainVideo" id=subtitle]]
+[[!template text="and then we go to a demo." start="00:07:43.733" video="mainVideo" id=subtitle]]
+[[!template text="You can go to the repository." start="00:07:51.367" video="mainVideo" id=subtitle]]
+[[!template text="Currently, it's not in Melpa" start="00:07:54.100" video="mainVideo" id=subtitle]]
+[[!template text="although I wanted" start="00:07:56.650" video="mainVideo" id=subtitle]]
+[[!template text="to merge it-- I mean, to add it--" start="00:07:58.017" video="mainVideo" id=subtitle]]
+[[!template text="to Melpa in the future." start="00:08:01.450" video="mainVideo" id=subtitle]]
+[[!template text="I want to clean the code and" start="00:08:04.767" video="mainVideo" id=subtitle]]
+[[!template text="add some more features;" start="00:08:06.467" video="mainVideo" id=subtitle]]
+[[!template text="I'm working on that and now" start="00:08:07.517" video="mainVideo" id=subtitle]]
+[[!template text="like an eagle, so to say..." start="00:08:09.750" video="mainVideo" id=subtitle]]
+[[!template text="but yeah, you can go here and then check" start="00:08:12.667" video="mainVideo" id=subtitle]]
+[[!template text="all the features and test it." start="00:08:15.633" video="mainVideo" id=subtitle]]
+[[!template text="To install is pretty easy:" start="00:08:18.933" video="mainVideo" id=subtitle]]
+[[!template text="just &quot ;add to path&quot ; thing." start="00:08:20.833" video="mainVideo" id=subtitle]]
+[[!template text="You don't need any external dependencies;" start="00:08:22.600" video="mainVideo" id=subtitle]]
+[[!template text="everything's in Emacs." start="00:08:23.750" video="mainVideo" id=subtitle]]
+[[!template text="This was tested with Emacs 27," start="00:08:25.917" video="mainVideo" id=subtitle]]
+[[!template text="but probably going to work" start="00:08:28.567" video="mainVideo" id=subtitle]]
+[[!template text="with Emacs 25 onwards so" start="00:08:29.983" video="mainVideo" id=subtitle]]
+[[!template text="it shouldn't be any problem." start="00:08:32.850" video="mainVideo" id=subtitle]]
+[[!template text="So let's go with the features." start="00:08:34.367" video="mainVideo" id=subtitle]]
+[[!template text="This is some CEDET integrations," start="00:08:38.733" video="mainVideo" id=subtitle]]
+[[!template text="and first, like I said, it has" start="00:08:42.883" video="mainVideo" id=subtitle]]
+[[!template text="support for SLY, SLIME, and inferior Lisp." start="00:08:44.517" video="mainVideo" id=subtitle]]
+[[!template text="If you are Common Lisp developer, you" start="00:08:48.100" video="mainVideo" id=subtitle]]
+[[!template text="probably know a SLIME and a SLY," start="00:08:49.617" video="mainVideo" id=subtitle]]
+[[!template text="and inferior Lisp is basically" start="00:08:52.367" video="mainVideo" id=subtitle]]
+[[!template text="just stock Emacs REPL." start="00:08:53.583" video="mainVideo" id=subtitle]]
+[[!template text="I support all three equally, so to say," start="00:08:57.900" video="mainVideo" id=subtitle]]
+[[!template text="and we have also `fiveam` integration," start="00:09:00.917" video="mainVideo" id=subtitle]]
+[[!template text="the ability to-- as I'm going to show later," start="00:09:05.683" video="mainVideo" id=subtitle]]
+[[!template text="you have the ability to send a test--" start="00:09:08.967" video="mainVideo" id=subtitle]]
+[[!template text="either packages or an entire suite of tests," start="00:09:10.983" video="mainVideo" id=subtitle]]
+[[!template text="and `asdf`, which currently I'm just" start="00:09:16.333" video="mainVideo" id=subtitle]]
+[[!template text="supporting basic project navigation" start="00:09:21.450" video="mainVideo" id=subtitle]]
+[[!template text="and some information," start="00:09:23.617" video="mainVideo" id=subtitle]]
+[[!template text="but it's a work-in-progress." start="00:09:25.533" video="mainVideo" id=subtitle]]
+[[!template text="I also have some general activities" start="00:09:28.617" video="mainVideo" id=subtitle]]
+[[!template text="that are not directly related to CEDET" start="00:09:29.883" video="mainVideo" id=subtitle]]
+[[!template text="but part of the CLEDE package, which" start="00:09:32.017" video="mainVideo" id=subtitle]]
+[[!template text="is CLEDE highlight." start="00:09:34.150" video="mainVideo" id=subtitle]]
+[[!template text="It's highly inspired by the" start="00:09:35.600" video="mainVideo" id=subtitle]]
+[[!template text="Emacs re-factor `erefactor`." start="00:09:36.917" video="mainVideo" id=subtitle]]
+[[!template text="Basically, you have some nice" start="00:09:41.267" video="mainVideo" id=subtitle]]
+[[!template text="highlights for lint variables." start="00:09:44.050" video="mainVideo" id=subtitle]]
+[[!template text="I want to expand that to also" start="00:09:47.983" video="mainVideo" id=subtitle]]
+[[!template text="support parameters and function stuff," start="00:09:49.567" video="mainVideo" id=subtitle]]
+[[!template text="but it's not a high priority for me." start="00:09:53.233" video="mainVideo" id=subtitle]]
+[[!template text="But yeah, I sometimes use this;" start="00:09:56.400" video="mainVideo" id=subtitle]]
+[[!template text="it's pretty neat when you have a big lint." start="00:09:58.217" video="mainVideo" id=subtitle]]
+[[!template text="Also some refactoring utilities..." start="00:10:02.050" video="mainVideo" id=subtitle]]
+[[!template text="some of those can be said" start="00:10:05.433" video="mainVideo" id=subtitle]]
+[[!template text="that it's overlapped with some..." start="00:10:06.800" video="mainVideo" id=subtitle]]
+[[!template text="because it is a string base, it doesn't" start="00:10:08.500" video="mainVideo" id=subtitle]]
+[[!template text="have too much context information," start="00:10:12.567" video="mainVideo" id=subtitle]]
+[[!template text="but yeah, some sort of" start="00:10:16.083" video="mainVideo" id=subtitle]]
+[[!template text="`replace-symbol-in-region` and `symbol-tag`." start="00:10:18.067" video="mainVideo" id=subtitle]]
+[[!template text="And then some CLEDE commands." start="00:10:22.267" video="mainVideo" id=subtitle]]
+[[!template text="This is the thing that I use all the time." start="00:10:23.967" video="mainVideo" id=subtitle]]
+[[!template text="It's like you're going to find" start="00:10:25.600" video="mainVideo" id=subtitle]]
+[[!template text="some commands to send to a REPL." start="00:10:26.167" video="mainVideo" id=subtitle]]
+[[!template text="I will show some example, but basically," start="00:10:29.167" video="mainVideo" id=subtitle]]
+[[!template text="you have already an example." start="00:10:31.467" video="mainVideo" id=subtitle]]
+[[!template text="You define a list of commands," start="00:10:33.083" video="mainVideo" id=subtitle]]
+[[!template text="you put name, and then you put the" start="00:10:34.433" video="mainVideo" id=subtitle]]
+[[!template text="Common Lisp code that you want to send." start="00:10:37.967" video="mainVideo" id=subtitle]]
+[[!template text="Given that, you're writing this" start="00:10:39.400" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Lisp in your configuration." start="00:10:41.650" video="mainVideo" id=subtitle]]
+[[!template text="You can have some runtime information" start="00:10:43.583" video="mainVideo" id=subtitle]]
+[[!template text="when the code is sent, right?" start="00:10:46.967" video="mainVideo" id=subtitle]]
+[[!template text="so insert, get a variable value, or whatever." start="00:10:49.550" video="mainVideo" id=subtitle]]
+[[!template text="OK, `imenu` integration." start="00:10:53.550" video="mainVideo" id=subtitle]]
+[[!template text="Yes, Semantic..." start="00:10:56.233" video="mainVideo" id=subtitle]]
+[[!template text="CEDET has a great `imenu` utilities" start="00:10:59.067" video="mainVideo" id=subtitle]]
+[[!template text="to have a better `imenu`." start="00:11:02.550" video="mainVideo" id=subtitle]]
+[[!template text="`imenu-list` also works really well." start="00:11:05.700" video="mainVideo" id=subtitle]]
+[[!template text="So you have better... when you go to a file" start="00:11:10.483" video="mainVideo" id=subtitle]]
+[[!template text="that you don't fully know what is inside," start="00:11:13.017" video="mainVideo" id=subtitle]]
+[[!template text="it's better to navigate having like a tree." start="00:11:15.300" video="mainVideo" id=subtitle]]
+[[!template text="Yeah, this one's the thing is going" start="00:11:20.633" video="mainVideo" id=subtitle]]
+[[!template text="to show that Senator, which is" start="00:11:22.483" video="mainVideo" id=subtitle]]
+[[!template text="Semantic navigator, and then some" start="00:11:24.883" video="mainVideo" id=subtitle]]
+[[!template text="Semantic-specific tools like `complete-jump`," start="00:11:26.733" video="mainVideo" id=subtitle]]
+[[!template text="which I don't use this one too much" start="00:11:30.317" video="mainVideo" id=subtitle]]
+[[!template text="because we have SLY/SLIME," start="00:11:32.850" video="mainVideo" id=subtitle]]
+[[!template text="but they're there, so yeah." start="00:11:35.400" video="mainVideo" id=subtitle]]
+[[!template text="Like I said, Common Lisp library support," start="00:11:39.183" video="mainVideo" id=subtitle]]
+[[!template text="which is duplicated." start="00:11:41.533" video="mainVideo" id=subtitle]]
+[[!template text="OK, so let's go to the demo." start="00:11:44.433" video="mainVideo" id=subtitle]]
+[[!template text="Um." start="00:11:47.117" video="mainVideo" id=subtitle]]
+[[!template text="Let's go to the demo file." start="00:11:51.083" video="mainVideo" id=subtitle]]
+[[!template text="Right." start="00:11:53.667" video="mainVideo" id=subtitle]]
+[[!template text="First, we have to do is enable CLEDE." start="00:11:55.400" video="mainVideo" id=subtitle]]
+[[!template text="This is pretty easy:" start="00:11:58.350" video="mainVideo" id=subtitle]]
+[[!template text="we call `clede-start`, right," start="00:11:59.533" video="mainVideo" id=subtitle]]
+[[!template text="and now it's started." start="00:12:03.500" video="mainVideo" id=subtitle]]
+[[!template text="CLEDE is not an asynchronous parser so" start="00:12:05.200" video="mainVideo" id=subtitle]]
+[[!template text="Semantic (in this case, Bovine) is not." start="00:12:08.200" video="mainVideo" id=subtitle]]
+[[!template text="If the file is large, it may take some time." start="00:12:11.000" video="mainVideo" id=subtitle]]
+[[!template text="It shouldn't because we have" start="00:12:16.017" video="mainVideo" id=subtitle]]
+[[!template text="powerful computers, but if your" start="00:12:16.117" video="mainVideo" id=subtitle]]
+[[!template text="computer is not that powerful," start="00:12:19.217" video="mainVideo" id=subtitle]]
+[[!template text="it may take a while." start="00:12:22.017" video="mainVideo" id=subtitle]]
+[[!template text="To see the information that has been" start="00:12:23.033" video="mainVideo" id=subtitle]]
+[[!template text="parsed, we're going to call `bovinate`." start="00:12:26.217" video="mainVideo" id=subtitle]]
+[[!template text="Oops... oops..." start="00:12:31.267" video="mainVideo" id=subtitle]]
+[[!template text="Oh! I have to-- sorry..." start="00:12:33.867" video="mainVideo" id=subtitle]]
+[[!template text="Let's enable Semantic again." start="00:12:36.133" video="mainVideo" id=subtitle]]
+[[!template text="Let's start... `bovinate`..." start="00:12:43.367" video="mainVideo" id=subtitle]]
+[[!template text="OK, so..." start="00:12:45.317" video="mainVideo" id=subtitle]]
+[[!template text="This is the information that" start="00:12:48.217" video="mainVideo" id=subtitle]]
+[[!template text="currently CLEDE is taking from the buffer." start="00:12:50.017" video="mainVideo" id=subtitle]]
+[[!template text="So we can see it's taking this, and" start="00:12:53.083" video="mainVideo" id=subtitle]]
+[[!template text="it doesn't know what it is," start="00:12:55.617" video="mainVideo" id=subtitle]]
+[[!template text="so this is the tag name..." start="00:12:58.550" video="mainVideo" id=subtitle]]
+[[!template text="this is the type," start="00:13:02.267" video="mainVideo" id=subtitle]]
+[[!template text="and these are some information" start="00:13:02.950" video="mainVideo" id=subtitle]]
+[[!template text="and the location." start="00:13:03.833" video="mainVideo" id=subtitle]]
+[[!template text="OK, so we know that this is a variable," start="00:13:05.850" video="mainVideo" id=subtitle]]
+[[!template text="and it has the full value." start="00:13:08.250" video="mainVideo" id=subtitle]]
+[[!template text="You know this is a package, right," start="00:13:10.250" video="mainVideo" id=subtitle]]
+[[!template text="because it's defined as a package." start="00:13:13.333" video="mainVideo" id=subtitle]]
+[[!template text="It doesn't understand what this is." start="00:13:15.550" video="mainVideo" id=subtitle]]
+[[!template text="This node is a function" start="00:13:18.300" video="mainVideo" id=subtitle]]
+[[!template text="because of the `fun`," start="00:13:19.067" video="mainVideo" id=subtitle]]
+[[!template text="and some of this is code," start="00:13:19.917" video="mainVideo" id=subtitle]]
+[[!template text="and it also understands some tests" start="00:13:23.233" video="mainVideo" id=subtitle]]
+[[!template text="because it has `fiveam` integration." start="00:13:26.017" video="mainVideo" id=subtitle]]
+[[!template text="If it detects that has some test here" start="00:13:27.767" video="mainVideo" id=subtitle]]
+[[!template text="it will know that, indeed, it is test." start="00:13:31.000" video="mainVideo" id=subtitle]]
+[[!template text="So let's try some, first, `imenu`." start="00:13:34.517" video="mainVideo" id=subtitle]]
+[[!template text="So we can see here we have..." start="00:13:40.417" video="mainVideo" id=subtitle]]
+[[!template text="I understand that this have" start="00:13:42.650" video="mainVideo" id=subtitle]]
+[[!template text="some sort of `fiveam` switch" start="00:13:44.850" video="mainVideo" id=subtitle]]
+[[!template text="and some tests defined." start="00:13:46.700" video="mainVideo" id=subtitle]]
+[[!template text="It understands this package, and" start="00:13:49.450" video="mainVideo" id=subtitle]]
+[[!template text="it'll give you some variables-- `defuns`," start="00:13:51.100" video="mainVideo" id=subtitle]]
+[[!template text="and it also will give you some misc" start="00:13:52.883" video="mainVideo" id=subtitle]]
+[[!template text="for things that doesn't know what it is." start="00:13:55.217" video="mainVideo" id=subtitle]]
+[[!template text="And you can also" start="00:14:00.017" video="mainVideo" id=subtitle]]
+[[!template text="navigate with this-- like this `imenu`." start="00:14:01.083" video="mainVideo" id=subtitle]]
+[[!template text="So, um, let's go first with some Senator." start="00:14:06.000" video="mainVideo" id=subtitle]]
+[[!template text="So with Senator, we can navigate," start="00:14:12.000" video="mainVideo" id=subtitle]]
+[[!template text="go to the next stack, previous stack," start="00:14:14.967" video="mainVideo" id=subtitle]]
+[[!template text="all this, um, top-level `s-expression`" start="00:14:16.300" video="mainVideo" id=subtitle]]
+[[!template text="are basically a tag, even though" start="00:14:20.883" video="mainVideo" id=subtitle]]
+[[!template text="it's code... you can navigate, right." start="00:14:22.567" video="mainVideo" id=subtitle]]
+[[!template text="Um, copy/kill this or some other stuff." start="00:14:28.567" video="mainVideo" id=subtitle]]
+[[!template text="Um, some interesting thing that we can" start="00:14:31.433" video="mainVideo" id=subtitle]]
+[[!template text="do is let's launch SLY, right." start="00:14:34.117" video="mainVideo" id=subtitle]]
+[[!template text="Um, let's load `fiveam`," start="00:14:38.817" video="mainVideo" id=subtitle]]
+[[!template text="and let's send some tests." start="00:14:44.417" video="mainVideo" id=subtitle]]
+[[!template text="We can say, OK, `clede-fiveam-send-current-test`," start="00:14:45.600" video="mainVideo" id=subtitle]]
+[[!template text="and it will-- OK, have to compile" start="00:14:51.567" video="mainVideo" id=subtitle]]
+[[!template text="this file first." start="00:14:53.133" video="mainVideo" id=subtitle]]
+[[!template text="OK, you don't like this..." start="00:14:54.850" video="mainVideo" id=subtitle]]
+[[!template text="you compile the tests." start="00:14:56.083" video="mainVideo" id=subtitle]]
+[[!template text="OK... um... well..." start="00:14:58.467" video="mainVideo" id=subtitle]]
+[[!template text="I don't have-- yeah, I don't have" start="00:15:03.767" video="mainVideo" id=subtitle]]
+[[!template text="the switch here so let's..." start="00:15:05.117" video="mainVideo" id=subtitle]]
+[[!template text="OK, yeah because I guess it's getting..." start="00:15:11.933" video="mainVideo" id=subtitle]]
+[[!template text="sorry about this..." start="00:15:14.833" video="mainVideo" id=subtitle]]
+[[!template text="Let's say we're going to send this test..." start="00:15:19.683" video="mainVideo" id=subtitle]]
+[[!template text="It isn't working..." start="00:15:23.083" video="mainVideo" id=subtitle]]
+[[!template text="OK, why are you not working..." start="00:15:28.767" video="mainVideo" id=subtitle]]
+[[!template text="maybe because we have to go" start="00:15:37.067" video="mainVideo" id=subtitle]]
+[[!template text="to the package `fiveam`." start="00:15:38.550" video="mainVideo" id=subtitle]]
+[[!template text="Yes, sorry... um..." start="00:15:47.183" video="mainVideo" id=subtitle]]
+[[!template text="Yeah, so we're gonna go here, and" start="00:15:49.233" video="mainVideo" id=subtitle]]
+[[!template text="we can say `fiveam-send-tests`," start="00:15:51.650" video="mainVideo" id=subtitle]]
+[[!template text="and there we have it." start="00:15:54.217" video="mainVideo" id=subtitle]]
+[[!template text="It will send the test" start="00:15:55.350" video="mainVideo" id=subtitle]]
+[[!template text="that we are currently in, right." start="00:15:56.300" video="mainVideo" id=subtitle]]
+[[!template text="So that's the thing." start="00:16:00.317" video="mainVideo" id=subtitle]]
+[[!template text="Another interesting thing that I said is" start="00:16:01.983" video="mainVideo" id=subtitle]]
+[[!template text="`clede-highlight-minor-mode`." start="00:16:04.000" video="mainVideo" id=subtitle]]
+[[!template text="Basically, work in `let`'s context" start="00:16:08.550" video="mainVideo" id=subtitle]]
+[[!template text="to know where to highlight" start="00:16:11.667" video="mainVideo" id=subtitle]]
+[[!template text="all the variables," start="00:16:13.550" video="mainVideo" id=subtitle]]
+[[!template text="and we can disable." start="00:16:17.217" video="mainVideo" id=subtitle]]
+[[!template text="What else do we have?" start="00:16:20.317" video="mainVideo" id=subtitle]]
+[[!template text="So we have framework integration." start="00:16:21.933" video="mainVideo" id=subtitle]]
+[[!template text="You can go `clede-` and" start="00:16:24.200" video="mainVideo" id=subtitle]]
+[[!template text="see what more commands are." start="00:16:26.000" video="mainVideo" id=subtitle]]
+[[!template text="`commands-run` are basically a way" start="00:16:27.817" video="mainVideo" id=subtitle]]
+[[!template text="to define commands, you have a variable," start="00:16:29.867" video="mainVideo" id=subtitle]]
+[[!template text="which is `clede-commands-list`." start="00:16:31.717" video="mainVideo" id=subtitle]]
+[[!template text="Let's explain that you can get" start="00:16:35.417" video="mainVideo" id=subtitle]]
+[[!template text="some system working" start="00:16:37.333" video="mainVideo" id=subtitle]]
+[[!template text="or whatever command you want, right." start="00:16:39.917" video="mainVideo" id=subtitle]]
+[[!template text="Also you have `asdf` basic integration." start="00:16:42.717" video="mainVideo" id=subtitle]]
+[[!template text="You can go to a definition file" start="00:16:46.183" video="mainVideo" id=subtitle]]
+[[!template text="of some of the systems are already loaded." start="00:16:48.167" video="mainVideo" id=subtitle]]
+[[!template text="For example, let's go to here," start="00:16:51.150" video="mainVideo" id=subtitle]]
+[[!template text="and we go to the definition file--" start="00:16:53.767" video="mainVideo" id=subtitle]]
+[[!template text="there's the file, right?" start="00:16:55.650" video="mainVideo" id=subtitle]]
+[[!template text="This is used because I'm sending" start="00:16:58.017" video="mainVideo" id=subtitle]]
+[[!template text="commands for the REPL, so this" start="00:16:59.100" video="mainVideo" id=subtitle]]
+[[!template text="functionality is not provided" start="00:17:00.900" video="mainVideo" id=subtitle]]
+[[!template text="by CEDET or Semantic," start="00:17:04.217" video="mainVideo" id=subtitle]]
+[[!template text="but I can also get some sort" start="00:17:09.267" video="mainVideo" id=subtitle]]
+[[!template text="of information for `asd` file," start="00:17:11.733" video="mainVideo" id=subtitle]]
+[[!template text="which is a work-in-progress," start="00:17:19.817" video="mainVideo" id=subtitle]]
+[[!template text="but you can go to some component file" start="00:17:21.650" video="mainVideo" id=subtitle]]
+[[!template text="when you have a big `asd` file" start="00:17:23.200" video="mainVideo" id=subtitle]]
+[[!template text="with lots of components" start="00:17:24.250" video="mainVideo" id=subtitle]]
+[[!template text="and some other interesting thing." start="00:17:25.300" video="mainVideo" id=subtitle]]
+[[!template text="Like I said, that's a work-in-progress," start="00:17:27.883" video="mainVideo" id=subtitle]]
+[[!template text="Yes, so this is most of the functionality." start="00:17:30.383" video="mainVideo" id=subtitle]]
+[[!template text="The most interesting thing, I think," start="00:17:35.067" video="mainVideo" id=subtitle]]
+[[!template text="is the base for the foundation." start="00:17:37.100" video="mainVideo" id=subtitle]]
+[[!template text="So you can expand: let's go to source code," start="00:17:40.367" video="mainVideo" id=subtitle]]
+[[!template text="for example, that `fiveam`." start="00:17:43.100" video="mainVideo" id=subtitle]]
+[[!template text="So as we can see here, this is" start="00:17:48.433" video="mainVideo" id=subtitle]]
+[[!template text="the `fiveam` integration, and to add it," start="00:17:50.000" video="mainVideo" id=subtitle]]
+[[!template text="I just define some new functions," start="00:17:53.533" video="mainVideo" id=subtitle]]
+[[!template text="and then you use this..." start="00:17:58.333" video="mainVideo" id=subtitle]]
+[[!template text="set up a new form parser that we use" start="00:18:02.083" video="mainVideo" id=subtitle]]
+[[!template text="to get some information" start="00:18:04.250" video="mainVideo" id=subtitle]]
+[[!template text="about the `s-expression` top-level," start="00:18:06.500" video="mainVideo" id=subtitle]]
+[[!template text="and we define the names," start="00:18:09.250" video="mainVideo" id=subtitle]]
+[[!template text="we define information we want to take" start="00:18:10.533" video="mainVideo" id=subtitle]]
+[[!template text="from the symbol and everything else." start="00:18:11.717" video="mainVideo" id=subtitle]]
+[[!template text="Also some ?? types" start="00:18:13.800" video="mainVideo" id=subtitle]]
+[[!template text="that would be going to be added" start="00:18:17.233" video="mainVideo" id=subtitle]]
+[[!template text="to the `imenu` thing:" start="00:18:19.467" video="mainVideo" id=subtitle]]
+[[!template text="for example, `imenu test switch and test`." start="00:18:21.167" video="mainVideo" id=subtitle]]
+[[!template text="And then, these are, for example," start="00:18:24.133" video="mainVideo" id=subtitle]]
+[[!template text="some function to send information" start="00:18:27.417" video="mainVideo" id=subtitle]]
+[[!template text="to the SLY, SLIME, or inferior Lisp" start="00:18:29.433" video="mainVideo" id=subtitle]]
+[[!template text="depending on the Lisp that you're using." start="00:18:33.583" video="mainVideo" id=subtitle]]
+[[!template text="So I do not have more time." start="00:18:37.150" video="mainVideo" id=subtitle]]
+[[!template text="Sorry about that." start="00:18:39.500" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much." start="00:18:40.467" video="mainVideo" id=subtitle]]
+[[!template text="My name is Fermin." start="00:18:45.017" video="mainVideo" id=subtitle]]
+[[!template text="You can send me a mail in my mail," start="00:18:46.483" video="mainVideo" id=subtitle]]
+[[!template text="and that's my webpage." start="00:18:49.833" video="mainVideo" id=subtitle]]
+[[!template text="I hope you like it." start="00:18:51.333" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main--main--chapters.vtt b/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main--main--chapters.vtt
new file mode 100644
index 00000000..40c8b472
--- /dev/null
+++ b/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main--main--chapters.vtt
@@ -0,0 +1,55 @@
+WEBVTT
+
+00:00:02.960 --> 00:00:58.319
+Introduction
+
+00:00:58.320 --> 00:01:57.679
+Contours of this presentation
+
+00:01:57.680 --> 00:02:27.359
+Intended audience
+
+00:02:27.360 --> 00:04:32.079
+Shaping and bidirectionality
+
+00:04:32.080 --> 00:05:30.638
+Emacs: a truly multilingual capable editor and environment
+
+00:05:30.639 --> 00:06:09.918
+Significance of Emacs support for Perso-Arabic scripts
+
+00:06:09.919 --> 00:06:49.918
+About Emacs input methods
+
+00:06:49.919 --> 00:07:27.839
+Emacs Persian input methods
+
+00:07:27.840 --> 00:12:00.159
+Selecting Persian input methods - gif-screencast
+
+00:12:00.160 --> 00:12:27.999
+Emacs built-in documentation
+
+00:12:28.000 --> 00:12:43.999
+Pointers to code
+
+00:12:44.000 --> 00:14:48.958
+Keyboard layouts for Persian input methods - gif-screencast
+
+00:14:48.959 --> 00:16:17.518
+Complete documentation
+
+00:16:17.519 --> 00:17:25.279
+Ramification Of BIDI and Perso-Arabic on Emacs applications
+
+00:17:25.280 --> 00:17:53.519
+BIDI-aware Emacs applications
+
+00:17:53.520 --> 00:18:44.639
+Emacs Native Markup Language (ENML)
+
+00:18:44.640 --> 00:19:24.239
+About ByStar And BISOS
+
+00:19:24.240 --> 00:19:25.240
+About Blee and Persian Blee
diff --git a/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt b/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt
new file mode 100644
index 00000000..16c3fb37
--- /dev/null
+++ b/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt
@@ -0,0 +1,34 @@
+WEBVTT
+
+00:00:01.360 --> 00:02:06.006
+Introduction
+
+00:02:06.007 --> 00:05:27.537
+What is BinDat?
+
+00:05:27.538 --> 00:08:30.748
+Conversion to lexical scoping
+
+00:08:30.749 --> 00:15:35.890
+The BinDat specification
+
+00:15:35.891 --> 00:17:47.579
+New design
+
+00:17:47.580 --> 00:19:30.225
+Documentation
+
+00:19:30.226 --> 00:21:51.272
+Advantages
+
+00:21:51.273 --> 00:23:08.077
+New features
+
+00:23:08.078 --> 00:27:56.093
+Examples
+
+00:27:56.094 --> 00:28:28.335
+Conclusion
+
+00:28:28.336 --> 00:28:29.336
+Negatives
diff --git a/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt b/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt
new file mode 100644
index 00000000..3eb2b4ed
--- /dev/null
+++ b/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt
@@ -0,0 +1,1855 @@
+WEBVTT
+
+00:01.360 --> 00:04.080
+Hi. So I'm going to talk today
+
+00:04.180 --> 00:10.000
+about a fun rewrite I did of the BinDat package.
+
+00:10.000 --> 00:00:12.400
+I call this Turbo BinDat.
+
+00:00:12.400 --> 00:00:14.001
+Actually, the package hasn't changed name,
+
+00:14.101 --> 00:16.801
+it's just that the result happens to be faster.
+
+00:16.901 --> 00:19.521
+The point was not to make it faster though,
+
+00:19.621 --> 00:22.241
+and the point was not to make you understand
+
+00:22.341 --> 00:23.440
+that data is not code.
+
+00:23.540 --> 00:27.120
+It's just one more experience I've had
+
+00:27.120 --> 00:31.280
+where I've seen that treating data as code
+
+00:31.381 --> 00:33.522
+is not always a good idea.
+
+00:33.622 --> 00:36.162
+It's important to keep the difference.
+
+00:36.162 --> 00:38.880
+So let's get started.
+
+00:38.881 --> 00:40.642
+So what is BinDat anyway?
+
+00:40.742 --> 00:43.602
+Here's just the overview of basically
+
+00:43.602 --> 00:44.962
+what I'm going to present.
+
+00:45.062 --> 00:47.842
+So I'm first going to present BinDat itself
+
+00:47.843 --> 00:00:49.039
+for those who don't know it,
+
+00:00:49.039 --> 00:00:51.923
+which is probably the majority of you.
+
+00:51.923 --> 00:55.363
+Then I'm going to talk about the actual problems
+
+00:55.363 --> 00:58.882
+that I encountered with this package
+
+00:58.882 --> 01:01.843
+that motivated me to rewrite it.
+
+01:01.843 --> 01:05.043
+Most of them were lack of flexibility,
+
+01:05.044 --> 01:09.924
+and some of it was just poor behavior
+
+01:09.924 --> 01:13.364
+with respect to scoping and variables,
+
+01:13.364 --> 01:16.324
+which of course, you know, is bad --
+
+01:16.424 --> 01:20.724
+basically uses of eval or, "eval is evil."
+
+01:20.724 --> 01:24.884
+Then I'm going to talk about the new design --
+
+01:24.985 --> 01:28.005
+how I redesigned it
+
+01:28.105 --> 01:31.365
+to make it both simpler and more flexible,
+
+01:31.365 --> 01:32.965
+and where the key idea was
+
+01:33.065 --> 01:35.205
+to expose code as code
+
+01:35.305 --> 01:37.525
+instead of having it as data,
+
+01:37.625 --> 01:39.605
+and so here the distinction between the two
+
+01:39.706 --> 01:44.085
+is important and made things simpler.
+
+01:44.085 --> 01:46.405
+I tried to keep efficiency in mind,
+
+01:46.405 --> 01:52.405
+which resulted in some of the aspects of the design
+
+01:52.505 --> 01:54.886
+which are not completely satisfactory,
+
+01:54.886 --> 01:57.046
+but the result is actually fairly efficient.
+
+01:57.146 --> 01:59.286
+Even though it was not the main motivation,
+
+01:59.287 --> 02:02.967
+it was one of the nice outcomes.
+
+02:02.967 --> 00:02:06.006
+And then I'm going to present some examples.
+
+02:06.007 --> 02:08.167
+So first: what is BinDat?
+
+02:08.267 --> 02:10.567
+Oh actually, rather than present THIS,
+
+02:10.667 --> 02:12.407
+I'm going to go straight to the code,
+
+02:12.507 --> 02:14.246
+because BinDat actually had
+
+02:14.346 --> 02:16.647
+an introduction which was fairly legible.
+
+02:16.748 --> 02:21.128
+So here we go: this is the old BinDat from Emacs 27
+
+02:21.128 --> 02:23.448
+and the commentary starts by explaining
+
+02:23.448 --> 02:25.848
+what is BinDat? Basically BinDat is a package
+
+02:25.948 --> 02:30.247
+that lets you parse and unparse
+
+02:30.247 --> 02:31.527
+basically binary data.
+
+02:31.627 --> 02:34.648
+The intent is to have typically network data
+
+02:34.749 --> 02:35.849
+or something like this.
+
+02:35.949 --> 02:38.328
+So assuming you have network data,
+
+02:38.328 --> 02:41.528
+presented or defined
+
+02:41.628 --> 02:44.569
+with some kind of C-style structs, typically,
+
+02:44.669 --> 02:46.009
+or something along these lines.
+
+02:46.109 --> 02:49.120
+So you presumably start with documentation
+
+02:49.120 --> 02:52.809
+that presents something like those structs here,
+
+02:52.810 --> 02:57.130
+and you want to be able to generate such packets
+
+02:57.230 --> 03:00.249
+and read such packets,
+
+03:00.349 --> 03:02.090
+so the way you do it is
+
+03:02.190 --> 03:04.570
+you rewrite those specifications
+
+03:04.670 --> 03:06.010
+into the BinDat syntax.
+
+03:06.110 --> 03:07.529
+So here's the BinDat syntax
+
+03:07.529 --> 03:10.490
+for the the previous specification.
+
+03:10.491 --> 03:11.610
+So here, for example,
+
+03:11.610 --> 03:16.970
+you see the case for a data packet
+
+03:16.970 --> 03:20.411
+which will have a 'type' field which is a byte
+
+03:20.411 --> 03:24.091
+(an unsigned 8-bit entity),
+
+03:24.091 --> 03:26.411
+then an 'opcode' which is also a byte,
+
+03:26.411 --> 03:30.731
+then a 'length' which is a 16-bit unsigned integer
+
+03:30.732 --> 03:34.092
+in little endian order,
+
+03:34.092 --> 03:38.732
+and then some 'id' for this entry, which is
+
+03:38.732 --> 03:43.531
+8 bytes containing a zero-terminated string,
+
+03:43.531 --> 03:47.531
+and then the actual data, basically the payload,
+
+03:47.532 --> 03:51.453
+which is in this case a vector of bytes,
+
+03:51.453 --> 03:54.812
+('bytes' here doesn't doesn't need to be specified)
+
+03:54.812 --> 03:58.172
+and here we specify the length of this vector.
+
+03:58.172 --> 03:59.773
+This 'length' here
+
+03:59.773 --> 04:02.252
+happens to be actually the name of THIS field,
+
+04:02.252 --> 04:03.853
+so the length of the data
+
+04:03.854 --> 04:06.574
+is specified by the 'length' field here,
+
+04:06.574 --> 04:08.574
+and BinDat will understand this part,
+
+04:08.574 --> 04:12.333
+which is the the nice part of BinDat.
+
+04:12.333 --> 04:15.774
+And then you have an alignment field at the end,
+
+04:15.774 --> 04:18.253
+which is basically padding.
+
+04:18.253 --> 04:20.574
+It says that it is padded
+
+04:20.575 --> 04:23.295
+until the next multiple of four.
+
+04:23.295 --> 04:25.855
+Okay. So this works reasonably well.
+
+04:25.855 --> 04:27.455
+This is actually very nice.
+
+04:27.455 --> 04:30.335
+With this, you can then call
+
+04:30.335 --> 04:32.975
+bindat-pack or bindat-unpack,
+
+04:32.975 --> 04:37.774
+passing it a string, or passing it an alist,
+
+04:37.774 --> 04:40.415
+to do the packing and unpacking.
+
+04:40.416 --> 04:43.296
+So, for example, if you take this string--
+
+04:43.296 --> 04:45.856
+actually, in this case, it's a vector of bytes
+
+04:45.856 --> 04:49.456
+but it works the same; it works in both ways--
+
+04:49.456 --> 04:53.536
+if you pass this to bindat-unpack,
+
+04:53.536 --> 04:57.456
+it will presumably return you this structure
+
+04:57.457 --> 05:00.017
+if you've given it the corresponding type.
+
+05:00.017 --> 05:01.776
+So it will extract--
+
+05:01.776 --> 05:05.617
+you will see that there is an IP address,
+
+05:05.617 --> 05:08.017
+which is a destination IP, a source IP,
+
+05:08.017 --> 05:09.857
+and some port number,
+
+05:09.857 --> 05:12.977
+and some actual data here and there, etc.
+
+05:12.977 --> 05:18.017
+So this is quite convenient if you need to do this,
+
+05:18.018 --> 05:20.898
+and that's what it was designed for.
+
+05:20.898 --> 00:05:27.537
+So here we are. Let's go back to the actual talk.
+
+05:27.538 --> 05:34.338
+I converted BinDat to lexical scoping at some point
+
+05:34.339 --> 05:37.299
+and things seemed to work fine,
+
+05:37.299 --> 05:42.819
+except, at some point, probably weeks later,
+
+05:42.819 --> 05:47.139
+I saw a bug report
+
+05:47.139 --> 05:53.058
+about the new version using lexical scoping
+
+05:53.059 --> 05:56.339
+not working correctly with WeeChat.
+
+05:56.339 --> 06:00.580
+So here's the actual chunk of code
+
+06:00.580 --> 06:02.820
+that appears in WeeChat.
+
+06:02.820 --> 06:08.420
+Here you see that they also define a BinDat spec.
+
+06:08.421 --> 06:14.741
+It's a packet that has a 32-bit unsigned length,
+
+06:14.741 --> 06:18.500
+then some compression byte/compression information,
+
+06:18.500 --> 06:23.780
+then an id which contains basically another struct
+
+06:23.780 --> 06:26.901
+(which is specified elsewhere; doesn't matter here),
+
+06:26.902 --> 06:28.661
+and after that, a vector
+
+06:28.661 --> 06:33.382
+whose size is not just specified by 'length',
+
+06:33.382 --> 06:35.142
+but is computed from 'length'.
+
+06:35.142 --> 06:39.142
+So here's how they used to compute it in WeeChat.
+
+06:39.142 --> 06:42.822
+So the length here can be specified in BinDat.
+
+06:42.822 --> 06:43.941
+Instead of having
+
+06:43.942 --> 06:45.863
+just a reference to one of the fields,
+
+06:45.863 --> 06:48.903
+or having a constant, you can actually compute it,
+
+06:48.903 --> 06:52.502
+where you have to use this '(eval',
+
+06:52.502 --> 06:54.743
+and then followed by the actual expression
+
+06:54.743 --> 06:58.103
+where you say how you compute it.
+
+06:58.103 --> 07:01.463
+And here you see that it actually computes it
+
+07:01.464 --> 07:04.904
+based on the 'length of the structure --
+
+07:04.904 --> 07:07.783
+that's supposed to be this 'length' field here --
+
+07:07.783 --> 07:11.223
+and it's referred to using the bindat-get-field
+
+07:11.223 --> 07:14.503
+to extract the field from the variable 'struct'.
+
+07:14.503 --> 07:17.943
+And then it subtracts four, it subtracts one,
+
+07:17.943 --> 07:19.467
+and adds some other things
+
+07:19.468 --> 07:22.185
+which depend on some field
+
+07:22.185 --> 07:26.905
+that's found in this 'id' field here.
+
+07:26.905 --> 07:28.425
+And the problem with this code
+
+07:28.425 --> 07:30.425
+was that it broke
+
+07:30.425 --> 07:32.745
+because of this 'struct' variable here,
+
+07:32.745 --> 07:35.145
+because this 'struct' variable is not defined
+
+07:35.145 --> 07:38.105
+anywhere in the specification of BinDat.
+
+07:38.106 --> 07:41.866
+It was used internally as a local variable,
+
+07:41.866 --> 07:45.306
+and because it was using dynamic scoping,
+
+07:45.306 --> 07:47.386
+it actually happened to be available here,
+
+07:47.386 --> 07:50.826
+but the documentation nowhere specifies it.
+
+07:50.826 --> 07:52.506
+So it was not exactly
+
+07:52.506 --> 07:55.546
+a bug of the conversion to lexical scoping,
+
+07:55.547 --> 07:58.906
+but it ended up breaking this code.
+
+07:58.906 --> 08:01.226
+And there was no way to actually
+
+08:01.226 --> 08:05.066
+fix the code within the specification of BinDat.
+
+08:05.066 --> 08:08.287
+You had to go outside the specification of BinDat
+
+08:08.287 --> 08:10.427
+to fix this problem.
+
+08:10.427 --> 08:14.346
+This is basically how I started looking at BinDat.
+
+08:14.347 --> 08:17.808
+Then I went to actually investigate a bit more
+
+08:17.808 --> 08:19.627
+what was going on,
+
+08:19.627 --> 08:22.108
+and the thing I noticed along the way
+
+08:22.108 --> 08:25.787
+was basically that the specification of BinDat
+
+08:25.787 --> 08:29.528
+is fairly complex and has a lot of eval
+
+08:29.528 --> 08:30.748
+and things like this.
+
+08:30.749 --> 08:32.288
+So let's take a look
+
+08:32.288 --> 08:35.068
+at what the BinDat specification looks like.
+
+08:35.068 --> 08:36.589
+So here it's actually documented
+
+08:36.589 --> 08:40.269
+as a kind of grammar rules.
+
+08:40.269 --> 08:45.308
+A specification is basically a sequence of items,
+
+08:45.308 --> 08:47.389
+and then each of the items is basically
+
+08:47.389 --> 08:51.248
+a FIELD of a struct, so it has a FIELD name,
+
+08:51.249 --> 08:53.249
+and then a TYPE.
+
+08:53.249 --> 08:54.510
+Instead of a TYPE,
+
+08:54.510 --> 08:56.590
+it could have some other FORM for eval,
+
+08:56.590 --> 08:58.989
+which was basically never used as far as I know,
+
+08:58.989 --> 09:00.190
+or it can be some filler,
+
+09:00.190 --> 09:02.750
+or you can have some 'align' specification,
+
+09:02.750 --> 09:05.150
+or you can refer to another struct.
+
+09:05.150 --> 09:07.390
+It could also be some kind of union,
+
+09:07.391 --> 09:10.430
+or it can be some kind of repetition of something.
+
+09:10.430 --> 09:12.430
+And then you have the TYPE specified here,
+
+09:12.430 --> 09:18.271
+which can be some integers, strings, or a vector,
+
+09:18.271 --> 09:21.631
+and there are a few other special cases.
+
+09:21.631 --> 09:25.310
+And then the actual field itself
+
+09:25.311 --> 09:28.192
+can be either a NAME, or something that's computed,
+
+09:28.192 --> 09:30.752
+and then everywhere here, you have LEN,
+
+09:30.752 --> 00:09:32.480
+which specifies the length of vectors,
+
+00:09:32.480 --> 00:09:34.672
+for example, or length of strings.
+
+09:34.672 --> 09:37.632
+This is actually either nil to mean one,
+
+09:37.632 --> 09:39.072
+or it can be an ARG,
+
+09:39.072 --> 09:40.952
+where ARG is defined to be
+
+09:40.952 --> 09:42.672
+either an integer or DEREF,
+
+09:42.673 --> 09:46.673
+where DEREF is basically a specification
+
+09:46.673 --> 09:48.833
+that can refer, for example, to the 'length' field
+
+09:48.833 --> 09:51.956
+-- that's what we saw between parentheses: (length)
+
+09:51.956 --> 09:56.273
+was this way to refer to the 'length' field.
+
+09:56.273 --> 09:59.793
+Or it can be an expression, which is what we saw
+
+09:59.794 --> 10:02.834
+in the computation of the length for WeeChat,
+
+10:02.834 --> 10:04.914
+where you just had a '(eval'
+
+10:04.914 --> 10:06.334
+and then some computation
+
+10:06.334 --> 10:10.274
+of the length of the payload.
+
+10:10.274 --> 10:12.354
+And so if you look here, you see that
+
+10:12.354 --> 10:14.674
+it is fairly large and complex,
+
+10:14.674 --> 10:18.514
+and it uses eval everywhere. And actually,
+
+10:18.515 --> 10:20.675
+it's not just that it has eval in its syntax,
+
+10:20.675 --> 10:23.395
+but the implementation has to use eval everywhere,
+
+10:23.395 --> 10:25.314
+because, if you go back
+
+10:25.314 --> 10:27.475
+to see the kind of code we see,
+
+10:27.475 --> 10:29.538
+we see here we just define
+
+10:29.538 --> 10:34.195
+weechat--relay-message-spec as a constant!
+
+10:34.195 --> 10:37.314
+It's nothing than just data, right?
+
+10:37.315 --> 10:38.836
+So within this data
+
+10:38.836 --> 10:41.076
+there are things we need to evaluate,
+
+10:41.076 --> 10:42.356
+but it's pure data,
+
+10:42.356 --> 10:44.356
+so it will have to be evaluated
+
+10:44.356 --> 10:46.596
+by passing it to eval. It can't be compiled,
+
+10:46.596 --> 10:50.196
+because it's within a quote, right?
+
+10:50.196 --> 10:52.836
+And so for that reason, kittens really
+
+10:52.837 --> 10:55.956
+suffer terribly with uses of BinDat.
+
+10:55.956 --> 10:59.957
+You really have to be very careful with that.
+
+10:59.957 --> 11:02.037
+More seriously,
+
+11:02.037 --> 11:05.157
+the 'struct' variable was not documented,
+
+11:05.157 --> 11:07.797
+and yet it's indispensable
+
+11:07.797 --> 11:08.996
+for important applications,
+
+11:08.996 --> 11:11.157
+such as using in WeeChat.
+
+11:11.158 --> 11:13.078
+So clearly this needs to be fixed.
+
+11:13.078 --> 11:15.481
+Of course, we can just document 'struct'
+
+11:15.481 --> 11:18.038
+as some variable that's used there,
+
+11:18.038 --> 11:19.798
+but of course we don't want to do that,
+
+11:19.798 --> 11:23.398
+because 'struct' is not obviously
+
+11:23.398 --> 11:25.398
+a dynamically scoped variable,
+
+11:25.398 --> 11:29.317
+so it's not very clean.
+
+11:29.318 --> 11:31.939
+Also other problems I noticed was that the grammar
+
+11:31.939 --> 11:35.239
+is significantly more complex than necessary.
+
+11:35.239 --> 11:38.199
+We have nine distinct non-terminals.
+
+11:38.199 --> 11:39.639
+There is ambiguity.
+
+11:39.639 --> 11:44.919
+If you try to use a field whose name is 'align',
+
+11:44.919 --> 11:48.679
+or 'fill', or something like this,
+
+11:48.680 --> 11:50.920
+then it's going to be misinterpreted,
+
+11:50.920 --> 11:54.920
+or it can be misinterpreted.
+
+11:54.920 --> 11:58.760
+The vector length can be either an expression,
+
+11:58.760 --> 12:02.280
+or an integer, or a reference to a label,
+
+12:02.280 --> 12:03.720
+but the expression
+
+12:03.720 --> 12:06.360
+should already be the general case,
+
+12:06.361 --> 12:08.041
+and this expression can itself be
+
+12:08.041 --> 12:09.401
+just a constant integer,
+
+12:09.401 --> 12:13.961
+so this complexity is probably not indispensable,
+
+12:13.961 --> 12:15.641
+or it could be replaced with something simpler.
+
+12:15.641 --> 12:17.401
+That's what I felt like.
+
+12:17.401 --> 12:19.161
+And basically lots of places
+
+12:19.161 --> 12:21.721
+allow an (eval EXP) form somewhere
+
+12:21.721 --> 12:25.081
+to open up the door for more flexibility,
+
+12:25.082 --> 12:26.922
+but not all of them do,
+
+12:26.922 --> 12:29.482
+and we don't really want
+
+12:29.482 --> 12:31.001
+to have this eval there, right?
+
+12:31.001 --> 12:33.802
+It's not very convenient syntactically either.
+
+12:33.802 --> 12:36.042
+So it makes the uses of eval
+
+12:36.042 --> 12:38.362
+a bit heavier than they need to be,
+
+12:38.362 --> 12:41.722
+and so I didn't really like this part.
+
+12:41.723 --> 12:42.603
+Another part is that
+
+12:42.603 --> 12:45.183
+when I tried to figure out what was going on,
+
+12:45.183 --> 12:46.666
+[dog barks and distracts Stefan]
+
+12:46.666 --> 12:50.043
+I had trouble... Winnie as well, as you can hear.
+
+12:50.043 --> 12:50.923
+She had trouble as well.
+
+12:50.923 --> 12:53.083
+But one of the troubles was that
+
+12:53.083 --> 12:55.002
+there was no way to debug the code
+
+12:55.002 --> 12:57.562
+via Edebug, because it's just data,
+
+12:57.562 --> 13:00.523
+so Edebug doesn't know that it has to look at it
+
+13:00.524 --> 13:02.683
+and instrument it.
+
+13:02.683 --> 13:05.644
+And of course it was not conveniently extensible.
+
+13:05.644 --> 13:07.164
+That's also one of the things
+
+13:07.164 --> 13:08.487
+I noticed along the way.
+
+13:09.084 --> 13:12.844
+Okay, so here's an example of
+
+13:12.844 --> 13:15.484
+problems not that I didn't just see there,
+
+13:15.485 --> 13:18.684
+but that were actually present in code.
+
+13:18.684 --> 13:22.124
+I went to look at code that was using BinDat
+
+13:22.124 --> 13:24.285
+to see what uses looked like,
+
+13:24.285 --> 13:28.765
+and I saw that BinDat was not used very heavily,
+
+13:28.765 --> 13:30.365
+but some of the main uses
+
+13:30.365 --> 13:33.884
+were just to read and write integers.
+
+13:33.885 --> 13:37.565
+And here you can see a very typical case.
+
+13:37.565 --> 13:41.726
+This is also coming from WeeChat.
+
+13:41.726 --> 13:43.565
+We do a bindat-get-field
+
+13:43.565 --> 13:48.445
+of the length of some struct we read.
+
+13:48.445 --> 13:50.685
+Actually, the struct we read is here.
+
+13:50.685 --> 13:51.646
+It has a single field,
+
+13:51.647 --> 13:53.006
+because the only thing we want to do
+
+13:53.006 --> 13:56.287
+is actually to unpack a 32-bit integer,
+
+13:56.287 --> 13:58.287
+but the only way we can do that
+
+13:58.287 --> 14:01.647
+is by specifying a struct with one field.
+
+14:01.647 --> 14:04.847
+And so we have to extract this struct of one field,
+
+14:04.847 --> 14:07.246
+which constructs an alist
+
+14:07.246 --> 14:09.647
+containing the actual integer,
+
+14:09.648 --> 14:11.887
+and then we just use get-field to extract it.
+
+14:11.887 --> 14:15.007
+So this doesn't seem very elegant
+
+14:15.007 --> 14:16.528
+to have to construct an alist
+
+14:16.528 --> 14:20.368
+just to then extract the integer from it.
+
+14:20.368 --> 14:21.648
+Same thing if you try to pack it:
+
+14:21.648 --> 14:25.007
+you first have to construct the alist
+
+14:25.007 --> 14:31.247
+to pass it to bindat-pack unnecessarily.
+
+14:31.248 --> 14:33.248
+Another problem that I saw in this case
+
+14:33.248 --> 14:35.729
+(it was in the websocket package)
+
+14:35.729 --> 14:39.568
+was here, where they actually have a function
+
+14:39.568 --> 14:41.169
+where they need to write
+
+14:41.169 --> 14:43.888
+an integer of a size that will vary
+
+14:43.888 --> 14:45.888
+depending on the circumstances.
+
+14:45.889 --> 14:49.650
+And so they have to test the value of this integer,
+
+14:49.650 --> 14:52.210
+and depending on which one it is,
+
+14:52.210 --> 14:54.449
+they're going to use different types.
+
+14:54.449 --> 14:56.290
+So here it's a case
+
+14:56.290 --> 14:59.490
+where we want to have some kind of way to eval --
+
+14:59.490 --> 15:02.530
+to compute the length of the integer --
+
+15:02.531 --> 15:08.130
+instead of it being predefined or fixed.
+
+15:08.130 --> 15:10.211
+So this is one of the cases
+
+15:10.211 --> 15:16.531
+where the lack of eval was a problem.
+
+15:16.531 --> 15:20.051
+And actually in all of websocket,
+
+15:20.051 --> 15:22.611
+BinDat is only used to pack and unpack integers,
+
+15:22.612 --> 15:24.612
+even though there are many more opportunities
+
+15:24.612 --> 15:26.772
+to use BinDat in there.
+
+15:26.772 --> 15:29.331
+But it's not very convenient to use BinDat,
+
+15:29.331 --> 00:15:35.890
+as it stands, for those other cases.
+
+15:35.891 --> 15:39.732
+So what does the new design look like?
+
+15:39.733 --> 15:44.132
+Well in the new design, here's the problematic code
+
+15:44.132 --> 15:46.373
+for WeeChat.
+
+15:46.373 --> 15:49.012
+So we basically have the same fields as before,
+
+15:49.012 --> 15:50.853
+you just see that instead of u32,
+
+15:50.853 --> 15:53.733
+we now have 'uint 32' separately.
+
+15:53.733 --> 15:55.332
+The idea is that now this 32
+
+15:55.332 --> 15:59.093
+can be an expression you can evaluate,
+
+15:59.094 --> 16:04.054
+and so the u8 is also replaced by 'uint 8',
+
+16:04.054 --> 16:07.253
+and the id type is basically the same as before,
+
+16:07.253 --> 16:08.854
+and here another difference we see,
+
+16:08.854 --> 16:11.654
+and the main difference...
+
+16:11.654 --> 16:13.494
+Actually, it's the second main difference.
+
+16:13.494 --> 16:15.174
+The first main difference is that
+
+16:15.175 --> 16:18.694
+we don't actually quote this whole thing.
+
+16:18.694 --> 16:23.095
+Instead, we pass it to the bindat-type macro.
+
+16:23.095 --> 16:25.095
+So this is a macro
+
+16:25.095 --> 16:27.574
+that's going to actually build the type.
+
+16:27.574 --> 16:29.254
+This is a big difference
+
+16:29.254 --> 16:30.535
+in terms of performance also,
+
+16:30.535 --> 16:32.694
+because by making it a macro,
+
+16:32.695 --> 16:34.296
+we can pre-compute the code
+
+16:34.296 --> 16:37.255
+that's going to pack and unpack this thing,
+
+16:37.255 --> 16:38.936
+instead of having to interpret it
+
+16:38.936 --> 16:41.096
+every time we pack and unpack.
+
+16:41.096 --> 16:43.815
+So this macro will generate more efficient code
+
+16:43.815 --> 16:45.815
+along the way.
+
+16:45.815 --> 16:48.695
+Also it makes the code that appears in here
+
+16:48.695 --> 16:50.296
+visible to the compiler
+
+16:50.297 --> 16:54.617
+because we can give an Edebug spec for it.
+
+16:54.617 --> 16:57.497
+And so here as an argument to vec,
+
+16:57.497 --> 16:59.016
+instead of having to specify
+
+16:59.016 --> 17:00.937
+that this is an evaluated expression,
+
+17:00.937 --> 17:02.777
+we just write the expression directly,
+
+17:02.777 --> 17:05.096
+because all the expressions that appear there
+
+17:05.096 --> 17:07.417
+will just be evaluated,
+
+17:07.418 --> 17:11.418
+and we don't need to use the 'struct' variable
+
+17:11.418 --> 17:14.137
+and then extract the length field from it.
+
+17:14.137 --> 17:16.938
+We can just use length as a variable.
+
+17:16.938 --> 17:18.698
+So this variable 'length' here
+
+17:18.698 --> 17:20.778
+will refer to this field here,
+
+17:20.778 --> 17:23.578
+and then this variable 'id' here
+
+17:23.578 --> 17:25.897
+will refer to this field here,
+
+17:25.898 --> 17:27.738
+and so we can just use the field values
+
+17:27.738 --> 17:30.459
+as local variables, which is very natural
+
+17:30.459 --> 00:17:31.679
+and very efficient also,
+
+00:17:31.679 --> 00:17:34.618
+because the code would actually directly do that,
+
+17:34.618 --> 17:37.899
+and the code that unpacks those data
+
+17:37.899 --> 17:40.299
+will just extract an integer
+
+17:40.299 --> 17:42.219
+and bind it to the length variable,
+
+17:42.219 --> 17:47.579
+and so that makes it immediately available there.
+
+17:47.580 --> 17:51.340
+Okay, let's see also
+
+17:51.340 --> 17:54.220
+what the actual documentation looks like.
+
+17:54.220 --> 17:57.739
+And so if we look at the doc of BinDat,
+
+17:57.739 --> 18:01.180
+we see the actual specification of the grammar.
+
+18:01.181 --> 18:03.181
+And so here we see instead of having
+
+18:03.181 --> 18:06.461
+these nine different non-terminals,
+
+18:06.461 --> 18:08.061
+we basically have two:
+
+18:08.061 --> 18:10.781
+we have the non-terminal for TYPE,
+
+18:10.781 --> 18:15.021
+which can be either a uint, a uintr, or a string,
+
+18:15.021 --> 18:17.421
+or bits, or fill, or align, or vec,
+
+18:17.421 --> 18:19.901
+or those various other forms;
+
+18:19.902 --> 18:22.621
+or it can be a struct, in which case,
+
+18:22.621 --> 18:23.981
+in the case of struct,
+
+18:23.981 --> 18:27.502
+then it will be followed by a sequence --
+
+18:27.502 --> 18:30.142
+a list of FIELDs, where each of the FIELDs
+
+18:30.142 --> 18:33.902
+is basically a LABEL followed by another TYPE.
+
+18:33.902 --> 18:37.342
+And so this makes the whole specification
+
+18:37.343 --> 18:39.823
+much simpler. We don't have any distinction now
+
+18:39.823 --> 18:42.862
+between struct being a special case,
+
+18:42.862 --> 18:46.383
+as opposed to just the normal types.
+
+18:46.383 --> 18:49.263
+struct is just now one of the possible types
+
+18:49.263 --> 18:52.543
+that can appear here.
+
+18:52.543 --> 18:53.263
+The other thing is that
+
+18:53.263 --> 18:55.742
+the LABEL is always present in the structure,
+
+18:55.743 --> 18:58.384
+so there's no ambiguity.
+
+18:58.384 --> 19:00.304
+Also all the above things,
+
+19:00.304 --> 19:03.103
+like the BITLEN we have here,
+
+19:03.103 --> 19:04.384
+the LEN we have here,
+
+19:04.384 --> 19:07.504
+the COUNT for vector we have here,
+
+19:07.504 --> 19:10.224
+these are all plain Elisp expressions,
+
+19:10.224 --> 19:13.024
+so they are implicitly evaluated if necessary.
+
+19:13.025 --> 19:14.705
+If you want them to be constant,
+
+19:14.705 --> 19:16.705
+and really constant, you can just use quotes,
+
+19:16.705 --> 19:20.145
+for those rare cases where it's necessary.
+
+19:20.145 --> 19:21.905
+Another thing is that you can extend it
+
+19:21.905 --> 19:25.505
+with with bindat-defmacro.
+
+19:25.505 --> 19:30.225
+Okay, let's go back here.
+
+19:30.226 --> 19:32.706
+So what are the advantages of this approach?
+
+19:32.706 --> 19:34.625
+As I said, one of the main advantages
+
+19:34.625 --> 19:39.346
+is that we now have support for Edebug.
+
+19:39.346 --> 19:41.426
+We don't have 'struct', 'repeat', and 'align'
+
+19:41.426 --> 19:42.946
+as special cases anymore.
+
+19:42.946 --> 19:44.625
+These are just normal types.
+
+19:44.625 --> 19:48.066
+Before, there was uint as type, int as type,
+
+19:48.067 --> 19:49.267
+and those kinds of things.
+
+19:49.267 --> 19:51.110
+'struct' and 'repeat' and 'align'
+
+19:51.110 --> 19:53.267
+were in a different case.
+
+19:53.267 --> 19:54.387
+So there were
+
+19:54.387 --> 19:56.787
+some subtle differences between those
+
+19:56.787 --> 19:59.027
+that completely disappeared.
+
+19:59.027 --> 20:02.626
+Also in the special cases, there was 'union',
+
+20:02.626 --> 20:05.027
+and union now has completely disappeared.
+
+20:05.027 --> 20:07.827
+We don't need it anymore, because instead,
+
+20:07.828 --> 20:09.588
+we can actually use code anywhere.
+
+20:09.588 --> 20:11.908
+That's one of the things I didn't mention here,
+
+20:11.908 --> 20:17.268
+but in this note here,
+
+20:17.268 --> 20:19.747
+that's one of the important notes.
+
+20:19.747 --> 20:21.987
+Not only are BITLEN, LEN, COUNT etc.
+
+20:21.987 --> 20:23.028
+Elisp expressions,
+
+20:23.028 --> 20:26.788
+but the type itself -- any type itself --
+
+20:26.789 --> 20:29.029
+is basically an expression.
+
+20:29.029 --> 20:32.709
+And so you can, instead of having 'uint BITLEN',
+
+20:32.709 --> 20:36.628
+you can have '(if blah-blah-blah uint string)',
+
+20:36.628 --> 20:38.149
+and so you can have a field
+
+20:38.149 --> 20:40.549
+that can be either string or an int,
+
+20:40.549 --> 20:44.789
+depending on some condition.
+
+20:44.790 --> 20:46.869
+And for that reason we don't need a union.
+
+20:46.869 --> 20:47.910
+Instead of having a union,
+
+20:47.910 --> 20:50.710
+we can just have a 'cond' or a 'pcase'
+
+20:50.710 --> 20:53.590
+that will return the type we want to use,
+
+20:53.590 --> 20:55.109
+depending on the context,
+
+20:55.109 --> 21:00.950
+which will generally depend on some previous field.
+
+21:00.951 --> 21:03.750
+Also we don't need to use single-field structs
+
+21:03.750 --> 21:05.351
+for simple types anymore,
+
+21:05.351 --> 21:09.271
+because there's no distinction between struct
+
+21:09.271 --> 21:11.271
+and other types.
+
+21:11.271 --> 21:17.191
+So we can pass to bindat-pack and bindat-unpack
+
+21:17.191 --> 21:20.951
+a specification which just says "here's an integer"
+
+21:20.952 --> 21:24.392
+and we'll just pack and unpack the integer.
+
+21:24.392 --> 21:26.472
+And of course now all the code is exposed,
+
+21:26.472 --> 21:29.192
+so not only Edebug works, but also Flymake,
+
+21:29.192 --> 21:30.392
+and the compiler, etc. --
+
+21:30.392 --> 21:33.111
+they can complain about it,
+
+21:33.111 --> 21:38.871
+and give you warnings and errors as we like them.
+
+21:38.872 --> 21:44.553
+And of course the kittens are much happier.
+
+21:44.553 --> 21:48.153
+Okay. This is going a bit over time,
+
+21:48.153 --> 00:21:51.272
+so let's try to go faster.
+
+21:51.273 --> 21:53.752
+Here are some of the new features
+
+21:53.753 --> 21:54.794
+that are introduced.
+
+21:54.794 --> 21:56.314
+I already mentioned briefly
+
+21:56.314 --> 22:00.633
+that you can define new types with bindat-defmacro.
+
+22:00.633 --> 22:04.474
+that's one of the important novelties,
+
+22:04.474 --> 22:08.794
+and you can extend BinDat with new types this way.
+
+22:08.794 --> 22:10.714
+The other thing you can do is
+
+22:10.714 --> 22:16.233
+you can control how values or packets
+
+22:16.234 --> 22:20.315
+are unpacked, and how they are represented.
+
+22:20.315 --> 22:22.555
+In the old BinDat,
+
+22:22.555 --> 22:24.315
+the packet is necessarily represented,
+
+22:24.315 --> 22:28.634
+when you unpack it, as an alist, basically,
+
+22:28.635 --> 22:30.396
+or a struct becomes an alist,
+
+22:30.396 --> 22:31.676
+and that's all there is.
+
+22:31.676 --> 22:34.076
+You don't have any choice about it.
+
+22:34.076 --> 22:35.596
+With the new system,
+
+22:35.596 --> 22:38.076
+by default, it also returns just an alist,
+
+22:38.076 --> 22:41.916
+but you can actually control what it's unpacked as,
+
+22:41.916 --> 22:46.396
+or what it's packed from, using these keywords.
+
+22:46.396 --> 22:49.596
+With :unpack-val, you can give an expression
+
+22:49.597 --> 22:53.357
+that will construct the unpacked value
+
+22:53.357 --> 22:56.957
+from the various fields.
+
+22:56.957 --> 22:59.197
+And with :pack-val and :pack-var,
+
+22:59.197 --> 23:02.557
+you can specify how to extract the information
+
+23:02.557 --> 23:05.116
+from the unpacked value
+
+23:05.117 --> 00:23:08.077
+to generate the pack value.
+
+23:08.078 --> 23:12.637
+So here are some examples.
+
+23:12.637 --> 23:15.358
+Here's an example taken from osc.
+
+23:15.358 --> 23:17.438
+osc actually doesn't use BinDat currently,
+
+23:17.438 --> 23:22.478
+but I have played with it
+
+23:22.479 --> 23:23.758
+to see what it would look like
+
+23:23.758 --> 23:26.159
+if we were to use BinDat.
+
+23:26.159 --> 23:28.638
+So here's the definition
+
+23:28.638 --> 23:30.638
+of the timetag representation,
+
+23:30.638 --> 23:35.279
+which represents timestamps in osc.
+
+23:35.279 --> 23:37.998
+So you would use bindat-type
+
+23:37.998 --> 23:40.559
+and then you have here :pack-var
+
+23:40.559 --> 23:42.080
+basically gives a name
+
+23:42.080 --> 23:48.559
+when we try to pack a timestamp.
+
+23:48.559 --> 23:51.520
+'time' will be the variable whose name contains
+
+23:51.520 --> 23:54.159
+the actual timestamp we will receive.
+
+23:54.159 --> 23:57.520
+So we want to represent the unpacked value
+
+23:57.520 --> 24:00.240
+as a normal Emacs timestamp,
+
+24:00.240 --> 24:02.480
+and then basically convert from this timestamp
+
+24:02.480 --> 24:06.401
+to a string, or from a string to this timestamp.
+
+24:06.401 --> 24:10.080
+When we receive it, it will be called time,
+
+24:10.080 --> 24:12.240
+so we can refer to it,
+
+24:12.240 --> 24:15.360
+and so in order to actually encode it,
+
+24:15.360 --> 24:18.320
+we basically turn this timestamp into an integer --
+
+24:18.320 --> 24:20.799
+that's what this :pack-val does.
+
+24:20.799 --> 24:23.442
+It says when we try to pack it,
+
+24:23.442 --> 24:26.082
+here's the the value that we should use.
+
+24:26.082 --> 24:27.760
+We turn it into an integer,
+
+24:27.760 --> 24:30.320
+and then this integer is going to be encoded
+
+24:30.320 --> 24:36.162
+as a uint 64-bit. So a 64-bit unsigned integer.
+
+24:36.163 --> 24:38.960
+When we try to unpack the value,
+
+24:38.960 --> 24:40.720
+this 'ticks' field
+
+24:40.720 --> 24:45.679
+will contain an unsigned int of 64 bits.
+
+24:45.679 --> 24:50.559
+We want to return instead a timestamp --
+
+24:50.559 --> 24:53.924
+a time value -- from Emacs.
+
+24:53.924 --> 24:59.363
+Here we use the representation of time
+
+24:59.363 --> 25:02.799
+as a pair of number of ticks
+
+25:02.799 --> 25:06.720
+and the corresponding frequency of those ticks.
+
+25:06.720 --> 25:09.120
+So that's what we do here with :unpack-val,
+
+25:09.120 --> 25:12.004
+which is construct the cons corresponding to it.
+
+25:12.004 --> 25:16.400
+With this definition, bindat-pack/unpack
+
+25:16.400 --> 00:25:19.039
+are going to convert to and from
+
+00:25:19.039 --> 00:25:21.760
+proper time values on one side,
+
+25:21.760 --> 25:26.159
+and binary strings on the other.
+
+25:26.159 --> 25:27.520
+Note, of course,
+
+25:27.520 --> 25:30.320
+that I complained that the old BinDat
+
+25:30.320 --> 25:36.080
+had to use single-field structs for simple types,
+
+25:36.080 --> 25:37.039
+and here, basically,
+
+25:37.039 --> 25:39.840
+I'm back using single-field structs as well
+
+25:39.840 --> 25:41.120
+for this particular case --
+
+25:41.120 --> 25:44.640
+actually a reasonably frequent case, to be honest.
+
+25:44.640 --> 25:49.279
+But at least this is not so problematic,
+
+25:49.279 --> 25:51.840
+because we actually control what is returned,
+
+25:51.840 --> 25:54.159
+so even though it's a single-field struct,
+
+25:54.159 --> 25:56.640
+it's not going to construct an alist
+
+25:56.640 --> 25:58.320
+or force you to construct an alist.
+
+25:58.320 --> 26:02.720
+Instead, it really receives and takes a value
+
+26:02.720 --> 26:07.367
+in the ideal representation that we chose.
+
+26:07.367 --> 26:10.007
+Here we have a more complex example,
+
+26:10.007 --> 26:12.488
+where the actual type is recursive,
+
+26:12.488 --> 26:18.640
+because it's representing those "LEB"...
+
+26:18.640 --> 26:20.400
+I can't remember what "LEB" stands for,
+
+26:20.400 --> 26:22.559
+but it's a representation
+
+26:22.559 --> 26:25.600
+for arbitrary length integers,
+
+26:25.600 --> 26:27.520
+where basically
+
+26:27.520 --> 26:33.360
+every byte is either smaller than 128,
+
+26:33.360 --> 26:36.799
+in which case it's the end of the of the value,
+
+26:36.799 --> 26:39.760
+or it's a value bigger than 128,
+
+26:39.760 --> 26:42.159
+in which case there's an extra byte on the end
+
+26:42.159 --> 26:44.490
+that's going to continue.
+
+26:44.490 --> 26:46.640
+Here we see the representation
+
+26:46.640 --> 26:52.240
+is basically a structure that starts with a byte,
+
+26:52.240 --> 26:53.679
+which contains this value,
+
+26:53.679 --> 26:56.000
+which can be either the last value or not,
+
+26:56.000 --> 26:59.770
+and the tail, which will either be empty,
+
+26:59.770 --> 27:01.279
+or contain something else.
+
+27:01.279 --> 27:04.000
+The empty [case] is here;
+
+27:04.000 --> 27:07.039
+if the head value is smaller than 128,
+
+27:07.039 --> 27:11.840
+then the type of this tail is going to be (unit 0),
+
+27:11.840 --> 27:16.492
+so basically 'unit' is the empty type,
+
+27:16.492 --> 27:20.880
+and 0 is the value we will receive when we read it.
+
+27:20.880 --> 27:25.520
+And if not, then it has as type 'loop',
+
+27:25.520 --> 27:28.240
+which is the type we're defining,
+
+27:28.240 --> 27:30.491
+so it's the recursive case,
+
+27:30.491 --> 27:35.132
+where then the rest of the type is the type itself.
+
+27:35.132 --> 27:37.120
+And so this lets us pack and unpack.
+
+27:37.120 --> 27:39.600
+We pass it an arbitrary size integer,
+
+27:39.600 --> 27:42.240
+and it's going to turn it into
+
+27:42.240 --> 27:48.492
+this LEB128 binary representation, and vice versa.
+
+27:48.492 --> 27:52.480
+I have other examples if you're interested,
+
+27:52.480 --> 00:27:56.093
+but anyway, here's the conclusion.
+
+27:56.094 --> 27:58.320
+We have a simpler, more flexible,
+
+27:58.320 --> 28:01.039
+and more powerful BinDat now,
+
+28:01.039 --> 28:03.454
+which is also significantly faster.
+
+28:03.454 --> 28:06.799
+And I can't remember the exact speed-up,
+
+28:06.799 --> 28:08.720
+but it's definitely not a few percents.
+
+28:08.720 --> 28:12.640
+I vaguely remember about 4x faster in my tests,
+
+28:12.640 --> 28:16.815
+but it's probably very different in different cases
+
+28:16.815 --> 28:20.159
+so it might be just 4x, 2x -- who knows?
+
+28:20.159 --> 28:23.374
+Try it for yourself, but I was pretty pleased,
+
+28:23.374 --> 00:28:28.335
+because it wasn't the main motivation, so anyway...
+
+28:28.336 --> 28:31.135
+The negatives are here.
+
+28:31.135 --> 28:34.480
+In the new system, there's this bindat-defmacro
+
+28:34.480 --> 28:36.720
+which lets us define, kind of, new types,
+
+28:36.720 --> 28:40.895
+and bindat-type also lets us define new types,
+
+28:40.895 --> 28:45.360
+and the distinction between them is a bit subtle;
+
+28:45.360 --> 28:48.080
+it kind of depends on...
+
+28:48.080 --> 28:50.880
+well it has an impact on efficiency
+
+28:50.880 --> 28:53.520
+more than anything, so it's not very satisfactory.
+
+28:53.520 --> 28:56.737
+There's a bit of redundancy between the two.
+
+28:56.737 --> 28:59.039
+There is no bit-level control, just as before.
+
+28:59.039 --> 29:02.097
+We can only manipulate basically bytes.
+
+29:02.098 --> 29:03.360
+So this is definitely not usable
+
+29:03.360 --> 29:09.058
+for a Huffman encoding kind of thing.
+
+29:09.058 --> 29:10.880
+Also, it's not nearly as flexible
+
+29:10.880 --> 29:12.240
+as some of the alternatives.
+
+29:12.240 --> 29:13.760
+So you know GNU Poke
+
+29:13.760 --> 29:20.017
+has been a vague inspiration for this work,
+
+29:20.018 --> 29:22.480
+and GNU Poke gives you a lot more power
+
+29:22.480 --> 29:25.059
+in how to specify the types, etc.
+
+29:25.059 --> 29:26.579
+And of course one of the main downsides
+
+29:26.579 --> 29:28.018
+is that it's still not used very much.
+
+29:28.018 --> 29:29.283
+Actually, the new BinDat
+
+29:29.283 --> 29:31.039
+is not used by any package
+
+29:31.039 --> 29:33.059
+as far as I know right now,
+
+29:33.059 --> 29:35.279
+but even the old one is not used very often,
+
+29:35.279 --> 29:36.799
+so who knows
+
+29:36.799 --> 29:38.799
+whether it's actually going to
+
+29:38.799 --> 29:41.520
+work very much better or not?
+
+29:41.520 --> 29:44.399
+Anyway, this is it for this talk.
+
+29:44.399 --> 29:46.683
+Thank you very much. Have a nice day.
+
+29:46.683 --> 29:47.883
+[captions by John Cummings]
diff --git a/2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt b/2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt
deleted file mode 100644
index 12a7a6ad..00000000
--- a/2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt
+++ /dev/null
@@ -1,1421 +0,0 @@
-WEBVTT
-
-
-00:00.960 --> 00:00:03.760
-welcome everyone uh my name is ferming i
-
-00:03.760 --> 00:00:05.120
-work as a commonwealth engineer at
-
-00:05.120 --> 00:00:08.000
-ribbon pack and today i'm going to talk
-
-00:08.000 --> 00:00:09.519
-about
-
-00:09.519 --> 00:00:11.360
-how to build an e-max
-
-00:11.360 --> 00:00:12.240
-right
-
-00:12.240 --> 00:00:16.640
-so uh let's start by defining what is an
-
-00:16.640 --> 00:00:18.000
-imax
-
-00:18.000 --> 00:00:20.080
-so that this can be a really this can be
-
-00:20.080 --> 00:00:21.920
-really hard depending on
-
-00:21.920 --> 00:00:23.920
-what you want to say what you want to
-
-00:23.920 --> 00:00:26.320
-qualify what emas is and not i'm going
-
-00:26.320 --> 00:00:27.920
-to
-
-00:27.920 --> 00:00:29.519
-get just this definition it's not the
-
-00:29.519 --> 00:00:31.840
-best but it's mine right
-
-00:31.840 --> 00:00:34.480
-so i would argue that an emacs should
-
-00:34.480 --> 00:00:37.440
-have text editing capabilities
-
-00:37.440 --> 00:00:38.879
-i wouldn't say it should be a text
-
-00:38.879 --> 00:00:41.120
-editor but it should be able to work
-
-00:41.120 --> 00:00:43.200
-really well with text
-
-00:43.200 --> 00:00:45.680
-as you have introspection and a global
-
-00:45.680 --> 00:00:46.879
-state
-
-00:46.879 --> 00:00:49.760
-so you can ask them every time
-
-00:49.760 --> 00:00:51.680
-um software itself i think it should be
-
-00:51.680 --> 00:00:54.879
-able to modify itself while running
-
-00:54.879 --> 00:00:56.640
-um so you shouldn't be static and you
-
-00:56.640 --> 00:00:59.280
-shouldn't never restart for
-
-00:59.280 --> 00:01:01.359
-any reason like in engineering max you
-
-01:01.359 --> 00:01:03.280
-can't predefine every function or every
-
-01:03.280 --> 00:01:05.680
-functionality the way you want
-
-01:05.680 --> 00:01:09.360
-and extensibility should not be limited
-
-01:09.360 --> 00:01:11.040
-with this i mean that if you add a new
-
-01:11.040 --> 00:01:12.560
-package shouldn't be a difference you
-
-01:12.560 --> 00:01:14.960
-shouldn't have an api
-
-01:14.960 --> 00:01:18.560
-to extend the software and the entire uh
-
-01:18.560 --> 00:01:20.640
-software itself should be the external
-
-01:20.640 --> 00:01:22.640
-api code
-
-01:22.640 --> 00:01:25.360
-i'll argue that's also
-
-01:25.360 --> 00:01:26.640
-um
-
-01:26.640 --> 00:01:28.320
-should be list base
-
-01:28.320 --> 00:01:29.759
-but
-
-01:29.759 --> 00:01:32.880
-um it's controversial so
-
-01:32.880 --> 00:01:34.720
-yes they're going to get this definition
-
-01:34.720 --> 00:01:37.280
-and then extend upon it so
-
-01:37.280 --> 00:01:38.880
-bear with me
-
-01:38.880 --> 00:01:41.920
-so right now uh genuine max is the best
-
-01:41.920 --> 00:01:44.079
-emacs that we have that's not the only
-
-01:44.079 --> 00:01:46.320
-one uh
-
-01:46.320 --> 00:01:48.479
-not even the first one imax but it's the
-
-01:48.479 --> 00:01:49.680
-best one that we have the one that we're
-
-01:49.680 --> 00:01:51.759
-using the one that we that i'm using
-
-01:51.759 --> 00:01:54.079
-right now and the one that we're here
-
-01:54.079 --> 00:01:55.280
-for
-
-01:55.280 --> 00:01:57.759
-but as we all know it's not perfect i'm
-
-01:57.759 --> 00:01:59.759
-going to highlight some
-
-01:59.759 --> 00:02:02.479
-um imperfection that all that we should
-
-02:02.479 --> 00:02:05.119
-know i guess that you must have
-
-02:05.119 --> 00:02:07.360
-so the first one is that uh i would
-
-02:07.360 --> 00:02:09.440
-argue that inmate lisp is a good lisp
-
-02:09.440 --> 00:02:11.280
-but it's not a general purpose
-
-02:11.280 --> 00:02:13.280
-programming language
-
-02:13.280 --> 00:02:15.040
-you can do pretty crazy things with
-
-02:15.040 --> 00:02:16.959
-emacs but i will argue that you can do
-
-02:16.959 --> 00:02:18.400
-also do that with
-
-02:18.400 --> 00:02:20.640
-brain [ __ ] i'm not comparing them i know
-
-02:20.640 --> 00:02:22.239
-with my list so much better than brain
-
-02:22.239 --> 00:02:24.720
-[ __ ] but that's not an argument in
-
-02:24.720 --> 00:02:26.480
-mclisp it's
-
-02:26.480 --> 00:02:29.599
-a language for an editor
-
-02:29.599 --> 00:02:32.080
-not for writing
-
-02:32.080 --> 00:02:34.720
-game engine for example
-
-02:34.720 --> 00:02:37.040
-um it's not the fastest lisp we all know
-
-02:37.040 --> 00:02:40.239
-this is um
-
-02:40.239 --> 00:02:42.319
-not in the middle i will say was really
-
-02:42.319 --> 00:02:44.720
-slow now it's getting better maybe with
-
-02:44.720 --> 00:02:46.480
-the c integration
-
-02:46.480 --> 00:02:49.200
-um thanks to andrea it can be even
-
-02:49.200 --> 00:02:51.680
-better but we'll see and has limited
-
-02:51.680 --> 00:02:55.360
-concurrency this will still be the case
-
-02:55.360 --> 00:02:58.159
-it has shared threats first i know
-
-02:58.159 --> 00:03:00.000
-it's not perfect and it's also not that
-
-03:00.000 --> 00:03:01.040
-fast
-
-03:01.040 --> 00:03:03.360
-and even though this for some people is
-
-03:03.360 --> 00:03:04.480
-not an issue
-
-03:04.480 --> 00:03:06.080
-i'll argue that for me it's an issue
-
-03:06.080 --> 00:03:07.920
-which is the canoe emac score is written
-
-03:07.920 --> 00:03:09.840
-in the c
-
-03:09.840 --> 00:03:13.519
-um i'm not a big fan of c i mean i have
-
-03:13.519 --> 00:03:15.519
-wrote things about c in the past and
-
-03:15.519 --> 00:03:16.840
-it's
-
-03:16.840 --> 00:03:20.560
-okay as a language but um i prefer i'll
-
-03:20.560 --> 00:03:22.800
-be in lisp so i can hack on it easily
-
-03:22.800 --> 00:03:24.720
-and really find it while it's running
-
-03:24.720 --> 00:03:27.440
-all in just one language so you don't
-
-03:27.440 --> 00:03:29.920
-have to learn two languages to get into
-
-03:29.920 --> 00:03:30.959
-it
-
-03:30.959 --> 00:03:33.120
-um even though it's just ten percent of
-
-03:33.120 --> 00:03:35.599
-emacs right but still there needs to be
-
-03:35.599 --> 00:03:38.799
-maintained and yeah
-
-03:38.799 --> 00:03:41.120
-i don't like that uh kind of uh a max
-
-03:41.120 --> 00:03:43.040
-aspect but just
-
-03:43.040 --> 00:03:45.360
-this was just my opinion okay so while
-
-03:45.360 --> 00:03:46.720
-you're like you know mac's pretty good
-
-03:46.720 --> 00:03:48.400
-you should use it
-
-03:48.400 --> 00:03:50.319
-you probably use it if you're here and
-
-03:50.319 --> 00:03:53.280
-use it every day it's great
-
-03:53.280 --> 00:03:54.239
-so
-
-03:54.239 --> 00:03:56.560
-some people in the past
-
-03:56.560 --> 00:03:58.080
-wanted to write
-
-03:58.080 --> 00:04:00.480
-an e-max of course and not the emacs
-
-04:00.480 --> 00:04:02.400
-and they think about different things
-
-04:02.400 --> 00:04:04.799
-and they attempt to write similar emacs
-
-04:04.799 --> 00:04:07.680
-like things i'm going to um
-
-04:07.680 --> 00:04:09.519
-i know there's a lot of more way more
-
-04:09.519 --> 00:04:12.879
-emacs than the one i'm going to say now
-
-04:12.879 --> 00:04:16.000
-but i just going to
-
-04:16.000 --> 00:04:18.639
-focus on the emacs that uh meets the
-
-04:18.639 --> 00:04:20.639
-criteria are not like
-
-04:20.639 --> 00:04:23.280
-uh the linux turbo's emacs right which
-
-04:23.280 --> 00:04:24.479
-is just a c
-
-04:24.479 --> 00:04:28.400
-simple e max to write c for me that may
-
-04:28.400 --> 00:04:30.160
-be uh
-
-04:30.160 --> 00:04:32.400
-an e max for the people but not for me i
-
-04:32.400 --> 00:04:34.639
-wouldn't argue that that's not
-
-04:34.639 --> 00:04:36.720
-really an emacs just an editor with
-
-04:36.720 --> 00:04:38.560
-commands similar to imax
-
-04:38.560 --> 00:04:40.160
-but
-
-04:40.160 --> 00:04:43.120
-i digress okay so the language i will
-
-04:43.120 --> 00:04:45.120
-argue that common lisp may be the best
-
-04:45.120 --> 00:04:46.320
-language
-
-04:46.320 --> 00:04:47.759
-period
-
-04:47.759 --> 00:04:49.600
-sorry about that the best language for
-
-04:49.600 --> 00:04:51.520
-writing emacs also
-
-04:51.520 --> 00:04:53.759
-um it's a timeless standard reaching in
-
-04:53.759 --> 00:04:57.520
-the 1990s is fast and reliable
-
-04:57.520 --> 00:05:00.160
-it's a great lisp i will argue that the
-
-05:00.160 --> 00:05:01.840
-best lisp but i don't want to get any
-
-05:01.840 --> 00:05:03.280
-trouble so i would just say it's great
-
-05:03.280 --> 00:05:04.400
-lisp
-
-05:04.400 --> 00:05:06.880
-um has good library support doesn't have
-
-05:06.880 --> 00:05:08.720
-like a huge library like i would say
-
-05:08.720 --> 00:05:12.160
-python or c but pretty
-
-05:12.160 --> 00:05:14.800
-robust and good library
-
-05:14.800 --> 00:05:18.000
-similar to mclisp which may seem as a
-
-05:18.000 --> 00:05:21.120
-historical accident which maybe it is
-
-05:21.120 --> 00:05:23.919
-but also in this case has some
-
-05:23.919 --> 00:05:26.160
-interesting properties that will
-
-05:26.160 --> 00:05:29.280
-be discussed
-
-05:29.280 --> 00:05:30.960
-later
-
-05:30.960 --> 00:05:32.400
-okay so
-
-05:32.400 --> 00:05:33.600
-um
-
-05:33.600 --> 00:05:35.280
-taking common lisps a language to write
-
-05:35.280 --> 00:05:36.479
-an imax i'm going to get some
-
-05:36.479 --> 00:05:37.759
-technologies in documentation that we
-
-05:37.759 --> 00:05:40.720
-can use to write an e-max in common lisp
-
-05:40.720 --> 00:05:43.440
-so the first one is mcclaim which is an
-
-05:43.440 --> 00:05:45.039
-implementation of a
-
-05:45.039 --> 00:05:47.120
-common lisp interface standard
-
-05:47.120 --> 00:05:50.320
-this is great i mean i loved how
-
-05:50.320 --> 00:05:52.720
-this is written how it is defined i like
-
-05:52.720 --> 00:05:54.479
-standard things
-
-05:54.479 --> 00:05:57.440
-um mclean it's a marvelous tool i will
-
-05:57.440 --> 00:05:59.759
-argue that it's the best
-
-05:59.759 --> 00:06:01.280
-um toolkit
-
-06:01.280 --> 00:06:03.039
-i wouldn't say there's a toolkit because
-
-06:03.039 --> 00:06:05.360
-it's way more extense than it but it's
-
-06:05.360 --> 00:06:07.919
-great i would highly recommend if you
-
-06:07.919 --> 00:06:10.639
-want to write a gui application in
-
-06:10.639 --> 00:06:14.400
-common lisp well mcclain is great
-
-06:14.400 --> 00:06:18.400
-also some people thought about
-
-06:18.400 --> 00:06:20.160
-libraries for writing emac style
-
-06:20.160 --> 00:06:22.720
-application so to create an emacs some
-
-06:22.720 --> 00:06:24.720
-people already thought about this and
-
-06:24.720 --> 00:06:26.479
-wrote a paper
-
-06:26.479 --> 00:06:27.440
-um
-
-06:27.440 --> 00:06:29.840
-one of them was robert strand
-
-06:29.840 --> 00:06:32.319
-which is the guy more interested in in
-
-06:32.319 --> 00:06:34.880
-imax like things
-
-06:34.880 --> 00:06:36.479
-and this paper is great you can get a
-
-06:36.479 --> 00:06:37.759
-lot of information how you can write
-
-06:37.759 --> 00:06:39.360
-your application get
-
-06:39.360 --> 00:06:41.039
-similar functionality and all the things
-
-06:41.039 --> 00:06:43.600
-that i said before
-
-06:43.600 --> 00:06:45.840
-and also the same
-
-06:45.840 --> 00:06:47.039
-of the
-
-06:47.039 --> 00:06:49.199
-robert strand or the guys that wrote
-
-06:49.199 --> 00:06:52.240
-that paper also wrote clefo which is
-
-06:52.240 --> 00:06:54.479
-a library for text editor buffer but
-
-06:54.479 --> 00:06:57.599
-more important it's also a definition
-
-06:57.599 --> 00:06:59.599
-so this video
-
-06:59.599 --> 00:07:02.639
-out there will where he explains
-
-07:02.639 --> 00:07:03.599
-um
-
-07:03.599 --> 00:07:05.919
-what clapper is so he wrote an
-
-07:05.919 --> 00:07:08.479
-implementation of clover but it's more
-
-07:08.479 --> 00:07:12.000
-of like a
-
-07:12.000 --> 00:07:12.880
-um
-
-07:12.880 --> 00:07:14.400
-yeah
-
-07:14.400 --> 00:07:17.599
-like a standard like a way to write
-
-07:17.599 --> 00:07:20.639
-uh how buffers or work in emacs
-
-07:20.639 --> 00:07:23.280
-and i think it's better
-
-07:23.280 --> 00:07:25.599
-in some ways that what imac genuine mac
-
-07:25.599 --> 00:07:26.960
-does right now
-
-07:26.960 --> 00:07:29.039
-um in other ways it's really interesting
-
-07:29.039 --> 00:07:31.759
-and i just have had a lot of fun
-
-07:31.759 --> 00:07:33.360
-implementing it so
-
-07:33.360 --> 00:07:35.919
-i'm using it more or less
-
-07:35.919 --> 00:07:38.080
-uh so yeah that's some great
-
-07:38.080 --> 00:07:40.479
-documentation great foundation so you
-
-07:40.479 --> 00:07:42.080
-don't have to
-
-07:42.080 --> 00:07:43.599
-i mean it's
-
-07:43.599 --> 00:07:44.879
-really
-
-07:44.879 --> 00:07:46.319
-interesting to write everything by
-
-07:46.319 --> 00:07:48.080
-yourself because you are
-
-07:48.080 --> 00:07:49.120
-a great
-
-07:49.120 --> 00:07:51.440
-programmer and you you want to have
-
-07:51.440 --> 00:07:52.879
-control of everything i understand
-
-07:52.879 --> 00:07:54.800
-everything from the ground up but we
-
-07:54.800 --> 00:07:56.720
-have to understand that
-
-07:56.720 --> 00:07:58.879
-an imax it's a really complex
-
-07:58.879 --> 00:08:00.639
-application
-
-08:00.639 --> 00:08:01.759
-and
-
-08:01.759 --> 00:08:03.120
-i will say that if you have some
-
-08:03.120 --> 00:08:05.520
-foundation it will be easier and you
-
-08:05.520 --> 00:08:08.479
-don't have to rewrite the wheel 20 times
-
-08:08.479 --> 00:08:10.080
-right
-
-08:10.080 --> 00:08:12.720
-okay so attempts uh the same guy robert
-
-08:12.720 --> 00:08:13.680
-strand
-
-08:13.680 --> 00:08:16.879
-have two climax which is emacs and emacs
-
-08:16.879 --> 00:08:19.360
-like thing written in common lisp
-
-08:19.360 --> 00:08:21.599
-um the first ones the third one is
-
-08:21.599 --> 00:08:23.360
-abandon and the second one is a work in
-
-08:23.360 --> 00:08:24.840
-progress
-
-08:24.840 --> 00:08:27.039
-um it's really interesting the second
-
-08:27.039 --> 00:08:29.440
-one uses in fact the clefor buffer
-
-08:29.440 --> 00:08:32.159
-implementation one question
-
-08:32.159 --> 00:08:36.880
-and the first one is just a mcclaim um
-
-08:36.880 --> 00:08:39.200
-front end remax so it's really tight the
-
-08:39.200 --> 00:08:40.800
-so the the
-
-08:40.800 --> 00:08:42.959
-interface retired with the api so it's
-
-08:42.959 --> 00:08:44.880
-basically i'm sickly
-
-08:44.880 --> 00:08:48.320
-um software that's similar to an emacs
-
-08:48.320 --> 00:08:49.360
-right
-
-08:49.360 --> 00:08:51.760
-and the third one it's a lem project
-
-08:51.760 --> 00:08:54.240
-which is a common lisp editor that aims
-
-08:54.240 --> 00:08:56.320
-to be really close to remax and it
-
-08:56.320 --> 00:08:59.519
-probably fits the criteria but
-
-08:59.519 --> 00:09:01.600
-and uses the encourages for the
-
-09:01.600 --> 00:09:03.279
-interface for as i know and it's really
-
-09:03.279 --> 00:09:05.200
-commonly focused so it even has some
-
-09:05.200 --> 00:09:08.560
-major modes for other languages but
-
-09:08.560 --> 00:09:09.839
-i mean it's
-
-09:09.839 --> 00:09:11.279
-um
-
-09:11.279 --> 00:09:13.440
-it's mainly for common lisp written by
-
-09:13.440 --> 00:09:15.680
-common lisp and for common list
-
-09:15.680 --> 00:09:18.080
-developers
-
-09:18.080 --> 00:09:21.839
-um so i decided to write my own emacs
-
-09:21.839 --> 00:09:23.839
-but i don't want to write everything
-
-09:23.839 --> 00:09:25.680
-from scratch
-
-09:25.680 --> 00:09:28.720
-because i'm not a creator programmer
-
-09:28.720 --> 00:09:29.839
-and also because probably there's
-
-09:29.839 --> 00:09:33.040
-something that some people already tried
-
-09:33.040 --> 00:09:34.640
-and the first thing i noticed with all
-
-09:34.640 --> 00:09:36.480
-these attempts
-
-09:36.480 --> 00:09:38.959
-that they fail in compete with emacs so
-
-09:38.959 --> 00:09:41.920
-to say they don't have an imax conf
-
-09:41.920 --> 00:09:43.839
-and they don't support genuine max
-
-09:43.839 --> 00:09:45.440
-packages
-
-09:45.440 --> 00:09:46.880
-and that's a big deal because they're
-
-09:46.880 --> 00:09:49.519
-more of the thousands packages out there
-
-09:49.519 --> 00:09:51.040
-under great
-
-09:51.040 --> 00:09:53.120
-and imagine they want to convince
-
-09:53.120 --> 00:09:54.800
-someone to say hey try this editor
-
-09:54.800 --> 00:09:57.440
-instead of x thing
-
-09:57.440 --> 00:09:59.839
-i would say okay can i use git things so
-
-09:59.839 --> 00:10:02.079
-i have to write a git
-
-10:02.079 --> 00:10:02.959
-um
-
-10:02.959 --> 00:10:04.640
-liar
-
-10:04.640 --> 00:10:07.360
-maggot or mode and i want to play tetris
-
-10:07.360 --> 00:10:09.440
-the other road so that's
-
-10:09.440 --> 00:10:10.640
-really
-
-10:10.640 --> 00:10:12.640
-hard for one person to do
-
-10:12.640 --> 00:10:14.079
-so someone
-
-10:14.079 --> 00:10:16.240
-thought similar so they say okay i'm
-
-10:16.240 --> 00:10:18.079
-going to rewrite the maxi aph common
-
-10:18.079 --> 00:10:19.200
-lisp
-
-10:19.200 --> 00:10:21.440
-it was this is what back in 2005 by sol
-
-10:21.440 --> 00:10:22.399
-bets
-
-10:22.399 --> 00:10:24.000
-sabits
-
-10:24.000 --> 00:10:26.000
-but it was banjo in 2007. the project
-
-10:26.000 --> 00:10:27.600
-was called lice
-
-10:27.600 --> 00:10:28.640
-and
-
-10:28.640 --> 00:10:31.600
-it was a really interesting approach
-
-10:31.600 --> 00:10:34.880
-um it wasn't finished and it was lost in
-
-10:34.880 --> 00:10:35.920
-time
-
-10:35.920 --> 00:10:37.440
-so my idea was to continue with the
-
-10:37.440 --> 00:10:38.880
-project so the foundation was really
-
-10:38.880 --> 00:10:40.320
-interesting even though i didn't like
-
-10:40.320 --> 00:10:42.160
-some other
-
-10:42.160 --> 00:10:43.760
-designing choices
-
-10:43.760 --> 00:10:45.360
-um but i want to continue with projects
-
-10:45.360 --> 00:10:47.519
-finished you cannot see emacs api add a
-
-10:47.519 --> 00:10:49.839
-compatibility layer to use canoe max
-
-10:49.839 --> 00:10:52.000
-packages that's the selling point right
-
-10:52.000 --> 00:10:53.760
-so you don't have to
-
-10:53.760 --> 00:10:56.000
-use new things
-
-10:56.000 --> 00:10:57.839
-i like my emacs i just want to have my
-
-10:57.839 --> 00:11:00.560
-emacs with commodities that's it and
-
-11:00.560 --> 00:11:02.959
-also better probably a better buffer
-
-11:02.959 --> 00:11:05.519
-implementation so the idea now that uh
-
-11:05.519 --> 00:11:07.839
-having an imaginativity layer
-
-11:07.839 --> 00:11:10.320
-is there improving e-max upon it right
-
-11:10.320 --> 00:11:13.040
-you can use the e-max api or the new one
-
-11:13.040 --> 00:11:14.880
-depending on your needs
-
-11:14.880 --> 00:11:15.760
-you can also have that that
-
-11:15.760 --> 00:11:19.120
-compatibility of both
-
-11:19.120 --> 00:11:21.920
-so um i come up with cedar
-
-11:21.920 --> 00:11:25.839
-um cedar is my attempt is a nice
-
-11:25.839 --> 00:11:27.120
-fork
-
-11:27.120 --> 00:11:30.079
-i will say the hug for hard fork because
-
-11:30.079 --> 00:11:32.399
-i change um
-
-11:32.399 --> 00:11:35.200
-a lot of things and add a lot of things
-
-11:35.200 --> 00:11:37.519
-but it's similar still similar
-
-11:37.519 --> 00:11:38.320
-um
-
-11:38.320 --> 00:11:39.680
-and for this demo i'm going to use the
-
-11:39.680 --> 00:11:41.839
-cidar and courses branch we want to test
-
-11:41.839 --> 00:11:44.880
-it out because the other ones are a work
-
-11:44.880 --> 00:11:46.560
-in progress so one
-
-11:46.560 --> 00:11:48.079
-it's the mclean
-
-11:48.079 --> 00:11:49.519
-club for implementation which is not
-
-11:49.519 --> 00:11:51.360
-finished and doesn't run
-
-11:51.360 --> 00:11:54.560
-and the other one is with the visual
-
-11:54.560 --> 00:11:54.959
-that's to explain here but basically
-
-11:54.959 --> 00:11:57.200
-and debugger
-
-11:57.200 --> 00:11:59.600
-it's an interesting debugger similar to
-
-11:59.600 --> 00:12:01.839
-slime
-
-12:01.839 --> 00:12:04.560
-which is the superior lisp
-
-12:04.560 --> 00:12:07.279
-for re max let's begin with max so it's
-
-12:07.279 --> 00:12:12.079
-increases base also like um
-
-12:12.079 --> 00:12:13.760
-like limb
-
-12:13.760 --> 00:12:16.959
-but um way more easy simple
-
-12:16.959 --> 00:12:19.279
-um i
-
-12:19.279 --> 00:12:22.880
-write well i translate more or less this
-
-12:22.880 --> 00:12:24.560
-list mode functionality
-
-12:24.560 --> 00:12:26.079
-and it has similar
-
-12:26.079 --> 00:12:28.079
-genuine max api
-
-12:28.079 --> 00:12:29.600
-we'll see that in the demo
-
-12:29.600 --> 00:12:31.600
-um it's usable but i work in progress
-
-12:31.600 --> 00:12:33.279
-instead of functionality right now i'm
-
-12:33.279 --> 00:12:35.279
-not focusing on stability yet i'm
-
-12:35.279 --> 00:12:38.240
-focusing finish the mclean front end
-
-12:38.240 --> 00:12:41.120
-which i'm not even halfway there
-
-12:41.120 --> 00:12:42.720
-but i hope to finish it
-
-12:42.720 --> 00:12:45.519
-maybe next year who knows
-
-12:45.519 --> 00:12:46.959
-finish the compatibility layer from the
-
-12:46.959 --> 00:12:48.399
-new max packages i seen this i think
-
-12:48.399 --> 00:12:50.959
-this is doable i know how to do it i
-
-12:50.959 --> 00:12:52.639
-just need time
-
-12:52.639 --> 00:12:53.600
-maybe
-
-12:53.600 --> 00:12:55.760
-a little bit of caffeine
-
-12:55.760 --> 00:12:57.040
-coffee
-
-12:57.040 --> 00:12:59.279
-so uh let's go with the demo right
-
-12:59.279 --> 00:13:02.079
-so uh let's open terminal what's this
-
-13:02.079 --> 00:13:04.800
-anchor base let's go to quick lisp
-
-13:04.800 --> 00:13:06.800
-log there
-
-13:06.800 --> 00:13:11.279
-um and let's run it
-
-13:11.279 --> 00:13:13.760
-okay so now that we're here um it give
-
-13:13.760 --> 00:13:16.000
-us the welcome thing this is the main
-
-13:16.000 --> 00:13:17.519
-buffer it's like we'll say the emacs
-
-13:17.519 --> 00:13:19.200
-buffer when you enter
-
-13:19.200 --> 00:13:21.040
-um so we know that it's firming this is
-
-13:21.040 --> 00:13:22.800
-not hardcoded
-
-13:22.800 --> 00:13:25.040
-okay and now we see it's a major mode in
-
-13:25.040 --> 00:13:27.200
-the bottom right lisp
-
-13:27.200 --> 00:13:29.360
-it's lisp interaction and
-
-13:29.360 --> 00:13:32.880
-this is the name of the buffer right
-
-13:32.880 --> 00:13:35.600
-um okay so we have a couple of buffers
-
-13:35.600 --> 00:13:38.240
-we have scratch which is the fundamental
-
-13:38.240 --> 00:13:40.720
-mode and messages all right
-
-13:40.720 --> 00:13:42.399
-okay so
-
-13:42.399 --> 00:13:44.639
-let's get some interesting things first
-
-13:44.639 --> 00:13:46.399
-uh let's open a file
-
-13:46.399 --> 00:13:48.959
-so i think it's in
-
-13:48.959 --> 00:13:51.199
-programming
-
-13:51.199 --> 00:13:53.440
-a max
-
-13:53.440 --> 00:13:56.480
-conf 2021 and let's go to c there
-
-13:56.480 --> 00:13:58.079
-let's go to demo
-
-13:58.079 --> 00:14:00.000
-so let's open a file so
-
-14:00.000 --> 00:14:01.440
-um
-
-14:01.440 --> 00:14:03.040
-phone lock is not yet
-
-14:03.040 --> 00:14:04.399
-um
-
-14:04.399 --> 00:14:06.240
-well it's implemented so it's there but
-
-14:06.240 --> 00:14:07.920
-it's not active by default
-
-14:07.920 --> 00:14:09.680
-so let's open
-
-14:09.680 --> 00:14:11.360
-uh mx
-
-14:11.360 --> 00:14:13.600
-and let's go lisp
-
-14:13.600 --> 00:14:16.079
-interaction mode
-
-14:16.079 --> 00:14:17.279
-right
-
-14:17.279 --> 00:14:19.199
-so this when you show me here is the
-
-14:19.199 --> 00:14:21.680
-implementation of the kill sex sex
-
-14:21.680 --> 00:14:24.240
-express s expression command
-
-14:24.240 --> 00:14:28.880
-which is exactly the same point by point
-
-14:28.880 --> 00:14:31.279
-from the emacs one you can go right now
-
-14:31.279 --> 00:14:32.959
-umax and ask
-
-14:32.959 --> 00:14:35.279
-how is skills s expression defined this
-
-14:35.279 --> 00:14:36.480
-is the same
-
-14:36.480 --> 00:14:38.560
-and this is how you define a key so we
-
-14:38.560 --> 00:14:41.920
-have we can say uh describe
-
-14:41.920 --> 00:14:43.839
-symbol
-
-14:43.839 --> 00:14:46.399
-the package will be
-
-14:46.399 --> 00:14:48.399
-cedar and the symbol is
-
-14:48.399 --> 00:14:50.480
-global map
-
-14:50.480 --> 00:14:51.610
-global map
-
-14:51.610 --> 00:14:53.279
-[Applause]
-
-14:53.279 --> 00:14:54.240
-so
-
-14:54.240 --> 00:14:56.160
-it's a top level global keymap
-
-14:56.160 --> 00:14:58.480
-thank you for the information
-
-14:58.480 --> 00:15:02.160
-um but you can also say okay uh can i
-
-15:02.160 --> 00:15:05.120
-say okay
-
-15:05.120 --> 00:15:08.000
-global map
-
-15:08.000 --> 00:15:10.079
-okay i'll be giving this a key map so
-
-15:10.079 --> 00:15:11.600
-even though i want to aim to have the
-
-15:11.600 --> 00:15:12.480
-same
-
-15:12.480 --> 00:15:15.920
-um api the
-
-15:15.920 --> 00:15:17.760
-um sorry
-
-15:17.760 --> 00:15:20.079
-uh the back thing so the back end is
-
-15:20.079 --> 00:15:22.480
-going to be class oriented and not same
-
-15:22.480 --> 00:15:24.720
-any max but the return expression should
-
-15:24.720 --> 00:15:27.680
-be really similar so if we say current
-
-15:27.680 --> 00:15:29.759
-buffer
-
-15:29.759 --> 00:15:31.759
-it will give us the buffer it's not the
-
-15:31.759 --> 00:15:33.759
-same in emacs but it's a buffer object
-
-15:33.759 --> 00:15:35.519
-and we can also ask
-
-15:35.519 --> 00:15:37.519
-about let me try to remember
-
-15:37.519 --> 00:15:39.440
-oh there we are
-
-15:39.440 --> 00:15:40.639
-um
-
-15:40.639 --> 00:15:41.839
-but for
-
-15:41.839 --> 00:15:45.680
-name we can close this and open one here
-
-15:45.680 --> 00:15:48.079
-and we can say okay so we have this
-
-15:48.079 --> 00:15:48.959
-thing
-
-15:48.959 --> 00:15:50.959
-that will give us the name so uh this is
-
-15:50.959 --> 00:15:52.800
-similar to the emacs api
-
-15:52.800 --> 00:15:54.399
-as we saw we
-
-15:54.399 --> 00:15:55.120
-so
-
-15:55.120 --> 00:15:57.519
-briefly we have a lot a couple of
-
-15:57.519 --> 00:15:58.639
-commands
-
-15:58.639 --> 00:16:00.240
-um
-
-16:00.240 --> 00:16:02.160
-kills expression also have a little bit
-
-16:02.160 --> 00:16:03.759
-of
-
-16:03.759 --> 00:16:06.639
-help kill word kill line
-
-16:06.639 --> 00:16:07.680
-region
-
-16:07.680 --> 00:16:08.959
-kill buffer
-
-16:08.959 --> 00:16:11.440
-all things that we expect from emacs
-
-16:11.440 --> 00:16:12.800
-um
-
-16:12.800 --> 00:16:14.320
-and yeah this is there's a couple of
-
-16:14.320 --> 00:16:16.160
-things i may show but i think this is
-
-16:16.160 --> 00:16:18.320
-good enough i don't have enough time if
-
-16:18.320 --> 00:16:20.720
-you want more information
-
-16:20.720 --> 00:16:22.800
-so let's go back to it let's close the
-
-16:22.800 --> 00:16:25.680
-buffer does it work no it doesn't work
-
-16:25.680 --> 00:16:28.079
-okay now the head buffer no ah let's go
-
-16:28.079 --> 00:16:29.920
-to cedar
-
-16:29.920 --> 00:16:32.320
-okay so if you want more information
-
-16:32.320 --> 00:16:32.870
-um
-
-16:32.870 --> 00:16:34.399
-[Applause]
-
-16:34.399 --> 00:16:36.880
-first of all thank you very much um
-
-16:36.880 --> 00:16:39.040
-sorry i don't have enough time to show
-
-16:39.040 --> 00:16:40.320
-too much too many things i will see
-
-16:40.320 --> 00:16:42.560
-there but um
-
-16:42.560 --> 00:16:44.639
-yeah uh
-
-16:44.639 --> 00:16:45.839
-if you want more information you can
-
-16:45.839 --> 00:16:48.079
-always send me an email this is my
-
-16:48.079 --> 00:16:50.240
-webpage
-
-16:50.240 --> 16:53.720
-thank you very much
diff --git a/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt
index b10e834a..07556c0c 100644
--- a/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt
+++ b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt
@@ -1,457 +1,1246 @@
WEBVTT
-00:00.240 --> 00:00:02.639
-hi my name is eduardox i'm the author of
+00:00:01.040 --> 00:00:04.367
+Welcome, everyone, to this Emacs Conf 2021.
-00:02.639 --> 00:00:05.040
-an mx package called ev and this talk is
+00:00:04.467 --> 00:00:07.617
+My name is Fermin. I work as
-00:05.040 --> 00:00:07.200
-about a new feature of ev called test
+00:00:07.617 --> 00:00:09.717
+a Common Lisp engineer at RavenPack,
-00:07.200 --> 00:00:08.400
-blocks
+00:00:09.817 --> 00:00:11.733
+and today I'm going to talk about
-00:08.400 --> 00:00:10.320
-let's start by demo
+00:00:11.833 --> 00:00:15.783
+CLEDE: the Common Lisp Emacs Development Environment.
-00:10.320 --> 00:00:12.559
-this is a file in lua that defines these
+00:00:15.883 --> 00:00:19.400
+So what is CLEDE?
-00:12.559 --> 00:00:14.160
-two functions here
+00:00:19.500 --> 00:00:20.500
+So CLEDE is a project
-00:14.160 --> 00:00:16.720
-and with it if we type f8 several times
+00:00:20.500 --> 00:00:22.017
+I've been working on this year
-00:16.720 --> 00:00:18.000
-here
+00:00:22.117 --> 00:00:24.650
+for better... well, yeah...
-00:18.000 --> 00:00:20.880
-the f8s create a lower apple here and
+00:00:24.750 --> 00:00:27.117
+a better Common Lisp integration
-00:20.880 --> 00:00:24.400
-then they send these lines to the rebel
+00:00:27.217 --> 00:00:30.317
+for static tools and
-00:24.400 --> 00:00:27.039
-where this line here loads this file
+00:00:30.417 --> 00:00:33.250
+for static and integrated Emacs tools.
-00:27.039 --> 00:00:29.679
-into the repo and these other lines here
+00:00:33.350 --> 00:00:35.367
+And to understand better what
-00:29.679 --> 00:00:33.200
-are tests for these lines
+00:00:35.467 --> 00:00:37.650
+CLEDE is, one first has to understand
-00:33.200 --> 00:00:35.120
-there's a lot of information here so let
+00:00:37.750 --> 00:00:40.133
+the base that I use...
-00:35.120 --> 00:00:40.480
-me organize them in a more visual way
+00:00:40.233 --> 00:00:43.767
+so the foundation that I use for CLEDE.
-00:40.480 --> 00:00:42.960
-this is our file in lua
+00:00:43.867 --> 00:00:46.050
+Um, so it is CEDET--
-00:42.960 --> 00:00:45.760
-lua sees this thing as a as a multi-line
+00:00:46.150 --> 00:00:47.417
+and specifically Semantic--
-00:45.760 --> 00:00:47.760
-comment but we are going to see it as a
+00:00:47.517 --> 00:00:49.733
+so we first have to talk about and
-00:47.760 --> 00:00:51.920
-test block and eev mode is active and so
+00:00:49.833 --> 00:00:50.417
+understand what it is.
-00:51.920 --> 00:00:54.480
-f8 does the right thing
+00:00:50.517 --> 00:00:53.817
+So CEDET is a collection
-00:54.480 --> 00:00:57.360
-uh these three lines here set up the
+00:00:53.917 --> 00:00:55.183
+of Emacs development environment tools.
-00:57.360 --> 00:01:00.079
-target buffer running a lower apple you
+00:00:55.283 --> 00:00:57.233
+It was created by Eric Ludlam
-01:00.079 --> 00:01:03.520
-can see the the prompt of the rebel here
+00:00:57.333 --> 00:01:00.767
+(I hope to say that name right)
-01:03.520 --> 00:01:05.360
-and these lines here are sent to the
+00:01:00.867 --> 00:01:02.333
+in the late 90s, and
-01:05.360 --> 00:01:07.200
-rebel
+00:01:02.433 --> 00:01:04.833
+the idea was to create entire IDE for Emacs.
-01:07.200 --> 00:01:09.680
-and when we type f8 on the line that
+00:01:04.933 --> 00:01:10.433
+CEDET is still integrated into Emacs,
-01:09.680 --> 00:01:10.720
-starts
+00:01:10.533 --> 00:01:11.717
+and it has a lot of interesting things
-01:10.720 --> 00:01:13.600
-with the red star like these lines here
+00:01:11.817 --> 00:01:14.033
+that are not used for too many people,
-01:13.600 --> 00:01:15.759
-what if it does is that it sends the
+00:01:14.133 --> 00:01:16.167
+so I'm going to explain some of those.
-01:15.759 --> 00:01:18.240
-rest of the line sorry it
+00:01:16.267 --> 00:01:18.417
+First, let's go with the good ones that
-01:18.240 --> 00:01:21.119
-executes the rest of the line as lisp
+00:01:18.517 --> 00:01:21.233
+one that I use for CLEDE and that can
-01:21.119 --> 00:01:23.920
-so it executes the three effects here
+00:01:21.333 --> 00:01:23.167
+be used for other projects as well.
-01:23.920 --> 00:01:26.240
-executes these lines as lisp and they
+00:01:23.267 --> 00:01:28.450
+Some of the features that
-01:26.240 --> 00:01:29.520
-set up the target buffer here
+00:01:28.550 --> 00:01:32.450
+CEDET has is parse generators
-01:29.520 --> 00:01:31.759
-and when we type f8 on the line that
+00:01:32.550 --> 00:01:35.217
+so we have Wisent and Bovine.
-01:31.759 --> 00:01:34.159
-does not start with the red star
+00:01:35.317 --> 00:01:38.350
+Wisent is basically a Bison clone
-01:34.159 --> 00:01:36.640
-the f8 sends the line to the target
+00:01:38.450 --> 00:01:40.200
+that was written in Emacs Lisp
-01:36.640 --> 00:01:38.799
-buffer and moves down
+00:01:40.300 --> 00:01:43.117
+that you can also specify grammars.
-01:38.799 --> 00:01:41.040
-and this line loads this file under
+00:01:43.217 --> 00:01:45.617
+It's a really big and rather complex
-01:41.040 --> 00:01:45.200
-apple and these lines are tests
+00:01:45.717 --> 00:01:47.350
+tool to work with,
-01:45.200 --> 00:01:47.520
-so we just saw how to use an existing
+00:01:47.450 --> 00:01:49.183
+and it's secretly used for, as far as
-01:47.520 --> 00:01:50.000
-test block let's now see how to create a
+00:01:49.283 --> 00:01:51.667
+I know, two languages.
-01:50.000 --> 00:01:52.640
-new test block we just have to run this
+00:01:51.767 --> 00:01:53.317
+They're not also well supported,
-01:52.640 --> 00:01:55.680
-meta x e insert test block
+00:01:53.417 --> 00:01:55.317
+but we'll get into that later.
-01:55.680 --> 00:01:58.079
-or meta x euat
+00:01:55.417 --> 00:01:58.133
+Also Bovine, which is a way more
-01:58.079 --> 00:02:01.439
-and the result depends on the major mode
+00:01:58.233 --> 00:01:59.867
+simple tool, like you can...
-02:01.439 --> 00:02:03.920
-uh let's see let's understand that that
+00:01:59.967 --> 00:02:01.733
+you don't need grammar files,
-02:03.920 --> 00:02:06.079
-by looking at the source code
+00:02:01.833 --> 00:02:07.350
+you can write just in plain Emacs Lisp.
-02:06.079 --> 00:02:08.720
-eeit is an alias to this function here
+00:02:07.450 --> 00:02:10.917
+And you also have utilities to work with
-02:08.720 --> 00:02:10.640
-and this function is just five lines of
+00:02:11.017 --> 00:02:16.550
+those generated tag trees, so to say.
-02:10.640 --> 00:02:12.800
-code plus a dot string
+00:02:16.650 --> 00:02:23.533
+These are not AST parsers like real Bison;
-02:12.800 --> 00:02:14.560
-and the dot string explains that if the
+00:02:23.633 --> 00:02:25.617
+they are tag-based so they basically get
-02:14.560 --> 00:02:16.480
-major mode is full mode then this
+00:02:25.717 --> 00:02:27.533
+tags and extract information from them,
-02:16.480 --> 00:02:18.800
-function tries to call
+00:02:27.633 --> 00:02:30.083
+and I can use that information
-02:18.800 --> 00:02:21.360
-a function called e insert test plot
+00:02:30.183 --> 00:02:31.000
+with Emacs Lisp
-02:21.360 --> 00:02:24.800
-test full mode if that function exists
+00:02:31.000 --> 00:02:33.567
+to contextually understand better
-02:24.800 --> 00:02:27.280
-and that if that function does not exist
+00:02:33.667 --> 00:02:36.267
+the language that you're parsing,
-02:27.280 --> 00:02:29.680
-then it yields an error
+00:02:36.367 --> 00:02:37.083
+but in general,
-02:29.680 --> 00:02:32.080
-and here's an example of one such
+00:02:37.183 --> 00:02:40.083
+this decision was made (as far as I know)
-02:32.080 --> 00:02:34.239
-function that's a function that
+00:02:40.183 --> 00:02:43.217
+because of the Emacs Lisp
-02:34.239 --> 00:02:37.280
-inserts a test block in haskell mode
+00:02:43.317 --> 00:02:44.217
+limitation of the time.
-02:37.280 --> 00:02:40.319
-and here we can see two functions like
+00:02:44.317 --> 00:02:50.233
+So Emacs was a rather
-02:40.319 --> 00:02:42.480
-this one for haskell mode and one for
+00:02:50.333 --> 00:02:52.167
+slower Lisp-- slow Lisp--
-02:42.480 --> 00:02:46.080
-javascript mode
+00:02:52.267 --> 00:02:55.850
+so they decide to just use
-02:46.080 --> 00:02:48.560
-uh these functions look quite similar
+00:02:55.950 --> 00:02:58.750
+tag-based thing instead of a parse--
-02:48.560 --> 00:02:49.440
-but
+00:02:58.850 --> 00:03:02.333
+I mean-- an AST-based one.
-02:49.440 --> 00:02:52.720
-their effects look quite different
+00:03:02.433 --> 00:03:05.167
+And Semantic give you some utility with
-02:52.720 --> 00:02:55.760
-to make this comparison here i started
+00:03:05.267 --> 00:03:06.250
+that as Senator, for example, give you
-02:55.760 --> 00:02:57.280
-by writing
+00:03:06.350 --> 00:03:07.667
+some semantic navigation.
-02:57.280 --> 00:02:59.680
-by creating seven files each one in a
+00:03:07.767 --> 00:03:09.750
+So CEDET is way more than this,
-02:59.680 --> 00:03:01.120
-different language
+00:03:09.850 --> 00:03:12.433
+but this is not a CEDET talk.
-03:01.120 --> 00:03:03.040
-and initially each one of these files
+00:03:12.533 --> 00:03:13.983
+So if you want to get more information,
-03:03.040 --> 00:03:04.959
-only had a comment with the name of the
+00:03:14.083 --> 00:03:16.350
+you can go to the official webpage.
-03:04.959 --> 00:03:08.239
-language so c haskell javascript org
+00:03:16.450 --> 00:03:19.933
+I have to say that it is outdated, and
-03:08.239 --> 00:03:10.560
-mode etc
+00:03:20.033 --> 00:03:22.933
+Emacs changed some things over the years
-03:10.560 --> 00:03:13.040
-and in each one of these files i typed
+00:03:23.033 --> 00:03:24.067
+because CEDET was merged into Emacs
-03:13.040 --> 00:03:16.959
-meta x eeit to insert the test block
+00:03:24.167 --> 00:03:27.767
+in 2011, as far as I know.
-03:16.959 --> 00:03:18.800
-so here we can see that these test
+00:03:27.867 --> 00:03:30.417
+You can also go to the official Emacs
-03:18.800 --> 00:03:20.319
-blocks are different
+00:03:30.517 --> 00:03:32.883
+documentation (the manual), which will get
-03:20.319 --> 00:03:22.080
-for example the syntax for multi-line
+00:03:32.983 --> 00:03:35.317
+more information about every tool,
-03:22.080 --> 00:03:24.000
-comments is different depending on the
+00:03:35.417 --> 00:03:38.317
+but it's a really interesting thing, and
-03:24.000 --> 00:03:25.200
-language
+00:03:38.417 --> 00:03:40.883
+I'm really sad that it is forgotten.
-03:25.200 --> 00:03:27.760
-uh this block here that selects which
+00:03:40.983 --> 00:03:43.233
+So let's go with the bad things:
-03:27.760 --> 00:03:30.319
-rebel to run is also different
+00:03:43.333 --> 00:03:46.483
+that CEDET is an abandoned project.
-03:30.319 --> 00:03:33.200
-this line here that shows how that
+00:03:46.583 --> 00:03:48.217
+This has some benefits like it's not
-03:33.200 --> 00:03:34.879
-tells the repo to
+00:03:48.317 --> 00:03:50.550
+going to change that much,
-03:34.879 --> 00:03:37.680
-load the current file is also different
+00:03:50.650 --> 00:03:52.367
+but it's, of course, not ideal.
-03:37.680 --> 00:03:39.680
-depending on the language
+00:03:52.467 --> 00:03:56.833
+Most of the tooling that CEDET
-03:39.680 --> 00:03:41.840
-in some cases i had to improvise a bit
+00:03:56.933 --> 00:03:58.100
+have right now are surpassed
-03:41.840 --> 00:03:43.360
-for example
+00:03:58.200 --> 00:03:59.633
+by other packages.
-03:43.360 --> 00:03:46.400
-uh to implement test blocks in shell
+00:03:59.733 --> 00:04:02.650
+And at first, I know Eric was working
-03:46.400 --> 00:03:48.560
-mode i had to use this
+00:04:02.750 --> 00:04:07.467
+with C at the time so he totally has
-03:48.560 --> 00:03:52.560
-this with syntax using a rear document
+00:04:07.567 --> 00:04:10.533
+"real support" so you can use CEDET
-03:52.560 --> 00:03:55.280
-in tcl i also had to improvise a bit and
+00:04:10.633 --> 00:04:13.033
+for other languages, but
-03:55.280 --> 00:03:57.840
-in some cases i had to improvise a lot
+00:04:13.133 --> 00:04:15.383
+to work really like an IDE, more or less,
-03:57.840 --> 00:04:01.120
-for example in org mode there isn't an
+00:04:15.483 --> 00:04:17.017
+it's all the...
-04:01.120 --> 00:04:03.360
-obvious rebel to run and there isn't an
+00:04:17.117 --> 00:04:19.517
+C is the only language supported,
-04:03.360 --> 00:04:05.280
-obvious way to load the
+00:04:19.617 --> 00:04:21.667
+and maybe some simple C++, but that's it.
-04:05.280 --> 00:04:08.080
-the current org file into the repo so
+00:04:21.767 --> 00:04:24.017
+It needs more documentation.
-04:08.080 --> 00:04:11.680
-the default action of meta x eeit
+00:04:24.117 --> 00:04:25.683
+People really don't know how to use it
-04:11.680 --> 00:04:14.400
-in log mode is just to insert this thing
+00:04:25.783 --> 00:04:28.583
+because, I have to say, rather complex
-04:14.400 --> 00:04:15.439
-here
+00:04:28.683 --> 00:04:30.067
+to get a project working with it,
-04:15.439 --> 00:04:17.519
-that we can use to run a
+00:04:30.167 --> 00:04:33.717
+and then make use of Semantic
-04:17.519 --> 00:04:22.320
-shell in a rebel
+00:04:33.817 --> 00:04:36.667
+because [it] needs some maintenance and
-04:22.320 --> 00:04:23.199
-so
+00:04:36.767 --> 00:04:38.567
+to update the code.
-04:23.199 --> 00:04:25.680
-these functions are quite similar and in
+00:04:38.667 --> 00:04:41.083
+But I will argue that even with these
-04:25.680 --> 00:04:27.440
-the beginning i was writing all of them
+00:04:41.183 --> 00:04:44.383
+deficiencies, it's usable, and
-04:27.440 --> 00:04:29.680
-by hand but then i got bored and i wrote
+00:04:44.483 --> 00:04:47.517
+I use the foundation of base for
-04:29.680 --> 00:04:32.320
-a function to help you write functions
+00:04:47.617 --> 00:04:49.533
+parse infrastructure for other languages.
-04:32.320 --> 00:04:33.840
-like that
+00:04:49.633 --> 00:04:52.367
+I will say that with Common Lisp was
-04:33.840 --> 00:04:35.759
-this function is called
+00:04:52.467 --> 00:04:53.983
+rather easy because
-04:35.759 --> 00:04:38.080
-find e-uit-links and it creates a
+00:04:54.083 --> 00:04:56.033
+CEDET already have Emacs Lisp parser
-04:38.080 --> 00:04:39.919
-temporary buffer
+00:04:56.133 --> 00:04:57.900
+even though it's not great.
-04:39.919 --> 00:04:41.680
-and the contents of this temporary
+00:04:58.000 --> 00:05:00.483
+It's easy to adapt and to use.
-04:41.680 --> 00:04:43.440
-buffer depends on the major mode for
+00:05:00.583 --> 00:05:04.000
+It's not used in an Emacs
-04:43.440 --> 00:04:45.680
-example if the current mode is python
+00:05:04.100 --> 00:05:05.433
+right now because, well,
-04:45.680 --> 00:04:48.880
-mode then running this function here
+00:05:05.533 --> 00:05:08.883
+Emacs know very well itself,
-04:48.880 --> 00:04:51.840
-creates a temporary buffer that lets me
+00:05:08.983 --> 00:05:11.600
+but it's there.
-04:51.840 --> 00:04:53.840
-write the support for
+00:05:11.700 --> 00:05:17.583
+So these, of course, are static parsers
-04:53.840 --> 00:04:56.880
-test blocks into python mode or rewrite
+00:05:17.683 --> 00:05:19.517
+so you don't need to run any
-04:56.880 --> 00:04:59.040
-the function that supports test blocks
+00:05:19.617 --> 00:05:21.883
+other language-specific tools, which is
-04:59.040 --> 00:05:00.880
-and python mode
+00:05:21.983 --> 00:05:24.400
+an advantage for some things.
-05:00.880 --> 00:05:03.600
-so if i'm in python mode and i run this
+00:05:24.500 --> 00:05:27.133
+And this was basically CEDET is,
-05:03.600 --> 00:05:06.639
-i get a temporary buffer like this
+00:05:27.233 --> 00:05:30.283
+and I use the parse infrastructure
-05:06.639 --> 00:05:08.800
-in which this thing is my template for
+00:05:30.383 --> 00:05:31.333
+and some tools
-05:08.800 --> 00:05:11.120
-the function usually this thing is
+00:05:31.433 --> 00:05:34.333
+to create a parser for Common Lisp.
-05:11.120 --> 00:05:13.039
-totally wrong i have to rewrite to this
+00:05:34.433 --> 00:05:36.700
+Well, more or less. *laughs*
-05:13.039 --> 00:05:13.919
-string
+00:05:36.800 --> 00:05:37.900
+Let's go to details.
-05:13.919 --> 00:05:16.400
-but the rest is right you can see python
+00:05:38.000 --> 00:05:39.850
+So I will say that it's not a parser
-05:16.400 --> 00:05:18.720
-mode here in the name of the function so
+00:05:39.950 --> 00:05:42.433
+by itself because, as we all know,
-05:18.720 --> 00:05:21.360
-we have to edit this and save that to
+00:05:42.533 --> 00:05:44.500
+to parse a macro-based language
-05:21.360 --> 00:05:22.840
-our home
+00:05:44.600 --> 00:05:46.833
+is really hard.
-05:22.840 --> 00:05:25.520
-slash.mx and by the way these things
+00:05:46.933 --> 00:05:48.450
+Mostly if you cannot have contextual
-05:25.520 --> 00:05:28.880
-here hyperlinks to many different things
+00:05:48.550 --> 00:05:52.800
+information because if you create code
-05:28.880 --> 00:05:31.600
-this elias piper link here
+00:05:52.900 --> 00:05:56.033
+at compile time or runtime is really hard
-05:31.600 --> 00:05:34.160
-points to the source code to the section
+00:05:56.133 --> 00:05:59.233
+if you don't have run time, right?
-05:34.160 --> 00:05:35.280
-in which
+00:05:59.333 --> 00:06:00.950
+Basically, CLEDE can be described
-05:35.280 --> 00:05:36.400
-these
+00:06:01.050 --> 00:06:02.600
+as a Semantic extension.
-05:36.400 --> 00:05:38.400
-functions are defined
+00:06:02.700 --> 00:06:03.867
+So basically it's like,
-05:38.400 --> 00:05:40.320
-so you can see this here the function
+00:06:03.967 --> 00:06:07.133
+you can have Semantic
-05:40.320 --> 00:05:41.759
-that supports c
+00:06:07.233 --> 00:06:09.817
+and use it with Common Lisp code
-05:41.759 --> 00:05:43.440
-the function for haskell the function
+00:06:09.917 --> 00:06:11.600
+and some Common Lisp Emacs tools.
-05:43.440 --> 00:05:46.400
-for javascript etc
+00:06:11.700 --> 00:06:17.350
+So Bison (which is not Bison) is
-05:46.400 --> 00:05:49.440
-and that's it this is a five-minute talk
+00:06:17.450 --> 00:06:21.650
+Bovine, and Semantic and Senator
-05:49.440 --> 00:05:50.960
-so i can't say much
+00:06:21.750 --> 00:06:24.750
+for navigating tags,
-05:50.960 --> 00:05:52.639
-if you want more information or if you
+00:06:24.850 --> 00:06:26.367
+and then communication with SLIME, SLY,
-05:52.639 --> 00:05:55.120
-want to see real world examples how i
+00:06:26.467 --> 00:06:28.733
+and inferior Lisp.
-05:55.120 --> 00:05:58.000
-use test blocks etc etc see this page
+00:06:28.833 --> 00:06:30.450
+That means... I will show that later, but
-05:58.000 --> 00:06:00.479
-here and i do not have time to explain
+00:06:30.550 --> 00:06:32.800
+basically, you can parse the buffer,
-06:00.479 --> 00:06:02.560
-this by the way here
+00:06:32.900 --> 00:06:34.167
+get some tags,
-06:02.560 --> 06:06.080
-so that's it thanks
+00:06:34.267 --> 00:06:35.967
+get information about the tags that you want,
+
+00:06:36.067 --> 00:06:38.017
+and then send some of that information
+
+00:06:38.117 --> 00:06:43.900
+to the SLIME, SLY, or inferior Lisp REPL buffer,
+
+00:06:44.000 --> 00:06:45.717
+so you can get both things
+
+00:06:45.817 --> 00:06:48.483
+at the same time.
+
+00:06:48.583 --> 00:06:50.217
+And given that it's a Lisp language,
+
+00:06:50.317 --> 00:06:53.300
+this can be pretty interesting.
+
+00:06:53.400 --> 00:06:57.600
+Also I wrote some common package integration,
+
+00:06:57.700 --> 00:06:59.217
+so even though there's not
+
+00:06:59.317 --> 00:07:00.300
+a Common Lisp standard,
+
+00:07:00.400 --> 00:07:05.100
+there's some libraries that are used
+
+00:07:05.200 --> 00:07:07.583
+by basically everyone.
+
+00:07:07.683 --> 00:07:09.417
+They're not part of the standard,
+
+00:07:09.517 --> 00:07:11.000
+but yeah.
+
+00:07:11.100 --> 00:07:13.900
+A lot of people use it: like `asdf`,
+
+00:07:14.000 --> 00:07:15.550
+which is the package manager,
+
+00:07:15.650 --> 00:07:18.967
+I will say it's [`asdf` is] the
+
+00:07:19.067 --> 00:07:21.783
+definition packages, so to say,
+
+00:07:21.883 --> 00:07:23.667
+better than packages itself
+
+00:07:23.767 --> 00:07:26.317
+and have more features.
+
+00:07:26.417 --> 00:07:28.383
+I wrote a nice integration with it
+
+00:07:28.483 --> 00:07:29.500
+and also `fiveam`,
+
+00:07:29.600 --> 00:07:34.417
+which is a well-known test package.
+
+00:07:34.517 --> 00:07:39.300
+I just wrote this as an example
+
+00:07:39.400 --> 00:07:41.883
+on how we can do with CLEDE.
+
+00:07:41.983 --> 00:07:43.633
+Let's look at the features,
+
+00:07:43.733 --> 00:07:46.267
+and then we go to a demo.
+
+00:07:51.367 --> 00:07:54.000
+You can go to the repository.
+
+00:07:54.100 --> 00:07:56.550
+Currently, it's not in Melpa
+
+00:07:56.650 --> 00:07:57.917
+although I wanted
+
+00:07:58.017 --> 00:08:01.250
+to merge it-- I mean, to add it--
+
+00:08:01.450 --> 00:08:04.667
+to Melpa in the future.
+
+00:08:04.767 --> 00:08:06.367
+I want to clean the code and
+
+00:08:06.467 --> 00:08:07.417
+add some more features;
+
+00:08:07.517 --> 00:08:09.650
+I'm working on that and now
+
+00:08:09.750 --> 00:08:12.567
+like an eagle, so to say...
+
+00:08:12.667 --> 00:08:15.533
+but yeah, you can go here and then check
+
+00:08:15.633 --> 00:08:18.833
+all the features and test it.
+
+00:08:18.933 --> 00:08:20.733
+To install is pretty easy:
+
+00:08:20.833 --> 00:08:22.500
+just "add to path" thing.
+
+00:08:22.600 --> 00:08:23.650
+You don't need any external dependencies;
+
+00:08:23.750 --> 00:08:25.817
+everything's in Emacs.
+
+00:08:25.917 --> 00:08:28.467
+This was tested with Emacs 27,
+
+00:08:28.567 --> 00:08:29.883
+but probably going to work
+
+00:08:29.983 --> 00:08:32.750
+with Emacs 25 onwards so
+
+00:08:32.850 --> 00:08:34.267
+it shouldn't be any problem.
+
+00:08:34.367 --> 00:08:38.633
+So let's go with the features.
+
+00:08:38.733 --> 00:08:42.783
+This is some CEDET integrations,
+
+00:08:42.883 --> 00:08:44.417
+and first, like I said, it has
+
+00:08:44.517 --> 00:08:48.000
+support for SLY, SLIME, and inferior Lisp.
+
+00:08:48.100 --> 00:08:49.517
+If you are Common Lisp developer, you
+
+00:08:49.617 --> 00:08:52.267
+probably know a SLIME and a SLY,
+
+00:08:52.367 --> 00:08:53.483
+and inferior Lisp is basically
+
+00:08:53.583 --> 00:08:57.800
+just stock Emacs REPL.
+
+00:08:57.900 --> 00:09:00.817
+I support all three equally, so to say,
+
+00:09:00.917 --> 00:09:05.583
+and we have also `fiveam` integration,
+
+00:09:05.683 --> 00:09:08.867
+the ability to-- as I'm going to show later,
+
+00:09:08.967 --> 00:09:10.883
+you have the ability to send a test--
+
+00:09:10.983 --> 00:09:16.233
+either packages or an entire suite of tests,
+
+00:09:16.333 --> 00:09:21.350
+and `asdf`, which currently I'm just
+
+00:09:21.450 --> 00:09:23.517
+supporting basic project navigation
+
+00:09:23.617 --> 00:09:25.433
+and some information,
+
+00:09:25.533 --> 00:09:28.517
+but it's a work-in-progress.
+
+00:09:28.617 --> 00:09:29.783
+I also have some general activities
+
+00:09:29.883 --> 00:09:31.917
+that are not directly related to CEDET
+
+00:09:32.017 --> 00:09:34.050
+but part of the CLEDE package, which
+
+00:09:34.150 --> 00:09:35.500
+is CLEDE highlight.
+
+00:09:35.600 --> 00:09:36.817
+It's highly inspired by the
+
+00:09:36.917 --> 00:09:41.167
+Emacs re-factor `erefactor`.
+
+00:09:41.267 --> 00:09:43.950
+Basically, you have some nice
+
+00:09:44.050 --> 00:09:47.883
+highlights for lint variables.
+
+00:09:47.983 --> 00:09:49.467
+I want to expand that to also
+
+00:09:49.567 --> 00:09:53.133
+support parameters and function stuff,
+
+00:09:53.233 --> 00:09:56.300
+but it's not a high priority for me.
+
+00:09:56.400 --> 00:09:58.117
+But yeah, I sometimes use this;
+
+00:09:58.217 --> 00:10:01.950
+it's pretty neat when you have a big lint.
+
+00:10:02.050 --> 00:10:05.333
+Also some refactoring utilities...
+
+00:10:05.433 --> 00:10:06.700
+some of those can be said
+
+00:10:06.800 --> 00:10:08.400
+that it's overlapped with some...
+
+00:10:08.500 --> 00:10:12.467
+because it is a string base, it doesn't
+
+00:10:12.567 --> 00:10:15.983
+have too much context information,
+
+00:10:16.083 --> 00:10:17.967
+but yeah, some sort of
+
+00:10:18.067 --> 00:10:22.167
+`replace-symbol-in-region` and `symbol-tag`.
+
+00:10:22.267 --> 00:10:23.867
+And then some CLEDE commands.
+
+00:10:23.967 --> 00:10:25.500
+This is the thing that I use all the time.
+
+00:10:25.600 --> 00:10:26.067
+It's like you're going to find
+
+00:10:26.167 --> 00:10:29.067
+some commands to send to a REPL.
+
+00:10:29.167 --> 00:10:31.367
+I will show some example, but basically,
+
+00:10:31.467 --> 00:10:32.983
+you have already an example.
+
+00:10:33.083 --> 00:10:34.333
+You define a list of commands,
+
+00:10:34.433 --> 00:10:37.867
+you put name, and then you put the
+
+00:10:37.967 --> 00:10:39.300
+Common Lisp code that you want to send.
+
+00:10:39.400 --> 00:10:41.550
+Given that, you're writing this
+
+00:10:41.650 --> 00:10:43.483
+Emacs Lisp in your configuration.
+
+00:10:43.583 --> 00:10:46.867
+You can have some runtime information
+
+00:10:46.967 --> 00:10:49.450
+when the code is sent, right?
+
+00:10:49.550 --> 00:10:53.450
+so insert, get a variable value, or whatever.
+
+00:10:53.550 --> 00:10:56.133
+OK, `imenu` integration.
+
+00:10:56.233 --> 00:10:58.967
+Yes, Semantic...
+
+00:10:59.067 --> 00:11:02.450
+CEDET has a great `imenu` utilities
+
+00:11:02.550 --> 00:11:05.600
+to have a better `imenu`.
+
+00:11:05.700 --> 00:11:10.383
+`imenu-list` also works really well.
+
+00:11:10.483 --> 00:11:12.917
+So you have better... when you go to a file
+
+00:11:13.017 --> 00:11:15.200
+that you don't fully know what is inside,
+
+00:11:15.300 --> 00:11:20.533
+it's better to navigate having like a tree.
+
+00:11:20.633 --> 00:11:22.383
+Yeah, this one's the thing is going
+
+00:11:22.483 --> 00:11:24.783
+to show that Senator, which is
+
+00:11:24.883 --> 00:11:26.633
+Semantic navigator, and then some
+
+00:11:26.733 --> 00:11:30.217
+Semantic-specific tools like `complete-jump`,
+
+00:11:30.317 --> 00:11:32.750
+which I don't use this one too much
+
+00:11:32.850 --> 00:11:35.300
+because we have SLY/SLIME,
+
+00:11:35.400 --> 00:11:39.083
+but they're there, so yeah.
+
+00:11:39.183 --> 00:11:41.433
+Like I said, Common Lisp library support,
+
+00:11:41.533 --> 00:11:44.333
+which is duplicated.
+
+00:11:44.433 --> 00:11:47.017
+OK, so let's go to the demo.
+
+00:11:47.117 --> 00:11:50.983
+Um.
+
+00:11:51.083 --> 00:11:53.567
+Let's go to the demo file.
+
+00:11:53.667 --> 00:11:55.300
+Right.
+
+00:11:55.400 --> 00:11:58.250
+First, we have to do is enable CLEDE.
+
+00:11:58.350 --> 00:11:59.433
+This is pretty easy:
+
+00:11:59.533 --> 00:12:03.400
+we call `clede-start`, right,
+
+00:12:03.500 --> 00:12:05.100
+and now it's started.
+
+00:12:05.200 --> 00:12:08.100
+CLEDE is not an asynchronous parser so
+
+00:12:08.200 --> 00:12:10.900
+Semantic (in this case, Bovine) is not.
+
+00:12:11.000 --> 00:12:15.917
+If the file is large, it may take some time.
+
+00:12:16.017 --> 00:12:16.017
+It shouldn't because we have
+
+00:12:16.117 --> 00:12:19.117
+powerful computers, but if your
+
+00:12:19.217 --> 00:12:21.917
+computer is not that powerful,
+
+00:12:22.017 --> 00:12:22.933
+it may take a while.
+
+00:12:23.033 --> 00:12:26.117
+To see the information that has been
+
+00:12:26.217 --> 00:12:31.167
+parsed, we're going to call `bovinate`.
+
+00:12:31.267 --> 00:12:33.767
+Oops... oops...
+
+00:12:33.867 --> 00:12:36.033
+Oh! I have to-- sorry...
+
+00:12:36.133 --> 00:12:43.267
+Let's enable Semantic again.
+
+00:12:43.367 --> 00:12:45.217
+Let's start... `bovinate`...
+
+00:12:45.317 --> 00:12:48.117
+OK, so...
+
+00:12:48.217 --> 00:12:49.917
+This is the information that
+
+00:12:50.017 --> 00:12:52.983
+currently CLEDE is taking from the buffer.
+
+00:12:53.083 --> 00:12:55.517
+So we can see it's taking this, and
+
+00:12:55.617 --> 00:12:58.550
+it doesn't know what it is,
+
+00:12:58.550 --> 00:13:02.167
+so this is the tag name...
+
+00:13:02.267 --> 00:13:02.850
+this is the type,
+
+00:13:02.950 --> 00:13:03.733
+and these are some information
+
+00:13:03.833 --> 00:13:05.750
+and the location.
+
+00:13:05.850 --> 00:13:08.150
+OK, so we know that this is a variable,
+
+00:13:08.250 --> 00:13:10.150
+and it has the full value.
+
+00:13:10.250 --> 00:13:13.233
+You know this is a package, right,
+
+00:13:13.333 --> 00:13:15.450
+because it's defined as a package.
+
+00:13:15.550 --> 00:13:18.100
+It doesn't understand what this is.
+
+00:13:18.300 --> 00:13:18.967
+This node is a function
+
+00:13:19.067 --> 00:13:19.817
+because of the `fun`,
+
+00:13:19.917 --> 00:13:23.133
+and some of this is code,
+
+00:13:23.233 --> 00:13:25.917
+and it also understands some tests
+
+00:13:26.017 --> 00:13:27.667
+because it has `fiveam` integration.
+
+00:13:27.767 --> 00:13:31.000
+If it detects that has some test here
+
+00:13:31.000 --> 00:13:34.517
+it will know that, indeed, it is test.
+
+00:13:34.517 --> 00:13:40.317
+So let's try some, first, `imenu`.
+
+00:13:40.417 --> 00:13:42.550
+So we can see here we have...
+
+00:13:42.650 --> 00:13:44.750
+I understand that this have
+
+00:13:44.850 --> 00:13:46.600
+some sort of `fiveam` switch
+
+00:13:46.700 --> 00:13:49.350
+and some tests defined.
+
+00:13:49.450 --> 00:13:51.000
+It understands this package, and
+
+00:13:51.100 --> 00:13:52.783
+it'll give you some variables-- `defuns`,
+
+00:13:52.883 --> 00:13:55.117
+and it also will give you some misc
+
+00:13:55.217 --> 00:13:59.917
+for things that doesn't know what it is.
+
+00:14:00.017 --> 00:14:00.983
+And you can also
+
+00:14:01.083 --> 00:14:04.417
+navigate with this-- like this `imenu`.
+
+00:14:06.000 --> 00:14:12.000
+So, um, let's go first with some Senator.
+
+00:14:12.000 --> 00:14:14.867
+So with Senator, we can navigate,
+
+00:14:14.967 --> 00:14:16.200
+go to the next stack, previous stack,
+
+00:14:16.300 --> 00:14:20.783
+all this, um, top-level `s-expression`
+
+00:14:20.883 --> 00:14:22.467
+are basically a tag, even though
+
+00:14:22.567 --> 00:14:28.467
+it's code... you can navigate, right.
+
+00:14:28.567 --> 00:14:31.333
+Um, copy/kill this or some other stuff.
+
+00:14:31.433 --> 00:14:34.017
+Um, some interesting thing that we can
+
+00:14:34.117 --> 00:14:38.717
+do is let's launch SLY, right.
+
+00:14:38.817 --> 00:14:44.317
+Um, let's load `fiveam`,
+
+00:14:44.417 --> 00:14:45.500
+and let's send some tests.
+
+00:14:45.600 --> 00:14:51.467
+We can say, OK, `clede-fiveam-send-current-test`,
+
+00:14:51.567 --> 00:14:53.033
+and it will-- OK, have to compile
+
+00:14:53.133 --> 00:14:54.750
+this file first.
+
+00:14:54.850 --> 00:14:55.983
+OK, you don't like this...
+
+00:14:56.083 --> 00:14:58.367
+you compile the tests.
+
+00:14:58.467 --> 00:15:03.667
+OK... um... well...
+
+00:15:03.767 --> 00:15:05.017
+I don't have-- yeah, I don't have
+
+00:15:05.117 --> 00:15:11.833
+the switch here so let's...
+
+00:15:11.933 --> 00:15:14.733
+OK, yeah because I guess it's getting...
+
+00:15:14.833 --> 00:15:19.583
+sorry about this...
+
+00:15:19.683 --> 00:15:22.983
+Let's say we're going to send this test...
+
+00:15:23.083 --> 00:15:28.667
+It isn't working...
+
+00:15:28.767 --> 00:15:36.967
+OK, why are you not working...
+
+00:15:37.067 --> 00:15:38.450
+maybe because we have to go
+
+00:15:38.550 --> 00:15:47.083
+to the package `fiveam`.
+
+00:15:47.183 --> 00:15:49.133
+Yes, sorry... um...
+
+00:15:49.233 --> 00:15:51.550
+Yeah, so we're gonna go here, and
+
+00:15:51.650 --> 00:15:54.117
+we can say `fiveam-send-tests`,
+
+00:15:54.217 --> 00:15:55.250
+and there we have it.
+
+00:15:55.350 --> 00:15:56.200
+It will send the test
+
+00:15:56.300 --> 00:16:00.217
+that we are currently in, right.
+
+00:16:00.317 --> 00:16:01.883
+So that's the thing.
+
+00:16:01.983 --> 00:16:04.000
+Another interesting thing that I said is
+
+00:16:04.000 --> 00:16:08.450
+`clede-highlight-minor-mode`.
+
+00:16:08.550 --> 00:16:11.567
+Basically, work in `let`'s context
+
+00:16:11.667 --> 00:16:13.450
+to know where to highlight
+
+00:16:13.550 --> 00:16:17.117
+all the variables,
+
+00:16:17.217 --> 00:16:20.217
+and we can disable.
+
+00:16:20.317 --> 00:16:21.833
+What else do we have?
+
+00:16:21.933 --> 00:16:24.100
+So we have framework integration.
+
+00:16:24.200 --> 00:16:25.900
+You can go `clede-` and
+
+00:16:26.000 --> 00:16:27.717
+see what more commands are.
+
+00:16:27.817 --> 00:16:29.767
+`commands-run` are basically a way
+
+00:16:29.867 --> 00:16:31.617
+to define commands, you have a variable,
+
+00:16:31.717 --> 00:16:35.317
+which is `clede-commands-list`.
+
+00:16:35.417 --> 00:16:37.233
+Let's explain that you can get
+
+00:16:37.333 --> 00:16:39.817
+some system working
+
+00:16:39.917 --> 00:16:42.617
+or whatever command you want, right.
+
+00:16:42.717 --> 00:16:46.083
+Also you have `asdf` basic integration.
+
+00:16:46.183 --> 00:16:48.067
+You can go to a definition file
+
+00:16:48.167 --> 00:16:51.050
+of some of the systems are already loaded.
+
+00:16:51.150 --> 00:16:53.667
+For example, let's go to here,
+
+00:16:53.767 --> 00:16:55.550
+and we go to the definition file--
+
+00:16:55.650 --> 00:16:57.917
+there's the file, right?
+
+00:16:58.017 --> 00:16:59.000
+This is used because I'm sending
+
+00:16:59.100 --> 00:17:00.800
+commands for the REPL, so this
+
+00:17:00.900 --> 00:17:04.117
+functionality is not provided
+
+00:17:04.217 --> 00:17:09.167
+by CEDET or Semantic,
+
+00:17:09.267 --> 00:17:11.633
+but I can also get some sort
+
+00:17:11.733 --> 00:17:19.717
+of information for `asd` file,
+
+00:17:19.817 --> 00:17:21.550
+which is a work-in-progress,
+
+00:17:21.650 --> 00:17:23.100
+but you can go to some component file
+
+00:17:23.200 --> 00:17:24.150
+when you have a big `asd` file
+
+00:17:24.250 --> 00:17:25.200
+with lots of components
+
+00:17:25.300 --> 00:17:27.783
+and some other interesting thing.
+
+00:17:27.883 --> 00:17:30.283
+Like I said, that's a work-in-progress,
+
+00:17:30.383 --> 00:17:34.967
+Yes, so this is most of the functionality.
+
+00:17:35.067 --> 00:17:37.000
+The most interesting thing, I think,
+
+00:17:37.100 --> 00:17:40.267
+is the base for the foundation.
+
+00:17:40.367 --> 00:17:43.000
+So you can expand: let's go to source code,
+
+00:17:43.100 --> 00:17:48.333
+for example, that `fiveam`.
+
+00:17:48.433 --> 00:17:49.900
+So as we can see here, this is
+
+00:17:50.000 --> 00:17:53.433
+the `fiveam` integration, and to add it,
+
+00:17:53.533 --> 00:17:58.233
+I just define some new functions,
+
+00:17:58.333 --> 00:18:01.983
+and then you use this...
+
+00:18:02.083 --> 00:18:04.150
+set up a new form parser that we use
+
+00:18:04.250 --> 00:18:06.400
+to get some information
+
+00:18:06.500 --> 00:18:09.150
+about the `s-expression` top-level,
+
+00:18:09.250 --> 00:18:10.433
+and we define the names,
+
+00:18:10.533 --> 00:18:11.617
+we define information we want to take
+
+00:18:11.717 --> 00:18:13.700
+from the symbol and everything else.
+
+00:18:13.800 --> 00:18:17.133
+Also some [??] types
+
+00:18:17.233 --> 00:18:19.367
+that would be going to be added
+
+00:18:19.467 --> 00:18:21.067
+to the `imenu` thing:
+
+00:18:21.167 --> 00:18:24.033
+for example, `imenu test switch and test`.
+
+00:18:24.133 --> 00:18:27.317
+And then, these are, for example,
+
+00:18:27.417 --> 00:18:29.333
+some function to send information
+
+00:18:29.433 --> 00:18:33.483
+to the SLY, SLIME, or inferior Lisp
+
+00:18:33.583 --> 00:18:37.050
+depending on the Lisp that you're using.
+
+00:18:37.150 --> 00:18:39.400
+So I do not have more time.
+
+00:18:39.500 --> 00:18:40.367
+Sorry about that.
+
+00:18:40.467 --> 00:18:44.917
+Thank you very much.
+
+00:18:45.017 --> 00:18:46.383
+My name is Fermin.
+
+00:18:46.483 --> 00:18:49.733
+You can send me a mail in my mail,
+
+00:18:49.833 --> 00:18:51.233
+and that's my webpage.
+
+00:18:51.333 --> 00:18:54.950
+I hope you like it.
diff --git a/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt b/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt
new file mode 100644
index 00000000..a897b790
--- /dev/null
+++ b/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt
@@ -0,0 +1,25 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:27.038
+Self-intro and context of the talk
+
+00:00:27.039 --> 00:00:43.119
+Goals of the workflow
+
+00:00:43.120 --> 00:01:33.999
+Requirements of the workflow
+
+00:01:34.000 --> 00:01:42.719
+Package dependencies
+
+00:01:42.720 --> 00:03:24.238
+Demo: Class notes PDFs
+
+00:03:24.239 --> 00:08:12.638
+Pulling down arXiv papers
+
+00:08:12.639 --> 00:08:59.439
+Small customizations
+
+00:08:59.440 --> 00:09:28.080
+TODO
diff --git a/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt b/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt
new file mode 100644
index 00000000..194156b0
--- /dev/null
+++ b/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt
@@ -0,0 +1,43 @@
+WEBVTT
+
+00:00:00.320 --> 00:00:18.559
+Introduction
+
+00:00:18.560 --> 00:00:33.599
+Emacs 28
+
+00:00:33.600 --> 00:02:36.399
+Native compilation
+
+00:02:36.400 --> 00:02:55.759
+Build with Cairo by default
+
+00:02:55.760 --> 00:03:22.958
+New mode, but off by default: context-menus
+
+00:03:22.959 --> 00:03:37.839
+Tab-bar and tab-line received many enhancements
+
+00:03:37.840 --> 00:04:20.319
+A command can marked as specific to a mode
+
+00:04:20.320 --> 00:05:00.879
+Transient input methods
+
+00:05:00.880 --> 00:05:14.559
+show-paren-mode is enabled by default
+
+00:05:14.560 --> 00:05:39.519
+We now have a Non-GNU ELPA
+
+00:05:39.520 --> 00:06:18.399
+repeat-mode
+
+00:06:18.400 --> 00:06:26.719
+project.el has dozens of new commands
+
+00:06:26.720 --> 00:06:54.959
+Shorthands for Lisp symbols
+
+00:06:54.960 --> 00:06:55.960
+Emacs 29 is just beginning
diff --git a/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt b/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt
new file mode 100644
index 00000000..d6a21081
--- /dev/null
+++ b/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt
@@ -0,0 +1,26 @@
+WEBVTT
+
+00:00:03.040 --> 00:00:38.045
+Introduction
+
+00:00:38.046 --> 00:02:05.725
+EAF Overview
+
+00:02:05.726 --> 00:02:23.285
+New logo
+
+00:02:23.286 --> 00:03:15.359
+EAF Supports Windows, macOS, and many Linux distros
+
+00:03:15.360 --> 00:03:56.958
+Multi-language scripting
+
+00:03:56.959 --> 00:05:45.359
+VueJS extension
+
+00:05:45.360 --> 00:07:09.598
+EAF core-app separation
+
+00:07:09.599 --> 00:07:45.319
+Other notable updates Popweb
+
diff --git a/2021/captions/emacsconf-2021-erg--emacs-research-group-season-zero-what-we-did-together-with-emacs-in-2-hours-a-week-for-a-year--noorah-alhasan-joe-corneli-raymond-puzio-leo-vivier--main--chapters.vtt b/2021/captions/emacsconf-2021-erg--emacs-research-group-season-zero-what-we-did-together-with-emacs-in-2-hours-a-week-for-a-year--noorah-alhasan-joe-corneli-raymond-puzio-leo-vivier--main--chapters.vtt
new file mode 100644
index 00000000..4fb35367
--- /dev/null
+++ b/2021/captions/emacsconf-2021-erg--emacs-research-group-season-zero-what-we-did-together-with-emacs-in-2-hours-a-week-for-a-year--noorah-alhasan-joe-corneli-raymond-puzio-leo-vivier--main--chapters.vtt
@@ -0,0 +1,43 @@
+WEBVTT
+
+00:00:00.880 --> 00:01:45.999
+Introduction
+
+00:01:46.000 --> 00:02:53.679
+Background and technology: Emacs Research Group
+
+00:02:53.680 --> 00:05:13.599
+Prerecorded demo
+
+00:05:13.600 --> 00:05:35.119
+Organising metaphor
+
+00:05:35.120 --> 00:06:00.719
+Timetable
+
+00:06:00.720 --> 00:06:32.239
+Project Action Review
+
+00:06:32.240 --> 00:07:02.318
+Causal Layered Analysis
+
+00:07:02.319 --> 00:07:42.879
+Design Patterns and Next Steps
+
+00:07:42.880 --> 00:07:53.598
+Projects
+
+00:07:53.599 --> 00:08:24.559
+Patterns of Patterns (PLoP 2021)
+
+00:08:24.560 --> 00:08:57.518
+PLACARD Workshop roles
+
+00:08:57.519 --> 00:09:38.479
+Initial user studies
+
+00:09:38.480 --> 00:10:08.559
+Broader context
+
+00:10:08.560 --> 00:10:09.560
+Conclusion
diff --git a/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt b/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt
new file mode 100644
index 00000000..9aa57433
--- /dev/null
+++ b/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt
@@ -0,0 +1,31 @@
+WEBVTT
+
+00:00:01.120 --> 00:02:36.479
+Introduction
+
+00:02:36.480 --> 00:04:19.839
+Emacs Lisp is a little old
+
+00:04:19.840 --> 00:05:03.038
+Benchmark then optimize, not vice versa
+
+00:05:03.039 --> 00:09:31.199
+profiler-start
+
+00:09:31.200 --> 00:13:01.359
+elp - Emacs Lisp Profiler
+
+00:13:01.360 --> 00:19:13.439
+benchmark
+
+00:19:13.440 --> 00:20:00.239
+Write less code
+
+00:20:00.240 --> 00:22:52.158
+Reduce allocations
+
+00:22:52.159 --> 00:30:52.239
+Recent optimizations in Xref
+
+00:30:52.240 --> 00:30:53.240
+cl-lib, dash, and seq
diff --git a/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt
index 7d688ed4..3e716c43 100644
--- a/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt
+++ b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt
@@ -1,82 +1,82 @@
WEBVTT
-00:00:11.120 --> 00:01:16.158
+00:00:00.000 --> 00:00:26.318
Thanks
-00:01:16.159 --> 00:03:59.438
+00:00:26.319 --> 00:03:09.598
In your opinion, what is Emacs' Achilles heel?
-00:03:59.439 --> 00:05:56.799
+00:03:09.599 --> 00:05:06.959
What is your opinion about the documentation of Emacs in other languages?
-00:05:56.800 --> 00:07:21.679
+00:05:06.960 --> 00:06:31.839
Do you think more effort should be made to popularize hacking on the C parts of Emacs?
-00:07:21.680 --> 00:08:01.839
+00:06:31.840 --> 00:07:11.999
Can you name a few features from other programming languages that you miss in Emacs Lisp?
-00:08:01.840 --> 00:09:12.239
+00:07:12.000 --> 00:08:22.399
What are your opinions on Emacs's commitments to free software?
-00:09:12.240 --> 00:12:32.799
+00:08:22.400 --> 00:11:42.959
Do you think that packages like Magit or Org mode make people see Emacs as an obstacle to these applications that they want to use?
-00:12:32.800 --> 00:13:47.759
+00:11:42.960 --> 00:12:57.919
Another way people can help inspire others to use Emacs
-00:13:47.760 --> 00:15:39.679
+00:12:57.920 --> 00:14:49.839
Should Emacs continue to present itself as an esoteric program and culture, or should we try to dispel the myth?
-00:15:39.680 --> 00:16:11.919
+00:14:49.840 --> 00:15:22.079
Do you think there could be changes made to the core of Emacs that would betray the ethos you and most people here appreciate?
-00:16:11.920 --> 00:16:28.319
+00:15:22.080 --> 00:15:38.479
When will David Wilson and Protesilaos collaborate?
-00:16:28.320 --> 00:17:18.479
+00:15:38.480 --> 00:16:28.639
If you had to choose between graphics or real browser support within Emacs, which would you choose?
-00:17:18.480 --> 00:19:19.519
+00:16:28.640 --> 00:18:29.679
How do you feel being an Emacs-focused YouTuber?
-00:19:19.520 --> 00:21:20.959
+00:18:29.680 --> 00:20:31.119
More typesetting capabilities versus better performance
-00:21:20.960 --> 00:25:33.039
+00:20:31.120 --> 00:24:43.199
Sneak peek of what's coming in the YouTube channel soon?
-00:25:33.040 --> 00:25:57.759
+00:24:43.200 --> 00:25:07.919
Principles and compromises
-00:25:57.760 --> 00:27:00.239
+00:25:07.920 --> 00:26:10.399
Understanding the value of Emacs Lisp
-00:27:00.240 --> 00:27:34.159
+00:26:10.400 --> 00:26:44.319
Will you do a video showing your personal workflow?
-00:27:34.160 --> 00:29:02.639
+00:26:44.320 --> 00:28:12.799
What do you think about Guix or NixOS?
-00:29:02.640 --> 00:32:08.239
+00:28:12.800 --> 00:31:18.399
Can you talk about your actual work?
-00:32:08.240 --> 00:36:12.959
+00:31:18.400 --> 00:35:23.119
Do your colleagues use Emacs as well?
-00:36:12.960 --> 00:40:13.439
+00:35:23.120 --> 00:39:23.599
Any thoughts on the idea that the best tool to use is the one that is easiest to leave?
-00:40:13.440 --> 00:43:19.759
+00:39:23.600 --> 00:42:29.919
Do you think there should be an updated initial configuration for fresh Emacs installations with more modern UI features and cool shortcuts?
-00:43:19.760 --> 00:44:40.559
+00:42:29.920 --> 00:43:50.719
How hard is it to get into the native code side of Emacs?
-00:44:40.560 --> 00:47:18.239
+00:43:50.720 --> 00:46:28.399
Emacs Chats
-00:47:18.240 --> 00:54:24.719
+00:46:28.400 --> 00:53:34.879
Livestreams
-00:54:24.720 --> 00:54:25.720
+00:53:34.880 --> 00:53:35.880
Short-form videos
diff --git a/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--main--chapters.vtt b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--main--chapters.vtt
new file mode 100644
index 00000000..7d688ed4
--- /dev/null
+++ b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--main--chapters.vtt
@@ -0,0 +1,82 @@
+WEBVTT
+
+00:00:11.120 --> 00:01:16.158
+Thanks
+
+00:01:16.159 --> 00:03:59.438
+In your opinion, what is Emacs' Achilles heel?
+
+00:03:59.439 --> 00:05:56.799
+What is your opinion about the documentation of Emacs in other languages?
+
+00:05:56.800 --> 00:07:21.679
+Do you think more effort should be made to popularize hacking on the C parts of Emacs?
+
+00:07:21.680 --> 00:08:01.839
+Can you name a few features from other programming languages that you miss in Emacs Lisp?
+
+00:08:01.840 --> 00:09:12.239
+What are your opinions on Emacs's commitments to free software?
+
+00:09:12.240 --> 00:12:32.799
+Do you think that packages like Magit or Org mode make people see Emacs as an obstacle to these applications that they want to use?
+
+00:12:32.800 --> 00:13:47.759
+Another way people can help inspire others to use Emacs
+
+00:13:47.760 --> 00:15:39.679
+Should Emacs continue to present itself as an esoteric program and culture, or should we try to dispel the myth?
+
+00:15:39.680 --> 00:16:11.919
+Do you think there could be changes made to the core of Emacs that would betray the ethos you and most people here appreciate?
+
+00:16:11.920 --> 00:16:28.319
+When will David Wilson and Protesilaos collaborate?
+
+00:16:28.320 --> 00:17:18.479
+If you had to choose between graphics or real browser support within Emacs, which would you choose?
+
+00:17:18.480 --> 00:19:19.519
+How do you feel being an Emacs-focused YouTuber?
+
+00:19:19.520 --> 00:21:20.959
+More typesetting capabilities versus better performance
+
+00:21:20.960 --> 00:25:33.039
+Sneak peek of what's coming in the YouTube channel soon?
+
+00:25:33.040 --> 00:25:57.759
+Principles and compromises
+
+00:25:57.760 --> 00:27:00.239
+Understanding the value of Emacs Lisp
+
+00:27:00.240 --> 00:27:34.159
+Will you do a video showing your personal workflow?
+
+00:27:34.160 --> 00:29:02.639
+What do you think about Guix or NixOS?
+
+00:29:02.640 --> 00:32:08.239
+Can you talk about your actual work?
+
+00:32:08.240 --> 00:36:12.959
+Do your colleagues use Emacs as well?
+
+00:36:12.960 --> 00:40:13.439
+Any thoughts on the idea that the best tool to use is the one that is easiest to leave?
+
+00:40:13.440 --> 00:43:19.759
+Do you think there should be an updated initial configuration for fresh Emacs installations with more modern UI features and cool shortcuts?
+
+00:43:19.760 --> 00:44:40.559
+How hard is it to get into the native code side of Emacs?
+
+00:44:40.560 --> 00:47:18.239
+Emacs Chats
+
+00:47:18.240 --> 00:54:24.719
+Livestreams
+
+00:54:24.720 --> 00:54:25.720
+Short-form videos
diff --git a/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt
new file mode 100644
index 00000000..32d90f1e
--- /dev/null
+++ b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt
@@ -0,0 +1,61 @@
+WEBVTT
+
+00:00:01.280 --> 00:00:28.079
+Introduction and conclusion
+
+00:00:28.080 --> 00:01:07.199
+Who am I?
+
+00:01:07.200 --> 00:02:26.958
+Is Emacs unpopular?
+
+00:02:26.959 --> 00:04:15.679
+What does popularity really mean?
+
+00:04:15.680 --> 00:04:32.399
+How do we measure popularity?
+
+00:04:32.400 --> 00:06:18.318
+Google Trends
+
+00:06:18.319 --> 00:08:19.999
+Stack Overflow Survey
+
+00:08:20.000 --> 00:10:23.199
+Community Activity
+
+00:10:23.200 --> 00:10:38.319
+How do editors lose popularity?
+
+00:10:38.320 --> 00:12:25.679
+A new editor with better features appears
+
+00:12:25.680 --> 00:14:01.039
+Lack of sufficient maintenance
+
+00:14:01.040 --> 00:14:36.958
+The "fashion" moves on
+
+00:14:36.959 --> 00:17:10.239
+What happens when an editor loses popularity?
+
+00:17:10.240 --> 00:17:20.159
+How will Emacs survive *despite* popularity?
+
+00:17:20.160 --> 00:19:51.439
+Emacs is more deeply hackable than almost all other editors
+
+00:19:51.440 --> 00:21:15.279
+Emacs has a strong community of highly skilled package authors
+
+00:21:15.280 --> 00:22:33.439
+Emacs has a very strong user community
+
+00:22:33.440 --> 00:23:40.959
+The Emacs maintainers and contributors care about the users
+
+00:23:40.960 --> 00:24:22.879
+Isn't all this supposed to come when an editor is popular?
+
+00:24:22.880 --> 00:24:23.880
+When someone talks about popularity...
diff --git a/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt b/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt
new file mode 100644
index 00000000..9a9f1aaf
--- /dev/null
+++ b/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt
@@ -0,0 +1,25 @@
+WEBVTT
+
+00:00:00.000 --> 00:04:44.206
+About me and this talk
+
+00:04:44.207 --> 00:09:17.106
+The inherent Emacs qualities for an autodidact
+
+00:09:17.107 --> 00:14:07.873
+The interconnectedness of the Emacs space
+
+00:14:07.874 --> 00:18:55.039
+The documentation culture of the Emacs community
+
+00:18:55.040 --> 00:23:59.528
+The Promethean Ideal of freeing know-how and expertise
+
+00:23:59.529 --> 00:28:53.139
+The 'killer apps' of Emacs
+
+00:28:53.140 --> 00:33:39.173
+You can't be an Emacs tourist
+
+00:33:39.174 --> 00:33:40.174
+Emacs as a champion of software freedom
diff --git a/2021/captions/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main--chapters.vtt b/2021/captions/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main--chapters.vtt
new file mode 100644
index 00000000..a8ce6623
--- /dev/null
+++ b/2021/captions/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main--chapters.vtt
@@ -0,0 +1,37 @@
+WEBVTT
+
+00:00:00.000 --> 00:01:01.569
+Introduction
+
+00:01:01.570 --> 00:02:07.635
+Before the beginning, the Beginning
+
+00:02:07.636 --> 00:02:56.169
+Oops
+
+00:02:56.170 --> 00:04:52.935
+Yada yada yada
+
+00:04:52.936 --> 00:06:51.802
+During all this time...
+
+00:06:51.803 --> 00:07:29.769
+Pandemic
+
+00:07:29.770 --> 00:08:50.002
+Anyway
+
+00:08:50.003 --> 00:09:38.235
+A growing obsession
+
+00:09:38.236 --> 00:10:32.735
+What is the point of all of this? I thought we were talking about frowing.
+
+00:10:32.736 --> 00:11:14.669
+Conversation
+
+00:11:14.670 --> 00:11:33.069
+Later...
+
+00:11:33.070 --> 00:11:34.070
+frowny.el
diff --git a/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt b/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt
new file mode 100644
index 00000000..5dba9edd
--- /dev/null
+++ b/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt
@@ -0,0 +1,22 @@
+WEBVTT
+
+00:00.240 --> 00:00:10.000
+Title
+
+00:10.000 --> 00:00:46.800
+Roadmap
+
+00:46.800 --> 00:01:46.079
+Gregorio
+
+01:46.079 --> 00:02:08.560
+Metadata
+
+02:08.560 --> 00:02:48.640
+`gregorian-mode`
+
+02:48.640 --> 00:06:49.520
+Examples
+
+06:49.520 --> 00:08:07.520
+Useful links
diff --git a/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers--chapters.vtt b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers--chapters.vtt
new file mode 100644
index 00000000..a6b3139b
--- /dev/null
+++ b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers--chapters.vtt
@@ -0,0 +1,40 @@
+WEBVTT
+
+00:00:00.080 --> 00:04:30.839
+Thanks
+
+00:04:30.840 --> 00:06:10.999
+How did you come up with this knowledge? By doing or by experience or by reading books? Which?
+
+00:06:10.000 --> 00:08:39.719
+How did you come to start using Org?
+
+00:08:39.720 --> 00:10:55.199
+You have recently overseen a major transition for org mode maintenance. What would you advise for other teams that are preparing for transitions so that processes can be maintained with minimal disruption? How do we take processes that were originally maintained by a single person to one maintained by multiple people?
+
+00:10:55.200 --> 00:11:27.879
+Which place is the right place to request a dark mode in Org Mode website?
+
+00:11:27.880 --> 00:15:09.879
+More thanks
+
+00:15:09.880 --> 00:17:24.519
+Does this mean that you do not need to be technical to become a maintainer?
+
+00:17:24.520 --> 00:21:11.799
+What does the day of the Org Mode maintainer look like? Lots of hours of work every day?
+
+00:21:11.800 --> 00:24:21.439
+Do you think having centralized roles for people to carry out certain tasks such as documentation across multiple areas would be a constructive approach to inviting new maintainers (in contrast to "every person take an issue of their own choosing", which leaves parts of maintenance and documentation neglected)?
+
+00:24:21.440 --> 00:27:52.319
+I think Org has and may potentially greatly influence Emacs development. If you would tend to agree, do you have places where you feel Emacs need to "pull back" harder, to influence Org? Key areas where Org is clearly "leading the way"?
+
+00:27:52.320 --> 00:35:32.839
+Could you expand a little on what's happening on contrib?
+
+00:35:32.840 --> 00:54:54.079
+Orgdown
+
+00:54:54.080 --> 00:54:55.080
+What about backlinks?
diff --git a/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt
new file mode 100644
index 00000000..f01f19da
--- /dev/null
+++ b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt
@@ -0,0 +1,64 @@
+WEBVTT
+
+00:00:00.799 --> 00:00:47.567
+Introduction
+
+00:00:47.568 --> 00:02:19.600
+What is a free software maintainer?
+
+00:02:19.601 --> 00:03:24.600
+What do I do as the Org maintainer?
+
+00:03:24.601 --> 00:04:18.400
+Do you see a pattern here?
+
+00:04:18.401 --> 00:05:03.900
+What a free software maintainer is or should be
+
+00:05:03.901 --> 00:05:26.900
+Summary
+
+00:05:26.901 --> 00:06:28.800
+ACDC: Asynchronous Collective Distributed Care
+
+00:06:28.801 --> 00:06:37.533
+How can you help Emacs maintainers?
+
+00:06:37.534 --> 00:06:56.500
+Become a maintainer for your own project, however small
+
+00:06:56.501 --> 00:07:10.900
+Volunteer as a contributor steward for another project
+
+00:07:10.901 --> 00:07:25.400
+Learn how to teach
+
+00:07:25.401 --> 00:07:35.633
+Test and enhance the project's contribution process
+
+00:07:35.634 --> 00:07:52.833
+Take care of the project's calls for help
+
+00:07:52.834 --> 00:08:08.800
+Encourage users from outside the project to contribute to the core forum
+
+00:08:08.801 --> 00:08:16.600
+Let the core forum know about what happens in this outside world
+
+00:08:16.601 --> 00:08:26.100
+Propose your help for non-code tasks
+
+00:08:26.101 --> 00:08:42.067
+If you expect someone else to fix your bug, try fixing someone else's bug first
+
+00:08:42.068 --> 00:08:49.233
+Don't expect the maintainer to be a hotline
+
+00:08:49.234 --> 00:08:57.167
+Complete this list
+
+00:08:57.168 --> 00:09:35.667
+Yes, this is hard
+
+00:09:35.668 --> 00:09:36.668
+Thanks
diff --git a/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt
index 45bc17b6..0bd1e6d1 100644
--- a/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt
+++ b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt
@@ -1,730 +1,730 @@
WEBVTT
-00:00.799 --> 00:00:02.734
+00:00.799 --> 00:02.734
Hello, I'm Bastien Guerry,
-00:00:02.734 --> 00:00:04.701
-and I'm happy to be here.
+00:02.734 --> 00:04.701
+and I'm very happy to be here.
-00:00:04.701 --> 00:00:07.734
-I've been the Org-mode maintainer
+00:04.701 --> 00:07.734
+I've been the Org-mode maintainer
-00:00:07.734 --> 00:00:09.501
+00:07.734 --> 00:09.501
for the last 10 years,
-00:00:09.501 --> 00:00:11.368
+00:09.501 --> 00:11.368
and I would like to ask the question
-00:00:11.368 --> 00:00:14.034
+00:11.368 --> 00:14.034
how to help GNU Emacs maintainers in general.
-00:14.400 --> 00:00:15.519
-By GNU Emacs, I mean
+00:14.400 --> 00:15.519
+By GNU Emacs, I mean
-00:00:15.519 --> 00:00:18.080
-the whole GNU Emacs ecosystem,
+00:15.519 --> 00:18.080
+the whole GNU Emacs ecosystem,
-00:00:18.080 --> 00:00:19.520
-including packages,
+00:18.080 --> 00:19.520
+including packages,
-00:00:19.520 --> 00:00:21.039
-not just the core GNU Emacs
+00:19.520 --> 00:21.039
+not just the core GNU Emacs
-00:00:21.039 --> 00:00:24.880
+00:21.039 --> 00:24.880
that we all love.
-00:00:24.880 --> 00:00:28.268
+00:24.880 --> 00:28.268
After a decade of dealing with
-00:00:28.268 --> 00:00:29.368
-the Org community,
+00:28.268 --> 00:29.368
+the Org community,
-00:00:29.368 --> 00:00:32.934
+00:29.368 --> 00:32.934
my view of what a maintainer is changed.
-00:00:32.934 --> 00:00:35.101
-I'd like to share some ideas with you
+00:32.934 --> 00:35.101
+I'd like to share some ideas with you
-00:00:35.101 --> 00:00:37.234
-as I think they could be useful
+00:35.101 --> 00:37.234
+as I think they could be useful
-00:00:37.234 --> 00:00:39.201
+00:37.234 --> 00:39.201
to help Emacs maintainers in general.
-00:00:39.201 --> 00:00:41.968
+00:39.201 --> 00:41.968
And hopefully, these ideas also apply
-00:00:41.968 --> 00:00:43.601
-to other free software projects,
+00:41.968 --> 00:43.601
+to other free software projects,
-00:00:43.601 --> 00:00:45.901
-at least those where contributors
+00:43.601 --> 00:45.901
+at least those where contributors
-00:00:45.901 --> 00:00:47.568
+00:45.901 --> 00:47.568
are all volunteers.
-00:00:47.568 --> 00:00:51.368
+00:47.568 --> 00:51.368
First of all, what is a free software maintainer?
-00:00:51.368 --> 00:00:54.601
-- Obviously this is some rich dude
+00:51.368 --> 00:54.601
+Obviously this is some rich dude
-00:00:54.601 --> 00:00:56.268
+00:54.601 --> 00:56.268
with a lot of free time
-00:00:56.268 --> 00:00:58.968
-- Acting both as a supersmart hacker
+00:56.268 --> 00:58.968
+Acting both as a supersmart hacker
-00:00:58.968 --> 00:01:02.401
+00:58.968 --> 01:02.401
and a super-patient community manager
-00:01:02.401 --> 00:01:05.101
-- Someone who acts as the central hotline
+01:02.401 --> 01:05.101
+Someone who acts as the central hotline
-00:01:05.101 --> 00:01:06.901
+01:05.101 --> 01:06.901
for users and contributors
-00:01:06.901 --> 00:01:09.568
-- Who knows how to write many emails,
+01:06.901 --> 01:09.568
+Who knows how to write many emails,
-00:01:09.568 --> 00:01:11.468
+01:09.568 --> 01:11.468
probably at the same time
-00:01:11.468 --> 00:01:14.101
-- Who does not hesitate
+01:11.468 --> 01:14.101
+Who does not hesitate
-00:01:14.101 --> 00:01:16.934
+01:14.101 --> 01:16.934
to publicly scold annoying users
-00:01:16.934 --> 00:01:19.801
-- and someone narcissistic enough
+01:16.934 --> 01:19.801
+and someone narcissistic enough
-00:01:19.801 --> 00:01:22.668
+01:19.801 --> 01:22.668
to seek credits for community efforts
-00:01:22.668 --> 00:01:26.034
-- But really looking for a job
+01:22.668 --> 01:26.034
+But really looking for a job
-00:01:26.034 --> 00:01:27.768
+01:26.034 --> 01:27.768
in some big IT company
-00:01:27.768 --> 00:01:32.234
-Right? Well... no. That was a joke.
+01:27.768 --> 01:32.234
+Right? Well... no. That was a joke.
-00:01:32.234 --> 00:01:34.601
+01:32.234 --> 01:34.601
But maybe you did smile
-00:01:34.601 --> 00:01:36.634
+01:34.601 --> 01:36.634
and that's probably
-00:01:36.634 --> 00:01:39.401
-because there is some truth to it.
+01:36.634 --> 01:39.401
+because there is some truth to it.
-00:01:39.401 --> 00:01:43.834
+01:39.401 --> 01:43.834
Why? Because our culture encourages
-00:01:43.834 --> 00:01:45.634
+01:43.834 --> 01:45.634
free software users and casual contributors
-00:01:45.634 --> 00:01:47.868
-to think about maintainers this way.
+01:45.634 --> 01:47.868
+to think about maintainers this way.
-00:01:47.868 --> 00:01:51.568
+01:47.868 --> 01:51.568
Don't we continue to use the expression
-00:01:51.568 --> 00:01:54.001
-"Benevolent Dictator For Life"?
+01:51.568 --> 01:54.001
+“Benevolent Dictator For Life”?
-00:01:54.001 --> 00:01:56.434
-This is what I'd call
+01:54.001 --> 01:56.434
+This is what I'd call
-00:01:56.434 --> 00:01:58.068
-the "Spiderman syndrome":
+01:56.434 --> 01:58.068
+the “Spiderman syndrome”:
-00:01:58.068 --> 00:02:01.268
+01:58.068 --> 02:01.268
maintenance is perceived in terms of
-00:02:01.268 --> 00:02:04.168
+02:01.268 --> 02:04.168
great power and great responsibility.
-00:02:04.168 --> 00:02:07.268
+02:04.168 --> 02:07.268
But I believe our culture of superheroes
-00:02:07.268 --> 00:02:09.101
+02:07.268 --> 02:09.101
is not helpful here:
-00:02:09.101 --> 00:02:11.301
-it does not reflect the truth,
+02:09.101 --> 02:11.301
+it does not reflect the truth,
-00:02:11.301 --> 00:02:14.134
-it does not set the right expectations,
+02:11.301 --> 02:14.134
+it does not set the right expectations,
-00:02:14.134 --> 00:02:16.334
-and it prevents contributors
+02:14.134 --> 02:16.334
+and it prevents contributors
-00:02:16.334 --> 00:02:17.601
-to properly understand
+02:16.334 --> 02:17.601
+to properly understand
-00:02:17.601 --> 00:02:19.601
+02:17.601 --> 02:19.601
how to help maintainers.
-00:02:19.601 --> 00:02:21.334
+02:19.601 --> 02:21.334
So let's start again.
-00:02:21.334 --> 00:02:24.968
-Instead of asking what a maintainer is,
+02:21.334 --> 02:24.968
+And instead of asking what a maintainer is,
-00:02:24.968 --> 00:02:27.068
+02:24.968 --> 02:27.068
let me take the list of
-00:02:27.068 --> 00:02:30.001
-what I do as the Org maintainer.
+02:27.068 --> 02:30.001
+what I do as the Org maintainer.
-00:02:30.001 --> 00:02:31.034
+02:30.001 --> 02:31.034
Here is my TODO-list:
-00:02:31.034 --> 00:02:33.934
-- First of all, I take care of
+02:31.034 --> 02:33.934
+First of all, I take care of
-00:02:33.934 --> 00:02:35.201
+02:33.934 --> 02:35.201
the orgmode.org website.
-00:02:35.201 --> 00:02:37.401
-- I also take care of the
+02:35.201 --> 02:37.401
+I also take care of the
-00:02:37.401 --> 00:02:41.434
+02:37.401 --> 02:41.434
org-contrib NonGNU ELPA package.
-00:02:41.434 --> 00:02:44.034
-- I do gardening on the
+02:41.434 --> 02:44.034
+I do gardening on the
-00:02:44.034 --> 00:02:46.168
+02:44.034 --> 02:46.168
community-driven documentation, Worg.
-00:02:46.168 --> 00:02:48.401
-- I do add contributors to Worg.
+02:46.168 --> 02:48.401
+I do add contributors to Worg.
-00:02:48.401 --> 00:02:51.134
-- I read emails on emacs-orgmode@,
+02:48.401 --> 02:51.134
+I read emails on emacs-orgmode@,
-00:02:51.134 --> 00:02:54.134
+02:51.134 --> 02:54.134
emacs-devel@ and bug-gnu-emacs@.
-00:02:54.134 --> 00:02:56.868
-- I contribute to email moderation
+02:54.134 --> 02:56.868
+I contribute to email moderation
-00:02:56.868 --> 00:02:59.801
+02:56.868 --> 02:59.801
of the emacs-orgmode@ list
-00:02:59.801 --> 00:03:02.468
+02:59.801 --> 03:02.468
with a bunch of other contributors.
-00:03:02.468 --> 00:03:05.134
-- I reply to private emails
+03:02.468 --> 03:05.134
+I reply to private emails
-00:03:05.134 --> 00:03:06.834
+03:05.134 --> 03:06.834
asking me for help about org-mode.
-00:03:06.834 --> 00:03:10.168
-- I coordinate with GNU Emacs maintainers
+03:06.834 --> 03:10.168
+I coordinate with GNU Emacs maintainers
-00:03:10.168 --> 00:03:12.934
+03:10.168 --> 03:12.934
and thanks to them for Emacs/Org integration.
-00:03:12.934 --> 00:03:16.034
-- I contribute with public emails
+03:12.934 --> 03:16.034
+I contribute with public emails
-00:03:16.034 --> 00:03:17.801
+03:16.034 --> 03:17.801
on the Org mailing list.
-00:03:17.801 --> 00:03:20.501
-- I release new versions of Org-mode.
+03:17.801 --> 03:20.501
+I release new versions of Org-mode.
-00:03:20.501 --> 00:03:22.634
-- and sometimes, sometimes,
+03:20.501 --> 03:22.634
+and sometimes, sometimes,
-00:03:22.634 --> 00:03:24.601
+03:22.634 --> 03:24.601
I contribute with code.
-00:03:24.601 --> 00:03:27.168
+03:24.601 --> 03:27.168
Do you see a pattern here?
-00:03:27.168 --> 00:03:30.468
+03:27.168 --> 03:30.468
Yes. I bet the last three tasks
-00:03:30.468 --> 00:03:31.801
+03:30.468 --> 03:31.801
is what most people have in mind
-00:03:31.801 --> 00:03:34.201
+03:31.801 --> 03:34.201
when they think of a maintainer:
-00:03:34.201 --> 00:03:35.534
+03:34.201 --> 03:35.534
it's all about hacking
-00:03:35.534 --> 00:03:37.734
+03:35.534 --> 03:37.734
and being an efficient hotline.
-00:03:37.734 --> 00:03:39.734
-But in fact, these tasks
+03:37.734 --> 03:39.734
+But in fact, these tasks
-00:03:39.734 --> 00:03:41.601
+03:39.734 --> 03:41.601
are only a superficial part
-00:03:41.601 --> 00:03:43.201
+03:41.601 --> 03:43.201
of what I do as a maintainer.
-00:03:43.201 --> 00:03:47.001
+03:43.201 --> 03:47.001
Some would consider that these core tasks
-00:03:47.001 --> 00:03:48.501
-are the /interesting/ ones,
+03:47.001 --> 03:48.501
+are the interesting ones,
-00:03:48.501 --> 00:03:51.634
-while the others are the /boring/ ones.
+03:48.501 --> 03:51.634
+while the others are the boring ones.
-00:03:51.634 --> 00:03:53.901
+03:51.634 --> 03:53.901
I don't see it that way:
-00:03:53.901 --> 00:03:56.534
+03:53.901 --> 03:56.534
some tasks are about the product,
-00:03:56.534 --> 00:03:58.801
-others are about the project.
+03:56.534 --> 03:58.801
+others are about the project.
-00:03:58.801 --> 00:04:00.834
-Without a good product,
+03:58.801 --> 04:00.834
+Without a good product,
-00:04:00.834 --> 00:04:02.168
+04:00.834 --> 04:02.168
there is little chance
-00:04:02.168 --> 00:04:03.401
+04:02.168 --> 04:03.401
you will have a good project,
-00:04:03.401 --> 00:04:07.534
+04:03.401 --> 04:07.534
but maintaining a project requires thinking
-00:04:07.534 --> 00:04:09.301
-in terms of infrastructure,
+04:07.534 --> 04:09.301
+in terms of infrastructure,
-00:04:09.301 --> 00:04:11.068
+04:09.301 --> 04:11.068
not in terms of bugs,
-00:04:11.068 --> 00:04:13.334
-thinking in terms of resources
+04:11.068 --> 04:13.334
+thinking in terms of resources
-00:04:13.334 --> 00:04:16.701
-that enable both users and contributors,
+04:13.334 --> 04:16.701
+that enable both users and contributors,
-00:04:16.701 --> 00:04:18.401
+04:16.701 --> 04:18.401
not in terms of commits.
-00:04:18.401 --> 00:04:21.001
-So let me try to define again
+04:18.401 --> 04:21.001
+So let me try to define again
-00:04:21.001 --> 00:04:23.334
+04:21.001 --> 04:23.334
what a free software maintainer is
-00:04:23.334 --> 00:04:24.434
+04:23.334 --> 04:24.434
or should be.
-00:04:24.434 --> 00:04:26.234
-A free software maintainer
+04:24.434 --> 04:26.234
+A free software maintainer
-00:04:26.234 --> 00:04:28.368
+04:26.234 --> 04:28.368
is someone who cares about
-00:04:28.368 --> 00:04:30.968
-enabling users and contributors
+04:28.368 --> 04:30.968
+enabling users and contributors
-00:04:30.968 --> 00:04:32.768
-so that they collectively
+04:30.968 --> 04:32.768
+so that they collectively
-00:04:32.768 --> 00:04:34.201
+04:32.768 --> 04:34.201
take care of the project.
-00:04:34.201 --> 00:04:36.734
+04:34.201 --> 04:36.734
See another pattern here?
-00:04:36.734 --> 00:04:40.301
-That's all about the /project/,
+04:36.734 --> 04:40.301
+Yeah, that's all about the project,
-00:04:40.301 --> 00:04:41.501
+04:40.301 --> 04:41.501
versus the product.
-00:04:41.501 --> 00:04:43.634
-It's about /taking care of it/,
+04:41.501 --> 04:43.634
+It's about taking care of it,
-00:04:43.634 --> 00:04:46.934
+04:43.634 --> 04:46.934
versus being a direct hotline for users,
-00:04:46.934 --> 00:04:49.901
-caring about the project infrastructure
+04:46.934 --> 04:49.901
+so, it's caring about the project infrastructure
-00:04:49.901 --> 00:04:52.134
+04:49.901 --> 04:52.134
and about empowering users
-00:04:52.134 --> 00:04:54.234
-with tools and incentives
+04:52.134 --> 04:54.234
+with tools and incentives
-00:04:54.234 --> 00:04:55.268
+04:54.234 --> 04:55.268
so that they care too.
-00:04:55.268 --> 00:04:58.434
+04:55.268 --> 04:58.434
How can you help such a maintainer?
-00:04:58.434 --> 00:05:00.901
+04:58.434 --> 05:00.901
By focusing on the project
-00:05:00.901 --> 00:05:03.901
+05:00.901 --> 05:03.901
and becoming an enabler yourself.
-00:05:03.901 --> 00:05:06.934
-Let's pause and summarize:
+05:03.901 --> 05:06.934
+So, let's pause and summarize:
-00:05:06.934 --> 00:05:08.801
+05:06.934 --> 05:08.801
our culture wants heroes
-00:05:08.801 --> 00:05:12.434
-and this leads us to expect maintainers
+05:08.801 --> 05:12.434
+and this leads us to expect maintainers
-00:05:12.434 --> 00:05:15.234
+05:12.434 --> 05:15.234
to be superhackers and superactive hotlines.
-00:05:15.234 --> 00:05:19.568
-This is the HOT mindset of maintenance,
+05:15.234 --> 05:19.568
+This is the HOT mindset of maintenance,
-00:05:19.568 --> 00:05:23.368
+05:19.568 --> 05:23.368
where the maintainers are Headmasters Of Tweaks
-00:05:23.368 --> 00:05:26.901
+05:23.368 --> 05:26.901
and soon becomes the Headmaster Of Troubles.
-00:05:26.901 --> 00:05:29.501
-To resist this HOT mindset,
+05:26.901 --> 05:29.501
+To resist this HOT mindset,
-00:05:29.501 --> 00:05:33.201
+05:29.501 --> 05:33.201
I suggest to redefine maintenance as ACDC:
-00:05:33.201 --> 00:05:36.534
-*Asynchronous Collective Distributed Care*:
+05:33.201 --> 05:36.534
+“Asynchronous Collective Distributed Care”:
-00:05:36.534 --> 00:05:38.968
-- /Asynchronous/ because time management
+05:36.534 --> 05:38.968
+“Asynchronous” because time management
-00:05:38.968 --> 00:05:40.168
-is a private matter
+05:38.968 --> 05:40.168
+is a private matter
-00:05:40.168 --> 00:05:41.968
+05:40.168 --> 05:41.968
and we are all volunteers.
-00:05:41.968 --> 00:05:44.168
-- /Collective/ because, well,
+05:41.968 --> 05:44.168
+“Collective” because, well,
-00:05:44.168 --> 00:05:45.634
+05:44.168 --> 05:45.634
no man is an island.
-00:05:45.634 --> 00:05:49.201
-- /Distributed/: because the more power
+05:45.634 --> 05:49.201
+“Distributed”: because the more power
-00:05:49.201 --> 00:05:51.601
-to the "edges", the more resilient
+05:49.201 --> 05:51.601
+to the “edges”, the more resilient
-00:05:51.601 --> 00:05:53.534
+05:51.601 --> 05:53.534
the system and the project is.
-00:05:53.534 --> 00:05:56.368
-- /Care/ because this is all about care:
+05:53.534 --> 05:56.368
+“Care” because this is all about care:
-00:05:56.368 --> 00:05:58.501
+05:56.368 --> 05:58.501
with each other as users
-00:05:58.501 --> 00:06:00.134
-or as contributors,
+05:58.501 --> 06:00.134
+or as contributors,
-00:06:00.134 --> 00:06:02.101
-with the project's infrastructure
+06:00.134 --> 06:02.101
+with the project's infrastructure
-00:06:02.101 --> 00:06:05.301
+06:02.101 --> 06:05.301
(servers, websites, bug trackers, etc.)
-00:06:05.301 --> 00:06:08.701
+06:05.301 --> 06:08.701
and care about having a useful product.
-00:06:08.701 --> 00:06:13.901
-/Enabling/ users and contributors means
+06:08.701 --> 06:13.901
+So, “enabling” users and contributors means
-00:06:13.901 --> 00:06:16.468
-encouraging them to take ownership,
+06:13.901 --> 06:16.468
+encouraging them to take ownership,
-00:06:16.468 --> 00:06:19.801
-which is more than just delegating tasks.
+06:16.468 --> 06:19.801
+which is more than just delegating tasks.
-00:06:19.801 --> 00:06:22.068
+06:19.801 --> 06:22.068
Let your users and contributors know
-00:06:22.068 --> 00:06:23.901
-that they need to tap into
+06:22.068 --> 06:23.901
+that they need to tap into
-00:06:23.901 --> 00:06:26.434
+06:23.901 --> 06:26.434
the collective attention pool with care:
-00:06:26.434 --> 00:06:28.801
+06:26.434 --> 06:28.801
the more autonomous they are, the better.
-00:06:28.801 --> 00:06:33.801
-So, with this ACDC definition in mind,
+06:28.801 --> 06:33.801
+So, with this ACDC definition in mind,
-00:06:33.801 --> 00:06:37.534
-how can /you/ help Emacs maintainers?
+06:33.801 --> 06:37.534
+how can <i>you</i> help Emacs maintainers?
-00:06:37.534 --> 00:06:41.268
-- First of all, by *becoming a maintainer
+06:37.534 --> 06:41.268
+First of all, by <i>becoming</i> a maintainer
-00:06:41.268 --> 00:06:44.334
-for your own project*, however small.
+06:41.268 --> 06:44.334
+for your own project*, however small.
-00:06:44.334 --> 00:06:47.001
-Think in terms of project (vs product).
+06:44.334 --> 06:47.001
+Think in terms of project vs. product.
-00:06:47.001 --> 00:06:49.034
-Empower users and contributors.
+06:47.001 --> 06:49.034
+Empower users and contributors.
-00:06:49.034 --> 00:06:50.668
-This will help you understand
+06:49.034 --> 06:50.668
+This will help you understand
-00:06:50.668 --> 00:06:54.068
-how to help other maintainers.
+06:50.668 --> 06:54.068
+how to help other maintainers.
-00:06:54.068 --> 00:06:56.501
-("More power to the edges!")
+06:54.068 --> 06:56.501
+“More power to the edges!”
-00:06:56.501 --> 00:07:00.001
-- *Volunteer as a contributor steward
+06:56.501 --> 07:00.001
+<i>Volunteer</i> as a contributor steward
-00:07:00.001 --> 00:07:02.201
-for another project*: you don't need to
+07:00.001 --> 07:02.201
+for another project: you don't need to
-00:07:02.201 --> 00:07:03.868
+07:02.201 --> 07:03.868
be a supersmart hacker
-00:07:03.868 --> 00:07:05.634
+07:03.868 --> 07:05.634
to help others to contribute.
-00:07:05.634 --> 00:07:07.701
-(For Org-mode, we are lucky to have
+07:05.634 --> 07:07.701
+For Org-mode, we are lucky to have
-00:07:07.701 --> 00:07:10.901
-two great contributor stewards.)
+07:07.701 --> 07:10.901
+two great contributor stewards.
-00:07:10.901 --> 00:07:12.868
-- *Learn how to teach*,
+07:10.901 --> 07:12.868
+<i>Learn</i> how to teach,
-00:07:12.868 --> 00:07:16.468
+07:12.868 --> 07:16.468
because pedagogical skills are invaluable.
-00:07:16.468 --> 00:07:18.301
-(Taking the time to explain
+07:16.468 --> 07:18.301
+Taking the time to explain
-00:07:18.301 --> 00:07:20.868
+07:18.301 --> 07:20.868
how to write a bug report or a patch
-00:07:20.868 --> 00:07:23.834
-is invaluable and this is a core part
+07:20.868 --> 07:23.834
+is invaluable and this is a core part
-00:07:23.834 --> 00:07:25.401
-of the Org culture.)
+07:23.834 --> 07:25.401
+of the Org culture.
-00:07:25.401 --> 00:07:27.801
-- *Test and enhance the project's
+07:25.401 --> 07:27.801
+<i>Test</i> and <i>enhance</i> the project's
-00:07:27.801 --> 00:07:30.001
-contribution process*. (For Org-mode,
+07:27.801 --> 07:30.001
+contribution process. For Org-mode,
-00:07:30.001 --> 00:07:33.268
-you would read and suggest contributions to
+07:30.001 --> 07:33.268
+you would read and suggest contributions to
-00:07:33.268 --> 00:07:35.634
-the org-contribute pages on Worg.)
+07:33.268 --> 07:35.634
+the org-contribute pages on Worg.
-00:07:35.634 --> 00:07:38.601
-- *Take care of the project's calls for help*.
+07:35.634 --> 07:38.601
+Take care of the project's <i>calls for help</i>.
-00:07:38.601 --> 00:07:40.968
-(For Org-mode, this would be this list
+07:38.601 --> 07:40.968
+For Org-mode, this would be this list
-07:40.560 --> 00:07:43.599
+07:40.560 --> 07:43.599
that we have on updates.orgmode.org
-07:43.599 --> 00:07:47.234
-For Emacs, this would be =etc/TODO= file.)
+07:43.599 --> 07:47.234
+For Emacs, this would be <i>etc/TODO</i> file.
-00:07:47.234 --> 00:07:50.834
-If the calls for help are not explicit enough,
+07:47.234 --> 07:50.834
+If the calls for help are not explicit enough,
-00:07:50.834 --> 00:07:52.834
+07:50.834 --> 07:52.834
try to contribute some.
-00:07:52.834 --> 00:07:56.701
-- *Encourage users from outside the project
+07:52.834 --> 07:56.701
+<i>Encourage</i> users from outside the project
-00:07:56.701 --> 00:07:58.434
-to contribute to the core forum*.
+07:56.701 --> 07:58.434
+to contribute to the core forum.
-00:07:58.434 --> 00:08:01.434
-(For Org-mode, there are many hacks and fixes
+07:58.434 --> 08:01.434
+For Org-mode, there are many hacks and fixes
-00:08:01.434 --> 00:08:03.901
-being shared on reddit and stackoverflow:
+08:01.434 --> 08:03.901
+being shared on Reddit and Stack Overflow,
-00:08:03.901 --> 00:08:05.401
+08:03.901 --> 08:05.401
and that's fine, but we we should not
-00:08:05.401 --> 00:08:07.401
-wait for months before having this
+08:05.401 --> 08:07.401
+wait for months before having this
-00:08:07.401 --> 00:08:08.801
-shared on the list.)
+08:07.401 --> 08:08.801
+shared on the list.
-00:08:08.801 --> 00:08:11.434
-- *Let the core forum know about
+08:08.801 --> 08:11.434
+Let the core forum <i>know</i> about
-00:08:11.434 --> 00:08:13.701
-what happens in this outside world*
+08:11.434 --> 08:13.701
+what happens in this outside world
-00:08:13.701 --> 00:08:16.601
+08:13.701 --> 08:16.601
by sharing important information yourself.
-00:08:16.601 --> 00:08:19.868
-- *Propose your help for non-code tasks*:
+08:16.601 --> 08:19.868
+<i>Propose</i> your help for non-code tasks:
-00:08:19.868 --> 00:08:21.368
-maintain a website,
+08:19.868 --> 08:21.368
+maintain a website,
-00:08:21.368 --> 00:08:23.734
-enhance the (community-driven) documentation,
+08:21.368 --> 08:23.734
+enhance the community-driven documentation,
-00:08:23.734 --> 00:08:26.101
+08:23.734 --> 08:26.101
help with bug triage, etc.
-00:08:26.101 --> 00:08:29.568
-- *If you expect someone else to fix your bug,
+08:26.101 --> 08:29.568
+If you expect someone else to fix your bug,
-00:08:29.568 --> 00:08:33.234
-try fixing someone else's bug too*:
+08:29.568 --> 08:33.234
+try fixing someone else's bug first, and too:
-00:08:33.234 --> 00:08:36.234
-that's how you'll learn Emacs Lisp
+08:33.234 --> 08:36.234
+that's how you'll learn Emacs Lisp
-00:08:36.234 --> 00:08:37.668
-and that's how you'll concretely
+08:36.234 --> 08:37.668
+and that's how you'll concretely
-00:08:37.668 --> 00:08:40.501
+08:37.668 --> 08:40.501
train your empathy, your sense of taking care.
-00:08:40.501 --> 00:08:42.068
+08:40.501 --> 08:42.068
That is so critical.
-00:08:42.068 --> 00:08:44.101
-- *Don't expect the maintainer
+08:42.068 --> 08:44.101
+Don't expect the maintainer
-00:08:44.101 --> 00:08:45.168
-to be a hotline*,
+08:44.101 --> 08:45.168
+to be a <i>hotline</i>,
-00:08:45.168 --> 00:08:46.801
-especially a private one.
+08:45.168 --> 08:46.801
+especially a private one.
-00:08:46.801 --> 00:08:49.234
+08:46.801 --> 08:49.234
Address yourself to the community.
-00:08:49.234 --> 00:08:51.968
-- and last but not least,
+08:49.234 --> 08:51.968
+and last but not least,
-00:08:51.968 --> 00:08:53.120
-*complete this list*.
+08:51.968 --> 08:53.120
+<i>complete</i> this list.
-00:08:53.120 --> 00:08:54.959
+08:53.120 --> 08:54.959
I'm trying to open a conversation here,
-00:08:54.959 --> 00:08:57.168
+08:54.959 --> 08:57.168
so don't be shy.
-00:08:57.168 --> 00:09:01.760
-That's it. Is it hard? Yes, this is hard,
+08:57.168 --> 09:01.760
+That's it. Uhm, is it hard? Yes, this is hard,
-00:09:01.760 --> 00:09:04.640
-and that's because helping maintainers
+09:01.760 --> 09:04.640
+and that's because helping maintainers
-00:09:04.640 --> 00:09:07.760
+09:04.640 --> 09:07.760
by becoming such a enabler
-00:09:07.760 --> 00:09:09.839
-in this ACDC mindset
+09:07.760 --> 09:09.839
+in this ACDC mindset
-00:09:09.839 --> 00:09:12.080
+09:09.839 --> 09:12.080
is not immediately rewarding,
-00:09:12.080 --> 00:09:15.168
+09:12.080 --> 09:15.168
whereas fixing a bug clearly, clearly is.
-00:09:15.168 --> 00:09:17.701
-But if you start thinking of the project
+09:15.168 --> 09:17.701
+But if you start thinking of the project
-00:09:17.701 --> 00:09:19.301
-as something that enables you
+09:17.701 --> 09:19.301
+as something that enables you
-00:09:19.301 --> 00:09:21.440
+09:19.301 --> 09:21.440
to do amazing things, and I believe
-00:09:21.440 --> 00:09:23.434
+09:21.440 --> 09:23.434
Org is this kind of project,
-00:09:23.434 --> 00:09:25.034
+09:23.434 --> 09:25.034
and if you start thinking
-00:09:25.034 --> 00:09:26.634
+09:25.034 --> 09:26.634
of the maintenance as something
-00:09:26.634 --> 00:09:28.934
+09:26.634 --> 09:28.934
that enables more contributions,
-00:09:28.934 --> 00:09:31.734
-you will see how important and rewarding
+09:28.934 --> 09:31.734
+you will see how important and rewarding
-00:09:31.734 --> 00:09:35.668
+09:31.734 --> 09:35.668
it is to become such an enabler.
-00:09:35.668 --> 00:09:39.701
-So, definitely grateful to all enablers
+09:35.668 --> 09:39.701
+So, definitely grateful to all the enablers
-00:09:39.701 --> 00:09:41.401
+09:39.701 --> 09:41.401
that we have in Org's community!
-00:09:41.401 --> 00:09:43.734
+09:41.401 --> 09:43.734
And to everyone who maintains
-00:09:43.734 --> 00:09:45.701
+09:43.734 --> 09:45.701
a culture of teaching and learning
-00:09:45.701 --> 00:09:49.068
+09:45.701 --> 09:49.068
through polite and respectful interactions
-00:09:49.068 --> 00:09:50.801
-on the mailing list and elsewhere:
+09:49.068 --> 09:50.801
+on the mailing list and elsewhere:
-00:09:50.801 --> 00:09:55.001
-we always need more "power to the edges".
+09:50.801 --> 09:55.001
+we always need more “power to the edges”.
-00:09:55.001 --> 00:09:57.168
-And I'm also very grateful
+09:55.001 --> 09:57.168
+And I'm also very grateful
-00:09:57.168 --> 00:09:59.034
-to the EmacsConf 2021 organizers,
+09:57.168 --> 09:59.034
+to the EmacsConf organizers,
-00:09:59.034 --> 00:10:02.568
+09:59.034 --> 10:02.568
because that's really taking care
-00:10:02.568 --> 00:10:03.568
-of the community! Thanks very much.
+10:02.568 --> 10:05.068
+of the community! So, thanks very much!
-00:10:03.568 --> 00:10:04.000
-[captions by sachac]
+10:05.068 --> 10:06.868
+[captions by sachac & zaeph]
diff --git a/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt b/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt
new file mode 100644
index 00000000..3bc5cbff
--- /dev/null
+++ b/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt
@@ -0,0 +1,46 @@
+WEBVTT
+
+00:00:04.960 --> 00:00:20.319
+Introduction
+
+00:00:20.320 --> 00:00:35.839
+Respect
+
+00:00:35.840 --> 00:01:19.118
+The Prepared Environment
+
+00:01:19.119 --> 00:01:56.559
+Human tendencies
+
+00:01:56.560 --> 00:03:30.719
+Orientation
+
+00:03:30.720 --> 00:04:25.999
+Order
+
+00:04:26.000 --> 00:05:12.079
+Exploration
+
+00:05:12.080 --> 00:05:46.159
+Communication
+
+00:05:46.160 --> 00:06:21.198
+Activity
+
+00:06:21.199 --> 00:06:48.318
+Manipulation
+
+00:06:48.319 --> 00:07:09.198
+Work (or Purposeful Activity)
+
+00:07:09.199 --> 00:07:38.959
+Repetition
+
+00:07:38.960 --> 00:08:16.318
+Exactness
+
+00:08:16.319 --> 00:09:01.999
+Abstraction
+
+00:09:02.000 --> 00:09:03.000
+Perfection
diff --git a/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers--chapters.vtt b/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers--chapters.vtt
new file mode 100644
index 00000000..734e47f2
--- /dev/null
+++ b/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers--chapters.vtt
@@ -0,0 +1,94 @@
+WEBVTT
+
+00:00:00.480 --> 00:01:16.319
+Thanks
+
+00:01:16.320 --> 00:02:05.359
+Why is Elisp not a general-purpose programming language, at least not completely?
+
+00:02:05.360 --> 00:02:37.759
+Is this activity related to the garbage collector?
+
+00:02:37.760 --> 00:03:42.079
+Is the idea to eventually develop Emacs itself in Elisp?
+
+00:03:42.080 --> 00:04:27.199
+How did you work on this?
+
+00:04:27.200 --> 00:05:39.039
+Does this compilation pipeline introduce vulnerabilities?
+
+00:05:39.040 --> 00:07:28.479
+What code, if any, will still benefit significantly from being written in C?
+
+00:07:28.480 --> 00:08:49.359
+What's the risk of (setq native-comp-speed 3)?
+
+00:08:49.360 --> 00:09:15.199
+Are there any limits introduced by native comp with respect to runtime introspectability, changeability/redefinability, etc?
+
+00:09:15.200 --> 00:10:11.359
+Is there a benefit in setting native-comp-compiler-options to "-mtune=native -march="?
+
+00:10:11.360 --> 00:11:54.799
+You mentioned native-comp coming in emacs 28. Will this be the default at build time, or will distros have to set this themselves?
+
+00:11:54.800 --> 00:14:22.479
+Could we avoid libgccjit.so? Or consider using another jit lib (e.g. dynasm used by luajit) et al to gain better optimization?
+
+00:14:22.480 --> 00:16:23.839
+How much of Emacs's C code base could be translated to emacs-lisp? What is the minimum C code base necessary?
+
+00:16:23.840 --> 00:17:27.599
+Could we statically type elisp code (via macros?) to provide more optimization hints to compiler?
+
+00:17:27.600 --> 00:18:55.839
+Elisp and Python all are dynamically typed langauge, but benchmark shows that Elisp runs slower than Python. Could we learn some best practices from the Python community?
+
+00:18:55.840 --> 00:21:35.919
+Did you try to optimize with Rust too? What are your thoughts on Rust for this particular optimization and security?
+
+00:21:35.920 --> 00:22:59.039
+Does the native compilation interface with the Emacs profiling tools?
+
+00:22:59.040 --> 00:27:04.319
+Where did funding for your work come from?
+
+00:27:04.320 --> 00:28:36.879
+What kind of application do I envision native comp enabling to work well in Emacs in the next few years, and which one would not be possible?
+
+00:28:36.880 --> 00:29:47.679
+Is this the first real-world practical use of libgccjit?
+
+00:29:47.680 --> 00:33:49.359
+Is there any task you need help with?
+
+00:33:49.360 --> 00:38:37.519
+What's a good way to proceed?
+
+00:38:37.520 --> 00:40:46.079
+What kind of packages do you think could now be practical with native comp?
+
+00:40:46.080 --> 00:46:29.759
+Why not implement Emacs Lisp in Guile and use Guile's compiler?
+
+00:46:29.760 --> 00:48:27.679
+What are some other hobbies/interests of yours besides Emacs?
+
+00:48:27.680 --> 00:51:04.639
+Will you be presenting at ELS or anywhere else in the next year?
+
+00:51:04.640 --> 00:59:46.959
+How to make Emacs more popular?
+
+00:59:46.960 --> 01:02:04.799
+Do you have 'wish list' features, things you long for Emacs to be able to do?
+
+01:02:04.800 --> 01:05:33.359
+From BBB chat: dickmao has a patch that makes Gnus async....
+
+01:05:33.360 --> 01:10:20.719
+Advice for anyone who wants to bring something into Emacs core
+
+01:10:20.720 --> 01:10:21.720
+Do you have any advice on how to approach the upstream development community?
diff --git a/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt b/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt
new file mode 100644
index 00000000..0f7e6a3c
--- /dev/null
+++ b/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt
@@ -0,0 +1,2752 @@
+WEBVTT
+
+00:00.200 --> 00:02.340
+Hi everybody, my name is Andrea Corallo,
+
+00:02.440 --> 00:03.280
+and this presentation is about
+
+00:03.382 --> 00:05.802
+the Emacs Lisp Native Compiler --
+
+00:05.904 --> 00:07.083
+having GNU Emacs able to
+
+00:07.184 --> 00:08.805
+compile and run Emacs Lisp as native code.
+
+00:08.907 --> 00:11.565
+This project has been my hobby project
+
+00:11.667 --> 00:14.009
+for the last about two years and a half
+
+00:14.111 --> 00:15.408
+And we will see a little bit
+
+00:15.509 --> 00:16.969
+where this project is coming from,
+
+00:17.070 --> 00:18.913
+where we are, and where we want to go.
+
+00:19.015 --> 00:20.571
+So essentially everything you need to know
+
+00:20.672 --> 00:22.132
+about the Emacs Lisp Native Compiler,
+
+00:22.232 --> 00:23.416
+and probably a little more.
+
+00:23.521 --> 00:26.535
+Just a little bit of context on Emacs Lisp.
+
+00:26.635 --> 00:30.175
+Well, Emacs Lisp is a programming language,
+
+00:30.278 --> 00:33.544
+it's indeed a Lisp,
+
+00:33.647 --> 00:36.619
+and one year ago I looked for some statistics,
+
+00:36.722 --> 00:38.742
+and I was kind of pleased to see
+
+00:38.842 --> 00:40.030
+-- surprised to see actually --
+
+00:40.132 --> 00:40.972
+that it's still kind of popular
+
+00:41.073 --> 00:42.844
+as a programming language.
+
+00:42.944 --> 00:43.684
+It doesn't rank that bad
+
+00:43.785 --> 00:45.554
+against other programming languages.
+
+00:45.658 --> 00:48.387
+Also, the other important fact about Emacs Lisp
+
+00:48.487 --> 00:51.518
+is that there is a lot of Emacs Lisp out there,
+
+00:51.622 --> 00:55.922
+and this will have an impact [on this project.]
+
+00:56.025 --> 00:57.632
+It's a programming language that is capable
+
+00:57.734 --> 00:59.320
+of almost any task, so it's
+
+00:59.420 --> 01:01.728
+almost a general-purpose programming language,
+
+01:01.831 --> 01:04.116
+and this reflects on Emacs itself,
+
+01:04.217 --> 01:07.232
+that it's capable of almost any task.
+
+01:07.335 --> 01:09.679
+Indeed this "almost" is something we want to fix,
+
+01:09.781 --> 01:10.720
+because we want to do everything,
+
+01:10.820 --> 01:14.218
+we want [to do] all of our computing [with Emacs].
+
+01:14.321 --> 01:16.523
+Also, an interesting aspect for me
+
+01:16.625 --> 01:18.903
+is that it's not specified by any standard.
+
+01:19.005 --> 01:22.507
+This implies it can evolve in a more agile way
+
+01:22.609 --> 01:25.667
+without having to change the standard, etc.
+
+01:25.770 --> 01:27.870
+And, in fact, it's kind of improving,
+
+01:27.970 --> 01:30.370
+I believe relatively fast.
+
+01:30.473 --> 01:32.791
+A little bit about Lisp in general.
+
+01:32.892 --> 01:34.952
+First, it's the best programming language ever,
+
+01:35.052 --> 01:35.712
+we all know it.
+
+01:35.813 --> 01:37.833
+It has a lot of very nice properties,
+
+01:37.934 --> 01:40.356
+like it's dynamic, it's homoiconic, etc.
+
+01:40.462 --> 01:42.394
+But the interesting thing for implementors,
+
+01:42.496 --> 01:43.476
+is that, in theory,
+
+01:43.576 --> 01:46.716
+it can be implemented with very few primitives.
+
+01:46.817 --> 01:49.485
+You build very few primitives that are like magic,
+
+01:49.590 --> 01:51.838
+and on top of this,
+
+01:51.938 --> 01:53.770
+you can implement the whole language.
+
+01:53.873 --> 01:55.759
+This sounds very nice,
+
+01:55.860 --> 01:57.280
+and very appealing for implementors
+
+01:57.381 --> 02:00.175
+meaning to implement a new Lisp implementation,
+
+02:00.279 --> 02:02.539
+or improving or modifying an existing one.
+
+02:02.641 --> 02:04.163
+So the question is:
+
+02:04.263 --> 02:07.663
+how many primitives do we have to implement
+
+02:07.764 --> 02:09.384
+if we want to change
+
+02:09.485 --> 02:13.203
+the GNU Emacs Lisp implementation?
+
+02:13.308 --> 02:20.128
+Unfortunately, not really as few as we would like.
+
+02:20.234 --> 02:25.294
+In GNU Emacs, we have about 1500 primitives,
+
+02:25.400 --> 02:27.970
+and the main reason for that is performance.
+
+02:28.071 --> 02:30.961
+Actually, GNU Emacs was written
+
+02:31.064 --> 02:34.292
+when performance was a big issue,
+
+02:34.393 --> 02:36.493
+and nowadays certain parts
+
+02:36.594 --> 02:38.486
+are still performance-critical.
+
+02:38.591 --> 02:40.295
+We have a lot of C code;
+
+02:40.395 --> 02:46.331
+30% of the GNU Emacs codebase is C code,
+
+02:46.435 --> 02:49.177
+and we have to maintain this.
+
+02:49.279 --> 02:52.859
+But not only that, this is the main barrier
+
+02:52.959 --> 02:55.579
+for people that tried in the past
+
+02:55.681 --> 02:57.663
+to change the Emacs Lisp implementation.
+
+02:57.765 --> 02:59.101
+Because not only do you have to
+
+02:59.202 --> 03:01.582
+replace these primitives,
+
+03:01.683 --> 03:03.907
+all of them or part of them,
+
+03:04.012 --> 03:06.384
+but sometimes they also share (these primitives),
+
+03:06.484 --> 03:07.952
+internal data structures.
+
+03:08.055 --> 03:09.745
+For instance, it's very difficult to say:
+
+03:09.846 --> 03:12.826
+Now I want to go from C
+
+03:12.926 --> 03:13.906
+to a different programming language
+
+03:14.006 --> 03:15.638
+for implementing these primitives.
+
+03:15.740 --> 03:17.028
+So this has been, effectively,
+
+03:17.128 --> 03:20.380
+the main barrier for doing this work.
+
+03:20.486 --> 03:22.090
+Another interesting aspect
+
+03:22.190 --> 03:23.870
+about the GNU Emacs implementation
+
+03:23.970 --> 03:26.190
+is that Lisp can run interpreted
+
+03:26.291 --> 03:28.647
+or byte-compiled for performance,
+
+03:28.752 --> 03:30.632
+and the byte compiler itself
+
+03:30.733 --> 03:32.673
+is written in Emacs Lisp.
+
+03:32.773 --> 03:35.033
+This implies that GNU Emacs has to go through
+
+03:35.134 --> 03:37.214
+a bootstrap procedure in order to be built.
+
+03:37.319 --> 03:38.715
+But it's kind of interesting
+
+03:38.815 --> 03:41.835
+for something that started as a text editor,
+
+03:41.937 --> 03:43.101
+or something like it.
+
+03:43.203 --> 03:47.877
+The byte-code that is Emacs Lisp
+
+03:47.979 --> 03:50.279
+when it's been byte compiled,
+
+03:50.379 --> 03:53.079
+it's running on a stack-based virtual machine
+
+03:53.180 --> 03:55.146
+that is implemented in C.
+
+03:55.253 --> 03:59.741
+OK, so I've listed a bunch of areas
+
+03:59.842 --> 04:02.074
+where Emacs Lisp could improve:
+
+04:02.178 --> 04:06.924
+Namespace, Extensibility, Performance,
+
+04:07.025 --> 04:11.239
+and Debuggability, and Diagnostic, we could say.
+
+04:11.346 --> 04:14.326
+This activity, this project in particular,
+
+04:14.428 --> 04:17.088
+is affecting primarily Performance
+
+04:17.189 --> 04:21.314
+and the performance area the Execution Engine.
+
+04:21.414 --> 04:22.570
+That said,
+
+04:22.671 --> 04:25.855
+I think it has an impact also on Extensibility,
+
+04:25.957 --> 04:27.811
+and I hope it will have an impact also
+
+04:27.913 --> 04:29.779
+on programming diagnostics,
+
+04:29.881 --> 04:32.501
+so giving better warnings, [unknown].
+
+04:32.604 --> 04:36.694
+So which are the benefits
+
+04:36.795 --> 04:39.215
+of increasing the Emacs Lisp performance?
+
+04:39.316 --> 04:42.976
+Indeed, we will have, if we do that,
+
+04:43.078 --> 04:45.668
+programs that run faster.
+
+04:45.774 --> 04:48.738
+But the main implication of that
+
+04:48.840 --> 04:50.760
+is that we could write less C;
+
+04:50.860 --> 04:52.940
+we could maintain and debug less C.
+
+04:53.041 --> 04:56.437
+That is kind of a time-consuming task.
+
+04:56.542 --> 04:59.502
+And we could also allow for
+
+04:59.603 --> 05:01.723
+writing performance-critical extensions
+
+05:01.824 --> 05:03.804
+directly in Lisp
+
+05:03.909 --> 05:06.305
+without having to use systems like
+
+05:06.406 --> 05:09.686
+[I think there's a bunch.]
+
+05:09.927 --> 05:14.791
+These are very consistent benefits.
+
+05:14.899 --> 05:16.669
+OK, Project Goals,
+
+05:16.769 --> 05:18.829
+but I think the title of this slide
+
+05:18.930 --> 05:21.520
+maybe should be Project Requirements.
+
+05:21.623 --> 05:23.231
+So when I started this activity,
+
+05:23.331 --> 05:26.943
+I set some requirements for the project,
+
+05:27.049 --> 05:29.469
+with the main goal in mind: to go upstream.
+
+05:29.570 --> 05:31.494
+So I wanted to create something,
+
+05:31.594 --> 05:34.250
+a modified implementation of GNU Emacs,
+
+05:34.353 --> 05:36.675
+that was compatible
+
+05:36.776 --> 05:38.596
+as close to 100% as possible
+
+05:38.696 --> 05:40.514
+to the current implementation.
+
+05:40.620 --> 05:42.720
+And when I say "current implementation,"
+
+05:42.820 --> 05:44.758
+I don't refer to what
+
+05:44.859 --> 05:46.879
+the Emacs Lisp Programming Manual specifies
+
+05:46.980 --> 05:49.804
+as expected behavior of the implementation,
+
+05:49.907 --> 05:52.207
+but really the implementation itself.
+
+05:52.309 --> 05:53.841
+This is because there are a lot of corner cases
+
+05:53.942 --> 05:56.390
+that are not specified by the manual,
+
+05:56.493 --> 05:58.093
+but programs do rely on that,
+
+05:58.193 --> 06:00.523
+and given there is a ton of Emacs Lisp
+
+06:00.625 --> 06:01.935
+already around,
+
+06:02.037 --> 06:05.437
+compatibility was definitely a major requirement.
+
+06:05.541 --> 06:07.727
+I wanted to produce something that had
+
+06:07.827 --> 06:09.587
+reduced impact on the Emacs codebase,
+
+06:09.687 --> 06:11.543
+at least as much as possible.
+
+06:11.644 --> 06:14.724
+So I didn't want to rewrite all of GNU Emacs.
+
+06:14.827 --> 06:17.609
+Indeed, because it would have been
+
+06:17.710 --> 06:21.068
+too much work for one single person,
+
+06:21.171 --> 06:25.371
+but also still thinking
+
+06:25.473 --> 06:29.153
+to an upstream outcome all of this time.
+
+06:29.258 --> 06:31.974
+Another requirement was to have
+
+06:32.076 --> 06:34.700
+no, or very reduced, impact on the user,
+
+06:34.804 --> 06:36.456
+so I didn't want to change
+
+06:36.556 --> 06:38.604
+the way Emacs is used by you.
+
+06:38.708 --> 06:40.618
+And last but not least,
+
+06:40.718 --> 06:42.848
+introducing new dependencies,
+
+06:42.951 --> 06:45.379
+those dependencies had to be Free Software,
+
+06:45.479 --> 06:47.191
+possibly GPL,
+
+06:47.295 --> 06:49.995
+and also an important requirement
+
+06:50.097 --> 06:52.941
+is that these dependencies had to be
+
+06:53.043 --> 06:55.143
+some kind of trusted software that we know
+
+06:55.243 --> 06:56.681
+is going to be maintained in the future.
+
+06:56.781 --> 06:59.261
+Given Emacs has been around since forever,
+
+06:59.363 --> 07:01.183
+and will be around forever and ever,
+
+07:01.285 --> 07:05.265
+this was another very important point.
+
+07:05.367 --> 07:08.707
+A little bit of history of this project/
+
+07:08.808 --> 07:10.648
+a quick timeline.
+
+07:10.748 --> 07:14.388
+2019, in May, I did my first commit,
+
+07:14.490 --> 07:17.110
+I think it was when I tried to write
+
+07:17.210 --> 07:20.230
+my first primitive function ever in C,
+
+07:20.332 --> 07:21.752
+in GNU Emacs.
+
+07:21.852 --> 07:24.832
+And this was an attempt to try to compile
+
+07:24.934 --> 07:30.314
+a function that, once executed, returning [?]
+
+07:30.415 --> 07:33.755
+That was it. Six months after (about),
+
+07:33.857 --> 07:37.057
+I had something that was kind of working,
+
+07:37.157 --> 07:42.797
+So I was able to start up a semi-standard Emacs
+
+07:42.899 --> 07:44.879
+and then to compile and load,
+
+07:44.981 --> 07:47.221
+and replacing most of the functions
+
+07:47.321 --> 07:50.921
+that I had defined floating in my Lisp universe.
+
+07:51.022 --> 07:54.202
+Those functions are the functions
+
+07:54.304 --> 07:55.944
+that are essentially composing Emacs,
+
+07:56.044 --> 07:57.884
+at least the Lisp side of Emacs.
+
+07:57.984 --> 08:01.084
+A lot of features were missing,
+
+08:01.186 --> 08:03.426
+like I had no Garbage Collector support,
+
+08:03.526 --> 08:07.006
+no bootstrap, I was not optimizing these functions
+
+08:07.108 --> 08:10.068
+Because optimization [would be broken].
+
+08:10.169 --> 08:12.749
+No image dump support, etc.
+
+08:12.850 --> 08:16.330
+But I think this proved the design could work.
+
+08:16.431 --> 08:19.171
+So I sent to email to emacs-devel. I said
+
+08:19.272 --> 08:20.852
+I have this stuff I'm working on,
+
+08:20.953 --> 08:24.613
+and I wanted some feedback from the upstream
+
+08:24.714 --> 08:27.534
+to see if there was some interest.
+
+08:27.635 --> 08:30.455
+I believe the outcome of this was positive
+
+08:30.557 --> 08:32.837
+because about one month after,
+
+08:32.937 --> 08:35.697
+I pushed my branch within the Emacs git
+
+08:35.798 --> 08:38.438
+as a feature branch, and shortly after,
+
+08:38.539 --> 08:42.679
+we started to use the bug tracker to track bugs.
+
+08:42.779 --> 08:45.479
+So essentially we moved the development
+
+08:45.580 --> 08:50.040
+on the upstream infrastructure.
+
+08:50.140 --> 08:55.620
+I believe two years after the first commit,
+
+08:55.721 --> 08:57.781
+the project was merged
+
+08:57.882 --> 09:00.922
+after literally hundreds of bugs solved,
+
+09:01.022 --> 09:03.842
+and improvements, suggestions [unknown]
+
+09:03.943 --> 09:08.623
+and this was about six months ago.
+
+09:08.723 --> 09:12.363
+Before discussing how the native compiler works,
+
+09:12.464 --> 09:14.224
+I think it's worth looking at
+
+09:14.324 --> 09:17.644
+how Lisp is implemented in GNU Emacs.
+
+09:17.745 --> 09:19.305
+We have Lisp_Objects
+
+09:19.405 --> 09:21.945
+floating around our Lisp universe,
+
+09:22.045 --> 09:23.905
+and they are internally represented in this way.
+
+09:24.006 --> 09:25.606
+We have what is called a tagged pointer,
+
+09:25.706 --> 09:27.406
+that is just a regular pointer
+
+09:27.506 --> 09:29.286
+that is pointing to the area of memory
+
+09:29.386 --> 09:31.926
+where we hold the real data of the object.
+
+09:32.027 --> 09:34.187
+But within this tagged pointer,
+
+09:34.287 --> 09:36.747
+we reserve a few bits
+
+09:36.848 --> 09:38.968
+to indicate the type of object we are pointing to.
+
+09:39.068 --> 09:40.528
+This is important because
+
+09:40.628 --> 09:42.288
+each time we access an object,
+
+09:42.388 --> 09:46.168
+we have to typically check those bits
+
+09:46.269 --> 09:49.029
+to check that the object we are manipulating
+
+09:49.129 --> 09:50.529
+is of the right kind,
+
+09:50.630 --> 09:52.530
+remove those bits, and, if we are happy,
+
+09:52.630 --> 09:55.810
+access the object, otherwise [unknown].
+
+09:55.910 --> 09:57.690
+All the objects are like this,
+
+09:57.791 --> 09:59.731
+except for typically Fixnums,
+
+09:59.831 --> 10:01.031
+that are small integers
+
+10:01.131 --> 10:04.891
+that we manage to fit directly within the pointer.
+
+10:04.992 --> 10:07.292
+Also for manipulating Fixnums,
+
+10:07.392 --> 10:09.412
+we have to check the tag bits each time.
+
+10:09.513 --> 10:13.173
+Whenever we are not sure of the type of object
+
+10:13.273 --> 10:16.493
+we are manipulating (read: almost every time),
+
+10:16.594 --> 10:18.914
+we have to check those bits and remove those bits
+
+10:19.014 --> 10:21.754
+before doing any manipulation on the Fixnum.
+
+10:21.854 --> 10:26.014
+How Emacs Lisp is byte-compiled and executed
+
+10:26.115 --> 10:27.775
+in, let's call it, "Vanilla".
+
+10:27.875 --> 10:30.055
+If we have a Lisp expression of this kind:
+
+10:30.156 --> 10:32.776
+We take the variable 'a' we do plus 2,
+
+10:32.876 --> 10:34.876
+and then we multiply the result by 3,
+
+10:34.976 --> 10:37.376
+the byte compiler will produce this LAP code.
+
+10:37.477 --> 10:38.497
+LAP code is essentially
+
+10:38.597 --> 10:40.017
+the assembly for the byte-code,
+
+10:40.117 --> 10:43.697
+so it's the "intermediate representation"
+
+10:43.798 --> 10:48.458
+that will assembled into byte-code. (.elc files)
+
+10:48.558 --> 10:50.738
+How is this program executed?
+
+10:50.839 --> 10:53.639
+As I mentioned, it's executed in a virtual machine
+
+10:53.739 --> 10:55.699
+that is stack-based,
+
+10:55.800 --> 10:58.540
+but we start with an execution stack that's empty,
+
+10:58.640 --> 11:01.680
+and a stack pointer pointing to its bottom.
+
+11:01.780 --> 11:04.280
+And we execute the first instruction,
+
+11:04.380 --> 11:07.120
+that is pushing in the stack the value of 'a',
+
+11:07.220 --> 11:10.360
+in this case, 100. Then we push the constant 2.
+
+11:10.460 --> 11:12.400
+Then we do the summation,
+
+11:12.500 --> 11:14.040
+and we have the result in the stack.
+
+11:14.140 --> 11:16.860
+Same: we push the constant 3,
+
+11:16.960 --> 11:17.620
+we do the multiplication,
+
+11:17.720 --> 11:19.260
+and we will be able to return.
+
+11:19.360 --> 11:22.700
+Now, what's good and what's bad about this?
+
+11:22.800 --> 11:25.800
+A good thing is that it's very simple
+
+11:25.900 --> 11:27.460
+to start from Lisp
+
+11:27.560 --> 11:31.320
+and compile this kind of LAP output.
+
+11:31.420 --> 11:34.240
+At least it's reasonably simple.
+
+11:34.340 --> 11:36.240
+The compiler is not that complex.
+
+11:36.340 --> 11:39.000
+The bad thing is that all this machinery
+
+11:39.100 --> 11:40.660
+-- push and pop, etc. --
+
+11:40.760 --> 11:44.320
+it's very different from how a modern CPU works.
+
+11:44.420 --> 11:45.720
+Because modern CPUs,
+
+11:45.820 --> 11:47.660
+they are not stack-based anymore
+
+11:47.760 --> 11:50.900
+but they have instead a fixed number of registers,
+
+11:51.000 --> 11:54.020
+and they work with assignment and operation
+
+11:54.120 --> 11:55.040
+within these registers
+
+11:55.140 --> 11:57.040
+that are generally called "general-purpose."
+
+11:57.140 --> 11:59.260
+So to execute this LAP program,
+
+11:59.360 --> 12:00.760
+there is another program,
+
+12:00.860 --> 12:02.600
+that is the implementation of the VM itself
+
+12:02.700 --> 12:06.400
+that is doing conversion during runtime.
+
+12:06.500 --> 12:08.320
+So it's interpreting the LAP program
+
+12:08.420 --> 12:11.360
+and it's converting it into instructions
+
+12:11.460 --> 12:13.180
+that we can execute on the CPU.
+
+12:13.280 --> 12:14.940
+This conversion is done each time
+
+12:15.040 --> 12:17.100
+we will run some byte-code.
+
+12:17.200 --> 12:19.760
+And it's something that we want to avoid.
+
+12:19.860 --> 12:21.560
+Instead of this live conversion,
+
+12:21.660 --> 12:26.220
+we want to convert once:
+
+12:26.320 --> 12:28.920
+our Lisp program into native code,
+
+12:29.020 --> 12:32.380
+that is, a binary program that can be executed
+
+12:32.480 --> 12:34.400
+directly by our CPU.
+
+12:34.500 --> 12:36.680
+We want to save all this unnecessary conversion
+
+12:36.780 --> 12:39.000
+that we do each time we are running a program
+
+12:39.100 --> 12:39.760
+while we are running it.
+
+12:39.860 --> 12:42.060
+And we want to do this process just once,
+
+12:42.160 --> 12:43.740
+when we are compiling.
+
+12:43.840 --> 12:46.240
+That's the main goal of this activity.
+
+12:46.340 --> 12:50.200
+How is the byte compiler implemented?
+
+12:50.300 --> 12:53.940
+As any compiler it's a pipeline of transformations.
+
+12:54.040 --> 12:58.560
+We go through macro expansion, closure conversion,
+
+12:58.660 --> 13:02.120
+we have a bunch of source level optimization.
+
+13:02.220 --> 13:03.940
+Then we go into LAP,
+
+13:04.040 --> 13:06.800
+that's the transformation we are interested in,
+
+13:06.900 --> 13:10.600
+and after a few optimizations on LAP,
+
+13:10.700 --> 13:14.140
+LAP is assembled into byte-code.
+
+13:14.240 --> 13:16.880
+So if we [list it]
+
+13:16.980 --> 13:19.320
+in terms of intermediate representations,
+
+13:19.420 --> 13:23.600
+we can simplify this pipeline like this.
+
+13:23.700 --> 13:26.100
+We start with Lisp, and at a certain point
+
+13:26.200 --> 13:29.520
+we are manipulating the program in LAP form,
+
+13:29.620 --> 13:31.980
+and then at the end we produce the byte-code
+
+13:32.080 --> 13:34.560
+that is the .elc file that [you run]
+
+13:34.660 --> 13:37.660
+What I wanted to realize was something like this.
+
+13:37.760 --> 13:41.200
+I wanted to start from LAP, do something,
+
+13:41.300 --> 13:44.600
+and jump into GCC using libgccjit
+
+13:44.700 --> 13:45.560
+and in particular
+
+13:45.660 --> 13:48.000
+the libgccjit Intermediate Representation
+
+13:48.100 --> 13:50.340
+that we will discuss.
+
+13:50.440 --> 13:53.120
+Now, why I wanted to do something like this?
+
+13:53.220 --> 13:57.300
+Essentially, writing a compiler from scratch
+
+13:57.400 --> 14:01.520
+for Emacs Lisp would have been a very big task.
+
+14:01.620 --> 14:05.120
+So I wanted to rely on, as much as I could,
+
+14:05.220 --> 14:07.180
+the Emacs Lisp byte compiler,
+
+14:07.280 --> 14:10.280
+because I had to produce something
+
+14:10.380 --> 14:12.920
+that was as compatible as possible
+
+14:13.020 --> 14:14.240
+to the current implementation.
+
+14:14.340 --> 14:18.340
+So this was (I believe) a very good idea
+
+14:18.440 --> 14:20.520
+to save an enormous quantity of work
+
+14:20.620 --> 14:22.340
+and to produce something
+
+14:22.440 --> 14:24.940
+that was compatible in terms of semantics
+
+14:25.040 --> 14:26.820
+with the original implementation.
+
+14:26.920 --> 14:30.660
+Also, I didn't want to implement a code generator
+
+14:30.760 --> 14:32.860
+for each architecture we were targeting,
+
+14:32.960 --> 14:35.900
+nor wanted to implement all these optimizations
+
+14:36.000 --> 14:37.840
+that are already in GCC,
+
+14:37.940 --> 14:40.120
+so I thought it was a good idea
+
+14:40.220 --> 14:44.720
+to rely on an existing compiler like GCC [?].
+
+14:44.820 --> 14:47.240
+Let's talk about libgccjit.
+
+14:47.340 --> 14:50.180
+It was added by David Malcolm in GCC 5
+
+14:50.280 --> 14:55.680
+It allows you to describe a C-ish semantic to GCC
+
+14:55.780 --> 14:57.380
+and have it compile.
+
+14:57.480 --> 15:01.400
+It's good for [reading] Jitters or AoT compilers.
+
+15:01.500 --> 15:04.400
+And if we talk about GCC:
+
+15:04.500 --> 15:07.180
+it's a compiler, it's a very good one,
+
+15:07.280 --> 15:09.340
+it has support for a remarkable number
+
+15:09.440 --> 15:11.640
+of target architectures.
+
+15:11.740 --> 15:15.080
+It's also very good at generating [fast code],
+
+15:15.180 --> 15:17.980
+and it's been around for a long time;
+
+15:18.080 --> 15:21.200
+I believe it's like 1 year younger than Emacs.
+
+15:21.300 --> 15:23.220
+It's still very well maintained,
+
+15:23.320 --> 15:25.840
+and we can assume it will be maintained
+
+15:25.940 --> 15:28.920
+for quite a while. And, as I mentioned,
+
+15:29.020 --> 15:31.120
+this was a very important point.
+
+15:31.220 --> 15:33.860
+Also, it's GPL; it's Free Software,
+
+15:33.960 --> 15:36.120
+and it's developed under the GNU umbrella,
+
+15:36.220 --> 15:40.360
+so I thought it was a very good option.
+
+15:40.460 --> 15:43.300
+So we can imagine a simple translation
+
+15:43.400 --> 15:46.400
+that goes from LAP to this subset of C
+
+15:46.500 --> 15:48.880
+that we can describe to libgccjit.
+
+15:48.980 --> 15:52.880
+This simple translation we can see here,
+
+15:52.980 --> 15:55.680
+it's actually pretty trivial.
+
+15:55.780 --> 15:58.500
+Instead of doing operations
+
+15:58.600 --> 16:02.060
+within the execution stack we have seen before,
+
+16:02.160 --> 16:05.080
+we have just an array that is replacing it,
+
+16:05.180 --> 16:07.380
+and it's called 'local' in this case,
+
+16:07.480 --> 16:12.360
+and we have assignments within this array,
+
+16:12.460 --> 16:15.140
+so that they are done in place of the original
+
+16:15.240 --> 16:17.100
+push and pop activity of the stack.
+
+16:17.200 --> 16:18.280
+The nice thing is that,
+
+16:18.380 --> 16:20.260
+when you have done this translation,
+
+16:20.360 --> 16:23.160
+GCC will be able to optimize this,
+
+16:23.260 --> 16:25.840
+and remove all the unnecessary operations,
+
+16:25.940 --> 16:27.180
+and generate code
+
+16:27.280 --> 16:29.660
+for the specific CPU you are targeting,
+
+16:29.760 --> 16:32.020
+[which will be running your code].
+
+16:32.120 --> 16:34.920
+This sounds great; it sounds like
+
+16:35.020 --> 16:37.440
+a very simple and effective translation,
+
+16:37.540 --> 16:39.920
+and in fact the first iteration of my compiler
+
+16:40.020 --> 16:41.120
+was doing just this.
+
+16:41.220 --> 16:45.320
+It was essentially a big C function
+
+16:45.420 --> 16:48.240
+that was taking LAP and doing this conversion
+
+16:48.340 --> 16:50.120
+describing the output to libgccjit.
+
+16:50.220 --> 16:53.720
+Unfortunately, if you do this,
+
+16:53.820 --> 16:55.740
+you will discover that you have
+
+16:55.840 --> 17:00.080
+a performance upper bound limit of about 3x.
+
+17:00.180 --> 17:04.360
+So it was an option,
+
+17:04.460 --> 17:06.560
+but I thought it was a good occasion
+
+17:06.660 --> 17:08.980
+for trying to do something more.
+
+17:09.080 --> 17:11.640
+And doing something more means
+
+17:11.740 --> 17:13.680
+implementing a smarter compiler
+
+17:13.780 --> 17:17.180
+that is doing some advanced analysis on the code,
+
+17:17.280 --> 17:18.640
+and will be able to perform
+
+17:18.740 --> 17:20.700
+Lisp-specific optimizations
+
+17:20.800 --> 17:22.480
+-- optimizations that take advantage of
+
+17:22.580 --> 17:24.960
+the specific Lisp semantics,
+
+17:25.060 --> 17:27.760
+something that GCC is not aware of.
+
+17:27.860 --> 17:31.240
+And while I was thinking about that,
+
+17:31.340 --> 17:34.000
+I thought that having a smarter compiler
+
+17:34.100 --> 17:38.120
+had also other advantages, like a smarter compiler
+
+17:38.220 --> 17:40.120
+that understands the semantics
+
+17:40.220 --> 17:41.820
+of the programming language being compiled
+
+17:41.920 --> 17:43.680
+would be also capable of
+
+17:43.780 --> 17:45.620
+giving feedback to the programmers,
+
+17:45.720 --> 17:47.920
+like better warnings and errors.
+
+17:48.020 --> 17:51.360
+So I was really fascinated about this idea,
+
+17:51.460 --> 17:53.240
+and I wanted to change my implementation
+
+17:53.340 --> 17:55.920
+because I was not really happy about it.
+
+17:56.020 --> 17:58.320
+I had a lot of C code in terms of
+
+17:58.420 --> 18:02.100
+lines that were not doing any smart job.
+
+18:02.200 --> 18:07.380
+And I wanted to write all the interesting logic
+
+18:07.480 --> 18:09.940
+[in Lisp].
+
+18:10.040 --> 18:12.560
+So optimizing outside GCC
+
+18:12.660 --> 18:15.840
+before jumping into GCC,
+
+18:15.940 --> 18:20.500
+as I mentioned, has two main targets:
+
+18:20.600 --> 18:23.060
+Either optimize the code before going into GCC,
+
+18:23.160 --> 18:25.380
+or present to GCC some code
+
+18:25.480 --> 18:27.740
+that we know GCC can optimize effectively.
+
+18:27.840 --> 18:30.800
+And also, this will give, as I mentioned,
+
+18:30.900 --> 18:32.660
+better options for the compiler
+
+18:32.760 --> 18:34.420
+to provide warnings, errors
+
+18:34.520 --> 18:36.340
+-- better diagnostics.
+
+18:36.440 --> 18:38.200
+So this is pretty much
+
+18:38.300 --> 18:40.640
+what the native compiler looks like nowadays,
+
+18:40.740 --> 18:42.720
+in terms of passes.
+
+18:42.820 --> 18:44.560
+We have a list of passes,
+
+18:44.660 --> 18:46.620
+each of which is taking an input
+
+18:46.720 --> 18:48.120
+and producing an output.
+
+18:48.220 --> 18:51.040
+So it's doing either analysis on the program
+
+18:51.140 --> 18:52.640
+that's being passed,
+
+18:52.740 --> 18:54.760
+or it's performing a transformation.
+
+18:54.860 --> 18:57.900
+All of these passes are implemented in Lisp,
+
+18:58.000 --> 19:00.440
+and only the last pass is implemented in C.
+
+19:00.540 --> 19:05.060
+That is the one that is talking to libgccjit.
+
+19:05.160 --> 19:07.760
+To do that, I have introduced
+
+19:07.860 --> 19:10.640
+a new intermediate representation
+
+19:10.740 --> 19:13.960
+that I call LIMPLE, as a tribute to GCC GIMPLE,
+
+19:14.060 --> 19:17.220
+that is the main internal representation of GCC,
+
+19:17.320 --> 19:20.600
+at least one of the main ones.
+
+19:20.700 --> 19:25.080
+Introducing a new intermediate representation
+
+19:25.180 --> 19:27.720
+-- a new way of representing my program --
+
+19:27.820 --> 19:29.540
+solved a bunch of problems.
+
+19:29.640 --> 19:33.200
+First, it allowed me to implement
+
+19:33.300 --> 19:37.280
+non-trivial analysis and transformations,
+
+19:37.380 --> 19:40.000
+the ones I needed in my compiler pipeline.
+
+19:40.100 --> 19:42.160
+But also, it solved the problem of
+
+19:42.260 --> 19:43.840
+what was the boundary between
+
+19:43.940 --> 19:46.120
+what I had to implement in Lisp,
+
+19:46.220 --> 19:48.040
+and what in C.
+
+19:48.140 --> 19:49.040
+Because once I had
+
+19:49.140 --> 19:51.860
+my intermediate representation defined,
+
+19:51.960 --> 19:53.780
+essentially the boundary between Lisp and C
+
+19:53.880 --> 19:55.640
+is just a function, that is,
+
+19:55.740 --> 19:57.780
+the one that is implementing the final pass.
+
+19:57.880 --> 19:59.220
+That is taking, as an input,
+
+19:59.320 --> 20:01.620
+all of my programs in LIMPLE representation
+
+20:01.720 --> 20:03.880
+and it's doing [his bit].
+
+20:03.980 --> 20:07.980
+So I was convinced this design at least had sense.
+
+20:08.080 --> 20:10.120
+When we go through some of these passes,
+
+20:10.220 --> 20:12.600
+just to give you an idea of what these are doing:
+
+20:12.700 --> 20:14.560
+the first pass is just responsible for
+
+20:14.660 --> 20:18.100
+spilling the LAP from the byte compiler
+
+20:18.200 --> 20:20.160
+that effectively here we are using as a front end
+
+20:20.260 --> 20:21.780
+for our compiler pipeline.
+
+20:21.880 --> 20:24.040
+The second pass, called 'limplify',
+
+20:24.140 --> 20:27.920
+will be in charge of converting LAP into LIMPLE.
+
+20:28.020 --> 20:31.260
+LIMPLE is an intermediate representation
+
+20:31.360 --> 20:32.860
+that is Control Flow Graph based,
+
+20:32.960 --> 20:34.700
+and it's capable of SSA.
+
+20:34.800 --> 20:38.640
+So we can have a look to what this means.
+
+20:38.740 --> 20:41.300
+Let's assume we have our LAP program,
+
+20:41.400 --> 20:42.520
+as any program,
+
+20:42.620 --> 20:43.960
+that's a simple list of instructions
+
+20:44.060 --> 20:45.640
+that we will execute one after the other.
+
+20:45.740 --> 20:47.360
+Some of these instructions
+
+20:47.460 --> 20:49.200
+are special instructions
+
+20:49.300 --> 20:51.240
+that we call conditional branches,
+
+20:51.340 --> 20:52.800
+where we check for a condition,
+
+20:52.900 --> 20:54.320
+and if this is verified,
+
+20:54.420 --> 20:56.940
+we jump to a different address within the program.
+
+20:57.040 --> 20:59.580
+(Addresses that here we are calling 'labels'.)
+
+20:59.680 --> 21:03.440
+So we can split our program in chunks,
+
+21:03.540 --> 21:08.200
+and those chunks we execute without interruption,
+
+21:08.300 --> 21:10.460
+so we always enter from the top of those,
+
+21:10.560 --> 21:12.600
+and we exit from the bottom.
+
+21:12.700 --> 21:15.980
+We can name those, and split them apart,
+
+21:16.080 --> 21:18.980
+and these are what we call basic blocks.
+
+21:19.080 --> 21:22.360
+And now we have a bunch of these basic blocks
+
+21:22.460 --> 21:23.380
+that are floating,
+
+21:23.480 --> 21:25.020
+and they are not any more sorted.
+
+21:25.120 --> 21:25.920
+This is what is called
+
+21:26.020 --> 21:28.680
+a Control Flow Graph based representation.
+
+21:28.780 --> 21:31.400
+Now we can get into the SSA topic.
+
+21:31.500 --> 21:33.900
+That stands for Static Single Assignment.
+
+21:34.000 --> 21:35.860
+I don't want to get into the details,
+
+21:35.960 --> 21:36.720
+but just give you a feeling.
+
+21:36.820 --> 21:38.480
+I added into our basic blocks
+
+21:38.580 --> 21:41.400
+in our Control Flow Graph a few assignments.
+
+21:41.500 --> 21:43.840
+We will transform this into SSA
+
+21:43.940 --> 21:45.040
+just for the variable 'x',
+
+21:45.140 --> 21:47.360
+just for the sake of demonstrating it.
+
+21:47.460 --> 21:49.760
+This is done through a number of phases
+
+21:49.860 --> 21:51.760
+that are essentially some analysis,
+
+21:51.860 --> 21:52.600
+mainly renaming.
+
+21:52.700 --> 21:55.560
+But the outcome, the one we see here,
+
+21:55.660 --> 21:59.120
+looks quite similar to the original one,
+
+21:59.220 --> 22:01.120
+but we can see that the variable 'x'
+
+22:01.220 --> 22:01.960
+has been renamed.
+
+22:02.060 --> 22:03.400
+And now we don't have anymore just one,
+
+22:03.500 --> 22:06.140
+but a number of these variables.
+
+22:06.240 --> 22:08.000
+The interesting property is that
+
+22:08.100 --> 22:10.880
+each of these variables is assigned just once.
+
+22:10.980 --> 22:13.240
+And this allows for the compiler
+
+22:13.340 --> 22:16.760
+to do prediction of the value of that variable,
+
+22:16.860 --> 22:19.040
+depending on the position
+
+22:19.140 --> 22:19.840
+within the Control Flow Graph.
+
+22:19.940 --> 22:21.980
+This is very important. For instance,
+
+22:22.080 --> 22:23.440
+a very simple case is 'x1'
+
+22:23.540 --> 22:27.440
+that we see is assigned once by definition,
+
+22:27.540 --> 22:29.300
+in particular here at the beginning.
+
+22:29.400 --> 22:31.040
+Here it's very simple to understand
+
+22:31.140 --> 22:33.080
+that x1 will have the value 3.
+
+22:33.180 --> 22:35.380
+While, for instance, it's more difficult to prove
+
+22:35.480 --> 22:37.060
+what is going to be the value of x5,
+
+22:37.160 --> 22:38.620
+because it's calling a function,
+
+22:38.720 --> 22:41.940
+or we don't know at the moment what x4 is.
+
+22:42.040 --> 22:46.240
+So the compiler will gain the capability
+
+22:46.340 --> 22:48.460
+to do prediction on all the variables,
+
+22:48.560 --> 22:50.620
+and the more we get information on one variable,
+
+22:50.720 --> 22:54.980
+the more we can prove about the others.
+
+22:55.460 --> 22:57.280
+Coming back to our passes, the next one
+
+22:57.380 --> 22:59.320
+is forward propagation.
+
+22:59.420 --> 23:00.600
+This pass is responsible for
+
+23:00.700 --> 23:03.240
+doing what I briefly mentioned just before:
+
+23:03.340 --> 23:07.160
+doing proof over all the different variables
+
+23:07.260 --> 23:09.620
+in different positions of the Control Flow Graph,
+
+23:09.720 --> 23:12.700
+about the values, types, or ranges.
+
+23:12.800 --> 23:15.080
+This pass is also responsible for
+
+23:15.180 --> 23:16.920
+executing functions
+
+23:17.020 --> 23:18.640
+when we know that the function has no side effect
+
+23:18.740 --> 23:20.520
+and the pass managed to
+
+23:20.620 --> 23:22.440
+prove all the values of its argument.
+
+23:22.540 --> 23:24.800
+So the function is then executed at compile time
+
+23:24.900 --> 23:26.700
+and it doesn't even exist anymore
+
+23:26.800 --> 23:27.880
+in the produced code.
+
+23:27.980 --> 23:30.300
+Then we have another pass, this is
+
+23:30.400 --> 23:33.420
+an example of a pass that is very specific:
+
+23:33.520 --> 23:36.120
+it's trying to remove the call to funcall
+
+23:36.220 --> 23:38.040
+when those are not necessary.
+
+23:38.140 --> 23:39.760
+There are a couple situations
+
+23:39.860 --> 23:42.200
+where this is very useful.
+
+23:42.300 --> 23:45.240
+And not only is this beneficial
+
+23:45.340 --> 23:47.560
+because we are generating better code,
+
+23:47.660 --> 23:49.245
+but when we manage to do that,
+
+23:49.345 --> 23:52.000
+we allow GCC better analysis over the code,
+
+23:52.100 --> 23:54.440
+because GCC knows nothing about funcall.
+
+23:54.540 --> 23:57.400
+So if we are calling, from 'foo', directly, 'bar',
+
+23:57.500 --> 24:01.280
+for GCC it's way easier to do its analysis
+
+24:01.380 --> 24:03.360
+on top of this code.
+
+24:03.460 --> 24:06.240
+Another interesting pass we can mention is 'tco'.
+
+24:06.340 --> 24:08.800
+This is performing Tail Recursion Elimination.
+
+24:08.900 --> 24:11.880
+It allows a more functional programming style,
+
+24:11.980 --> 24:13.220
+if you want.
+
+24:13.320 --> 24:14.280
+We can jump to the last pass
+
+24:14.380 --> 24:16.200
+that is called 'final', and as I mentioned,
+
+24:16.300 --> 24:17.520
+this one is responsible for
+
+24:17.620 --> 24:19.880
+taking our program in LIMPLE representation
+
+24:19.980 --> 24:24.900
+and describing it to libgccjit in the gccjit IR.
+
+24:25.000 --> 24:27.480
+That's the main task. It's also
+
+24:27.580 --> 24:29.520
+defining inline functions
+
+24:29.620 --> 24:32.400
+for accessing fundamental data types, and so on.
+
+24:32.500 --> 24:34.460
+This pass is also responsible for
+
+24:34.560 --> 24:36.280
+using some of the predictions
+
+24:36.380 --> 24:39.560
+done by previous passes to generate better code.
+
+24:39.660 --> 24:41.320
+Things we had to add
+
+24:41.420 --> 24:43.880
+to have all of this machinery work
+
+24:43.980 --> 24:45.240
+and to be controllable:
+
+24:45.340 --> 24:47.480
+The first one is an opt called 'native-comp-speed'
+
+24:47.580 --> 24:49.920
+and it's equivalent to Common Lisp's 'speed'.
+
+24:50.020 --> 24:51.920
+It represents the optimization level.
+
+24:52.020 --> 24:53.400
+The default is 2 and is
+
+24:53.500 --> 24:55.400
+the maximum optimization level
+
+24:55.500 --> 24:58.600
+that is meant to reflect
+
+24:58.700 --> 25:00.860
+all the original semantics of Emacs Lisp.
+
+25:00.960 --> 25:02.480
+So it's the one that should be used by default.
+
+25:02.580 --> 25:04.640
+The second one is 'compilation unit'
+
+25:04.740 --> 25:05.960
+and it's a kind of new object
+
+25:06.060 --> 25:11.080
+that has been added to Emacs.
+
+25:11.180 --> 25:12.960
+Let's have a look to
+
+25:13.060 --> 25:14.360
+how the Garbage Collector works in this case.
+
+25:14.460 --> 25:15.840
+The GNU Emacs Garbage Collector
+
+25:15.940 --> 25:18.660
+is a simple mark-and-sweep garbage collector.
+
+25:18.760 --> 25:21.420
+It does a tree walk through all the objects
+
+25:21.520 --> 25:25.100
+and follows references from one object to another.
+
+25:25.200 --> 25:27.960
+All the objects reachable during the mark phase
+
+25:28.060 --> 25:31.240
+will be kept in our Lisp universe.
+
+25:31.340 --> 25:33.680
+All the other ones will be freed.
+
+25:33.780 --> 25:35.080
+In this case we have a bunch of functions,
+
+25:35.180 --> 25:38.760
+'foo1', 'foo2', 'bar1', etc., that are defined.
+
+25:38.860 --> 25:40.320
+When a function is defined,
+
+25:40.420 --> 25:42.400
+it's accessible through its symbol,
+
+25:42.500 --> 25:44.360
+so we have the symbol referring to the function.
+
+25:44.460 --> 25:47.720
+The function, in this case a native-compiled one,
+
+25:47.820 --> 25:50.040
+is referring to the compilation unit.
+
+25:50.140 --> 25:53.020
+The compilation unit is essentially
+
+25:53.120 --> 25:58.600
+the ELF file that has been compiled,
+
+25:58.700 --> 26:01.160
+and contains all those functions
+
+26:01.260 --> 26:03.240
+that came from the original .el file,
+
+26:03.340 --> 26:05.100
+and that we have loaded into memory.
+
+26:05.200 --> 26:10.000
+If, for instance, 'bar1 and 'bar2 are undefined,
+
+26:10.100 --> 26:14.200
+functions [3] and 4 will be no longer reachable,
+
+26:14.300 --> 26:16.040
+and we will be able to free them
+
+26:16.140 --> 26:18.160
+and unload the compilation unit.
+
+26:18.260 --> 26:21.200
+We discussed quite a lot about Control Flow Graph,
+
+26:21.300 --> 26:23.560
+SSA, and a lot of boring stuff,
+
+26:23.660 --> 26:25.400
+and I promised you that we are doing
+
+26:25.500 --> 26:27.320
+a lot of interesting proofs over variables,
+
+26:27.420 --> 26:30.220
+So let's have some examples of them.
+
+26:30.320 --> 26:31.840
+Let's jump into a quick demo
+
+26:31.940 --> 26:34.480
+to see what all of this abstract theory
+
+26:34.580 --> 26:37.680
+and this esoteric propagation engine can do for us
+
+26:37.780 --> 26:39.240
+and how the user can interact with it.
+
+26:39.340 --> 26:42.100
+I've defined a bunch of functions,
+
+26:42.200 --> 26:45.240
+and I will native-compile and load it.
+
+26:47.500 --> 26:48.840
+Alright, Emacs Lisp native compiled and loaded.
+
+26:48.940 --> 26:52.320
+At this point, I can disassemble 'foo1'
+
+26:52.420 --> 26:56.320
+to make sure it's native code and I'm not lying.
+
+26:56.420 --> 26:58.500
+These are the instructions
+
+26:58.600 --> 27:01.320
+that will be executed directly by my CPU
+
+27:01.420 --> 27:03.620
+when I call this function.
+
+27:03.720 --> 27:07.520
+Alright, very cool.
+
+27:07.620 --> 27:16.080
+Now, [Lisp:] (symbol-function #'foo1)
+
+27:16.180 --> 27:19.720
+Interestingly, this is returning a subroutine,
+
+27:19.820 --> 27:21.820
+as it would be a primitive function.
+
+27:21.920 --> 27:23.700
+Because this is native code,
+
+27:23.800 --> 27:24.840
+even if it's written in Lisp,
+
+27:24.940 --> 27:26.340
+has been converted to native code
+
+27:26.440 --> 27:29.200
+as if it's a primitive function.
+
+27:29.300 --> 27:31.560
+But we can do also a new thing:
+
+27:31.660 --> 27:34.440
+asking for the type of the subroutine.
+
+27:34.540 --> 27:38.360
+Alright, very cool. It says this is a function,
+
+27:38.460 --> 27:40.280
+it's taking one argument of type 't'
+
+27:40.380 --> 27:41.560
+(that means anything
+
+27:41.660 --> 27:42.960
+because we don't have any information),
+
+27:43.060 --> 27:45.200
+and is returning a type 't',
+
+27:45.300 --> 27:47.380
+so also there we don't have much information.
+
+27:47.480 --> 27:49.700
+OK, very cool, but not very useful.
+
+27:49.800 --> 27:53.680
+Let's see #'foo2. #'foo2 is slightly different,
+
+27:53.780 --> 27:55.840
+it doesn't take any argument, but it's returning
+
+27:55.940 --> 27:58.040
+an integer included between 3 and 3.
+
+27:58.140 --> 28:01.360
+Wow, amazing!
+
+28:01.460 --> 28:04.040
+Let's get into something a little more complex:
+
+28:04.140 --> 28:09.440
+#'foo3 takes one argument we know nothing about,
+
+28:09.540 --> 28:11.740
+but it's returning a number.
+
+28:11.840 --> 28:13.280
+And why it's returning a number?
+
+28:13.380 --> 28:16.320
+Essentially because 1+ is returning a number,
+
+28:16.420 --> 28:18.880
+and in all the other cases,
+
+28:18.980 --> 28:20.640
+it would signal an error
+
+28:20.740 --> 28:23.380
+if it's not happy about its input argument.
+
+28:23.480 --> 28:27.760
+Let's have a look to #'foo4.
+
+28:27.860 --> 28:32.920
+#'foo4 is a little bit more complex.
+
+28:33.020 --> 28:34.680
+It will return nil
+
+28:34.780 --> 28:37.400
+if the 'when' condition is not satisfied,
+
+28:37.500 --> 28:39.720
+so it's type 'null' here.
+
+28:39.820 --> 28:41.200
+It can return a floating point;
+
+28:41.300 --> 28:43.600
+we don't do propagation of floating point so far,
+
+28:43.700 --> 28:47.080
+or it can return any integer between 4 and 9.
+
+28:47.180 --> 28:52.840
+Wow. Let's go on with #'foo5.
+
+28:52.940 --> 28:55.760
+#'foo5 is even more complex
+
+28:55.860 --> 28:57.200
+because other than
+
+28:57.300 --> 28:59.180
+having to satisfy this condition,
+
+28:59.280 --> 29:02.280
+we can see that the result of the propagation
+
+29:02.380 --> 29:03.800
+of this complex condition
+
+29:03.900 --> 29:05.460
+is propagated also across the 'plus'.
+
+29:05.560 --> 29:08.240
+So this foo5 can return nil,
+
+29:08.340 --> 29:09.720
+a floating point we know nothing about,
+
+29:09.820 --> 29:13.560
+or an integer included between 12 and 24.
+
+29:13.660 --> 29:18.080
+Let's go on with #'foo6.
+
+29:18.180 --> 29:23.320
+#'foo6 is returning anything but an integer.
+
+29:23.420 --> 29:26.520
+I think it should be pretty obvious why,
+
+29:26.620 --> 29:28.120
+because if it's not an integer we return it,
+
+29:28.220 --> 29:30.000
+otherwise we signal an error.
+
+29:30.100 --> 29:32.880
+Let's finish with #'foo7 very quickly.
+
+29:32.980 --> 29:37.920
+#'foo7 has another very complex condition,
+
+29:38.020 --> 29:40.320
+at least for me, but it's also interesting to see
+
+29:40.420 --> 29:42.200
+that we are also propagating values for symbols.
+
+29:42.300 --> 29:45.160
+So we can return the symbol 'big,
+
+29:45.260 --> 29:46.980
+the symbol 'small,
+
+29:47.080 --> 29:51.200
+or an integer included between -100 and 100.
+
+29:51.300 --> 29:54.440
+Now, the question is: why all of this is useful
+
+29:54.540 --> 29:56.800
+other than having Andrea very happy
+
+29:56.900 --> 29:59.560
+when he's playing with this all day?
+
+29:59.660 --> 30:01.440
+Well, we have to come back one second
+
+30:01.540 --> 30:04.920
+to how Lisp_Objects are represented within Emacs.
+
+30:05.020 --> 30:09.480
+Lisp_Objects are represented as machine words,
+
+30:09.580 --> 30:12.580
+where we reserve a few bits to indicate the type.
+
+30:12.680 --> 30:15.560
+And every time we access the object,
+
+30:15.660 --> 30:17.120
+when this is a Fixnum,
+
+30:17.220 --> 30:19.920
+or a regular object where this is a pointer,
+
+30:20.020 --> 30:21.600
+we always have to extract these bits,
+
+30:21.700 --> 30:24.520
+make sure that they satisfy a condition,
+
+30:24.620 --> 30:27.120
+so make sure that we are going to manipulate
+
+30:27.220 --> 30:28.580
+the object of the type we expect,
+
+30:28.680 --> 30:31.040
+and then we can extract the object
+
+30:31.140 --> 30:32.540
+and do the manipulation.
+
+30:32.640 --> 30:34.420
+If the compiler managed to prove
+
+30:34.620 --> 30:37.400
+that the contained object is of the right type,
+
+30:37.500 --> 30:42.440
+it will be able to not emit the type check,
+
+30:42.540 --> 30:44.500
+and save a lot of instructions.
+
+30:44.600 --> 30:48.560
+This is a very powerful optimization.
+
+30:48.660 --> 30:50.760
+Let's discuss some potential future development
+
+30:50.860 --> 30:52.000
+in this area.
+
+30:52.100 --> 30:53.360
+First I think it would be extremely nice
+
+30:53.460 --> 30:54.920
+to extend the propagation
+
+30:55.020 --> 30:56.920
+to types that are not built in.
+
+30:57.020 --> 30:58.160
+There are a lot of cases
+
+30:58.260 --> 31:00.600
+where we could optimize effectively.
+
+31:00.700 --> 31:02.520
+For instance when we do
+
+31:02.620 --> 31:05.720
+a lot of accesses to structures
+
+31:05.820 --> 31:06.920
+-- lots of stuff like that --
+
+31:07.020 --> 31:08.880
+where we keep on checking and checking
+
+31:08.980 --> 31:10.640
+the same object for the type
+
+31:10.740 --> 31:13.080
+where it's obvious, where it should be trivial
+
+31:13.180 --> 31:14.720
+to prove that it's the right type
+
+31:14.820 --> 31:16.360
+after the first access or things like that.
+
+31:16.460 --> 31:18.920
+So I believe this is a low-hanging fruit
+
+31:19.020 --> 31:21.180
+in terms of performance.
+
+31:21.280 --> 31:23.080
+Also I think it would be really nice
+
+31:23.180 --> 31:24.720
+to extend the declare mechanism
+
+31:24.820 --> 31:27.600
+to allow the user to declare argument types.
+
+31:27.700 --> 31:30.480
+(Optionally. Indeed, optionally.)
+
+31:30.580 --> 31:32.880
+Doing that would give the compiler
+
+31:32.980 --> 31:35.120
+a lot of information to propagate value types
+
+31:35.220 --> 31:36.360
+within the function.
+
+31:36.460 --> 31:38.840
+But those will allow the compiler
+
+31:38.940 --> 31:43.040
+to give the user really good diagnostics
+
+31:43.140 --> 31:45.400
+during compile time. Like the compiler could say:
+
+31:45.500 --> 31:47.000
+Hey, here you are calling a function
+
+31:47.100 --> 31:49.200
+that is expecting this argument of this type,
+
+31:49.300 --> 31:52.000
+but I'm proving that you are calling it
+
+31:52.100 --> 31:55.200
+with an argument that is of THIS type,
+
+31:55.300 --> 31:57.840
+and is not a subtype of the expected one.
+
+31:57.940 --> 32:00.240
+So you are doing something not coherent.
+
+32:00.340 --> 32:02.800
+This kind of interprocedural logic.
+
+32:02.900 --> 32:05.000
+And I think the compiler should also take advantage
+
+32:05.100 --> 32:06.640
+(under certain circumstances)
+
+32:06.740 --> 32:08.760
+of this interprocedural analysis
+
+32:08.860 --> 32:12.520
+in order to optimize even more, when possible.
+
+32:12.620 --> 32:13.720
+Also I think we should
+
+32:13.820 --> 32:15.480
+work on our [?] to improve the code generation
+
+32:15.580 --> 32:17.100
+depending on the prediction
+
+32:17.200 --> 32:18.160
+that the compiler is doing.
+
+32:18.260 --> 32:20.120
+We already take advantage of those predictions,
+
+32:20.220 --> 32:22.300
+but I think we could do better.
+
+32:22.400 --> 32:25.120
+A quick look at some performance results.
+
+32:25.220 --> 32:28.720
+These are from the elisp-benchmarks package
+
+32:28.820 --> 32:30.760
+within GNU ELPA.
+
+32:30.860 --> 32:32.520
+This is the performance uplift,
+
+32:32.620 --> 32:38.480
+and we can identify about 4 "classes" of results.
+
+32:38.580 --> 32:41.440
+The first one there is no performance uplift,
+
+32:41.540 --> 32:42.880
+because there is not much we can do,
+
+32:42.980 --> 32:44.720
+and the time is probably not spent
+
+32:44.820 --> 32:46.280
+within the execution engine.
+
+32:46.380 --> 32:49.000
+And the ones around 3x are the ones
+
+32:49.100 --> 32:50.680
+Where probably we are not triggering
+
+32:50.780 --> 32:52.640
+manually specific optimizations,
+
+32:52.740 --> 32:53.600
+but just the fact
+
+32:53.700 --> 32:57.100
+that we are converting into native code
+
+32:57.200 --> 33:00.500
+is giving us this performance uplift.
+
+33:00.600 --> 33:03.280
+Then there is a bunch of other benchmarks
+
+33:03.380 --> 33:05.680
+where the Lisp optimizations are triggering,
+
+33:05.780 --> 33:09.620
+and the uplift is way bigger,
+
+33:09.720 --> 33:11.900
+and then we have 3 benchmarks that at the time
+
+33:12.000 --> 33:13.420
+are completely optimized out.
+
+33:13.520 --> 33:15.580
+That means the compiler became "so smart"
+
+33:15.680 --> 33:18.160
+that it was able to compute the result
+
+33:18.260 --> 33:20.160
+in the compile time and just put the result
+
+33:20.260 --> 33:21.400
+in the generated binary.
+
+33:21.500 --> 33:23.880
+Let's discuss a little bit the compilation model.
+
+33:23.980 --> 33:26.080
+This is an Hybrid one;
+
+33:26.180 --> 33:29.420
+it's both JIT-like and Ahead-of-Time-like.
+
+33:29.520 --> 33:33.400
+Emacs is composed of what we call an Emacs image,
+
+33:33.500 --> 33:36.180
+essentially the Emacs binary that we start.
+
+33:36.280 --> 33:37.720
+It's including all the C code,
+
+33:37.820 --> 33:41.760
+plus all the Lisp code that we preload.
+
+33:41.860 --> 33:46.480
+Then we have the rest of the Emacs Lisp codebase
+
+33:46.580 --> 33:49.440
+that can be loaded just if it's required.
+
+33:49.540 --> 33:52.760
+Same for the external packages, if we have any.
+
+33:52.860 --> 33:55.120
+If we build an Emacs Lisp
+
+33:55.220 --> 33:57.940
+with native compilation enabled, by default,
+
+33:58.040 --> 34:01.200
+only the Emacs image will be native compiled.
+
+34:01.300 --> 34:03.920
+All the other code will be compiled
+
+34:04.020 --> 34:06.720
+on the fly when it's loaded and executed
+
+34:06.820 --> 34:08.800
+the first time, if it's necessary.
+
+34:08.900 --> 34:10.880
+Same for the packages, in a transparent way
+
+34:10.980 --> 34:12.640
+and asynchronous way.
+
+34:12.740 --> 34:13.480
+Also worth noting
+
+34:13.580 --> 34:15.400
+that the result of this compilation
+
+34:15.500 --> 34:17.240
+will be stored into a cache directory
+
+34:17.340 --> 34:19.900
+within the home directory of the user.
+
+34:20.000 --> 34:23.600
+So it will be reused in the following sessions
+
+34:23.700 --> 34:25.440
+if the same file is loaded,
+
+34:25.540 --> 34:27.520
+without having to recompile multiple times
+
+34:27.620 --> 34:29.320
+the same file in different sessions.
+
+34:29.420 --> 34:31.520
+It works a little bit like this:
+
+34:31.620 --> 34:33.800
+When we load the byte-code for the first time,
+
+34:33.900 --> 34:35.900
+we spawn a native compilation process.
+
+34:36.000 --> 34:39.320
+Meanwhile we keep using the byte-code available.
+
+34:39.420 --> 34:41.180
+When the native compilation is finished,
+
+34:41.280 --> 34:43.960
+we hot-swap the definition of the functions
+
+34:44.060 --> 34:46.040
+that are contained in the file
+
+34:46.140 --> 34:47.960
+and start using the native code transparently.
+
+34:48.060 --> 34:49.880
+We do this asynchronously,
+
+34:49.980 --> 34:53.140
+and for more compilation units at the same time,
+
+34:53.240 --> 34:56.280
+so it looks a little bit like this.
+
+34:56.380 --> 34:58.560
+Let's try a quick demo of all of this machinery.
+
+34:58.660 --> 35:00.880
+I've started a fresh Emacs
+
+35:00.980 --> 35:03.280
+with native compilation support,
+
+35:03.380 --> 35:05.060
+and at this moment nothing is going on.
+
+35:05.160 --> 35:07.440
+We will test the machinery with Tetris,
+
+35:07.540 --> 35:10.460
+because I can't imagine anything better
+
+35:10.560 --> 35:12.840
+to test this.
+
+35:12.940 --> 35:15.080
+What I do expect is that when I launch Tetris
+
+35:15.180 --> 35:17.920
+it will be loaded, it will immediately
+
+35:18.020 --> 35:20.460
+start execution of the byte-compiled version,
+
+35:20.560 --> 35:23.000
+so we won't see any delay in the user experience,
+
+35:23.100 --> 35:25.160
+and in the meanwhile, a parallel process
+
+35:25.260 --> 35:28.160
+will start to native-compile Tetris itself.
+
+35:28.260 --> 35:30.200
+When the native compilation will be finished,
+
+35:30.300 --> 35:33.240
+the functions of all Tetris will be hot-swapped.
+
+35:33.340 --> 35:36.280
+So we will not see any interruption.
+
+35:36.380 --> 35:39.680
+So Tetris started, and it's running,
+
+35:39.780 --> 35:41.600
+we have seen no delay, and in the meanwhile,
+
+35:41.700 --> 35:43.520
+the native compilation probably already finished,
+
+35:43.620 --> 35:44.960
+we can have a look.
+
+35:45.060 --> 35:47.160
+In this I see the native compilation log buffer.
+
+35:47.260 --> 35:49.720
+So we see that Tetris has been native compiled,
+
+35:49.820 --> 35:51.760
+and all of its dependencies.
+
+35:51.860 --> 35:53.840
+Now Tetris is still running,
+
+35:53.940 --> 36:00.480
+but I can do "C-h f tetris"
+
+36:00.580 --> 36:02.540
+and we can see that 'tetris'
+
+36:02.640 --> 36:04.880
+is an interactive native compiled
+
+36:04.980 --> 36:07.940
+Lisp function, so it has been native-compiled.
+
+36:08.040 --> 36:13.500
+I can even disassemble if I want.
+
+36:13.600 --> 36:14.880
+OK, so very cool.
+
+36:14.980 --> 36:18.020
+I guess we can say this mechanism is working.
+
+36:18.120 --> 36:20.660
+Also worth noting that if I go back
+
+36:20.760 --> 36:24.120
+to the *Async-native-compile-log* buffer,
+
+36:24.220 --> 36:27.960
+we see we have compiled another bunch of files.
+
+36:28.060 --> 36:31.600
+I think these are because of my 'C-h f',
+
+36:31.700 --> 36:33.800
+this help function command and disassemble,
+
+36:33.900 --> 36:34.920
+and so on.
+
+36:35.020 --> 36:37.720
+The first time you run Emacs, you will have,
+
+36:37.820 --> 36:41.280
+from time to time, these processes spawned.
+
+36:41.380 --> 36:43.100
+Emacs is "compiling itself",
+
+36:43.200 --> 36:45.520
+and it's replacing the byte-code definition
+
+36:45.620 --> 36:47.640
+with the native one. But after a few sessions,
+
+36:47.740 --> 36:49.760
+you will not see this anymore,
+
+36:49.860 --> 36:51.360
+because the output of this compilation,
+
+36:51.460 --> 36:54.900
+as I mentioned, are stored in the user directory.
+
+36:55.000 --> 36:57.560
+To conclude: Emacs with native compilation support
+
+36:57.660 --> 36:59.080
+is coming up in Emacs 28,
+
+36:59.180 --> 37:01.040
+that is gonna be the next major stable release
+
+37:01.140 --> 37:02.080
+that will be released.
+
+37:02.180 --> 37:04.840
+So we ought to celebrate with a big party,
+
+37:04.940 --> 37:07.320
+I believe. But before going to the party,
+
+37:07.420 --> 37:09.080
+I'd like to list a few points
+
+37:09.180 --> 37:11.340
+that I think have been success factors
+
+37:11.440 --> 37:13.420
+in upstreaming this work.
+
+37:13.520 --> 37:15.420
+It has been extremely important
+
+37:15.520 --> 37:18.140
+to get in touch with upstream as soon as possible,
+
+37:18.240 --> 37:20.680
+as soon as I had a proof of concept.
+
+37:20.780 --> 37:22.600
+It's been extremely important
+
+37:22.700 --> 37:24.660
+to involve the community as much as possible,
+
+37:24.760 --> 37:28.480
+and this included keeping a development blog,
+
+37:28.580 --> 37:31.600
+and posts about that on emacs-devel,
+
+37:31.700 --> 37:33.720
+and also producing material,
+
+37:33.820 --> 37:36.020
+participating in conferences,
+
+37:36.120 --> 37:38.320
+and giving presentations like the one I'm doing,
+
+37:38.420 --> 37:40.680
+to explain what I was doing and how it works.
+
+37:40.780 --> 37:43.040
+It has been extremely important, also,
+
+37:43.140 --> 37:45.860
+to be able to rely on the upstream infrastructure.
+
+37:45.960 --> 37:47.540
+So, to develop the software
+
+37:47.640 --> 37:49.080
+as a feature branch in the official git,
+
+37:49.180 --> 37:49.960
+but even more, I would say,
+
+37:50.060 --> 37:51.660
+to use the official bug tracker
+
+37:51.760 --> 37:52.880
+for solving bugs of this branch.
+
+37:52.980 --> 37:54.680
+This gave the opportunity
+
+37:54.780 --> 37:58.160
+to stay really in close touch with maintainers,
+
+37:58.260 --> 37:59.920
+and senior developers of Emacs.
+
+38:00.020 --> 38:02.980
+That helped me a lot. And at the same time
+
+38:03.080 --> 38:04.820
+they were informed about what I was doing
+
+38:04.920 --> 38:07.360
+and what was the status of this feature branch.
+
+38:07.460 --> 38:08.800
+Extremely important.
+
+38:08.900 --> 38:11.160
+And also I think it played a major role
+
+38:11.260 --> 38:14.120
+to try to design this enormous patch
+
+38:14.220 --> 38:18.120
+in a way that the impact on the current codebase
+
+38:18.220 --> 38:21.120
+was minimized (at least as much as possible).
+
+38:21.220 --> 38:23.660
+And also minimizing
+
+38:23.760 --> 38:26.240
+the impact on the user operation of the software,
+
+38:26.340 --> 38:28.040
+in this case Emacs.
+
+38:28.140 --> 38:29.640
+So yes, mandatory Special Thanks:
+
+38:29.740 --> 38:33.360
+Emacs developers, and especially maintainers
+
+38:33.460 --> 38:36.680
+and senior developers like Stefan Monnier,
+
+38:36.780 --> 38:40.440
+that helped me a lot across this long journey.
+
+38:40.540 --> 38:42.800
+And, well, all the community
+
+38:42.900 --> 38:45.160
+that really got so excited about this project
+
+38:45.260 --> 38:46.240
+and gave me the energy
+
+38:46.340 --> 38:49.120
+to go through all of this time and development
+
+38:49.220 --> 38:51.980
+and bugs and solving, etc. etc.
+
+38:52.080 --> 38:54.920
+So yes, it was a really exciting time,
+
+38:55.020 --> 38:58.000
+and I think we have to look forward
+
+38:58.100 --> 39:01.400
+and start thinking about how to improve all this
+
+39:01.500 --> 39:02.920
+for the following years.
+
+39:03.020 --> 39:04.300
+And that's it.
+
+39:04.400 --> 39:06.040
+I think I should be online for questions.
+
+39:06.140 --> 39:07.480
+Thank you very much.
+
+39:07.580 --> 39:07.680
+[captions by John Cummings]
diff --git a/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt b/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt
new file mode 100644
index 00000000..7afd1e04
--- /dev/null
+++ b/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt
@@ -0,0 +1,34 @@
+WEBVTT
+
+00:00:00.003 --> 00:00:11.023
+Introduction
+
+00:00:11.024 --> 00:00:24.987
+Upcoming Emacs 28 release
+
+00:00:24.988 --> 00:00:57.125
+Org mode 9.5
+
+00:00:57.126 --> 00:01:18.107
+Magit major release
+
+00:01:18.108 --> 00:01:51.283
+Completion
+
+00:01:51.284 --> 00:02:12.064
+Embark
+
+00:02:12.065 --> 00:02:44.655
+tree-sitter
+
+00:02:44.656 --> 00:03:03.656
+Collaborative editing
+
+00:03:03.657 --> 00:03:41.737
+Graphical experiments
+
+00:03:41.738 --> 00:04:00.070
+Community
+
+00:04:00.071 --> 00:04:01.071
+libera.chat
diff --git a/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main--chapters.vtt b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main--chapters.vtt
new file mode 100644
index 00000000..51d6ae42
--- /dev/null
+++ b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main--chapters.vtt
@@ -0,0 +1,31 @@
+WEBVTT
+
+00:01.280 --> 00:00:45.600
+Introduction
+
+00:45.600 --> 00:01:04.559
+State of the manuals
+
+01:04.559 --> 00:02:15.680
+gettext and po4a
+
+00:02:15.680 --> 00:03:39.760
+OmegaT
+
+03:39.760 --> 00:05:21.440
+OmegaT demo
+
+05:21.440 --> 00:06:38.560
+Protected strings
+
+06:38.560 --> 00:06:57.199
+Entering strings
+
+06:57.199 --> 00:07:25.199
+Validation
+
+07:25.199 --> 00:08:39.760
+Collaboration
+
+08:39.760 --> 00:09:06.760
+Conclusion
diff --git a/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt b/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt
new file mode 100644
index 00000000..33525c96
--- /dev/null
+++ b/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt
@@ -0,0 +1,25 @@
+WEBVTT
+
+00:00.000 --> 01:16.239
+Introduction
+
+01:16.240 --> 05:18.799
+Definition of design patterns and relation to Emacs
+
+05:18.800 --> 09:12.239
+Why this approach matters
+
+09:12.240 --> 11:29.999
+Managing complexity: Emacs as mind map
+
+11:30.000 --> 12:31.679
+Emacs as design pattern framework
+
+12:31.680 --> 13:30.638
+Personal customization
+
+13:30.639 --> 16:41.998
+Implementing Emacs as a model for learning
+
+16:41.999 --> 23:00.920
+Emacs as accommodating complex social, community assemblages
diff --git a/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt b/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt
new file mode 100644
index 00000000..1850cce5
--- /dev/null
+++ b/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt
@@ -0,0 +1,31 @@
+WEBVTT
+
+00:00:01.040 --> 00:00:10.558
+Introduction
+
+00:00:10.559 --> 00:01:42.719
+How we build and budget project proposals
+
+00:01:42.720 --> 00:02:58.399
+Org mode template with embedded Emacs Lisp
+
+00:02:58.400 --> 00:03:37.279
+The project plan
+
+00:03:37.280 --> 00:04:40.719
+Effort
+
+00:04:40.720 --> 00:06:07.439
+Hourly rates
+
+00:06:07.440 --> 00:07:28.159
+Totals
+
+00:07:28.160 --> 00:08:21.038
+Payment structure
+
+00:08:21.039 --> 00:09:07.999
+Export
+
+00:09:08.000 --> 00:09:09.000
+Advantages
diff --git a/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt b/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt
new file mode 100644
index 00000000..107ae37a
--- /dev/null
+++ b/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt
@@ -0,0 +1,16 @@
+WEBVTT
+
+00:00:00.480 --> 00:00:51.759
+Introduction
+
+00:00:51.760 --> 00:02:30.238
+Elfeed
+
+00:02:30.239 --> 00:03:50.559
+org-ref
+
+00:03:50.560 --> 00:05:48.719
+BibLaTeX
+
+00:05:48.720 --> 00:05:49.720
+Notes and org-roam
diff --git a/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt b/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt
new file mode 100644
index 00000000..130e25e8
--- /dev/null
+++ b/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt
@@ -0,0 +1,40 @@
+WEBVTT
+
+00:00:00.080 --> 00:00:31.598
+Introduction
+
+00:00:31.599 --> 00:00:57.599
+UNIX Philosophy?
+
+00:00:57.600 --> 00:01:25.438
+Enter Emacs
+
+00:01:25.439 --> 00:01:50.798
+Emacs versus the original ideas
+
+00:01:50.799 --> 00:02:17.439
+Why compare to UNIX?
+
+00:02:17.440 --> 00:02:59.649
+Emacs /does/ work with the UNIX philosophy
+
+00:02:59.650 --> 00:03:15.049
+Philosophies don't really matter in computing
+
+00:03:15.050 --> 00:04:14.382
+Android Studio
+
+00:04:14.383 --> 00:04:42.899
+Window Managers
+
+00:04:42.900 --> 00:05:09.299
+Browsers
+
+00:05:09.300 --> 00:05:34.638
+Vim
+
+00:05:34.639 --> 00:06:12.232
+Terminals
+
+00:06:12.233 --> 00:06:13.233
+Do what helps you most, not what a philosophy tells you
diff --git a/2021/captions/maintainers.md b/2021/captions/maintainers.md
index eb6ae5d6..787165b5 100644
--- a/2021/captions/maintainers.md
+++ b/2021/captions/maintainers.md
@@ -1,7 +1,8 @@
<a name="transcript"></a>
# Transcript
-[[!template text="Hello, I'm Bastien Guerry," start="00:00:00.799" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Hello, I'm Bastien Guerry," start="00:00:00.799" video="mainVideo" id=subtitle]]
+[[!template text="and I'm very happy to be here." start="00:00:02.734" video="mainVideo" id=subtitle]]
[[!template text="I've been the Org-mode maintainer" start="00:00:04.701" video="mainVideo" id=subtitle]]
[[!template text="for the last 10 years," start="00:00:07.734" video="mainVideo" id=subtitle]]
[[!template text="and I would like to ask the question" start="00:00:09.501" video="mainVideo" id=subtitle]]
@@ -21,22 +22,22 @@
[[!template text="to other free software projects," start="00:00:41.968" video="mainVideo" id=subtitle]]
[[!template text="at least those where contributors" start="00:00:43.601" video="mainVideo" id=subtitle]]
[[!template text="are all volunteers." start="00:00:45.901" video="mainVideo" id=subtitle]]
-[[!template new="1" text="First of all, what is a free software maintainer?" start="00:00:47.568" video="mainVideo" id=subtitle]]
+[[!template new="1" text="First of all, what is a free software maintainer?<br />" start="00:00:47.568" video="mainVideo" id=subtitle]]
[[!template text="\- Obviously this is some rich dude" start="00:00:51.368" video="mainVideo" id=subtitle]]
-[[!template text="with a lot of free time.<br />" start="00:00:54.601" video="mainVideo" id=subtitle]]
+[[!template text="with a lot of free time<br />" start="00:00:54.601" video="mainVideo" id=subtitle]]
[[!template text="\- Acting both as a supersmart hacker" start="00:00:56.268" video="mainVideo" id=subtitle]]
-[[!template text="and a super-patient community manager" start="00:00:58.968" video="mainVideo" id=subtitle]]
+[[!template text="and a super-patient community manager<br />" start="00:00:58.968" video="mainVideo" id=subtitle]]
[[!template text="\- Someone who acts as the central hotline" start="00:01:02.401" video="mainVideo" id=subtitle]]
-[[!template text="for users and contributors" start="00:01:05.101" video="mainVideo" id=subtitle]]
+[[!template text="for users and contributors<br />" start="00:01:05.101" video="mainVideo" id=subtitle]]
[[!template text="\- Who knows how to write many emails," start="00:01:06.901" video="mainVideo" id=subtitle]]
-[[!template text="probably at the same time" start="00:01:09.568" video="mainVideo" id=subtitle]]
+[[!template text="probably at the same time<br />" start="00:01:09.568" video="mainVideo" id=subtitle]]
[[!template text="\- Who does not hesitate" start="00:01:11.468" video="mainVideo" id=subtitle]]
-[[!template text="to publicly scold annoying users" start="00:01:14.101" video="mainVideo" id=subtitle]]
+[[!template text="to publicly scold annoying users<br />" start="00:01:14.101" video="mainVideo" id=subtitle]]
[[!template text="\- and someone narcissistic enough" start="00:01:16.934" video="mainVideo" id=subtitle]]
-[[!template text="to seek credits for community efforts" start="00:01:19.801" video="mainVideo" id=subtitle]]
+[[!template text="to seek credits for community efforts<br />" start="00:01:19.801" video="mainVideo" id=subtitle]]
[[!template text="\- But really looking for a job" start="00:01:22.668" video="mainVideo" id=subtitle]]
-[[!template text="in some big IT company" start="00:01:26.034" video="mainVideo" id=subtitle]]
-[[!template new="1" text="Right? Well... no. That was a joke." start="00:01:27.768" video="mainVideo" id=subtitle]]
+[[!template text="in some big IT company<br />" start="00:01:26.034" video="mainVideo" id=subtitle]]
+[[!template text="Right? Well... no. That was a joke." start="00:01:27.768" video="mainVideo" id=subtitle]]
[[!template text="But maybe you did smile" start="00:01:32.234" video="mainVideo" id=subtitle]]
[[!template text="and that's probably" start="00:01:34.601" video="mainVideo" id=subtitle]]
[[!template text="because there is some truth to it." start="00:01:36.634" video="mainVideo" id=subtitle]]
@@ -44,12 +45,12 @@
[[!template text="free software users and casual contributors" start="00:01:43.834" video="mainVideo" id=subtitle]]
[[!template text="to think about maintainers this way." start="00:01:45.634" video="mainVideo" id=subtitle]]
[[!template text="Don't we continue to use the expression" start="00:01:47.868" video="mainVideo" id=subtitle]]
-[[!template text="&quot;Benevolent Dictator For Life&quot;?" start="00:01:51.568" video="mainVideo" id=subtitle]]
+[[!template text="“Benevolent Dictator For Life”?" start="00:01:51.568" video="mainVideo" id=subtitle]]
[[!template text="This is what I'd call" start="00:01:54.001" video="mainVideo" id=subtitle]]
-[[!template text="the &quot;Spiderman syndrome&quot;:" start="00:01:56.434" video="mainVideo" id=subtitle]]
+[[!template text="the “Spiderman syndrome”:" start="00:01:56.434" video="mainVideo" id=subtitle]]
[[!template text="maintenance is perceived in terms of" start="00:01:58.068" video="mainVideo" id=subtitle]]
[[!template text="great power and great responsibility." start="00:02:01.268" video="mainVideo" id=subtitle]]
-[[!template new="1" text="But I believe our culture of superheroes" start="00:02:04.168" video="mainVideo" id=subtitle]]
+[[!template text="But I believe our culture of superheroes" start="00:02:04.168" video="mainVideo" id=subtitle]]
[[!template text="is not helpful here:" start="00:02:07.268" video="mainVideo" id=subtitle]]
[[!template text="it does not reflect the truth," start="00:02:09.101" video="mainVideo" id=subtitle]]
[[!template text="it does not set the right expectations," start="00:02:11.301" video="mainVideo" id=subtitle]]
@@ -57,31 +58,31 @@
[[!template text="to properly understand" start="00:02:16.334" video="mainVideo" id=subtitle]]
[[!template text="how to help maintainers." start="00:02:17.601" video="mainVideo" id=subtitle]]
[[!template new="1" text="So let's start again." start="00:02:19.601" video="mainVideo" id=subtitle]]
-[[!template text="Instead of asking what a maintainer is," start="00:02:21.334" video="mainVideo" id=subtitle]]
+[[!template text="And instead of asking what a maintainer is," start="00:02:21.334" video="mainVideo" id=subtitle]]
[[!template text="let me take the list of" start="00:02:24.968" video="mainVideo" id=subtitle]]
[[!template text="what I do as the Org maintainer." start="00:02:27.068" video="mainVideo" id=subtitle]]
-[[!template text="Here is my TODO-list:" start="00:02:30.001" video="mainVideo" id=subtitle]]
+[[!template text="Here is my TODO-list:<br />" start="00:02:30.001" video="mainVideo" id=subtitle]]
[[!template text="\- First of all, I take care of" start="00:02:31.034" video="mainVideo" id=subtitle]]
-[[!template text="the orgmode.org website." start="00:02:33.934" video="mainVideo" id=subtitle]]
+[[!template text="the orgmode.org website.<br />" start="00:02:33.934" video="mainVideo" id=subtitle]]
[[!template text="\- I also take care of the" start="00:02:35.201" video="mainVideo" id=subtitle]]
-[[!template text="org-contrib NonGNU ELPA package." start="00:02:37.401" video="mainVideo" id=subtitle]]
+[[!template text="org-contrib NonGNU ELPA package.<br />" start="00:02:37.401" video="mainVideo" id=subtitle]]
[[!template text="\- I do gardening on the" start="00:02:41.434" video="mainVideo" id=subtitle]]
-[[!template text="community-driven documentation, Worg." start="00:02:44.034" video="mainVideo" id=subtitle]]
-[[!template text="\- I do add contributors to Worg." start="00:02:46.168" video="mainVideo" id=subtitle]]
+[[!template text="community-driven documentation, Worg.<br />" start="00:02:44.034" video="mainVideo" id=subtitle]]
+[[!template text="\- I do add contributors to Worg.<br />" start="00:02:46.168" video="mainVideo" id=subtitle]]
[[!template text="\- I read emails on emacs-orgmode@," start="00:02:48.401" video="mainVideo" id=subtitle]]
-[[!template text="emacs-devel@ and bug-gnu-emacs@." start="00:02:51.134" video="mainVideo" id=subtitle]]
+[[!template text="emacs-devel@ and bug-gnu-emacs@.<br />" start="00:02:51.134" video="mainVideo" id=subtitle]]
[[!template text="\- I contribute to email moderation" start="00:02:54.134" video="mainVideo" id=subtitle]]
[[!template text="of the emacs-orgmode@ list" start="00:02:56.868" video="mainVideo" id=subtitle]]
-[[!template text="with a bunch of other contributors." start="00:02:59.801" video="mainVideo" id=subtitle]]
+[[!template text="with a bunch of other contributors.<br />" start="00:02:59.801" video="mainVideo" id=subtitle]]
[[!template text="\- I reply to private emails" start="00:03:02.468" video="mainVideo" id=subtitle]]
-[[!template text="asking me for help about org-mode." start="00:03:05.134" video="mainVideo" id=subtitle]]
+[[!template text="asking me for help about org-mode.<br />" start="00:03:05.134" video="mainVideo" id=subtitle]]
[[!template text="\- I coordinate with GNU Emacs maintainers" start="00:03:06.834" video="mainVideo" id=subtitle]]
-[[!template text="and thanks to them for Emacs/Org integration." start="00:03:10.168" video="mainVideo" id=subtitle]]
+[[!template text="and thanks to them for Emacs/Org integration.<br />" start="00:03:10.168" video="mainVideo" id=subtitle]]
[[!template text="\- I contribute with public emails" start="00:03:12.934" video="mainVideo" id=subtitle]]
-[[!template text="on the Org mailing list." start="00:03:16.034" video="mainVideo" id=subtitle]]
-[[!template text="\- I release new versions of Org-mode." start="00:03:17.801" video="mainVideo" id=subtitle]]
+[[!template text="on the Org mailing list.<br />" start="00:03:16.034" video="mainVideo" id=subtitle]]
+[[!template text="\- I release new versions of Org-mode.<br />" start="00:03:17.801" video="mainVideo" id=subtitle]]
[[!template text="\- and sometimes, sometimes," start="00:03:20.501" video="mainVideo" id=subtitle]]
-[[!template text="I contribute with code." start="00:03:22.634" video="mainVideo" id=subtitle]]
+[[!template text="I contribute with code.<br />" start="00:03:22.634" video="mainVideo" id=subtitle]]
[[!template new="1" text="Do you see a pattern here?" start="00:03:24.601" video="mainVideo" id=subtitle]]
[[!template text="Yes. I bet the last three tasks" start="00:03:27.168" video="mainVideo" id=subtitle]]
[[!template text="is what most people have in mind" start="00:03:30.468" video="mainVideo" id=subtitle]]
@@ -92,8 +93,8 @@
[[!template text="are only a superficial part" start="00:03:39.734" video="mainVideo" id=subtitle]]
[[!template text="of what I do as a maintainer." start="00:03:41.601" video="mainVideo" id=subtitle]]
[[!template text="Some would consider that these core tasks" start="00:03:43.201" video="mainVideo" id=subtitle]]
-[[!template text="are the /interesting/ ones," start="00:03:47.001" video="mainVideo" id=subtitle]]
-[[!template text="while the others are the /boring/ ones." start="00:03:48.501" video="mainVideo" id=subtitle]]
+[[!template text="are the interesting ones," start="00:03:47.001" video="mainVideo" id=subtitle]]
+[[!template text="while the others are the boring ones." start="00:03:48.501" video="mainVideo" id=subtitle]]
[[!template text="I don't see it that way:" start="00:03:51.634" video="mainVideo" id=subtitle]]
[[!template text="some tasks are about the product," start="00:03:53.901" video="mainVideo" id=subtitle]]
[[!template text="others are about the project." start="00:03:56.534" video="mainVideo" id=subtitle]]
@@ -115,18 +116,18 @@
[[!template text="so that they collectively" start="00:04:30.968" video="mainVideo" id=subtitle]]
[[!template text="take care of the project." start="00:04:32.768" video="mainVideo" id=subtitle]]
[[!template text="See another pattern here?" start="00:04:34.201" video="mainVideo" id=subtitle]]
-[[!template text="That's all about the /project/," start="00:04:36.734" video="mainVideo" id=subtitle]]
+[[!template text="Yeah, that's all about the project," start="00:04:36.734" video="mainVideo" id=subtitle]]
[[!template text="versus the product." start="00:04:40.301" video="mainVideo" id=subtitle]]
-[[!template text="It's about /taking care of it/," start="00:04:41.501" video="mainVideo" id=subtitle]]
+[[!template text="It's about taking care of it," start="00:04:41.501" video="mainVideo" id=subtitle]]
[[!template text="versus being a direct hotline for users," start="00:04:43.634" video="mainVideo" id=subtitle]]
-[[!template text="caring about the project infrastructure" start="00:04:46.934" video="mainVideo" id=subtitle]]
+[[!template text="so, it's caring about the project infrastructure" start="00:04:46.934" video="mainVideo" id=subtitle]]
[[!template text="and about empowering users" start="00:04:49.901" video="mainVideo" id=subtitle]]
[[!template text="with tools and incentives" start="00:04:52.134" video="mainVideo" id=subtitle]]
[[!template text="so that they care too." start="00:04:54.234" video="mainVideo" id=subtitle]]
[[!template text="How can you help such a maintainer?" start="00:04:55.268" video="mainVideo" id=subtitle]]
[[!template text="By focusing on the project" start="00:04:58.434" video="mainVideo" id=subtitle]]
[[!template text="and becoming an enabler yourself." start="00:05:00.901" video="mainVideo" id=subtitle]]
-[[!template new="1" text="Let's pause and summarize:" start="00:05:03.901" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, let's pause and summarize:" start="00:05:03.901" video="mainVideo" id=subtitle]]
[[!template text="our culture wants heroes" start="00:05:06.934" video="mainVideo" id=subtitle]]
[[!template text="and this leads us to expect maintainers" start="00:05:08.801" video="mainVideo" id=subtitle]]
[[!template text="to be superhackers and superactive hotlines." start="00:05:12.434" video="mainVideo" id=subtitle]]
@@ -135,22 +136,22 @@
[[!template text="and soon becomes the Headmaster Of Troubles." start="00:05:23.368" video="mainVideo" id=subtitle]]
[[!template new="1" text="To resist this HOT mindset," start="00:05:26.901" video="mainVideo" id=subtitle]]
[[!template text="I suggest to redefine maintenance as ACDC:" start="00:05:29.501" video="mainVideo" id=subtitle]]
-[[!template text="*Asynchronous Collective Distributed Care*:" start="00:05:33.201" video="mainVideo" id=subtitle]]
-[[!template text="\- /Asynchronous/ because time management" start="00:05:36.534" video="mainVideo" id=subtitle]]
+[[!template text="“Asynchronous Collective Distributed Care”:" start="00:05:33.201" video="mainVideo" id=subtitle]]
+[[!template new="1" text="“Asynchronous” because time management" start="00:05:36.534" video="mainVideo" id=subtitle]]
[[!template text="is a private matter" start="00:05:38.968" video="mainVideo" id=subtitle]]
[[!template text="and we are all volunteers." start="00:05:40.168" video="mainVideo" id=subtitle]]
-[[!template text="\- /Collective/ because, well," start="00:05:41.968" video="mainVideo" id=subtitle]]
+[[!template new="1" text="“Collective” because, well," start="00:05:41.968" video="mainVideo" id=subtitle]]
[[!template text="no man is an island." start="00:05:44.168" video="mainVideo" id=subtitle]]
-[[!template text="\- /Distributed/: because the more power" start="00:05:45.634" video="mainVideo" id=subtitle]]
-[[!template text="to the &quot;edges&quot;, the more resilient" start="00:05:49.201" video="mainVideo" id=subtitle]]
+[[!template new="1" text="“Distributed”: because the more power" start="00:05:45.634" video="mainVideo" id=subtitle]]
+[[!template text="to the “edges”, the more resilient" start="00:05:49.201" video="mainVideo" id=subtitle]]
[[!template text="the system and the project is." start="00:05:51.601" video="mainVideo" id=subtitle]]
-[[!template text="\- /Care/ because this is all about care:" start="00:05:53.534" video="mainVideo" id=subtitle]]
+[[!template new="1" text="“Care” because this is all about care:" start="00:05:53.534" video="mainVideo" id=subtitle]]
[[!template text="with each other as users" start="00:05:56.368" video="mainVideo" id=subtitle]]
[[!template text="or as contributors," start="00:05:58.501" video="mainVideo" id=subtitle]]
[[!template text="with the project's infrastructure" start="00:06:00.134" video="mainVideo" id=subtitle]]
[[!template text="(servers, websites, bug trackers, etc.)" start="00:06:02.101" video="mainVideo" id=subtitle]]
[[!template text="and care about having a useful product." start="00:06:05.301" video="mainVideo" id=subtitle]]
-[[!template text="/Enabling/ users and contributors means" start="00:06:08.701" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, “enabling” users and contributors means" start="00:06:08.701" video="mainVideo" id=subtitle]]
[[!template text="encouraging them to take ownership," start="00:06:13.901" video="mainVideo" id=subtitle]]
[[!template text="which is more than just delegating tasks." start="00:06:16.468" video="mainVideo" id=subtitle]]
[[!template text="Let your users and contributors know" start="00:06:19.801" video="mainVideo" id=subtitle]]
@@ -158,65 +159,65 @@
[[!template text="the collective attention pool with care:" start="00:06:23.901" video="mainVideo" id=subtitle]]
[[!template text="the more autonomous they are, the better." start="00:06:26.434" video="mainVideo" id=subtitle]]
[[!template new="1" text="So, with this ACDC definition in mind," start="00:06:28.801" video="mainVideo" id=subtitle]]
-[[!template text="how can /you/ help Emacs maintainers?" start="00:06:33.801" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- First of all, by *becoming a maintainer" start="00:06:37.534" video="mainVideo" id=subtitle]]
-[[!template text="for your own project*, however small." start="00:06:41.268" video="mainVideo" id=subtitle]]
-[[!template text="Think in terms of project (vs product)." start="00:06:44.334" video="mainVideo" id=subtitle]]
+[[!template text="how can <i>you</i> help Emacs maintainers?" start="00:06:33.801" video="mainVideo" id=subtitle]]
+[[!template new="1" text="First of all, by <i>becoming</i> a maintainer" start="00:06:37.534" video="mainVideo" id=subtitle]]
+[[!template text="for your own project, however small." start="00:06:41.268" video="mainVideo" id=subtitle]]
+[[!template text="Think in terms of project vs. product." start="00:06:44.334" video="mainVideo" id=subtitle]]
[[!template text="Empower users and contributors." start="00:06:47.001" video="mainVideo" id=subtitle]]
[[!template text="This will help you understand" start="00:06:49.034" video="mainVideo" id=subtitle]]
[[!template text="how to help other maintainers." start="00:06:50.668" video="mainVideo" id=subtitle]]
-[[!template text="(&quot;More power to the edges!&quot;)" start="00:06:54.068" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Volunteer as a contributor steward" start="00:06:56.501" video="mainVideo" id=subtitle]]
-[[!template text="for another project*: you don't need to" start="00:07:00.001" video="mainVideo" id=subtitle]]
+[[!template text="“More power to the edges!”" start="00:06:54.068" video="mainVideo" id=subtitle]]
+[[!template new="1" text="<i>Volunteer</i> as a contributor steward" start="00:06:56.501" video="mainVideo" id=subtitle]]
+[[!template text="for another project: you don't need to" start="00:07:00.001" video="mainVideo" id=subtitle]]
[[!template text="be a supersmart hacker" start="00:07:02.201" video="mainVideo" id=subtitle]]
[[!template text="to help others to contribute." start="00:07:03.868" video="mainVideo" id=subtitle]]
-[[!template text="(For Org-mode, we are lucky to have" start="00:07:05.634" video="mainVideo" id=subtitle]]
-[[!template text="two great contributor stewards.)" start="00:07:07.701" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Learn how to teach*," start="00:07:10.901" video="mainVideo" id=subtitle]]
+[[!template text="For Org-mode, we are lucky to have" start="00:07:05.634" video="mainVideo" id=subtitle]]
+[[!template text="two great contributor stewards." start="00:07:07.701" video="mainVideo" id=subtitle]]
+[[!template new="1" text="<i>Learn</i> how to teach," start="00:07:10.901" video="mainVideo" id=subtitle]]
[[!template text="because pedagogical skills are invaluable." start="00:07:12.868" video="mainVideo" id=subtitle]]
-[[!template text="(Taking the time to explain" start="00:07:16.468" video="mainVideo" id=subtitle]]
+[[!template text="Taking the time to explain" start="00:07:16.468" video="mainVideo" id=subtitle]]
[[!template text="how to write a bug report or a patch" start="00:07:18.301" video="mainVideo" id=subtitle]]
[[!template text="is invaluable and this is a core part" start="00:07:20.868" video="mainVideo" id=subtitle]]
-[[!template text="of the Org culture.)" start="00:07:23.834" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Test and enhance the project's" start="00:07:25.401" video="mainVideo" id=subtitle]]
-[[!template text="contribution process*. (For Org-mode," start="00:07:27.801" video="mainVideo" id=subtitle]]
+[[!template text="of the Org culture." start="00:07:23.834" video="mainVideo" id=subtitle]]
+[[!template new="1" text="<i>Test</i> and <i>enhance</i> the project's" start="00:07:25.401" video="mainVideo" id=subtitle]]
+[[!template text="contribution process. For Org-mode," start="00:07:27.801" video="mainVideo" id=subtitle]]
[[!template text="you would read and suggest contributions to" start="00:07:30.001" video="mainVideo" id=subtitle]]
-[[!template text="the org-contribute pages on Worg.)" start="00:07:33.268" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Take care of the project's calls for help*." start="00:07:35.634" video="mainVideo" id=subtitle]]
-[[!template text="(For Org-mode, this would be this list" start="00:07:38.601" video="mainVideo" id=subtitle]]
+[[!template text="the org-contribute pages on Worg." start="00:07:33.268" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Take care of the project's <i>calls for help</i>." start="00:07:35.634" video="mainVideo" id=subtitle]]
+[[!template text="For Org-mode, this would be this list" start="00:07:38.601" video="mainVideo" id=subtitle]]
[[!template text="that we have on updates.orgmode.org" start="00:07:40.560" video="mainVideo" id=subtitle]]
-[[!template text="For Emacs, this would be =etc/TODO= file.)" start="00:07:43.599" video="mainVideo" id=subtitle]]
+[[!template text="For Emacs, this would be <i>etc/TODO</i> file." start="00:07:43.599" video="mainVideo" id=subtitle]]
[[!template text="If the calls for help are not explicit enough," start="00:07:47.234" video="mainVideo" id=subtitle]]
[[!template text="try to contribute some." start="00:07:50.834" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Encourage users from outside the project" start="00:07:52.834" video="mainVideo" id=subtitle]]
-[[!template text="to contribute to the core forum*." start="00:07:56.701" video="mainVideo" id=subtitle]]
-[[!template text="(For Org-mode, there are many hacks and fixes" start="00:07:58.434" video="mainVideo" id=subtitle]]
-[[!template text="being shared on reddit and stackoverflow:" start="00:08:01.434" video="mainVideo" id=subtitle]]
+[[!template new="1" text="<i>Encourage</i> users from outside the project" start="00:07:52.834" video="mainVideo" id=subtitle]]
+[[!template text="to contribute to the core forum." start="00:07:56.701" video="mainVideo" id=subtitle]]
+[[!template text="For Org-mode, there are many hacks and fixes" start="00:07:58.434" video="mainVideo" id=subtitle]]
+[[!template text="being shared on Reddit and Stack Overflow," start="00:08:01.434" video="mainVideo" id=subtitle]]
[[!template text="and that's fine, but we we should not" start="00:08:03.901" video="mainVideo" id=subtitle]]
[[!template text="wait for months before having this" start="00:08:05.401" video="mainVideo" id=subtitle]]
-[[!template text="shared on the list.)" start="00:08:07.401" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Let the core forum know about" start="00:08:08.801" video="mainVideo" id=subtitle]]
-[[!template text="what happens in this outside world*" start="00:08:11.434" video="mainVideo" id=subtitle]]
+[[!template text="shared on the list." start="00:08:07.401" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let the core forum <i>know</i> about" start="00:08:08.801" video="mainVideo" id=subtitle]]
+[[!template text="what happens in this outside world" start="00:08:11.434" video="mainVideo" id=subtitle]]
[[!template text="by sharing important information yourself." start="00:08:13.701" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Propose your help for non-code tasks*:" start="00:08:16.601" video="mainVideo" id=subtitle]]
+[[!template new="1" text="<i>Propose</i> your help for non-code tasks:" start="00:08:16.601" video="mainVideo" id=subtitle]]
[[!template text="maintain a website," start="00:08:19.868" video="mainVideo" id=subtitle]]
-[[!template text="enhance the (community-driven) documentation," start="00:08:21.368" video="mainVideo" id=subtitle]]
+[[!template text="enhance the community-driven documentation," start="00:08:21.368" video="mainVideo" id=subtitle]]
[[!template text="help with bug triage, etc." start="00:08:23.734" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *If you expect someone else to fix your bug," start="00:08:26.101" video="mainVideo" id=subtitle]]
-[[!template text="try fixing someone else's bug too*:" start="00:08:29.568" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If you expect someone else to fix your bug," start="00:08:26.101" video="mainVideo" id=subtitle]]
+[[!template text="try fixing someone else's bug first, and too:" start="00:08:29.568" video="mainVideo" id=subtitle]]
[[!template text="that's how you'll learn Emacs Lisp" start="00:08:33.234" video="mainVideo" id=subtitle]]
[[!template text="and that's how you'll concretely" start="00:08:36.234" video="mainVideo" id=subtitle]]
[[!template text="train your empathy, your sense of taking care." start="00:08:37.668" video="mainVideo" id=subtitle]]
[[!template text="That is so critical." start="00:08:40.501" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- *Don't expect the maintainer" start="00:08:42.068" video="mainVideo" id=subtitle]]
-[[!template text="to be a hotline*," start="00:08:44.101" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Don't expect the maintainer" start="00:08:42.068" video="mainVideo" id=subtitle]]
+[[!template text="to be a <i>hotline</i>," start="00:08:44.101" video="mainVideo" id=subtitle]]
[[!template text="especially a private one." start="00:08:45.168" video="mainVideo" id=subtitle]]
[[!template text="Address yourself to the community." start="00:08:46.801" video="mainVideo" id=subtitle]]
-[[!template new="1" text="\- and last but not least," start="00:08:49.234" video="mainVideo" id=subtitle]]
-[[!template text="*complete this list*." start="00:08:51.968" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And last but not least," start="00:08:49.234" video="mainVideo" id=subtitle]]
+[[!template text="<i>complete</i> this list." start="00:08:51.968" video="mainVideo" id=subtitle]]
[[!template text="I'm trying to open a conversation here," start="00:08:53.120" video="mainVideo" id=subtitle]]
[[!template text="so don't be shy." start="00:08:54.959" video="mainVideo" id=subtitle]]
-[[!template new="1" text="That's it. Is it hard? Yes, this is hard," start="00:08:57.168" video="mainVideo" id=subtitle]]
+[[!template new="1" text="That's it. Uhm, is it hard? Yes, this is hard," start="00:08:57.168" video="mainVideo" id=subtitle]]
[[!template text="and that's because helping maintainers" start="00:09:01.760" video="mainVideo" id=subtitle]]
[[!template text="by becoming such a enabler" start="00:09:04.640" video="mainVideo" id=subtitle]]
[[!template text="in this ACDC mindset" start="00:09:07.760" video="mainVideo" id=subtitle]]
@@ -231,15 +232,15 @@
[[!template text="that enables more contributions," start="00:09:26.634" video="mainVideo" id=subtitle]]
[[!template text="you will see how important and rewarding" start="00:09:28.934" video="mainVideo" id=subtitle]]
[[!template text="it is to become such an enabler." start="00:09:31.734" video="mainVideo" id=subtitle]]
-[[!template new="1" text="So, definitely grateful to all enablers" start="00:09:35.668" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, definitely grateful to all the enablers" start="00:09:35.668" video="mainVideo" id=subtitle]]
[[!template text="that we have in Org's community!" start="00:09:39.701" video="mainVideo" id=subtitle]]
[[!template text="And to everyone who maintains" start="00:09:41.401" video="mainVideo" id=subtitle]]
[[!template text="a culture of teaching and learning" start="00:09:43.734" video="mainVideo" id=subtitle]]
[[!template text="through polite and respectful interactions" start="00:09:45.701" video="mainVideo" id=subtitle]]
[[!template text="on the mailing list and elsewhere:" start="00:09:49.068" video="mainVideo" id=subtitle]]
-[[!template text="we always need more &quot;power to the edges&quot;." start="00:09:50.801" video="mainVideo" id=subtitle]]
+[[!template text="we always need more “power to the edges”." start="00:09:50.801" video="mainVideo" id=subtitle]]
[[!template text="And I'm also very grateful" start="00:09:55.001" video="mainVideo" id=subtitle]]
-[[!template text="to the EmacsConf 2021 organizers," start="00:09:57.168" video="mainVideo" id=subtitle]]
+[[!template text="to the EmacsConf organizers," start="00:09:57.168" video="mainVideo" id=subtitle]]
[[!template text="because that's really taking care" start="00:09:59.034" video="mainVideo" id=subtitle]]
-[[!template text="of the community! Thanks very much." start="00:10:02.568" video="mainVideo" id=subtitle]]
-[[!template text="captions by bzg and sachac" start="00:10:03.568" video="mainVideo" id=subtitle]]
+[[!template text="of the community! So, thanks very much!" start="00:10:02.568" video="mainVideo" id=subtitle]]
+[[!template text="captions by bzg, sachac, and zaeph" start="00:10:05.068" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/native.md b/2021/captions/native.md
new file mode 100644
index 00000000..83e30473
--- /dev/null
+++ b/2021/captions/native.md
@@ -0,0 +1,920 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi everybody, my name is Andrea Corallo," start="00:00:00.200" video="mainVideo" id=subtitle]]
+[[!template text="and this presentation is about" start="00:00:02.440" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs Lisp Native Compiler --" start="00:00:03.382" video="mainVideo" id=subtitle]]
+[[!template text="having GNU Emacs able to" start="00:00:05.904" video="mainVideo" id=subtitle]]
+[[!template text="compile and run Emacs Lisp as native code." start="00:00:07.184" video="mainVideo" id=subtitle]]
+[[!template text="This project has been my hobby project" start="00:00:08.907" video="mainVideo" id=subtitle]]
+[[!template text="for the last about two years and a half" start="00:00:11.667" video="mainVideo" id=subtitle]]
+[[!template text="And we will see a little bit" start="00:00:14.111" video="mainVideo" id=subtitle]]
+[[!template text="where this project is coming from," start="00:00:15.509" video="mainVideo" id=subtitle]]
+[[!template text="where we are, and where we want to go." start="00:00:17.070" video="mainVideo" id=subtitle]]
+[[!template text="So essentially everything you need to know" start="00:00:19.015" video="mainVideo" id=subtitle]]
+[[!template text="about the Emacs Lisp Native Compiler," start="00:00:20.672" video="mainVideo" id=subtitle]]
+[[!template text="and probably a little more." start="00:00:22.232" video="mainVideo" id=subtitle]]
+[[!template text="Just a little bit of context on Emacs Lisp." start="00:00:23.521" video="mainVideo" id=subtitle]]
+[[!template text="Well, Emacs Lisp is a programming language," start="00:00:26.635" video="mainVideo" id=subtitle]]
+[[!template text="it's indeed a Lisp," start="00:00:30.278" video="mainVideo" id=subtitle]]
+[[!template text="and one year ago I looked for some statistics," start="00:00:33.647" video="mainVideo" id=subtitle]]
+[[!template text="and I was kind of pleased to see" start="00:00:36.722" video="mainVideo" id=subtitle]]
+[[!template text="-- surprised to see actually --" start="00:00:38.842" video="mainVideo" id=subtitle]]
+[[!template text="that it's still kind of popular" start="00:00:40.132" video="mainVideo" id=subtitle]]
+[[!template text="as a programming language." start="00:00:41.073" video="mainVideo" id=subtitle]]
+[[!template text="It doesn't rank that bad" start="00:00:42.944" video="mainVideo" id=subtitle]]
+[[!template text="against other programming languages." start="00:00:43.785" video="mainVideo" id=subtitle]]
+[[!template text="Also, the other important fact about Emacs Lisp" start="00:00:45.658" video="mainVideo" id=subtitle]]
+[[!template text="is that there is a lot of Emacs Lisp out there," start="00:00:48.487" video="mainVideo" id=subtitle]]
+[[!template text="and this will have an impact on this project." start="00:00:51.622" video="mainVideo" id=subtitle]]
+[[!template text="It's a programming language that is capable" start="00:00:56.025" video="mainVideo" id=subtitle]]
+[[!template text="of almost any task, so it's" start="00:00:57.734" video="mainVideo" id=subtitle]]
+[[!template text="almost a general-purpose programming language," start="00:00:59.420" video="mainVideo" id=subtitle]]
+[[!template text="and this reflects on Emacs itself," start="00:01:01.831" video="mainVideo" id=subtitle]]
+[[!template text="that it's capable of almost any task." start="00:01:04.217" video="mainVideo" id=subtitle]]
+[[!template text="Indeed this &quot ;almost&quot ; is something we want to fix," start="00:01:07.335" video="mainVideo" id=subtitle]]
+[[!template text="because we want to do everything," start="00:01:09.781" video="mainVideo" id=subtitle]]
+[[!template text="we want to do all of our computing with Emacs." start="00:01:10.820" video="mainVideo" id=subtitle]]
+[[!template text="Also, an interesting aspect for me" start="00:01:14.321" video="mainVideo" id=subtitle]]
+[[!template text="is that it's not specified by any standard." start="00:01:16.625" video="mainVideo" id=subtitle]]
+[[!template text="This implies it can evolve in a more agile way" start="00:01:19.005" video="mainVideo" id=subtitle]]
+[[!template text="without having to change the standard, etc." start="00:01:22.609" video="mainVideo" id=subtitle]]
+[[!template text="And, in fact, it's kind of improving," start="00:01:25.770" video="mainVideo" id=subtitle]]
+[[!template text="I believe relatively fast." start="00:01:27.970" video="mainVideo" id=subtitle]]
+[[!template text="A little bit about Lisp in general." start="00:01:30.473" video="mainVideo" id=subtitle]]
+[[!template text="First, it's the best programming language ever," start="00:01:32.892" video="mainVideo" id=subtitle]]
+[[!template text="we all know it." start="00:01:35.052" video="mainVideo" id=subtitle]]
+[[!template text="It has a lot of very nice properties," start="00:01:35.813" video="mainVideo" id=subtitle]]
+[[!template text="like it's dynamic, it's homoiconic, etc." start="00:01:37.934" video="mainVideo" id=subtitle]]
+[[!template text="But the interesting thing for implementors," start="00:01:40.462" video="mainVideo" id=subtitle]]
+[[!template text="is that, in theory," start="00:01:42.496" video="mainVideo" id=subtitle]]
+[[!template text="it can be implemented with very few primitives." start="00:01:43.576" video="mainVideo" id=subtitle]]
+[[!template text="You build very few primitives that are like magic," start="00:01:46.817" video="mainVideo" id=subtitle]]
+[[!template text="and on top of this," start="00:01:49.590" video="mainVideo" id=subtitle]]
+[[!template text="you can implement the whole language." start="00:01:51.938" video="mainVideo" id=subtitle]]
+[[!template text="This sounds very nice," start="00:01:53.873" video="mainVideo" id=subtitle]]
+[[!template text="and very appealing for implementors" start="00:01:55.860" video="mainVideo" id=subtitle]]
+[[!template text="meaning to implement a new Lisp implementation," start="00:01:57.381" video="mainVideo" id=subtitle]]
+[[!template text="or improving or modifying an existing one." start="00:02:00.279" video="mainVideo" id=subtitle]]
+[[!template text="So the question is:" start="00:02:02.641" video="mainVideo" id=subtitle]]
+[[!template text="how many primitives do we have to implement" start="00:02:04.263" video="mainVideo" id=subtitle]]
+[[!template text="if we want to change" start="00:02:07.764" video="mainVideo" id=subtitle]]
+[[!template text="the GNU Emacs Lisp implementation?" start="00:02:09.485" video="mainVideo" id=subtitle]]
+[[!template text="Unfortunately, not really as few as we would like." start="00:02:13.308" video="mainVideo" id=subtitle]]
+[[!template text="In GNU Emacs, we have about 1500 primitives," start="00:02:20.234" video="mainVideo" id=subtitle]]
+[[!template text="and the main reason for that is performance." start="00:02:25.400" video="mainVideo" id=subtitle]]
+[[!template text="Actually, GNU Emacs was written" start="00:02:28.071" video="mainVideo" id=subtitle]]
+[[!template text="when performance was a big issue," start="00:02:31.064" video="mainVideo" id=subtitle]]
+[[!template text="and nowadays certain parts" start="00:02:34.393" video="mainVideo" id=subtitle]]
+[[!template text="are still performance-critical." start="00:02:36.594" video="mainVideo" id=subtitle]]
+[[!template text="We have a lot of C code;" start="00:02:38.591" video="mainVideo" id=subtitle]]
+[[!template text="30% of the GNU Emacs codebase is C code," start="00:02:40.395" video="mainVideo" id=subtitle]]
+[[!template text="and we have to maintain this." start="00:02:46.435" video="mainVideo" id=subtitle]]
+[[!template text="But not only that, this is the main barrier" start="00:02:49.279" video="mainVideo" id=subtitle]]
+[[!template text="for people that tried in the past" start="00:02:52.959" video="mainVideo" id=subtitle]]
+[[!template text="to change the Emacs Lisp implementation." start="00:02:55.681" video="mainVideo" id=subtitle]]
+[[!template text="Because not only do you have to" start="00:02:57.765" video="mainVideo" id=subtitle]]
+[[!template text="replace these primitives," start="00:02:59.202" video="mainVideo" id=subtitle]]
+[[!template text="all of them or part of them," start="00:03:01.683" video="mainVideo" id=subtitle]]
+[[!template text="but sometimes they also share (these primitives)," start="00:03:04.012" video="mainVideo" id=subtitle]]
+[[!template text="internal data structures." start="00:03:06.484" video="mainVideo" id=subtitle]]
+[[!template text="For instance, it's very difficult to say:" start="00:03:08.055" video="mainVideo" id=subtitle]]
+[[!template text="Now I want to go from C" start="00:03:09.846" video="mainVideo" id=subtitle]]
+[[!template text="to a different programming language" start="00:03:12.926" video="mainVideo" id=subtitle]]
+[[!template text="for implementing these primitives." start="00:03:14.006" video="mainVideo" id=subtitle]]
+[[!template text="So this has been, effectively," start="00:03:15.740" video="mainVideo" id=subtitle]]
+[[!template text="the main barrier for doing this work." start="00:03:17.128" video="mainVideo" id=subtitle]]
+[[!template text="Another interesting aspect" start="00:03:20.486" video="mainVideo" id=subtitle]]
+[[!template text="about the GNU Emacs implementation" start="00:03:22.190" video="mainVideo" id=subtitle]]
+[[!template text="is that Lisp can run interpreted" start="00:03:23.970" video="mainVideo" id=subtitle]]
+[[!template text="or byte-compiled for performance," start="00:03:26.291" video="mainVideo" id=subtitle]]
+[[!template text="and the byte compiler itself" start="00:03:28.752" video="mainVideo" id=subtitle]]
+[[!template text="is written in Emacs Lisp." start="00:03:30.733" video="mainVideo" id=subtitle]]
+[[!template text="This implies that GNU Emacs has to go through" start="00:03:32.773" video="mainVideo" id=subtitle]]
+[[!template text="a bootstrap procedure in order to be built." start="00:03:35.134" video="mainVideo" id=subtitle]]
+[[!template text="But it's kind of interesting" start="00:03:37.319" video="mainVideo" id=subtitle]]
+[[!template text="for something that started as a text editor," start="00:03:38.815" video="mainVideo" id=subtitle]]
+[[!template text="or something like it." start="00:03:41.937" video="mainVideo" id=subtitle]]
+[[!template text="The byte-code that is Emacs Lisp" start="00:03:43.203" video="mainVideo" id=subtitle]]
+[[!template text="when it's been byte compiled," start="00:03:47.979" video="mainVideo" id=subtitle]]
+[[!template text="it's running on a stack-based virtual machine" start="00:03:50.379" video="mainVideo" id=subtitle]]
+[[!template text="that is implemented in C." start="00:03:53.180" video="mainVideo" id=subtitle]]
+[[!template text="OK, so I've listed a bunch of areas" start="00:03:55.253" video="mainVideo" id=subtitle]]
+[[!template text="where Emacs Lisp could improve:" start="00:03:59.842" video="mainVideo" id=subtitle]]
+[[!template text="Namespace, Extensibility, Performance," start="00:04:02.178" video="mainVideo" id=subtitle]]
+[[!template text="and Debuggability, and Diagnostic, we could say." start="00:04:07.025" video="mainVideo" id=subtitle]]
+[[!template text="This activity, this project in particular," start="00:04:11.346" video="mainVideo" id=subtitle]]
+[[!template text="is affecting primarily Performance" start="00:04:14.428" video="mainVideo" id=subtitle]]
+[[!template text="and the performance area the Execution Engine." start="00:04:17.189" video="mainVideo" id=subtitle]]
+[[!template text="That said," start="00:04:21.414" video="mainVideo" id=subtitle]]
+[[!template text="I think it has an impact also on Extensibility," start="00:04:22.671" video="mainVideo" id=subtitle]]
+[[!template text="and I hope it will have an impact also" start="00:04:25.957" video="mainVideo" id=subtitle]]
+[[!template text="on programming diagnostics," start="00:04:27.913" video="mainVideo" id=subtitle]]
+[[!template text="so giving better warnings, unknown." start="00:04:29.881" video="mainVideo" id=subtitle]]
+[[!template text="So which are the benefits" start="00:04:32.604" video="mainVideo" id=subtitle]]
+[[!template text="of increasing the Emacs Lisp performance?" start="00:04:36.795" video="mainVideo" id=subtitle]]
+[[!template text="Indeed, we will have, if we do that," start="00:04:39.316" video="mainVideo" id=subtitle]]
+[[!template text="programs that run faster." start="00:04:43.078" video="mainVideo" id=subtitle]]
+[[!template text="But the main implication of that" start="00:04:45.774" video="mainVideo" id=subtitle]]
+[[!template text="is that we could write less C;" start="00:04:48.840" video="mainVideo" id=subtitle]]
+[[!template text="we could maintain and debug less C." start="00:04:50.860" video="mainVideo" id=subtitle]]
+[[!template text="That is kind of a time-consuming task." start="00:04:53.041" video="mainVideo" id=subtitle]]
+[[!template text="And we could also allow for" start="00:04:56.542" video="mainVideo" id=subtitle]]
+[[!template text="writing performance-critical extensions" start="00:04:59.603" video="mainVideo" id=subtitle]]
+[[!template text="directly in Lisp" start="00:05:01.824" video="mainVideo" id=subtitle]]
+[[!template text="without having to use systems like" start="00:05:03.909" video="mainVideo" id=subtitle]]
+[[!template text="I think there's a bunch." start="00:05:06.406" video="mainVideo" id=subtitle]]
+[[!template text="These are very consistent benefits." start="00:05:09.927" video="mainVideo" id=subtitle]]
+[[!template text="OK, Project Goals," start="00:05:14.899" video="mainVideo" id=subtitle]]
+[[!template text="but I think the title of this slide" start="00:05:16.769" video="mainVideo" id=subtitle]]
+[[!template text="maybe should be Project Requirements." start="00:05:18.930" video="mainVideo" id=subtitle]]
+[[!template text="So when I started this activity," start="00:05:21.623" video="mainVideo" id=subtitle]]
+[[!template text="I set some requirements for the project," start="00:05:23.331" video="mainVideo" id=subtitle]]
+[[!template text="with the main goal in mind: to go upstream." start="00:05:27.049" video="mainVideo" id=subtitle]]
+[[!template text="So I wanted to create something," start="00:05:29.570" video="mainVideo" id=subtitle]]
+[[!template text="a modified implementation of GNU Emacs," start="00:05:31.594" video="mainVideo" id=subtitle]]
+[[!template text="that was compatible" start="00:05:34.353" video="mainVideo" id=subtitle]]
+[[!template text="as close to 100% as possible" start="00:05:36.776" video="mainVideo" id=subtitle]]
+[[!template text="to the current implementation." start="00:05:38.696" video="mainVideo" id=subtitle]]
+[[!template text="And when I say &quot ;current implementation,&quot ;" start="00:05:40.620" video="mainVideo" id=subtitle]]
+[[!template text="I don't refer to what" start="00:05:42.820" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs Lisp Programming Manual specifies" start="00:05:44.859" video="mainVideo" id=subtitle]]
+[[!template text="as expected behavior of the implementation," start="00:05:46.980" video="mainVideo" id=subtitle]]
+[[!template text="but really the implementation itself." start="00:05:49.907" video="mainVideo" id=subtitle]]
+[[!template text="This is because there are a lot of corner cases" start="00:05:52.309" video="mainVideo" id=subtitle]]
+[[!template text="that are not specified by the manual," start="00:05:53.942" video="mainVideo" id=subtitle]]
+[[!template text="but programs do rely on that," start="00:05:56.493" video="mainVideo" id=subtitle]]
+[[!template text="and given there is a ton of Emacs Lisp" start="00:05:58.193" video="mainVideo" id=subtitle]]
+[[!template text="already around," start="00:06:00.625" video="mainVideo" id=subtitle]]
+[[!template text="compatibility was definitely a major requirement." start="00:06:02.037" video="mainVideo" id=subtitle]]
+[[!template text="I wanted to produce something that had" start="00:06:05.541" video="mainVideo" id=subtitle]]
+[[!template text="reduced impact on the Emacs codebase," start="00:06:07.827" video="mainVideo" id=subtitle]]
+[[!template text="at least as much as possible." start="00:06:09.687" video="mainVideo" id=subtitle]]
+[[!template text="So I didn't want to rewrite all of GNU Emacs." start="00:06:11.644" video="mainVideo" id=subtitle]]
+[[!template text="Indeed, because it would have been" start="00:06:14.827" video="mainVideo" id=subtitle]]
+[[!template text="too much work for one single person," start="00:06:17.710" video="mainVideo" id=subtitle]]
+[[!template text="but also still thinking" start="00:06:21.171" video="mainVideo" id=subtitle]]
+[[!template text="to an upstream outcome all of this time." start="00:06:25.473" video="mainVideo" id=subtitle]]
+[[!template text="Another requirement was to have" start="00:06:29.258" video="mainVideo" id=subtitle]]
+[[!template text="no, or very reduced, impact on the user," start="00:06:32.076" video="mainVideo" id=subtitle]]
+[[!template text="so I didn't want to change" start="00:06:34.804" video="mainVideo" id=subtitle]]
+[[!template text="the way Emacs is used by you." start="00:06:36.556" video="mainVideo" id=subtitle]]
+[[!template text="And last but not least," start="00:06:38.708" video="mainVideo" id=subtitle]]
+[[!template text="introducing new dependencies," start="00:06:40.718" video="mainVideo" id=subtitle]]
+[[!template text="those dependencies had to be Free Software," start="00:06:42.951" video="mainVideo" id=subtitle]]
+[[!template text="possibly GPL," start="00:06:45.479" video="mainVideo" id=subtitle]]
+[[!template text="and also an important requirement" start="00:06:47.295" video="mainVideo" id=subtitle]]
+[[!template text="is that these dependencies had to be" start="00:06:50.097" video="mainVideo" id=subtitle]]
+[[!template text="some kind of trusted software that we know" start="00:06:53.043" video="mainVideo" id=subtitle]]
+[[!template text="is going to be maintained in the future." start="00:06:55.243" video="mainVideo" id=subtitle]]
+[[!template text="Given Emacs has been around since forever," start="00:06:56.781" video="mainVideo" id=subtitle]]
+[[!template text="and will be around forever and ever," start="00:06:59.363" video="mainVideo" id=subtitle]]
+[[!template text="this was another very important point." start="00:07:01.285" video="mainVideo" id=subtitle]]
+[[!template text="A little bit of history of this project/" start="00:07:05.367" video="mainVideo" id=subtitle]]
+[[!template text="a quick timeline." start="00:07:08.808" video="mainVideo" id=subtitle]]
+[[!template text="2019, in May, I did my first commit," start="00:07:10.748" video="mainVideo" id=subtitle]]
+[[!template text="I think it was when I tried to write" start="00:07:14.490" video="mainVideo" id=subtitle]]
+[[!template text="my first primitive function ever in C," start="00:07:17.210" video="mainVideo" id=subtitle]]
+[[!template text="in GNU Emacs." start="00:07:20.332" video="mainVideo" id=subtitle]]
+[[!template text="And this was an attempt to try to compile" start="00:07:21.852" video="mainVideo" id=subtitle]]
+[[!template text="a function that, once executed, returning ?" start="00:07:24.934" video="mainVideo" id=subtitle]]
+[[!template text="That was it. Six months after (about)," start="00:07:30.415" video="mainVideo" id=subtitle]]
+[[!template text="I had something that was kind of working," start="00:07:33.857" video="mainVideo" id=subtitle]]
+[[!template text="So I was able to start up a semi-standard Emacs" start="00:07:37.157" video="mainVideo" id=subtitle]]
+[[!template text="and then to compile and load," start="00:07:42.899" video="mainVideo" id=subtitle]]
+[[!template text="and replacing most of the functions" start="00:07:44.981" video="mainVideo" id=subtitle]]
+[[!template text="that I had defined floating in my Lisp universe." start="00:07:47.321" video="mainVideo" id=subtitle]]
+[[!template text="Those functions are the functions" start="00:07:51.022" video="mainVideo" id=subtitle]]
+[[!template text="that are essentially composing Emacs," start="00:07:54.304" video="mainVideo" id=subtitle]]
+[[!template text="at least the Lisp side of Emacs." start="00:07:56.044" video="mainVideo" id=subtitle]]
+[[!template text="A lot of features were missing," start="00:07:57.984" video="mainVideo" id=subtitle]]
+[[!template text="like I had no Garbage Collector support," start="00:08:01.186" video="mainVideo" id=subtitle]]
+[[!template text="no bootstrap, I was not optimizing these functions" start="00:08:03.526" video="mainVideo" id=subtitle]]
+[[!template text="Because optimization would be broken." start="00:08:07.108" video="mainVideo" id=subtitle]]
+[[!template text="No image dump support, etc." start="00:08:10.169" video="mainVideo" id=subtitle]]
+[[!template text="But I think this proved the design could work." start="00:08:12.850" video="mainVideo" id=subtitle]]
+[[!template text="So I sent to email to emacs-devel. I said" start="00:08:16.431" video="mainVideo" id=subtitle]]
+[[!template text="I have this stuff I'm working on," start="00:08:19.272" video="mainVideo" id=subtitle]]
+[[!template text="and I wanted some feedback from the upstream" start="00:08:20.953" video="mainVideo" id=subtitle]]
+[[!template text="to see if there was some interest." start="00:08:24.714" video="mainVideo" id=subtitle]]
+[[!template text="I believe the outcome of this was positive" start="00:08:27.635" video="mainVideo" id=subtitle]]
+[[!template text="because about one month after," start="00:08:30.557" video="mainVideo" id=subtitle]]
+[[!template text="I pushed my branch within the Emacs git" start="00:08:32.937" video="mainVideo" id=subtitle]]
+[[!template text="as a feature branch, and shortly after," start="00:08:35.798" video="mainVideo" id=subtitle]]
+[[!template text="we started to use the bug tracker to track bugs." start="00:08:38.539" video="mainVideo" id=subtitle]]
+[[!template text="So essentially we moved the development" start="00:08:42.779" video="mainVideo" id=subtitle]]
+[[!template text="on the upstream infrastructure." start="00:08:45.580" video="mainVideo" id=subtitle]]
+[[!template text="I believe two years after the first commit," start="00:08:50.140" video="mainVideo" id=subtitle]]
+[[!template text="the project was merged" start="00:08:55.721" video="mainVideo" id=subtitle]]
+[[!template text="after literally hundreds of bugs solved," start="00:08:57.882" video="mainVideo" id=subtitle]]
+[[!template text="and improvements, suggestions unknown" start="00:09:01.022" video="mainVideo" id=subtitle]]
+[[!template text="and this was about six months ago." start="00:09:03.943" video="mainVideo" id=subtitle]]
+[[!template text="Before discussing how the native compiler works," start="00:09:08.723" video="mainVideo" id=subtitle]]
+[[!template text="I think it's worth looking at" start="00:09:12.464" video="mainVideo" id=subtitle]]
+[[!template text="how Lisp is implemented in GNU Emacs." start="00:09:14.324" video="mainVideo" id=subtitle]]
+[[!template text="We have Lisp_Objects" start="00:09:17.745" video="mainVideo" id=subtitle]]
+[[!template text="floating around our Lisp universe," start="00:09:19.405" video="mainVideo" id=subtitle]]
+[[!template text="and they are internally represented in this way." start="00:09:22.045" video="mainVideo" id=subtitle]]
+[[!template text="We have what is called a tagged pointer," start="00:09:24.006" video="mainVideo" id=subtitle]]
+[[!template text="that is just a regular pointer" start="00:09:25.706" video="mainVideo" id=subtitle]]
+[[!template text="that is pointing to the area of memory" start="00:09:27.506" video="mainVideo" id=subtitle]]
+[[!template text="where we hold the real data of the object." start="00:09:29.386" video="mainVideo" id=subtitle]]
+[[!template text="But within this tagged pointer," start="00:09:32.027" video="mainVideo" id=subtitle]]
+[[!template text="we reserve a few bits" start="00:09:34.287" video="mainVideo" id=subtitle]]
+[[!template text="to indicate the type of object we are pointing to." start="00:09:36.848" video="mainVideo" id=subtitle]]
+[[!template text="This is important because" start="00:09:39.068" video="mainVideo" id=subtitle]]
+[[!template text="each time we access an object," start="00:09:40.628" video="mainVideo" id=subtitle]]
+[[!template text="we have to typically check those bits" start="00:09:42.388" video="mainVideo" id=subtitle]]
+[[!template text="to check that the object we are manipulating" start="00:09:46.269" video="mainVideo" id=subtitle]]
+[[!template text="is of the right kind," start="00:09:49.129" video="mainVideo" id=subtitle]]
+[[!template text="remove those bits, and, if we are happy," start="00:09:50.630" video="mainVideo" id=subtitle]]
+[[!template text="access the object, otherwise unknown." start="00:09:52.630" video="mainVideo" id=subtitle]]
+[[!template text="All the objects are like this," start="00:09:55.910" video="mainVideo" id=subtitle]]
+[[!template text="except for typically Fixnums," start="00:09:57.791" video="mainVideo" id=subtitle]]
+[[!template text="that are small integers" start="00:09:59.831" video="mainVideo" id=subtitle]]
+[[!template text="that we manage to fit directly within the pointer." start="00:10:01.131" video="mainVideo" id=subtitle]]
+[[!template text="Also for manipulating Fixnums," start="00:10:04.992" video="mainVideo" id=subtitle]]
+[[!template text="we have to check the tag bits each time." start="00:10:07.392" video="mainVideo" id=subtitle]]
+[[!template text="Whenever we are not sure of the type of object" start="00:10:09.513" video="mainVideo" id=subtitle]]
+[[!template text="we are manipulating (read: almost every time)," start="00:10:13.273" video="mainVideo" id=subtitle]]
+[[!template text="we have to check those bits and remove those bits" start="00:10:16.594" video="mainVideo" id=subtitle]]
+[[!template text="before doing any manipulation on the Fixnum." start="00:10:19.014" video="mainVideo" id=subtitle]]
+[[!template text="How Emacs Lisp is byte-compiled and executed" start="00:10:21.854" video="mainVideo" id=subtitle]]
+[[!template text="in, let's call it, &quot ;Vanilla&quot ;." start="00:10:26.115" video="mainVideo" id=subtitle]]
+[[!template text="If we have a Lisp expression of this kind:" start="00:10:27.875" video="mainVideo" id=subtitle]]
+[[!template text="We take the variable 'a' we do plus 2," start="00:10:30.156" video="mainVideo" id=subtitle]]
+[[!template text="and then we multiply the result by 3," start="00:10:32.876" video="mainVideo" id=subtitle]]
+[[!template text="the byte compiler will produce this LAP code." start="00:10:34.976" video="mainVideo" id=subtitle]]
+[[!template text="LAP code is essentially" start="00:10:37.477" video="mainVideo" id=subtitle]]
+[[!template text="the assembly for the byte-code," start="00:10:38.597" video="mainVideo" id=subtitle]]
+[[!template text="so it's the &quot ;intermediate representation&quot ;" start="00:10:40.117" video="mainVideo" id=subtitle]]
+[[!template text="that will assembled into byte-code. (.elc files)" start="00:10:43.798" video="mainVideo" id=subtitle]]
+[[!template text="How is this program executed?" start="00:10:48.558" video="mainVideo" id=subtitle]]
+[[!template text="As I mentioned, it's executed in a virtual machine" start="00:10:50.839" video="mainVideo" id=subtitle]]
+[[!template text="that is stack-based," start="00:10:53.739" video="mainVideo" id=subtitle]]
+[[!template text="but we start with an execution stack that's empty," start="00:10:55.800" video="mainVideo" id=subtitle]]
+[[!template text="and a stack pointer pointing to its bottom." start="00:10:58.640" video="mainVideo" id=subtitle]]
+[[!template text="And we execute the first instruction," start="00:11:01.780" video="mainVideo" id=subtitle]]
+[[!template text="that is pushing in the stack the value of 'a'," start="00:11:04.380" video="mainVideo" id=subtitle]]
+[[!template text="in this case, 100. Then we push the constant 2." start="00:11:07.220" video="mainVideo" id=subtitle]]
+[[!template text="Then we do the summation," start="00:11:10.460" video="mainVideo" id=subtitle]]
+[[!template text="and we have the result in the stack." start="00:11:12.500" video="mainVideo" id=subtitle]]
+[[!template text="Same: we push the constant 3," start="00:11:14.140" video="mainVideo" id=subtitle]]
+[[!template text="we do the multiplication," start="00:11:16.960" video="mainVideo" id=subtitle]]
+[[!template text="and we will be able to return." start="00:11:17.720" video="mainVideo" id=subtitle]]
+[[!template text="Now, what's good and what's bad about this?" start="00:11:19.360" video="mainVideo" id=subtitle]]
+[[!template text="A good thing is that it's very simple" start="00:11:22.800" video="mainVideo" id=subtitle]]
+[[!template text="to start from Lisp" start="00:11:25.900" video="mainVideo" id=subtitle]]
+[[!template text="and compile this kind of LAP output." start="00:11:27.560" video="mainVideo" id=subtitle]]
+[[!template text="At least it's reasonably simple." start="00:11:31.420" video="mainVideo" id=subtitle]]
+[[!template text="The compiler is not that complex." start="00:11:34.340" video="mainVideo" id=subtitle]]
+[[!template text="The bad thing is that all this machinery" start="00:11:36.340" video="mainVideo" id=subtitle]]
+[[!template text="-- push and pop, etc. --" start="00:11:39.100" video="mainVideo" id=subtitle]]
+[[!template text="it's very different from how a modern CPU works." start="00:11:40.760" video="mainVideo" id=subtitle]]
+[[!template text="Because modern CPUs," start="00:11:44.420" video="mainVideo" id=subtitle]]
+[[!template text="they are not stack-based anymore" start="00:11:45.820" video="mainVideo" id=subtitle]]
+[[!template text="but they have instead a fixed number of registers," start="00:11:47.760" video="mainVideo" id=subtitle]]
+[[!template text="and they work with assignment and operation" start="00:11:51.000" video="mainVideo" id=subtitle]]
+[[!template text="within these registers" start="00:11:54.120" video="mainVideo" id=subtitle]]
+[[!template text="that are generally called &quot ;general-purpose.&quot ;" start="00:11:55.140" video="mainVideo" id=subtitle]]
+[[!template text="So to execute this LAP program," start="00:11:57.140" video="mainVideo" id=subtitle]]
+[[!template text="there is another program," start="00:11:59.360" video="mainVideo" id=subtitle]]
+[[!template text="that is the implementation of the VM itself" start="00:12:00.860" video="mainVideo" id=subtitle]]
+[[!template text="that is doing conversion during runtime." start="00:12:02.700" video="mainVideo" id=subtitle]]
+[[!template text="So it's interpreting the LAP program" start="00:12:06.500" video="mainVideo" id=subtitle]]
+[[!template text="and it's converting it into instructions" start="00:12:08.420" video="mainVideo" id=subtitle]]
+[[!template text="that we can execute on the CPU." start="00:12:11.460" video="mainVideo" id=subtitle]]
+[[!template text="This conversion is done each time" start="00:12:13.280" video="mainVideo" id=subtitle]]
+[[!template text="we will run some byte-code." start="00:12:15.040" video="mainVideo" id=subtitle]]
+[[!template text="And it's something that we want to avoid." start="00:12:17.200" video="mainVideo" id=subtitle]]
+[[!template text="Instead of this live conversion," start="00:12:19.860" video="mainVideo" id=subtitle]]
+[[!template text="we want to convert once:" start="00:12:21.660" video="mainVideo" id=subtitle]]
+[[!template text="our Lisp program into native code," start="00:12:26.320" video="mainVideo" id=subtitle]]
+[[!template text="that is, a binary program that can be executed" start="00:12:29.020" video="mainVideo" id=subtitle]]
+[[!template text="directly by our CPU." start="00:12:32.480" video="mainVideo" id=subtitle]]
+[[!template text="We want to save all this unnecessary conversion" start="00:12:34.500" video="mainVideo" id=subtitle]]
+[[!template text="that we do each time we are running a program" start="00:12:36.780" video="mainVideo" id=subtitle]]
+[[!template text="while we are running it." start="00:12:39.100" video="mainVideo" id=subtitle]]
+[[!template text="And we want to do this process just once," start="00:12:39.860" video="mainVideo" id=subtitle]]
+[[!template text="when we are compiling." start="00:12:42.160" video="mainVideo" id=subtitle]]
+[[!template text="That's the main goal of this activity." start="00:12:43.840" video="mainVideo" id=subtitle]]
+[[!template text="How is the byte compiler implemented?" start="00:12:46.340" video="mainVideo" id=subtitle]]
+[[!template text="As any compiler it's a pipeline of transformations." start="00:12:50.300" video="mainVideo" id=subtitle]]
+[[!template text="We go through macro expansion, closure conversion," start="00:12:54.040" video="mainVideo" id=subtitle]]
+[[!template text="we have a bunch of source level optimization." start="00:12:58.660" video="mainVideo" id=subtitle]]
+[[!template text="Then we go into LAP," start="00:13:02.220" video="mainVideo" id=subtitle]]
+[[!template text="that's the transformation we are interested in," start="00:13:04.040" video="mainVideo" id=subtitle]]
+[[!template text="and after a few optimizations on LAP," start="00:13:06.900" video="mainVideo" id=subtitle]]
+[[!template text="LAP is assembled into byte-code." start="00:13:10.700" video="mainVideo" id=subtitle]]
+[[!template text="So if we list it" start="00:13:14.240" video="mainVideo" id=subtitle]]
+[[!template text="in terms of intermediate representations," start="00:13:16.980" video="mainVideo" id=subtitle]]
+[[!template text="we can simplify this pipeline like this." start="00:13:19.420" video="mainVideo" id=subtitle]]
+[[!template text="We start with Lisp, and at a certain point" start="00:13:23.700" video="mainVideo" id=subtitle]]
+[[!template text="we are manipulating the program in LAP form," start="00:13:26.200" video="mainVideo" id=subtitle]]
+[[!template text="and then at the end we produce the byte-code" start="00:13:29.620" video="mainVideo" id=subtitle]]
+[[!template text="that is the .elc file that you run" start="00:13:32.080" video="mainVideo" id=subtitle]]
+[[!template text="What I wanted to realize was something like this." start="00:13:34.660" video="mainVideo" id=subtitle]]
+[[!template text="I wanted to start from LAP, do something," start="00:13:37.760" video="mainVideo" id=subtitle]]
+[[!template text="and jump into GCC using libgccjit" start="00:13:41.300" video="mainVideo" id=subtitle]]
+[[!template text="and in particular" start="00:13:44.700" video="mainVideo" id=subtitle]]
+[[!template text="the libgccjit Intermediate Representation" start="00:13:45.660" video="mainVideo" id=subtitle]]
+[[!template text="that we will discuss." start="00:13:48.100" video="mainVideo" id=subtitle]]
+[[!template text="Now, why I wanted to do something like this?" start="00:13:50.440" video="mainVideo" id=subtitle]]
+[[!template text="Essentially, writing a compiler from scratch" start="00:13:53.220" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs Lisp would have been a very big task." start="00:13:57.400" video="mainVideo" id=subtitle]]
+[[!template text="So I wanted to rely on, as much as I could," start="00:14:01.620" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs Lisp byte compiler," start="00:14:05.220" video="mainVideo" id=subtitle]]
+[[!template text="because I had to produce something" start="00:14:07.280" video="mainVideo" id=subtitle]]
+[[!template text="that was as compatible as possible" start="00:14:10.380" video="mainVideo" id=subtitle]]
+[[!template text="to the current implementation." start="00:14:13.020" video="mainVideo" id=subtitle]]
+[[!template text="So this was (I believe) a very good idea" start="00:14:14.340" video="mainVideo" id=subtitle]]
+[[!template text="to save an enormous quantity of work" start="00:14:18.440" video="mainVideo" id=subtitle]]
+[[!template text="and to produce something" start="00:14:20.620" video="mainVideo" id=subtitle]]
+[[!template text="that was compatible in terms of semantics" start="00:14:22.440" video="mainVideo" id=subtitle]]
+[[!template text="with the original implementation." start="00:14:25.040" video="mainVideo" id=subtitle]]
+[[!template text="Also, I didn't want to implement a code generator" start="00:14:26.920" video="mainVideo" id=subtitle]]
+[[!template text="for each architecture we were targeting," start="00:14:30.760" video="mainVideo" id=subtitle]]
+[[!template text="nor wanted to implement all these optimizations" start="00:14:32.960" video="mainVideo" id=subtitle]]
+[[!template text="that are already in GCC," start="00:14:36.000" video="mainVideo" id=subtitle]]
+[[!template text="so I thought it was a good idea" start="00:14:37.940" video="mainVideo" id=subtitle]]
+[[!template text="to rely on an existing compiler like GCC ?." start="00:14:40.220" video="mainVideo" id=subtitle]]
+[[!template text="Let's talk about libgccjit." start="00:14:44.820" video="mainVideo" id=subtitle]]
+[[!template text="It was added by David Malcolm in GCC 5" start="00:14:47.340" video="mainVideo" id=subtitle]]
+[[!template text="It allows you to describe a C-ish semantic to GCC" start="00:14:50.280" video="mainVideo" id=subtitle]]
+[[!template text="and have it compile." start="00:14:55.780" video="mainVideo" id=subtitle]]
+[[!template text="It's good for reading Jitters or AoT compilers." start="00:14:57.480" video="mainVideo" id=subtitle]]
+[[!template text="And if we talk about GCC:" start="00:15:01.500" video="mainVideo" id=subtitle]]
+[[!template text="it's a compiler, it's a very good one," start="00:15:04.500" video="mainVideo" id=subtitle]]
+[[!template text="it has support for a remarkable number" start="00:15:07.280" video="mainVideo" id=subtitle]]
+[[!template text="of target architectures." start="00:15:09.440" video="mainVideo" id=subtitle]]
+[[!template text="It's also very good at generating fast code," start="00:15:11.740" video="mainVideo" id=subtitle]]
+[[!template text="and it's been around for a long time;" start="00:15:15.180" video="mainVideo" id=subtitle]]
+[[!template text="I believe it's like 1 year younger than Emacs." start="00:15:18.080" video="mainVideo" id=subtitle]]
+[[!template text="It's still very well maintained," start="00:15:21.300" video="mainVideo" id=subtitle]]
+[[!template text="and we can assume it will be maintained" start="00:15:23.320" video="mainVideo" id=subtitle]]
+[[!template text="for quite a while. And, as I mentioned," start="00:15:25.940" video="mainVideo" id=subtitle]]
+[[!template text="this was a very important point." start="00:15:29.020" video="mainVideo" id=subtitle]]
+[[!template text="Also, it's GPL; it's Free Software," start="00:15:31.220" video="mainVideo" id=subtitle]]
+[[!template text="and it's developed under the GNU umbrella," start="00:15:33.960" video="mainVideo" id=subtitle]]
+[[!template text="so I thought it was a very good option." start="00:15:36.220" video="mainVideo" id=subtitle]]
+[[!template text="So we can imagine a simple translation" start="00:15:40.460" video="mainVideo" id=subtitle]]
+[[!template text="that goes from LAP to this subset of C" start="00:15:43.400" video="mainVideo" id=subtitle]]
+[[!template text="that we can describe to libgccjit." start="00:15:46.500" video="mainVideo" id=subtitle]]
+[[!template text="This simple translation we can see here," start="00:15:48.980" video="mainVideo" id=subtitle]]
+[[!template text="it's actually pretty trivial." start="00:15:52.980" video="mainVideo" id=subtitle]]
+[[!template text="Instead of doing operations" start="00:15:55.780" video="mainVideo" id=subtitle]]
+[[!template text="within the execution stack we have seen before," start="00:15:58.600" video="mainVideo" id=subtitle]]
+[[!template text="we have just an array that is replacing it," start="00:16:02.160" video="mainVideo" id=subtitle]]
+[[!template text="and it's called 'local' in this case," start="00:16:05.180" video="mainVideo" id=subtitle]]
+[[!template text="and we have assignments within this array," start="00:16:07.480" video="mainVideo" id=subtitle]]
+[[!template text="so that they are done in place of the original" start="00:16:12.460" video="mainVideo" id=subtitle]]
+[[!template text="push and pop activity of the stack." start="00:16:15.240" video="mainVideo" id=subtitle]]
+[[!template text="The nice thing is that," start="00:16:17.200" video="mainVideo" id=subtitle]]
+[[!template text="when you have done this translation," start="00:16:18.380" video="mainVideo" id=subtitle]]
+[[!template text="GCC will be able to optimize this," start="00:16:20.360" video="mainVideo" id=subtitle]]
+[[!template text="and remove all the unnecessary operations," start="00:16:23.260" video="mainVideo" id=subtitle]]
+[[!template text="and generate code" start="00:16:25.940" video="mainVideo" id=subtitle]]
+[[!template text="for the specific CPU you are targeting," start="00:16:27.280" video="mainVideo" id=subtitle]]
+[[!template text="which will be running your code." start="00:16:29.760" video="mainVideo" id=subtitle]]
+[[!template text="This sounds great; it sounds like" start="00:16:32.120" video="mainVideo" id=subtitle]]
+[[!template text="a very simple and effective translation," start="00:16:35.020" video="mainVideo" id=subtitle]]
+[[!template text="and in fact the first iteration of my compiler" start="00:16:37.540" video="mainVideo" id=subtitle]]
+[[!template text="was doing just this." start="00:16:40.020" video="mainVideo" id=subtitle]]
+[[!template text="It was essentially a big C function" start="00:16:41.220" video="mainVideo" id=subtitle]]
+[[!template text="that was taking LAP and doing this conversion" start="00:16:45.420" video="mainVideo" id=subtitle]]
+[[!template text="describing the output to libgccjit." start="00:16:48.340" video="mainVideo" id=subtitle]]
+[[!template text="Unfortunately, if you do this," start="00:16:50.220" video="mainVideo" id=subtitle]]
+[[!template text="you will discover that you have" start="00:16:53.820" video="mainVideo" id=subtitle]]
+[[!template text="a performance upper bound limit of about 3x." start="00:16:55.840" video="mainVideo" id=subtitle]]
+[[!template text="So it was an option," start="00:17:00.180" video="mainVideo" id=subtitle]]
+[[!template text="but I thought it was a good occasion" start="00:17:04.460" video="mainVideo" id=subtitle]]
+[[!template text="for trying to do something more." start="00:17:06.660" video="mainVideo" id=subtitle]]
+[[!template text="And doing something more means" start="00:17:09.080" video="mainVideo" id=subtitle]]
+[[!template text="implementing a smarter compiler" start="00:17:11.740" video="mainVideo" id=subtitle]]
+[[!template text="that is doing some advanced analysis on the code," start="00:17:13.780" video="mainVideo" id=subtitle]]
+[[!template text="and will be able to perform" start="00:17:17.280" video="mainVideo" id=subtitle]]
+[[!template text="Lisp-specific optimizations" start="00:17:18.740" video="mainVideo" id=subtitle]]
+[[!template text="-- optimizations that take advantage of" start="00:17:20.800" video="mainVideo" id=subtitle]]
+[[!template text="the specific Lisp semantics," start="00:17:22.580" video="mainVideo" id=subtitle]]
+[[!template text="something that GCC is not aware of." start="00:17:25.060" video="mainVideo" id=subtitle]]
+[[!template text="And while I was thinking about that," start="00:17:27.860" video="mainVideo" id=subtitle]]
+[[!template text="I thought that having a smarter compiler" start="00:17:31.340" video="mainVideo" id=subtitle]]
+[[!template text="had also other advantages, like a smarter compiler" start="00:17:34.100" video="mainVideo" id=subtitle]]
+[[!template text="that understands the semantics" start="00:17:38.220" video="mainVideo" id=subtitle]]
+[[!template text="of the programming language being compiled" start="00:17:40.220" video="mainVideo" id=subtitle]]
+[[!template text="would be also capable of" start="00:17:41.920" video="mainVideo" id=subtitle]]
+[[!template text="giving feedback to the programmers," start="00:17:43.780" video="mainVideo" id=subtitle]]
+[[!template text="like better warnings and errors." start="00:17:45.720" video="mainVideo" id=subtitle]]
+[[!template text="So I was really fascinated about this idea," start="00:17:48.020" video="mainVideo" id=subtitle]]
+[[!template text="and I wanted to change my implementation" start="00:17:51.460" video="mainVideo" id=subtitle]]
+[[!template text="because I was not really happy about it." start="00:17:53.340" video="mainVideo" id=subtitle]]
+[[!template text="I had a lot of C code in terms of" start="00:17:56.020" video="mainVideo" id=subtitle]]
+[[!template text="lines that were not doing any smart job." start="00:17:58.420" video="mainVideo" id=subtitle]]
+[[!template text="And I wanted to write all the interesting logic" start="00:18:02.200" video="mainVideo" id=subtitle]]
+[[!template text="in Lisp." start="00:18:07.480" video="mainVideo" id=subtitle]]
+[[!template text="So optimizing outside GCC" start="00:18:10.040" video="mainVideo" id=subtitle]]
+[[!template text="before jumping into GCC," start="00:18:12.660" video="mainVideo" id=subtitle]]
+[[!template text="as I mentioned, has two main targets:" start="00:18:15.940" video="mainVideo" id=subtitle]]
+[[!template text="Either optimize the code before going into GCC," start="00:18:20.600" video="mainVideo" id=subtitle]]
+[[!template text="or present to GCC some code" start="00:18:23.160" video="mainVideo" id=subtitle]]
+[[!template text="that we know GCC can optimize effectively." start="00:18:25.480" video="mainVideo" id=subtitle]]
+[[!template text="And also, this will give, as I mentioned," start="00:18:27.840" video="mainVideo" id=subtitle]]
+[[!template text="better options for the compiler" start="00:18:30.900" video="mainVideo" id=subtitle]]
+[[!template text="to provide warnings, errors" start="00:18:32.760" video="mainVideo" id=subtitle]]
+[[!template text="-- better diagnostics." start="00:18:34.520" video="mainVideo" id=subtitle]]
+[[!template text="So this is pretty much" start="00:18:36.440" video="mainVideo" id=subtitle]]
+[[!template text="what the native compiler looks like nowadays," start="00:18:38.300" video="mainVideo" id=subtitle]]
+[[!template text="in terms of passes." start="00:18:40.740" video="mainVideo" id=subtitle]]
+[[!template text="We have a list of passes," start="00:18:42.820" video="mainVideo" id=subtitle]]
+[[!template text="each of which is taking an input" start="00:18:44.660" video="mainVideo" id=subtitle]]
+[[!template text="and producing an output." start="00:18:46.720" video="mainVideo" id=subtitle]]
+[[!template text="So it's doing either analysis on the program" start="00:18:48.220" video="mainVideo" id=subtitle]]
+[[!template text="that's being passed," start="00:18:51.140" video="mainVideo" id=subtitle]]
+[[!template text="or it's performing a transformation." start="00:18:52.740" video="mainVideo" id=subtitle]]
+[[!template text="All of these passes are implemented in Lisp," start="00:18:54.860" video="mainVideo" id=subtitle]]
+[[!template text="and only the last pass is implemented in C." start="00:18:58.000" video="mainVideo" id=subtitle]]
+[[!template text="That is the one that is talking to libgccjit." start="00:19:00.540" video="mainVideo" id=subtitle]]
+[[!template text="To do that, I have introduced" start="00:19:05.160" video="mainVideo" id=subtitle]]
+[[!template text="a new intermediate representation" start="00:19:07.860" video="mainVideo" id=subtitle]]
+[[!template text="that I call LIMPLE, as a tribute to GCC GIMPLE," start="00:19:10.740" video="mainVideo" id=subtitle]]
+[[!template text="that is the main internal representation of GCC," start="00:19:14.060" video="mainVideo" id=subtitle]]
+[[!template text="at least one of the main ones." start="00:19:17.320" video="mainVideo" id=subtitle]]
+[[!template text="Introducing a new intermediate representation" start="00:19:20.700" video="mainVideo" id=subtitle]]
+[[!template text="-- a new way of representing my program --" start="00:19:25.180" video="mainVideo" id=subtitle]]
+[[!template text="solved a bunch of problems." start="00:19:27.820" video="mainVideo" id=subtitle]]
+[[!template text="First, it allowed me to implement" start="00:19:29.640" video="mainVideo" id=subtitle]]
+[[!template text="non-trivial analysis and transformations," start="00:19:33.300" video="mainVideo" id=subtitle]]
+[[!template text="the ones I needed in my compiler pipeline." start="00:19:37.380" video="mainVideo" id=subtitle]]
+[[!template text="But also, it solved the problem of" start="00:19:40.100" video="mainVideo" id=subtitle]]
+[[!template text="what was the boundary between" start="00:19:42.260" video="mainVideo" id=subtitle]]
+[[!template text="what I had to implement in Lisp," start="00:19:43.940" video="mainVideo" id=subtitle]]
+[[!template text="and what in C." start="00:19:46.220" video="mainVideo" id=subtitle]]
+[[!template text="Because once I had" start="00:19:48.140" video="mainVideo" id=subtitle]]
+[[!template text="my intermediate representation defined," start="00:19:49.140" video="mainVideo" id=subtitle]]
+[[!template text="essentially the boundary between Lisp and C" start="00:19:51.960" video="mainVideo" id=subtitle]]
+[[!template text="is just a function, that is," start="00:19:53.880" video="mainVideo" id=subtitle]]
+[[!template text="the one that is implementing the final pass." start="00:19:55.740" video="mainVideo" id=subtitle]]
+[[!template text="That is taking, as an input," start="00:19:57.880" video="mainVideo" id=subtitle]]
+[[!template text="all of my programs in LIMPLE representation" start="00:19:59.320" video="mainVideo" id=subtitle]]
+[[!template text="and it's doing his bit." start="00:20:01.720" video="mainVideo" id=subtitle]]
+[[!template text="So I was convinced this design at least had sense." start="00:20:03.980" video="mainVideo" id=subtitle]]
+[[!template text="When we go through some of these passes," start="00:20:08.080" video="mainVideo" id=subtitle]]
+[[!template text="just to give you an idea of what these are doing:" start="00:20:10.220" video="mainVideo" id=subtitle]]
+[[!template text="the first pass is just responsible for" start="00:20:12.700" video="mainVideo" id=subtitle]]
+[[!template text="spilling the LAP from the byte compiler" start="00:20:14.660" video="mainVideo" id=subtitle]]
+[[!template text="that effectively here we are using as a front end" start="00:20:18.200" video="mainVideo" id=subtitle]]
+[[!template text="for our compiler pipeline." start="00:20:20.260" video="mainVideo" id=subtitle]]
+[[!template text="The second pass, called 'limplify'," start="00:20:21.880" video="mainVideo" id=subtitle]]
+[[!template text="will be in charge of converting LAP into LIMPLE." start="00:20:24.140" video="mainVideo" id=subtitle]]
+[[!template text="LIMPLE is an intermediate representation" start="00:20:28.020" video="mainVideo" id=subtitle]]
+[[!template text="that is Control Flow Graph based," start="00:20:31.360" video="mainVideo" id=subtitle]]
+[[!template text="and it's capable of SSA." start="00:20:32.960" video="mainVideo" id=subtitle]]
+[[!template text="So we can have a look to what this means." start="00:20:34.800" video="mainVideo" id=subtitle]]
+[[!template text="Let's assume we have our LAP program," start="00:20:38.740" video="mainVideo" id=subtitle]]
+[[!template text="as any program," start="00:20:41.400" video="mainVideo" id=subtitle]]
+[[!template text="that's a simple list of instructions" start="00:20:42.620" video="mainVideo" id=subtitle]]
+[[!template text="that we will execute one after the other." start="00:20:44.060" video="mainVideo" id=subtitle]]
+[[!template text="Some of these instructions" start="00:20:45.740" video="mainVideo" id=subtitle]]
+[[!template text="are special instructions" start="00:20:47.460" video="mainVideo" id=subtitle]]
+[[!template text="that we call conditional branches," start="00:20:49.300" video="mainVideo" id=subtitle]]
+[[!template text="where we check for a condition," start="00:20:51.340" video="mainVideo" id=subtitle]]
+[[!template text="and if this is verified," start="00:20:52.900" video="mainVideo" id=subtitle]]
+[[!template text="we jump to a different address within the program." start="00:20:54.420" video="mainVideo" id=subtitle]]
+[[!template text="(Addresses that here we are calling 'labels'.)" start="00:20:57.040" video="mainVideo" id=subtitle]]
+[[!template text="So we can split our program in chunks," start="00:20:59.680" video="mainVideo" id=subtitle]]
+[[!template text="and those chunks we execute without interruption," start="00:21:03.540" video="mainVideo" id=subtitle]]
+[[!template text="so we always enter from the top of those," start="00:21:08.300" video="mainVideo" id=subtitle]]
+[[!template text="and we exit from the bottom." start="00:21:10.560" video="mainVideo" id=subtitle]]
+[[!template text="We can name those, and split them apart," start="00:21:12.700" video="mainVideo" id=subtitle]]
+[[!template text="and these are what we call basic blocks." start="00:21:16.080" video="mainVideo" id=subtitle]]
+[[!template text="And now we have a bunch of these basic blocks" start="00:21:19.080" video="mainVideo" id=subtitle]]
+[[!template text="that are floating," start="00:21:22.460" video="mainVideo" id=subtitle]]
+[[!template text="and they are not any more sorted." start="00:21:23.480" video="mainVideo" id=subtitle]]
+[[!template text="This is what is called" start="00:21:25.120" video="mainVideo" id=subtitle]]
+[[!template text="a Control Flow Graph based representation." start="00:21:26.020" video="mainVideo" id=subtitle]]
+[[!template text="Now we can get into the SSA topic." start="00:21:28.780" video="mainVideo" id=subtitle]]
+[[!template text="That stands for Static Single Assignment." start="00:21:31.500" video="mainVideo" id=subtitle]]
+[[!template text="I don't want to get into the details," start="00:21:34.000" video="mainVideo" id=subtitle]]
+[[!template text="but just give you a feeling." start="00:21:35.960" video="mainVideo" id=subtitle]]
+[[!template text="I added into our basic blocks" start="00:21:36.820" video="mainVideo" id=subtitle]]
+[[!template text="in our Control Flow Graph a few assignments." start="00:21:38.580" video="mainVideo" id=subtitle]]
+[[!template text="We will transform this into SSA" start="00:21:41.500" video="mainVideo" id=subtitle]]
+[[!template text="just for the variable 'x'," start="00:21:43.940" video="mainVideo" id=subtitle]]
+[[!template text="just for the sake of demonstrating it." start="00:21:45.140" video="mainVideo" id=subtitle]]
+[[!template text="This is done through a number of phases" start="00:21:47.460" video="mainVideo" id=subtitle]]
+[[!template text="that are essentially some analysis," start="00:21:49.860" video="mainVideo" id=subtitle]]
+[[!template text="mainly renaming." start="00:21:51.860" video="mainVideo" id=subtitle]]
+[[!template text="But the outcome, the one we see here," start="00:21:52.700" video="mainVideo" id=subtitle]]
+[[!template text="looks quite similar to the original one," start="00:21:55.660" video="mainVideo" id=subtitle]]
+[[!template text="but we can see that the variable 'x'" start="00:21:59.220" video="mainVideo" id=subtitle]]
+[[!template text="has been renamed." start="00:22:01.220" video="mainVideo" id=subtitle]]
+[[!template text="And now we don't have anymore just one," start="00:22:02.060" video="mainVideo" id=subtitle]]
+[[!template text="but a number of these variables." start="00:22:03.500" video="mainVideo" id=subtitle]]
+[[!template text="The interesting property is that" start="00:22:06.240" video="mainVideo" id=subtitle]]
+[[!template text="each of these variables is assigned just once." start="00:22:08.100" video="mainVideo" id=subtitle]]
+[[!template text="And this allows for the compiler" start="00:22:10.980" video="mainVideo" id=subtitle]]
+[[!template text="to do prediction of the value of that variable," start="00:22:13.340" video="mainVideo" id=subtitle]]
+[[!template text="depending on the position" start="00:22:16.860" video="mainVideo" id=subtitle]]
+[[!template text="within the Control Flow Graph." start="00:22:19.140" video="mainVideo" id=subtitle]]
+[[!template text="This is very important. For instance," start="00:22:19.940" video="mainVideo" id=subtitle]]
+[[!template text="a very simple case is 'x1'" start="00:22:22.080" video="mainVideo" id=subtitle]]
+[[!template text="that we see is assigned once by definition," start="00:22:23.540" video="mainVideo" id=subtitle]]
+[[!template text="in particular here at the beginning." start="00:22:27.540" video="mainVideo" id=subtitle]]
+[[!template text="Here it's very simple to understand" start="00:22:29.400" video="mainVideo" id=subtitle]]
+[[!template text="that x1 will have the value 3." start="00:22:31.140" video="mainVideo" id=subtitle]]
+[[!template text="While, for instance, it's more difficult to prove" start="00:22:33.180" video="mainVideo" id=subtitle]]
+[[!template text="what is going to be the value of x5," start="00:22:35.480" video="mainVideo" id=subtitle]]
+[[!template text="because it's calling a function," start="00:22:37.160" video="mainVideo" id=subtitle]]
+[[!template text="or we don't know at the moment what x4 is." start="00:22:38.720" video="mainVideo" id=subtitle]]
+[[!template text="So the compiler will gain the capability" start="00:22:42.040" video="mainVideo" id=subtitle]]
+[[!template text="to do prediction on all the variables," start="00:22:46.340" video="mainVideo" id=subtitle]]
+[[!template text="and the more we get information on one variable," start="00:22:48.560" video="mainVideo" id=subtitle]]
+[[!template text="the more we can prove about the others." start="00:22:50.720" video="mainVideo" id=subtitle]]
+[[!template text="Coming back to our passes, the next one" start="00:22:55.460" video="mainVideo" id=subtitle]]
+[[!template text="is forward propagation." start="00:22:57.380" video="mainVideo" id=subtitle]]
+[[!template text="This pass is responsible for" start="00:22:59.420" video="mainVideo" id=subtitle]]
+[[!template text="doing what I briefly mentioned just before:" start="00:23:00.700" video="mainVideo" id=subtitle]]
+[[!template text="doing proof over all the different variables" start="00:23:03.340" video="mainVideo" id=subtitle]]
+[[!template text="in different positions of the Control Flow Graph," start="00:23:07.260" video="mainVideo" id=subtitle]]
+[[!template text="about the values, types, or ranges." start="00:23:09.720" video="mainVideo" id=subtitle]]
+[[!template text="This pass is also responsible for" start="00:23:12.800" video="mainVideo" id=subtitle]]
+[[!template text="executing functions" start="00:23:15.180" video="mainVideo" id=subtitle]]
+[[!template text="when we know that the function has no side effect" start="00:23:17.020" video="mainVideo" id=subtitle]]
+[[!template text="and the pass managed to" start="00:23:18.740" video="mainVideo" id=subtitle]]
+[[!template text="prove all the values of its argument." start="00:23:20.620" video="mainVideo" id=subtitle]]
+[[!template text="So the function is then executed at compile time" start="00:23:22.540" video="mainVideo" id=subtitle]]
+[[!template text="and it doesn't even exist anymore" start="00:23:24.900" video="mainVideo" id=subtitle]]
+[[!template text="in the produced code." start="00:23:26.800" video="mainVideo" id=subtitle]]
+[[!template text="Then we have another pass, this is" start="00:23:27.980" video="mainVideo" id=subtitle]]
+[[!template text="an example of a pass that is very specific:" start="00:23:30.400" video="mainVideo" id=subtitle]]
+[[!template text="it's trying to remove the call to funcall" start="00:23:33.520" video="mainVideo" id=subtitle]]
+[[!template text="when those are not necessary." start="00:23:36.220" video="mainVideo" id=subtitle]]
+[[!template text="There are a couple situations" start="00:23:38.140" video="mainVideo" id=subtitle]]
+[[!template text="where this is very useful." start="00:23:39.860" video="mainVideo" id=subtitle]]
+[[!template text="And not only is this beneficial" start="00:23:42.300" video="mainVideo" id=subtitle]]
+[[!template text="because we are generating better code," start="00:23:45.340" video="mainVideo" id=subtitle]]
+[[!template text="but when we manage to do that," start="00:23:47.660" video="mainVideo" id=subtitle]]
+[[!template text="we allow GCC better analysis over the code," start="00:23:49.345" video="mainVideo" id=subtitle]]
+[[!template text="because GCC knows nothing about funcall." start="00:23:52.100" video="mainVideo" id=subtitle]]
+[[!template text="So if we are calling, from 'foo', directly, 'bar'," start="00:23:54.540" video="mainVideo" id=subtitle]]
+[[!template text="for GCC it's way easier to do its analysis" start="00:23:57.500" video="mainVideo" id=subtitle]]
+[[!template text="on top of this code." start="00:24:01.380" video="mainVideo" id=subtitle]]
+[[!template text="Another interesting pass we can mention is 'tco'." start="00:24:03.460" video="mainVideo" id=subtitle]]
+[[!template text="This is performing Tail Recursion Elimination." start="00:24:06.340" video="mainVideo" id=subtitle]]
+[[!template text="It allows a more functional programming style," start="00:24:08.900" video="mainVideo" id=subtitle]]
+[[!template text="if you want." start="00:24:11.980" video="mainVideo" id=subtitle]]
+[[!template text="We can jump to the last pass" start="00:24:13.320" video="mainVideo" id=subtitle]]
+[[!template text="that is called 'final', and as I mentioned," start="00:24:14.380" video="mainVideo" id=subtitle]]
+[[!template text="this one is responsible for" start="00:24:16.300" video="mainVideo" id=subtitle]]
+[[!template text="taking our program in LIMPLE representation" start="00:24:17.620" video="mainVideo" id=subtitle]]
+[[!template text="and describing it to libgccjit in the gccjit IR." start="00:24:19.980" video="mainVideo" id=subtitle]]
+[[!template text="That's the main task. It's also" start="00:24:25.000" video="mainVideo" id=subtitle]]
+[[!template text="defining inline functions" start="00:24:27.580" video="mainVideo" id=subtitle]]
+[[!template text="for accessing fundamental data types, and so on." start="00:24:29.620" video="mainVideo" id=subtitle]]
+[[!template text="This pass is also responsible for" start="00:24:32.500" video="mainVideo" id=subtitle]]
+[[!template text="using some of the predictions" start="00:24:34.560" video="mainVideo" id=subtitle]]
+[[!template text="done by previous passes to generate better code." start="00:24:36.380" video="mainVideo" id=subtitle]]
+[[!template text="Things we had to add" start="00:24:39.660" video="mainVideo" id=subtitle]]
+[[!template text="to have all of this machinery work" start="00:24:41.420" video="mainVideo" id=subtitle]]
+[[!template text="and to be controllable:" start="00:24:43.980" video="mainVideo" id=subtitle]]
+[[!template text="The first one is an opt called 'native-comp-speed'" start="00:24:45.340" video="mainVideo" id=subtitle]]
+[[!template text="and it's equivalent to Common Lisp's 'speed'." start="00:24:47.580" video="mainVideo" id=subtitle]]
+[[!template text="It represents the optimization level." start="00:24:50.020" video="mainVideo" id=subtitle]]
+[[!template text="The default is 2 and is" start="00:24:52.020" video="mainVideo" id=subtitle]]
+[[!template text="the maximum optimization level" start="00:24:53.500" video="mainVideo" id=subtitle]]
+[[!template text="that is meant to reflect" start="00:24:55.500" video="mainVideo" id=subtitle]]
+[[!template text="all the original semantics of Emacs Lisp." start="00:24:58.700" video="mainVideo" id=subtitle]]
+[[!template text="So it's the one that should be used by default." start="00:25:00.960" video="mainVideo" id=subtitle]]
+[[!template text="The second one is 'compilation unit'" start="00:25:02.580" video="mainVideo" id=subtitle]]
+[[!template text="and it's a kind of new object" start="00:25:04.740" video="mainVideo" id=subtitle]]
+[[!template text="that has been added to Emacs." start="00:25:06.060" video="mainVideo" id=subtitle]]
+[[!template text="Let's have a look to" start="00:25:11.180" video="mainVideo" id=subtitle]]
+[[!template text="how the Garbage Collector works in this case." start="00:25:13.060" video="mainVideo" id=subtitle]]
+[[!template text="The GNU Emacs Garbage Collector" start="00:25:14.460" video="mainVideo" id=subtitle]]
+[[!template text="is a simple mark-and-sweep garbage collector." start="00:25:15.940" video="mainVideo" id=subtitle]]
+[[!template text="It does a tree walk through all the objects" start="00:25:18.760" video="mainVideo" id=subtitle]]
+[[!template text="and follows references from one object to another." start="00:25:21.520" video="mainVideo" id=subtitle]]
+[[!template text="All the objects reachable during the mark phase" start="00:25:25.200" video="mainVideo" id=subtitle]]
+[[!template text="will be kept in our Lisp universe." start="00:25:28.060" video="mainVideo" id=subtitle]]
+[[!template text="All the other ones will be freed." start="00:25:31.340" video="mainVideo" id=subtitle]]
+[[!template text="In this case we have a bunch of functions," start="00:25:33.780" video="mainVideo" id=subtitle]]
+[[!template text="'foo1', 'foo2', 'bar1', etc., that are defined." start="00:25:35.180" video="mainVideo" id=subtitle]]
+[[!template text="When a function is defined," start="00:25:38.860" video="mainVideo" id=subtitle]]
+[[!template text="it's accessible through its symbol," start="00:25:40.420" video="mainVideo" id=subtitle]]
+[[!template text="so we have the symbol referring to the function." start="00:25:42.500" video="mainVideo" id=subtitle]]
+[[!template text="The function, in this case a native-compiled one," start="00:25:44.460" video="mainVideo" id=subtitle]]
+[[!template text="is referring to the compilation unit." start="00:25:47.820" video="mainVideo" id=subtitle]]
+[[!template text="The compilation unit is essentially" start="00:25:50.140" video="mainVideo" id=subtitle]]
+[[!template text="the ELF file that has been compiled," start="00:25:53.120" video="mainVideo" id=subtitle]]
+[[!template text="and contains all those functions" start="00:25:58.700" video="mainVideo" id=subtitle]]
+[[!template text="that came from the original .el file," start="00:26:01.260" video="mainVideo" id=subtitle]]
+[[!template text="and that we have loaded into memory." start="00:26:03.340" video="mainVideo" id=subtitle]]
+[[!template text="If, for instance, 'bar1 and 'bar2 are undefined," start="00:26:05.200" video="mainVideo" id=subtitle]]
+[[!template text="functions 3 and 4 will be no longer reachable," start="00:26:10.100" video="mainVideo" id=subtitle]]
+[[!template text="and we will be able to free them" start="00:26:14.300" video="mainVideo" id=subtitle]]
+[[!template text="and unload the compilation unit." start="00:26:16.140" video="mainVideo" id=subtitle]]
+[[!template text="We discussed quite a lot about Control Flow Graph," start="00:26:18.260" video="mainVideo" id=subtitle]]
+[[!template text="SSA, and a lot of boring stuff," start="00:26:21.300" video="mainVideo" id=subtitle]]
+[[!template text="and I promised you that we are doing" start="00:26:23.660" video="mainVideo" id=subtitle]]
+[[!template text="a lot of interesting proofs over variables," start="00:26:25.500" video="mainVideo" id=subtitle]]
+[[!template text="So let's have some examples of them." start="00:26:27.420" video="mainVideo" id=subtitle]]
+[[!template text="Let's jump into a quick demo" start="00:26:30.320" video="mainVideo" id=subtitle]]
+[[!template text="to see what all of this abstract theory" start="00:26:31.940" video="mainVideo" id=subtitle]]
+[[!template text="and this esoteric propagation engine can do for us" start="00:26:34.580" video="mainVideo" id=subtitle]]
+[[!template text="and how the user can interact with it." start="00:26:37.780" video="mainVideo" id=subtitle]]
+[[!template text="I've defined a bunch of functions," start="00:26:39.340" video="mainVideo" id=subtitle]]
+[[!template text="and I will native-compile and load it." start="00:26:42.200" video="mainVideo" id=subtitle]]
+[[!template text="Alright, Emacs Lisp native compiled and loaded." start="00:26:47.500" video="mainVideo" id=subtitle]]
+[[!template text="At this point, I can disassemble 'foo1'" start="00:26:48.940" video="mainVideo" id=subtitle]]
+[[!template text="to make sure it's native code and I'm not lying." start="00:26:52.420" video="mainVideo" id=subtitle]]
+[[!template text="These are the instructions" start="00:26:56.420" video="mainVideo" id=subtitle]]
+[[!template text="that will be executed directly by my CPU" start="00:26:58.600" video="mainVideo" id=subtitle]]
+[[!template text="when I call this function." start="00:27:01.420" video="mainVideo" id=subtitle]]
+[[!template text="Alright, very cool." start="00:27:03.720" video="mainVideo" id=subtitle]]
+[[!template text="Now, Lisp: (symbol-function #'foo1)" start="00:27:07.620" video="mainVideo" id=subtitle]]
+[[!template text="Interestingly, this is returning a subroutine," start="00:27:16.180" video="mainVideo" id=subtitle]]
+[[!template text="as it would be a primitive function." start="00:27:19.820" video="mainVideo" id=subtitle]]
+[[!template text="Because this is native code," start="00:27:21.920" video="mainVideo" id=subtitle]]
+[[!template text="even if it's written in Lisp," start="00:27:23.800" video="mainVideo" id=subtitle]]
+[[!template text="has been converted to native code" start="00:27:24.940" video="mainVideo" id=subtitle]]
+[[!template text="as if it's a primitive function." start="00:27:26.440" video="mainVideo" id=subtitle]]
+[[!template text="But we can do also a new thing:" start="00:27:29.300" video="mainVideo" id=subtitle]]
+[[!template text="asking for the type of the subroutine." start="00:27:31.660" video="mainVideo" id=subtitle]]
+[[!template text="Alright, very cool. It says this is a function," start="00:27:34.540" video="mainVideo" id=subtitle]]
+[[!template text="it's taking one argument of type 't'" start="00:27:38.460" video="mainVideo" id=subtitle]]
+[[!template text="(that means anything" start="00:27:40.380" video="mainVideo" id=subtitle]]
+[[!template text="because we don't have any information)," start="00:27:41.660" video="mainVideo" id=subtitle]]
+[[!template text="and is returning a type 't'," start="00:27:43.060" video="mainVideo" id=subtitle]]
+[[!template text="so also there we don't have much information." start="00:27:45.300" video="mainVideo" id=subtitle]]
+[[!template text="OK, very cool, but not very useful." start="00:27:47.480" video="mainVideo" id=subtitle]]
+[[!template text="Let's see #'foo2. #'foo2 is slightly different," start="00:27:49.800" video="mainVideo" id=subtitle]]
+[[!template text="it doesn't take any argument, but it's returning" start="00:27:53.780" video="mainVideo" id=subtitle]]
+[[!template text="an integer included between 3 and 3." start="00:27:55.940" video="mainVideo" id=subtitle]]
+[[!template text="Wow, amazing!" start="00:27:58.140" video="mainVideo" id=subtitle]]
+[[!template text="Let's get into something a little more complex:" start="00:28:01.460" video="mainVideo" id=subtitle]]
+[[!template text="#'foo3 takes one argument we know nothing about," start="00:28:04.140" video="mainVideo" id=subtitle]]
+[[!template text="but it's returning a number." start="00:28:09.540" video="mainVideo" id=subtitle]]
+[[!template text="And why it's returning a number?" start="00:28:11.840" video="mainVideo" id=subtitle]]
+[[!template text="Essentially because 1+ is returning a number," start="00:28:13.380" video="mainVideo" id=subtitle]]
+[[!template text="and in all the other cases," start="00:28:16.420" video="mainVideo" id=subtitle]]
+[[!template text="it would signal an error" start="00:28:18.980" video="mainVideo" id=subtitle]]
+[[!template text="if it's not happy about its input argument." start="00:28:20.740" video="mainVideo" id=subtitle]]
+[[!template text="Let's have a look to #'foo4." start="00:28:23.480" video="mainVideo" id=subtitle]]
+[[!template text="#'foo4 is a little bit more complex." start="00:28:27.860" video="mainVideo" id=subtitle]]
+[[!template text="It will return nil" start="00:28:33.020" video="mainVideo" id=subtitle]]
+[[!template text="if the 'when' condition is not satisfied," start="00:28:34.780" video="mainVideo" id=subtitle]]
+[[!template text="so it's type 'null' here." start="00:28:37.500" video="mainVideo" id=subtitle]]
+[[!template text="It can return a floating point;" start="00:28:39.820" video="mainVideo" id=subtitle]]
+[[!template text="we don't do propagation of floating point so far," start="00:28:41.300" video="mainVideo" id=subtitle]]
+[[!template text="or it can return any integer between 4 and 9." start="00:28:43.700" video="mainVideo" id=subtitle]]
+[[!template text="Wow. Let's go on with #'foo5." start="00:28:47.180" video="mainVideo" id=subtitle]]
+[[!template text="#'foo5 is even more complex" start="00:28:52.940" video="mainVideo" id=subtitle]]
+[[!template text="because other than" start="00:28:55.860" video="mainVideo" id=subtitle]]
+[[!template text="having to satisfy this condition," start="00:28:57.300" video="mainVideo" id=subtitle]]
+[[!template text="we can see that the result of the propagation" start="00:28:59.280" video="mainVideo" id=subtitle]]
+[[!template text="of this complex condition" start="00:29:02.380" video="mainVideo" id=subtitle]]
+[[!template text="is propagated also across the 'plus'." start="00:29:03.900" video="mainVideo" id=subtitle]]
+[[!template text="So this foo5 can return nil," start="00:29:05.560" video="mainVideo" id=subtitle]]
+[[!template text="a floating point we know nothing about," start="00:29:08.340" video="mainVideo" id=subtitle]]
+[[!template text="or an integer included between 12 and 24." start="00:29:09.820" video="mainVideo" id=subtitle]]
+[[!template text="Let's go on with #'foo6." start="00:29:13.660" video="mainVideo" id=subtitle]]
+[[!template text="#'foo6 is returning anything but an integer." start="00:29:18.180" video="mainVideo" id=subtitle]]
+[[!template text="I think it should be pretty obvious why," start="00:29:23.420" video="mainVideo" id=subtitle]]
+[[!template text="because if it's not an integer we return it," start="00:29:26.620" video="mainVideo" id=subtitle]]
+[[!template text="otherwise we signal an error." start="00:29:28.220" video="mainVideo" id=subtitle]]
+[[!template text="Let's finish with #'foo7 very quickly." start="00:29:30.100" video="mainVideo" id=subtitle]]
+[[!template text="#'foo7 has another very complex condition," start="00:29:32.980" video="mainVideo" id=subtitle]]
+[[!template text="at least for me, but it's also interesting to see" start="00:29:38.020" video="mainVideo" id=subtitle]]
+[[!template text="that we are also propagating values for symbols." start="00:29:40.420" video="mainVideo" id=subtitle]]
+[[!template text="So we can return the symbol 'big," start="00:29:42.300" video="mainVideo" id=subtitle]]
+[[!template text="the symbol 'small," start="00:29:45.260" video="mainVideo" id=subtitle]]
+[[!template text="or an integer included between -100 and 100." start="00:29:47.080" video="mainVideo" id=subtitle]]
+[[!template text="Now, the question is: why all of this is useful" start="00:29:51.300" video="mainVideo" id=subtitle]]
+[[!template text="other than having Andrea very happy" start="00:29:54.540" video="mainVideo" id=subtitle]]
+[[!template text="when he's playing with this all day?" start="00:29:56.900" video="mainVideo" id=subtitle]]
+[[!template text="Well, we have to come back one second" start="00:29:59.660" video="mainVideo" id=subtitle]]
+[[!template text="to how Lisp_Objects are represented within Emacs." start="00:30:01.540" video="mainVideo" id=subtitle]]
+[[!template text="Lisp_Objects are represented as machine words," start="00:30:05.020" video="mainVideo" id=subtitle]]
+[[!template text="where we reserve a few bits to indicate the type." start="00:30:09.580" video="mainVideo" id=subtitle]]
+[[!template text="And every time we access the object," start="00:30:12.680" video="mainVideo" id=subtitle]]
+[[!template text="when this is a Fixnum," start="00:30:15.660" video="mainVideo" id=subtitle]]
+[[!template text="or a regular object where this is a pointer," start="00:30:17.220" video="mainVideo" id=subtitle]]
+[[!template text="we always have to extract these bits," start="00:30:20.020" video="mainVideo" id=subtitle]]
+[[!template text="make sure that they satisfy a condition," start="00:30:21.700" video="mainVideo" id=subtitle]]
+[[!template text="so make sure that we are going to manipulate" start="00:30:24.620" video="mainVideo" id=subtitle]]
+[[!template text="the object of the type we expect," start="00:30:27.220" video="mainVideo" id=subtitle]]
+[[!template text="and then we can extract the object" start="00:30:28.680" video="mainVideo" id=subtitle]]
+[[!template text="and do the manipulation." start="00:30:31.140" video="mainVideo" id=subtitle]]
+[[!template text="If the compiler managed to prove" start="00:30:32.640" video="mainVideo" id=subtitle]]
+[[!template text="that the contained object is of the right type," start="00:30:34.620" video="mainVideo" id=subtitle]]
+[[!template text="it will be able to not emit the type check," start="00:30:37.500" video="mainVideo" id=subtitle]]
+[[!template text="and save a lot of instructions." start="00:30:42.540" video="mainVideo" id=subtitle]]
+[[!template text="This is a very powerful optimization." start="00:30:44.600" video="mainVideo" id=subtitle]]
+[[!template text="Let's discuss some potential future development" start="00:30:48.660" video="mainVideo" id=subtitle]]
+[[!template text="in this area." start="00:30:50.860" video="mainVideo" id=subtitle]]
+[[!template text="First I think it would be extremely nice" start="00:30:52.100" video="mainVideo" id=subtitle]]
+[[!template text="to extend the propagation" start="00:30:53.460" video="mainVideo" id=subtitle]]
+[[!template text="to types that are not built in." start="00:30:55.020" video="mainVideo" id=subtitle]]
+[[!template text="There are a lot of cases" start="00:30:57.020" video="mainVideo" id=subtitle]]
+[[!template text="where we could optimize effectively." start="00:30:58.260" video="mainVideo" id=subtitle]]
+[[!template text="For instance when we do" start="00:31:00.700" video="mainVideo" id=subtitle]]
+[[!template text="a lot of accesses to structures" start="00:31:02.620" video="mainVideo" id=subtitle]]
+[[!template text="-- lots of stuff like that --" start="00:31:05.820" video="mainVideo" id=subtitle]]
+[[!template text="where we keep on checking and checking" start="00:31:07.020" video="mainVideo" id=subtitle]]
+[[!template text="the same object for the type" start="00:31:08.980" video="mainVideo" id=subtitle]]
+[[!template text="where it's obvious, where it should be trivial" start="00:31:10.740" video="mainVideo" id=subtitle]]
+[[!template text="to prove that it's the right type" start="00:31:13.180" video="mainVideo" id=subtitle]]
+[[!template text="after the first access or things like that." start="00:31:14.820" video="mainVideo" id=subtitle]]
+[[!template text="So I believe this is a low-hanging fruit" start="00:31:16.460" video="mainVideo" id=subtitle]]
+[[!template text="in terms of performance." start="00:31:19.020" video="mainVideo" id=subtitle]]
+[[!template text="Also I think it would be really nice" start="00:31:21.280" video="mainVideo" id=subtitle]]
+[[!template text="to extend the declare mechanism" start="00:31:23.180" video="mainVideo" id=subtitle]]
+[[!template text="to allow the user to declare argument types." start="00:31:24.820" video="mainVideo" id=subtitle]]
+[[!template text="(Optionally. Indeed, optionally.)" start="00:31:27.700" video="mainVideo" id=subtitle]]
+[[!template text="Doing that would give the compiler" start="00:31:30.580" video="mainVideo" id=subtitle]]
+[[!template text="a lot of information to propagate value types" start="00:31:32.980" video="mainVideo" id=subtitle]]
+[[!template text="within the function." start="00:31:35.220" video="mainVideo" id=subtitle]]
+[[!template text="But those will allow the compiler" start="00:31:36.460" video="mainVideo" id=subtitle]]
+[[!template text="to give the user really good diagnostics" start="00:31:38.940" video="mainVideo" id=subtitle]]
+[[!template text="during compile time. Like the compiler could say:" start="00:31:43.140" video="mainVideo" id=subtitle]]
+[[!template text="Hey, here you are calling a function" start="00:31:45.500" video="mainVideo" id=subtitle]]
+[[!template text="that is expecting this argument of this type," start="00:31:47.100" video="mainVideo" id=subtitle]]
+[[!template text="but I'm proving that you are calling it" start="00:31:49.300" video="mainVideo" id=subtitle]]
+[[!template text="with an argument that is of THIS type," start="00:31:52.100" video="mainVideo" id=subtitle]]
+[[!template text="and is not a subtype of the expected one." start="00:31:55.300" video="mainVideo" id=subtitle]]
+[[!template text="So you are doing something not coherent." start="00:31:57.940" video="mainVideo" id=subtitle]]
+[[!template text="This kind of interprocedural logic." start="00:32:00.340" video="mainVideo" id=subtitle]]
+[[!template text="And I think the compiler should also take advantage" start="00:32:02.900" video="mainVideo" id=subtitle]]
+[[!template text="(under certain circumstances)" start="00:32:05.100" video="mainVideo" id=subtitle]]
+[[!template text="of this interprocedural analysis" start="00:32:06.740" video="mainVideo" id=subtitle]]
+[[!template text="in order to optimize even more, when possible." start="00:32:08.860" video="mainVideo" id=subtitle]]
+[[!template text="Also I think we should" start="00:32:12.620" video="mainVideo" id=subtitle]]
+[[!template text="work on our ? to improve the code generation" start="00:32:13.820" video="mainVideo" id=subtitle]]
+[[!template text="depending on the prediction" start="00:32:15.580" video="mainVideo" id=subtitle]]
+[[!template text="that the compiler is doing." start="00:32:17.200" video="mainVideo" id=subtitle]]
+[[!template text="We already take advantage of those predictions," start="00:32:18.260" video="mainVideo" id=subtitle]]
+[[!template text="but I think we could do better." start="00:32:20.220" video="mainVideo" id=subtitle]]
+[[!template text="A quick look at some performance results." start="00:32:22.400" video="mainVideo" id=subtitle]]
+[[!template text="These are from the elisp-benchmarks package" start="00:32:25.220" video="mainVideo" id=subtitle]]
+[[!template text="within GNU ELPA." start="00:32:28.820" video="mainVideo" id=subtitle]]
+[[!template text="This is the performance uplift," start="00:32:30.860" video="mainVideo" id=subtitle]]
+[[!template text="and we can identify about 4 &quot ;classes&quot ; of results." start="00:32:32.620" video="mainVideo" id=subtitle]]
+[[!template text="The first one there is no performance uplift," start="00:32:38.580" video="mainVideo" id=subtitle]]
+[[!template text="because there is not much we can do," start="00:32:41.540" video="mainVideo" id=subtitle]]
+[[!template text="and the time is probably not spent" start="00:32:42.980" video="mainVideo" id=subtitle]]
+[[!template text="within the execution engine." start="00:32:44.820" video="mainVideo" id=subtitle]]
+[[!template text="And the ones around 3x are the ones" start="00:32:46.380" video="mainVideo" id=subtitle]]
+[[!template text="Where probably we are not triggering" start="00:32:49.100" video="mainVideo" id=subtitle]]
+[[!template text="manually specific optimizations," start="00:32:50.780" video="mainVideo" id=subtitle]]
+[[!template text="but just the fact" start="00:32:52.740" video="mainVideo" id=subtitle]]
+[[!template text="that we are converting into native code" start="00:32:53.700" video="mainVideo" id=subtitle]]
+[[!template text="is giving us this performance uplift." start="00:32:57.200" video="mainVideo" id=subtitle]]
+[[!template text="Then there is a bunch of other benchmarks" start="00:33:00.600" video="mainVideo" id=subtitle]]
+[[!template text="where the Lisp optimizations are triggering," start="00:33:03.380" video="mainVideo" id=subtitle]]
+[[!template text="and the uplift is way bigger," start="00:33:05.780" video="mainVideo" id=subtitle]]
+[[!template text="and then we have 3 benchmarks that at the time" start="00:33:09.720" video="mainVideo" id=subtitle]]
+[[!template text="are completely optimized out." start="00:33:12.000" video="mainVideo" id=subtitle]]
+[[!template text="That means the compiler became &quot ;so smart&quot ;" start="00:33:13.520" video="mainVideo" id=subtitle]]
+[[!template text="that it was able to compute the result" start="00:33:15.680" video="mainVideo" id=subtitle]]
+[[!template text="in the compile time and just put the result" start="00:33:18.260" video="mainVideo" id=subtitle]]
+[[!template text="in the generated binary." start="00:33:20.260" video="mainVideo" id=subtitle]]
+[[!template text="Let's discuss a little bit the compilation model." start="00:33:21.500" video="mainVideo" id=subtitle]]
+[[!template text="This is an Hybrid one;" start="00:33:23.980" video="mainVideo" id=subtitle]]
+[[!template text="it's both JIT-like and Ahead-of-Time-like." start="00:33:26.180" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is composed of what we call an Emacs image," start="00:33:29.520" video="mainVideo" id=subtitle]]
+[[!template text="essentially the Emacs binary that we start." start="00:33:33.500" video="mainVideo" id=subtitle]]
+[[!template text="It's including all the C code," start="00:33:36.280" video="mainVideo" id=subtitle]]
+[[!template text="plus all the Lisp code that we preload." start="00:33:37.820" video="mainVideo" id=subtitle]]
+[[!template text="Then we have the rest of the Emacs Lisp codebase" start="00:33:41.860" video="mainVideo" id=subtitle]]
+[[!template text="that can be loaded just if it's required." start="00:33:46.580" video="mainVideo" id=subtitle]]
+[[!template text="Same for the external packages, if we have any." start="00:33:49.540" video="mainVideo" id=subtitle]]
+[[!template text="If we build an Emacs Lisp" start="00:33:52.860" video="mainVideo" id=subtitle]]
+[[!template text="with native compilation enabled, by default," start="00:33:55.220" video="mainVideo" id=subtitle]]
+[[!template text="only the Emacs image will be native compiled." start="00:33:58.040" video="mainVideo" id=subtitle]]
+[[!template text="All the other code will be compiled" start="00:34:01.300" video="mainVideo" id=subtitle]]
+[[!template text="on the fly when it's loaded and executed" start="00:34:04.020" video="mainVideo" id=subtitle]]
+[[!template text="the first time, if it's necessary." start="00:34:06.820" video="mainVideo" id=subtitle]]
+[[!template text="Same for the packages, in a transparent way" start="00:34:08.900" video="mainVideo" id=subtitle]]
+[[!template text="and asynchronous way." start="00:34:10.980" video="mainVideo" id=subtitle]]
+[[!template text="Also worth noting" start="00:34:12.740" video="mainVideo" id=subtitle]]
+[[!template text="that the result of this compilation" start="00:34:13.580" video="mainVideo" id=subtitle]]
+[[!template text="will be stored into a cache directory" start="00:34:15.500" video="mainVideo" id=subtitle]]
+[[!template text="within the home directory of the user." start="00:34:17.340" video="mainVideo" id=subtitle]]
+[[!template text="So it will be reused in the following sessions" start="00:34:20.000" video="mainVideo" id=subtitle]]
+[[!template text="if the same file is loaded," start="00:34:23.700" video="mainVideo" id=subtitle]]
+[[!template text="without having to recompile multiple times" start="00:34:25.540" video="mainVideo" id=subtitle]]
+[[!template text="the same file in different sessions." start="00:34:27.620" video="mainVideo" id=subtitle]]
+[[!template text="It works a little bit like this:" start="00:34:29.420" video="mainVideo" id=subtitle]]
+[[!template text="When we load the byte-code for the first time," start="00:34:31.620" video="mainVideo" id=subtitle]]
+[[!template text="we spawn a native compilation process." start="00:34:33.900" video="mainVideo" id=subtitle]]
+[[!template text="Meanwhile we keep using the byte-code available." start="00:34:36.000" video="mainVideo" id=subtitle]]
+[[!template text="When the native compilation is finished," start="00:34:39.420" video="mainVideo" id=subtitle]]
+[[!template text="we hot-swap the definition of the functions" start="00:34:41.280" video="mainVideo" id=subtitle]]
+[[!template text="that are contained in the file" start="00:34:44.060" video="mainVideo" id=subtitle]]
+[[!template text="and start using the native code transparently." start="00:34:46.140" video="mainVideo" id=subtitle]]
+[[!template text="We do this asynchronously," start="00:34:48.060" video="mainVideo" id=subtitle]]
+[[!template text="and for more compilation units at the same time," start="00:34:49.980" video="mainVideo" id=subtitle]]
+[[!template text="so it looks a little bit like this." start="00:34:53.240" video="mainVideo" id=subtitle]]
+[[!template text="Let's try a quick demo of all of this machinery." start="00:34:56.380" video="mainVideo" id=subtitle]]
+[[!template text="I've started a fresh Emacs" start="00:34:58.660" video="mainVideo" id=subtitle]]
+[[!template text="with native compilation support," start="00:35:00.980" video="mainVideo" id=subtitle]]
+[[!template text="and at this moment nothing is going on." start="00:35:03.380" video="mainVideo" id=subtitle]]
+[[!template text="We will test the machinery with Tetris," start="00:35:05.160" video="mainVideo" id=subtitle]]
+[[!template text="because I can't imagine anything better" start="00:35:07.540" video="mainVideo" id=subtitle]]
+[[!template text="to test this." start="00:35:10.560" video="mainVideo" id=subtitle]]
+[[!template text="What I do expect is that when I launch Tetris" start="00:35:12.940" video="mainVideo" id=subtitle]]
+[[!template text="it will be loaded, it will immediately" start="00:35:15.180" video="mainVideo" id=subtitle]]
+[[!template text="start execution of the byte-compiled version," start="00:35:18.020" video="mainVideo" id=subtitle]]
+[[!template text="so we won't see any delay in the user experience," start="00:35:20.560" video="mainVideo" id=subtitle]]
+[[!template text="and in the meanwhile, a parallel process" start="00:35:23.100" video="mainVideo" id=subtitle]]
+[[!template text="will start to native-compile Tetris itself." start="00:35:25.260" video="mainVideo" id=subtitle]]
+[[!template text="When the native compilation will be finished," start="00:35:28.260" video="mainVideo" id=subtitle]]
+[[!template text="the functions of all Tetris will be hot-swapped." start="00:35:30.300" video="mainVideo" id=subtitle]]
+[[!template text="So we will not see any interruption." start="00:35:33.340" video="mainVideo" id=subtitle]]
+[[!template text="So Tetris started, and it's running," start="00:35:36.380" video="mainVideo" id=subtitle]]
+[[!template text="we have seen no delay, and in the meanwhile," start="00:35:39.780" video="mainVideo" id=subtitle]]
+[[!template text="the native compilation probably already finished," start="00:35:41.700" video="mainVideo" id=subtitle]]
+[[!template text="we can have a look." start="00:35:43.620" video="mainVideo" id=subtitle]]
+[[!template text="In this I see the native compilation log buffer." start="00:35:45.060" video="mainVideo" id=subtitle]]
+[[!template text="So we see that Tetris has been native compiled," start="00:35:47.260" video="mainVideo" id=subtitle]]
+[[!template text="and all of its dependencies." start="00:35:49.820" video="mainVideo" id=subtitle]]
+[[!template text="Now Tetris is still running," start="00:35:51.860" video="mainVideo" id=subtitle]]
+[[!template text="but I can do &quot ;C-h f tetris&quot ;" start="00:35:53.940" video="mainVideo" id=subtitle]]
+[[!template text="and we can see that 'tetris'" start="00:36:00.580" video="mainVideo" id=subtitle]]
+[[!template text="is an interactive native compiled" start="00:36:02.640" video="mainVideo" id=subtitle]]
+[[!template text="Lisp function, so it has been native-compiled." start="00:36:04.980" video="mainVideo" id=subtitle]]
+[[!template text="I can even disassemble if I want." start="00:36:08.040" video="mainVideo" id=subtitle]]
+[[!template text="OK, so very cool." start="00:36:13.600" video="mainVideo" id=subtitle]]
+[[!template text="I guess we can say this mechanism is working." start="00:36:14.980" video="mainVideo" id=subtitle]]
+[[!template text="Also worth noting that if I go back" start="00:36:18.120" video="mainVideo" id=subtitle]]
+[[!template text="to the *Async-native-compile-log* buffer," start="00:36:20.760" video="mainVideo" id=subtitle]]
+[[!template text="we see we have compiled another bunch of files." start="00:36:24.220" video="mainVideo" id=subtitle]]
+[[!template text="I think these are because of my 'C-h f'," start="00:36:28.060" video="mainVideo" id=subtitle]]
+[[!template text="this help function command and disassemble," start="00:36:31.700" video="mainVideo" id=subtitle]]
+[[!template text="and so on." start="00:36:33.900" video="mainVideo" id=subtitle]]
+[[!template text="The first time you run Emacs, you will have," start="00:36:35.020" video="mainVideo" id=subtitle]]
+[[!template text="from time to time, these processes spawned." start="00:36:37.820" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is &quot ;compiling itself&quot ;," start="00:36:41.380" video="mainVideo" id=subtitle]]
+[[!template text="and it's replacing the byte-code definition" start="00:36:43.200" video="mainVideo" id=subtitle]]
+[[!template text="with the native one. But after a few sessions," start="00:36:45.620" video="mainVideo" id=subtitle]]
+[[!template text="you will not see this anymore," start="00:36:47.740" video="mainVideo" id=subtitle]]
+[[!template text="because the output of this compilation," start="00:36:49.860" video="mainVideo" id=subtitle]]
+[[!template text="as I mentioned, are stored in the user directory." start="00:36:51.460" video="mainVideo" id=subtitle]]
+[[!template text="To conclude: Emacs with native compilation support" start="00:36:55.000" video="mainVideo" id=subtitle]]
+[[!template text="is coming up in Emacs 28," start="00:36:57.660" video="mainVideo" id=subtitle]]
+[[!template text="that is gonna be the next major stable release" start="00:36:59.180" video="mainVideo" id=subtitle]]
+[[!template text="that will be released." start="00:37:01.140" video="mainVideo" id=subtitle]]
+[[!template text="So we ought to celebrate with a big party," start="00:37:02.180" video="mainVideo" id=subtitle]]
+[[!template text="I believe. But before going to the party," start="00:37:04.940" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to list a few points" start="00:37:07.420" video="mainVideo" id=subtitle]]
+[[!template text="that I think have been success factors" start="00:37:09.180" video="mainVideo" id=subtitle]]
+[[!template text="in upstreaming this work." start="00:37:11.440" video="mainVideo" id=subtitle]]
+[[!template text="It has been extremely important" start="00:37:13.520" video="mainVideo" id=subtitle]]
+[[!template text="to get in touch with upstream as soon as possible," start="00:37:15.520" video="mainVideo" id=subtitle]]
+[[!template text="as soon as I had a proof of concept." start="00:37:18.240" video="mainVideo" id=subtitle]]
+[[!template text="It's been extremely important" start="00:37:20.780" video="mainVideo" id=subtitle]]
+[[!template text="to involve the community as much as possible," start="00:37:22.700" video="mainVideo" id=subtitle]]
+[[!template text="and this included keeping a development blog," start="00:37:24.760" video="mainVideo" id=subtitle]]
+[[!template text="and posts about that on emacs-devel," start="00:37:28.580" video="mainVideo" id=subtitle]]
+[[!template text="and also producing material," start="00:37:31.700" video="mainVideo" id=subtitle]]
+[[!template text="participating in conferences," start="00:37:33.820" video="mainVideo" id=subtitle]]
+[[!template text="and giving presentations like the one I'm doing," start="00:37:36.120" video="mainVideo" id=subtitle]]
+[[!template text="to explain what I was doing and how it works." start="00:37:38.420" video="mainVideo" id=subtitle]]
+[[!template text="It has been extremely important, also," start="00:37:40.780" video="mainVideo" id=subtitle]]
+[[!template text="to be able to rely on the upstream infrastructure." start="00:37:43.140" video="mainVideo" id=subtitle]]
+[[!template text="So, to develop the software" start="00:37:45.960" video="mainVideo" id=subtitle]]
+[[!template text="as a feature branch in the official git," start="00:37:47.640" video="mainVideo" id=subtitle]]
+[[!template text="but even more, I would say," start="00:37:49.180" video="mainVideo" id=subtitle]]
+[[!template text="to use the official bug tracker" start="00:37:50.060" video="mainVideo" id=subtitle]]
+[[!template text="for solving bugs of this branch." start="00:37:51.760" video="mainVideo" id=subtitle]]
+[[!template text="This gave the opportunity" start="00:37:52.980" video="mainVideo" id=subtitle]]
+[[!template text="to stay really in close touch with maintainers," start="00:37:54.780" video="mainVideo" id=subtitle]]
+[[!template text="and senior developers of Emacs." start="00:37:58.260" video="mainVideo" id=subtitle]]
+[[!template text="That helped me a lot. And at the same time" start="00:38:00.020" video="mainVideo" id=subtitle]]
+[[!template text="they were informed about what I was doing" start="00:38:03.080" video="mainVideo" id=subtitle]]
+[[!template text="and what was the status of this feature branch." start="00:38:04.920" video="mainVideo" id=subtitle]]
+[[!template text="Extremely important." start="00:38:07.460" video="mainVideo" id=subtitle]]
+[[!template text="And also I think it played a major role" start="00:38:08.900" video="mainVideo" id=subtitle]]
+[[!template text="to try to design this enormous patch" start="00:38:11.260" video="mainVideo" id=subtitle]]
+[[!template text="in a way that the impact on the current codebase" start="00:38:14.220" video="mainVideo" id=subtitle]]
+[[!template text="was minimized (at least as much as possible)." start="00:38:18.220" video="mainVideo" id=subtitle]]
+[[!template text="And also minimizing" start="00:38:21.220" video="mainVideo" id=subtitle]]
+[[!template text="the impact on the user operation of the software," start="00:38:23.760" video="mainVideo" id=subtitle]]
+[[!template text="in this case Emacs." start="00:38:26.340" video="mainVideo" id=subtitle]]
+[[!template text="So yes, mandatory Special Thanks:" start="00:38:28.140" video="mainVideo" id=subtitle]]
+[[!template text="Emacs developers, and especially maintainers" start="00:38:29.740" video="mainVideo" id=subtitle]]
+[[!template text="and senior developers like Stefan Monnier," start="00:38:33.460" video="mainVideo" id=subtitle]]
+[[!template text="that helped me a lot across this long journey." start="00:38:36.780" video="mainVideo" id=subtitle]]
+[[!template text="And, well, all the community" start="00:38:40.540" video="mainVideo" id=subtitle]]
+[[!template text="that really got so excited about this project" start="00:38:42.900" video="mainVideo" id=subtitle]]
+[[!template text="and gave me the energy" start="00:38:45.260" video="mainVideo" id=subtitle]]
+[[!template text="to go through all of this time and development" start="00:38:46.340" video="mainVideo" id=subtitle]]
+[[!template text="and bugs and solving, etc. etc." start="00:38:49.220" video="mainVideo" id=subtitle]]
+[[!template text="So yes, it was a really exciting time," start="00:38:52.080" video="mainVideo" id=subtitle]]
+[[!template text="and I think we have to look forward" start="00:38:55.020" video="mainVideo" id=subtitle]]
+[[!template text="and start thinking about how to improve all this" start="00:38:58.100" video="mainVideo" id=subtitle]]
+[[!template text="for the following years." start="00:39:01.500" video="mainVideo" id=subtitle]]
+[[!template text="And that's it." start="00:39:03.020" video="mainVideo" id=subtitle]]
+[[!template text="I think I should be online for questions." start="00:39:04.400" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much." start="00:39:06.140" video="mainVideo" id=subtitle]]
+[[!template text="captions by John Cummings" start="00:39:07.580" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/omegat.md b/2021/captions/omegat.md
index 6cbfb9e9..e6f68e57 100644
--- a/2021/captions/omegat.md
+++ b/2021/captions/omegat.md
@@ -298,3 +298,603 @@
[[!template text="so don't hesitate to send me" start="00:08:59.200" video="mainVideo" id=subtitle]]
[[!template text="questions and remarks." start="00:09:00.480" video="mainVideo" id=subtitle]]
[[!template text="Thank you again, and see you around." start="00:09:02.080" video="mainVideo" id=subtitle]]
+
+# Transcript (Japanese)
+
+[[!template new="1" text="皆さん、こんにちは。" start="00:00:01.280" video="mainVideo" id="subtitle"]]
+[[!template text="エラリー ジャンクリストフといいます。" start="00:00:02.560" video="mainVideo" id="subtitle"]]
+[[!template text="今日はEmacsのマニュアルの翻訳と" start="00:00:04.400" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTについてお話しします。" start="00:00:05.680" video="mainVideo" id="subtitle"]]
+[[!template text="セッションに参加いただき、ありがとうございます。" start="00:00:08.320" video="mainVideo" id="subtitle"]]
+[[!template text="自由ソフトウェアの世界では" start="00:00:10.960" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳は本当に大きな意味を持ちます。" start="00:00:12.880" video="mainVideo" id="subtitle"]]
+[[!template text="ほとんどのLinuxディストリビューション、" start="00:00:15.040" video="mainVideo" id="subtitle"]]
+[[!template text="ソフトウェアパッケージ" start="00:00:17.119" video="mainVideo" id="subtitle"]]
+[[!template text="ウェブサイトが" start="00:00:18.720" video="mainVideo" id="subtitle"]]
+[[!template text="異なるプロセスやファイル形式を使い、" start="00:00:19.920" video="mainVideo" id="subtitle"]]
+[[!template text="多くのコミュニティによって" start="00:00:22.320" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳されていることをすでにご存知でしょう。" start="00:00:23.439" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳とローカライゼーションについては" start="00:00:24.880" video="mainVideo" id="subtitle"]]
+[[!template text="ノウハウと経験がかなり蓄積されています。" start="00:00:27.359" video="mainVideo" id="subtitle"]]
+[[!template text="しかし、Emacsコミュニティについては" start="00:00:29.599" video="mainVideo" id="subtitle"]]
+[[!template text="必ずしもそうではありません。" start="00:00:30.400" video="mainVideo" id="subtitle"]]
+[[!template text="色々と複雑で、" start="00:00:32.160" video="mainVideo" id="subtitle"]]
+[[!template text="またリソースがないため、" start="00:00:34.079" video="mainVideo" id="subtitle"]]
+[[!template text="ローカライゼーションプロセスが" start="00:00:35.200" video="mainVideo" id="subtitle"]]
+[[!template text="まだ確立していません。" start="00:00:35.920" video="mainVideo" id="subtitle"]]
+[[!template text="しかし、マニュアルの翻訳は可能ですし、" start="00:00:37.600" video="mainVideo" id="subtitle"]]
+[[!template text="マニュアルの翻訳によって、" start="00:00:39.920" video="mainVideo" id="subtitle"]]
+[[!template text="Emacsコミュニティ全体に" start="00:00:41.200" video="mainVideo" id="subtitle"]]
+[[!template text="多くの利益がもたらされるでしょう。" start="00:00:42.399" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="では、マニュアルはどうなっているのでしょうか?" start="00:00:45.600" video="mainVideo" id="subtitle"]]
+[[!template text="今日現在、182のファイルが" start="00:00:47.920" video="mainVideo" id="subtitle"]]
+[[!template text=".texi や.org 形式で作成されています。" start="00:00:51.199" video="mainVideo" id="subtitle"]]
+[[!template text="単語数は200万以上です。" start="00:00:54.160" video="mainVideo" id="subtitle"]]
+[[!template text="文字数は、" start="00:00:56.559" video="mainVideo" id="subtitle"]]
+[[!template text="5000万以上です。" start="00:00:57.360" video="mainVideo" id="subtitle"]]
+[[!template text="これはかなりの量ですし、" start="00:00:59.039" video="mainVideo" id="subtitle"]]
+[[!template text="当然ながら、一人でできる仕事ではありません。" start="00:01:00.559" video="mainVideo" id="subtitle"]]
+[[!template new="1" text=".texi ファイルを開くと、" start="00:01:04.559" video="mainVideo" id="subtitle"]]
+[[!template text="何が出てくるのでしょうか?" start="00:01:06.159" video="mainVideo" id="subtitle"]]
+[[!template text="実は、翻訳者が翻訳する必要が" start="00:01:07.760" video="mainVideo" id="subtitle"]]
+[[!template text="ないものが" start="00:01:09.439" video="mainVideo" id="subtitle"]]
+[[!template text="たくさんあるのです。" start="00:01:10.560" video="mainVideo" id="subtitle"]]
+[[!template text="ここでは、一番最後の" start="00:01:12.400" video="mainVideo" id="subtitle"]]
+[[!template text="セグメント、一番最後の" start="00:01:13.680" video="mainVideo" id="subtitle"]]
+[[!template text="文だけが翻訳する" start="00:01:15.040" video="mainVideo" id="subtitle"]]
+[[!template text="必要があります。" start="00:01:16.400" video="mainVideo" id="subtitle"]]
+[[!template text="このようなメタ的なものは" start="00:01:18.080" video="mainVideo" id="subtitle"]]
+[[!template text="すべて翻訳者の目に" start="00:01:19.360" video="mainVideo" id="subtitle"]]
+[[!template text="触れる必要はありません。" start="00:01:20.240" video="mainVideo" id="subtitle"]]
+[[!template text="このような場合はどう対処すればいいのでしょうか?" start="00:01:24.479" video="mainVideo" id="subtitle"]]
+[[!template text="ソースファイルの場合、" start="00:01:26.720" video="mainVideo" id="subtitle"]]
+[[!template text="gettext というユーティリティーがあり、" start="00:01:27.680" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳可能な文字列を" start="00:01:29.360" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳可能な形式に変換します。" start="00:01:30.640" video="mainVideo" id="subtitle"]]
+[[!template text="それが .po 形式になります。" start="00:01:32.079" video="mainVideo" id="subtitle"]]
+[[!template text="この .po 形式はどこにでもあり、" start="00:01:33.840" video="mainVideo" id="subtitle"]]
+[[!template text="自由ではないソフトウェア" start="00:01:35.520" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳業界でも広く使われています。" start="00:01:36.400" video="mainVideo" id="subtitle"]]
+[[!template text="ドキュメントについては" start="00:01:38.720" video="mainVideo" id="subtitle"]]
+[[!template text="別のツールがあります。" start="00:01:39.520" video="mainVideo" id="subtitle"]]
+[[!template text="po4a と呼ばれるもので、" start="00:01:40.720" video="mainVideo" id="subtitle"]]
+[[!template text="これは「po for all」の略です。" start="00:01:42.000" video="mainVideo" id="subtitle"]]
+[[!template text="po4aを182.texiと" start="00:01:45.119" video="mainVideo" id="subtitle"]]
+[[!template text=".org ファイルに用いると" start="00:01:46.399" video="mainVideo" id="subtitle"]]
+[[!template text="どうなるでしょうか?" start="00:01:49.200" video="mainVideo" id="subtitle"]]
+[[!template text="先ほどよりずっといいものができました。" start="00:01:50.479" video="mainVideo" id="subtitle"]]
+[[!template text="これで分節が3つができました。" start="00:01:52.640" video="mainVideo" id="subtitle"]]
+[[!template text="ご覧の通り、" start="00:01:54.799" video="mainVideo" id="subtitle"]]
+[[!template text="最初の2つの分節は" start="00:01:55.759" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳の必要がないので、" start="00:01:56.399" video="mainVideo" id="subtitle"]]
+[[!template text="完璧ではありません。" start="00:01:57.280" video="mainVideo" id="subtitle"]]
+[[!template text="ですから、まだ" start="00:01:58.880" video="mainVideo" id="subtitle"]]
+[[!template text="改善の余地があります。" start="00:01:59.520" video="mainVideo" id="subtitle"]]
+[[!template text="さて、このファイルセットを" start="00:02:02.479" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTに入れると翻訳対象単語数が" start="00:02:04.960" video="mainVideo" id="subtitle"]]
+[[!template text="かなり減ります。" start="00:02:07.119" video="mainVideo" id="subtitle"]]
+[[!template text="単語数が50%、" start="00:02:08.800" video="mainVideo" id="subtitle"]]
+[[!template text="文字数が23%減りましたが、" start="00:02:11.360" video="mainVideo" id="subtitle"]]
+[[!template text="まだかなりの仕事量です。" start="00:02:14.239" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="では、ここでOmegaTについて、" start="00:02:15.680" video="mainVideo" id="subtitle"]]
+[[!template text="そして、OmegaTがどこに役立つかを見てみましょう。" start="00:02:17.599" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTは、GPL3+ Java8+ のソフトで" start="00:02:22.239" video="mainVideo" id="subtitle"]]
+[[!template text="コンピューター支援翻訳ツールです。" start="00:02:25.440" video="mainVideo" id="subtitle"]]
+[[!template text="Computer Aided Translationと呼ばれます。" start="00:02:27.599" video="mainVideo" id="subtitle"]]
+[[!template text="CATは翻訳者にとって、" start="00:02:29.440" video="mainVideo" id="subtitle"]]
+[[!template text="プログラマーにとってのIDEのようなものです。" start="00:02:30.720" video="mainVideo" id="subtitle"]]
+[[!template text="CATは、コンピュータの力を利用して" start="00:02:33.280" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳者の仕事を自動化します。" start="00:02:35.040" video="mainVideo" id="subtitle"]]
+[[!template text="例えば、参考翻訳の検索や" start="00:02:36.480" video="mainVideo" id="subtitle"]]
+[[!template text="ファジーマッチ、自動入力" start="00:02:38.400" video="mainVideo" id="subtitle"]]
+[[!template text="などのようなものです。" start="00:02:40.800" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTは最近のものありません。" start="00:02:44.080" video="mainVideo" id="subtitle"]]
+[[!template text="来年で20年になり、" start="00:02:46.319" video="mainVideo" id="subtitle"]]
+[[!template text="現時点では" start="00:02:48.319" video="mainVideo" id="subtitle"]]
+[[!template text="SourceForgeのサイトから" start="00:02:48.959" video="mainVideo" id="subtitle"]]
+[[!template text="150万件前後のダウンロードがあります。" start="00:02:51.440" video="mainVideo" id="subtitle"]]
+[[!template text="これにはローカライズや" start="00:02:53.200" video="mainVideo" id="subtitle"]]
+[[!template text="マニュアルに使用されるファイルが" start="00:02:54.080" video="mainVideo" id="subtitle"]]
+[[!template text="多少含まれるので、" start="00:02:55.040" video="mainVideo" id="subtitle"]]
+[[!template text="それほど意味はありませんが、" start="00:02:56.480" video="mainVideo" id="subtitle"]]
+[[!template text="それでもかなり大きな数字です。" start="00:02:57.920" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTは、多くのLinux" start="00:02:59.599" video="mainVideo" id="subtitle"]]
+[[!template text="ディストリビューションに含まれますが、" start="00:03:00.720" video="mainVideo" id="subtitle"]]
+[[!template text="ここで見られるように" start="00:03:02.400" video="mainVideo" id="subtitle"]]
+[[!template text="ほとんどがWindowsでダウンロードされています。" start="00:03:03.680" video="mainVideo" id="subtitle"]]
+[[!template text="なぜなら、翻訳者は" start="00:03:05.920" video="mainVideo" id="subtitle"]]
+[[!template text="ほとんどWindows上で作業しているからです。" start="00:03:06.800" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTにもかっこいいロゴと" start="00:03:09.680" video="mainVideo" id="subtitle"]]
+[[!template text="かっこいいサイトがあります。" start="00:03:11.120" video="mainVideo" id="subtitle"]]
+[[!template text="ぜひ一度ご覧ください。" start="00:03:12.080" video="mainVideo" id="subtitle"]]
+[[!template text="サイトはomegat.orgで、" start="00:03:13.920" video="mainVideo" id="subtitle"]]
+[[!template text="すべての必要な情報が見られます。" start="00:03:16.159" video="mainVideo" id="subtitle"]]
+[[!template text="また、Javaの有無の関わらず、" start="00:03:17.280" video="mainVideo" id="subtitle"]]
+[[!template text="Linuxバージョンもダウンロードできます。" start="00:03:19.040" video="mainVideo" id="subtitle"]]
+[[!template text="では、OmegaTによって何が変わるのでしょうか?" start="00:03:22.080" video="mainVideo" id="subtitle"]]
+[[!template text="プロの翻訳者が提供しなければいけないのは、" start="00:03:24.799" video="mainVideo" id="subtitle"]]
+[[!template text="速く、一貫性があり" start="00:03:26.560" video="mainVideo" id="subtitle"]]
+[[!template text="品質の高い翻訳です。" start="00:03:27.680" video="mainVideo" id="subtitle"]]
+[[!template text="それを実現するためには、" start="00:03:29.519" video="mainVideo" id="subtitle"]]
+[[!template text="適切なツールが必要です。" start="00:03:30.720" video="mainVideo" id="subtitle"]]
+[[!template text="po-modeがツールボックスの一部であればいいのですが、" start="00:03:32.159" video="mainVideo" id="subtitle"]]
+[[!template text="そうはなっていません。" start="00:03:34.239" video="mainVideo" id="subtitle"]]
+[[!template text="残念ながら。" start="00:03:35.120" video="mainVideo" id="subtitle"]]
+[[!template text="ですから、そのようなCATツールを使わなければなりません。" start="00:03:36.560" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="このデモのために作成したプロジェクトを" start="00:03:39.760" video="mainVideo" id="subtitle"]]
+[[!template text="開くと、OmegaTがどのように表示されるか" start="00:03:41.440" video="mainVideo" id="subtitle"]]
+[[!template text="お見せしましょう。" start="00:03:43.120" video="mainVideo" id="subtitle"]]
+[[!template text="表示はかなりややこしいですが、" start="00:03:45.200" video="mainVideo" id="subtitle"]]
+[[!template text="実際には、必要に応じてすべての" start="00:03:46.640" video="mainVideo" id="subtitle"]]
+[[!template text="ウィンドウを変更できます。" start="00:03:47.760" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTがどんなものなのか" start="00:03:49.519" video="mainVideo" id="subtitle"]]
+[[!template text="理解していただくために" start="00:03:50.400" video="mainVideo" id="subtitle"]]
+[[!template text="一度にすべてをお見せしたいと思います。" start="00:03:51.120" video="mainVideo" id="subtitle"]]
+[[!template text="さまざまな色やウィンドウがあり、" start="00:03:53.680" video="mainVideo" id="subtitle"]]
+[[!template text="それらスペースには" start="00:03:55.200" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳者を支援する" start="00:03:55.920" video="mainVideo" id="subtitle"]]
+[[!template text="さまざまな機能がありますが、" start="00:03:57.120" video="mainVideo" id="subtitle"]]
+[[!template text="皆さんにはあまり" start="00:03:58.560" video="mainVideo" id="subtitle"]]
+[[!template text="馴染みがないかもしれません。" start="00:03:59.360" video="mainVideo" id="subtitle"]]
+[[!template text="今からそのインターフェースを" start="00:04:02.879" video="mainVideo" id="subtitle"]]
+[[!template text="ご紹介します。" start="00:04:04.080" video="mainVideo" id="subtitle"]]
+[[!template text="まずは、エディターですね。" start="00:04:05.680" video="mainVideo" id="subtitle"]]
+[[!template text="エディターは2つの部分から成ります。" start="00:04:07.519" video="mainVideo" id="subtitle"]]
+[[!template text="番号に関連づけられた" start="00:04:09.439" video="mainVideo" id="subtitle"]]
+[[!template text="現在の分節と、" start="00:04:10.480" video="mainVideo" id="subtitle"]]
+[[!template text="もうひとつは上下にあるすべての" start="00:04:12.319" video="mainVideo" id="subtitle"]]
+[[!template text="分節です。" start="00:04:13.519" video="mainVideo" id="subtitle"]]
+[[!template text="ウィンドウの一番上には" start="00:04:15.840" video="mainVideo" id="subtitle"]]
+[[!template text=".poファイルにあった最初の3つの分節が" start="00:04:16.720" video="mainVideo" id="subtitle"]]
+[[!template text="表示されています。" start="00:04:18.720" video="mainVideo" id="subtitle"]]
+[[!template text="ここの最後の4つ目の分節には" start="00:04:20.799" video="mainVideo" id="subtitle"]]
+[[!template text="ファジーマッチが自動挿入されています。" start="00:04:22.880" video="mainVideo" id="subtitle"]]
+[[!template text="このようなレガシー翻訳は" start="00:04:28.720" video="mainVideo" id="subtitle"]]
+[[!template text="「翻訳メモリ」と呼ばれます。" start="00:04:30.880" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTがこれを自動挿入したのは、" start="00:04:32.720" video="mainVideo" id="subtitle"]]
+[[!template text="私がそうするように設定したからです。" start="00:04:35.280" video="mainVideo" id="subtitle"]]
+[[!template text="また、私自身のセキュリティのために、" start="00:04:37.120" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳の検証のために" start="00:04:38.560" video="mainVideo" id="subtitle"]]
+[[!template text="削除しなければならない規定の" start="00:04:40.639" video="mainVideo" id="subtitle"]]
+[[!template text="[fuzzy] がついています。" start="00:04:41.919" video="mainVideo" id="subtitle"]]
+[[!template text="次の機能は、用語集機能です。" start="00:04:44.880" video="mainVideo" id="subtitle"]]
+[[!template text="今回のプロジェクトには" start="00:04:47.919" video="mainVideo" id="subtitle"]]
+[[!template text="たくさんの用語集データがあります。" start="00:04:48.479" video="mainVideo" id="subtitle"]]
+[[!template text="関連のあるものもあれば、そうでないものもあります。" start="00:04:50.160" video="mainVideo" id="subtitle"]]
+[[!template text="今翻訳している分節では" start="00:04:52.560" video="mainVideo" id="subtitle"]]
+[[!template text="下線が引かれた項目が" start="00:04:53.919" video="mainVideo" id="subtitle"]]
+[[!template text="あります。" start="00:04:55.199" video="mainVideo" id="subtitle"]]
+[[!template text="右側のポップアップメニューでは" start="00:04:57.520" video="mainVideo" id="subtitle"]]
+[[!template text="入力中に用語を入れることができます。" start="00:04:59.040" video="mainVideo" id="subtitle"]]
+[[!template text="これは自動挿入システムのようなもので、" start="00:05:02.240" video="mainVideo" id="subtitle"]]
+[[!template text="履歴予測や定型文などと" start="00:05:04.639" video="mainVideo" id="subtitle"]]
+[[!template text="いったような入力補完に対応しています。" start="00:05:07.039" video="mainVideo" id="subtitle"]]
+[[!template text="右側の部分には、" start="00:05:14.479" video="mainVideo" id="subtitle"]]
+[[!template text=".poと.texiのファイルから" start="00:05:15.440" video="mainVideo" id="subtitle"]]
+[[!template text="直接得られた" start="00:05:17.120" video="mainVideo" id="subtitle"]]
+[[!template text="参照情報があります。" start="00:05:18.240" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="また、パートナーの翻訳者と" start="00:05:21.440" video="mainVideo" id="subtitle"]]
+[[!template text="共有できるメモもあり、" start="00:05:23.440" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳完了までに" start="00:05:25.759" video="mainVideo" id="subtitle"]]
+[[!template text="あと143,000分節あることを示す" start="00:05:28.080" video="mainVideo" id="subtitle"]]
+[[!template text="数字も表示されています。" start="00:05:31.199" video="mainVideo" id="subtitle"]]
+[[!template text="しかし、どうしても" start="00:05:35.280" video="mainVideo" id="subtitle"]]
+[[!template text="入力したくない文字列がたくさんあります。" start="00:05:37.120" video="mainVideo" id="subtitle"]]
+[[!template text="例えば、これらの文字列は" start="00:05:40.000" video="mainVideo" id="subtitle"]]
+[[!template text="典型的な .texi の文字列で、" start="00:05:42.160" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳者が入力する" start="00:05:43.840" video="mainVideo" id="subtitle"]]
+[[!template text="必要はありません。" start="00:05:45.039" video="mainVideo" id="subtitle"]]
+[[!template text="これについて" start="00:05:46.479" video="mainVideo" id="subtitle"]]
+[[!template text="どうにかしなければなりません。" start="00:05:47.360" video="mainVideo" id="subtitle"]]
+[[!template text="そのためには、正規表現を使い" start="00:05:50.400" video="mainVideo" id="subtitle"]]
+[[!template text="保護された文字列を作成し、" start="00:05:51.600" video="mainVideo" id="subtitle"]]
+[[!template text="ソース分節では" start="00:05:52.479" video="mainVideo" id="subtitle"]]
+[[!template text="文字列をすぐに視覚化し、" start="00:05:54.400" video="mainVideo" id="subtitle"]]
+[[!template text="ターゲット分節で" start="00:05:56.800" video="mainVideo" id="subtitle"]]
+[[!template text="半自動的に入力し、" start="00:05:59.120" video="mainVideo" id="subtitle"]]
+[[!template text="整合性を" start="00:06:00.479" video="mainVideo" id="subtitle"]]
+[[!template text="チェックできるようにしましょう。" start="00:06:01.680" video="mainVideo" id="subtitle"]]
+[[!template text="処理したい文字列を定義するのに" start="00:06:04.479" video="mainVideo" id="subtitle"]]
+[[!template text="考えた正規表現は" start="00:06:06.479" video="mainVideo" id="subtitle"]]
+[[!template text="このようなものです。" start="00:06:08.160" video="mainVideo" id="subtitle"]]
+[[!template text="正規表現のプロではないので、" start="00:06:09.600" video="mainVideo" id="subtitle"]]
+[[!template text="皆さんからのご指摘もあると思います。" start="00:06:11.120" video="mainVideo" id="subtitle"]]
+[[!template text="しかし、この表現は" start="00:06:13.360" video="mainVideo" id="subtitle"]]
+[[!template text="Orgモードの構文を" start="00:06:14.560" video="mainVideo" id="subtitle"]]
+[[!template text="まだ含んでいないにもかかわらず" start="00:06:15.919" video="mainVideo" id="subtitle"]]
+[[!template text="十分な定義になっています。" start="00:06:17.919" video="mainVideo" id="subtitle"]]
+[[!template text="これで、触ってはいけない" start="00:06:20.960" video="mainVideo" id="subtitle"]]
+[[!template text=".texi 特有のものが" start="00:06:22.344" video="mainVideo" id="subtitle"]]
+[[!template text="すべてグレーで" start="00:06:23.440" video="mainVideo" id="subtitle"]]
+[[!template text="表示されるようになりました。" start="00:06:24.960" video="mainVideo" id="subtitle"]]
+[[!template text="実は、お気づきかもしれませんが" start="00:06:26.100" video="mainVideo" id="subtitle"]]
+[[!template text="少しズルをしました。" start="00:06:27.680" video="mainVideo" id="subtitle"]]
+[[!template text="先ほどの正規表現に「年」と" start="00:06:28.479" video="mainVideo" id="subtitle"]]
+[[!template text="「Free Software Foundation」の名前を追加しました。" start="00:06:30.319" video="mainVideo" id="subtitle"]]
+[[!template text="なぜなら、どんな種類の文字列でも" start="00:06:32.000" video="mainVideo" id="subtitle"]]
+[[!template text="保護できることを" start="00:06:34.000" video="mainVideo" id="subtitle"]]
+[[!template text="示したかったからです。" start="00:06:35.520" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="これで、" start="00:06:38.560" video="mainVideo" id="subtitle"]]
+[[!template text="触れたくない文字列を" start="00:06:39.520" video="mainVideo" id="subtitle"]]
+[[!template text="可視化することができましたが、" start="00:06:41.360" video="mainVideo" id="subtitle"]]
+[[!template text="それでもすべての文字列を翻訳に" start="00:06:43.440" video="mainVideo" id="subtitle"]]
+[[!template text="入力しなければなりません。" start="00:06:45.440" video="mainVideo" id="subtitle"]]
+[[!template text="そのために、先ほどの用語集で使った" start="00:06:46.880" video="mainVideo" id="subtitle"]]
+[[!template text="ポップアップメニューがあれば、" start="00:06:48.319" video="mainVideo" id="subtitle"]]
+[[!template text="編集メニューの中にも" start="00:06:50.400" video="mainVideo" id="subtitle"]]
+[[!template text="不足しているタグを" start="00:06:51.520" video="mainVideo" id="subtitle"]]
+[[!template text="簡単に挿入するための" start="00:06:52.400" video="mainVideo" id="subtitle"]]
+[[!template text="ショートカットも用意されています。" start="00:06:53.919" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="最後に忘れてはならないのが" start="00:06:57.199" video="mainVideo" id="subtitle"]]
+[[!template text="入力の検証が可能なことです。" start="00:06:58.800" video="mainVideo" id="subtitle"]]
+[[!template text="ここで、OmegaTは7つの保護された文字列を" start="00:07:00.800" video="mainVideo" id="subtitle"]]
+[[!template text="見逃したことをきちんと見せてくれます。" start="00:07:02.479" video="mainVideo" id="subtitle"]]
+[[!template text="私は1998年だけを入力しましたが、" start="00:07:05.759" video="mainVideo" id="subtitle"]]
+[[!template text="5つの異なる年があり、" start="00:07:07.599" video="mainVideo" id="subtitle"]]
+[[!template text="著作権の文字列と" start="00:07:09.280" video="mainVideo" id="subtitle"]]
+[[!template text="FSF名の文字列がありました。" start="00:07:10.479" video="mainVideo" id="subtitle"]]
+[[!template text="この極めてネイティブに近い" start="00:07:14.240" video="mainVideo" id="subtitle"]]
+[[!template text="Texinfo対応により、" start="00:07:15.970" video="mainVideo" id="subtitle"]]
+[[!template text="入力するものがずっと少なくなり、" start="00:07:16.960" video="mainVideo" id="subtitle"]]
+[[!template text="エラーの可能性も" start="00:07:18.880" video="mainVideo" id="subtitle"]]
+[[!template text="ずっと低くなりました。" start="00:07:19.919" video="mainVideo" id="subtitle"]]
+[[!template text="とはいえ、まだまだ大変な作業であることは間違いありません。" start="00:07:21.120" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="今、私たちが望んでいるのは、" start="00:07:25.199" video="mainVideo" id="subtitle"]]
+[[!template text="仲間の翻訳者と一緒に仕事をすることです。" start="00:07:26.319" video="mainVideo" id="subtitle"]]
+[[!template text="ここでわからないければならないのは、" start="00:07:27.840" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTが実際に隠れ" start="00:07:28.720" video="mainVideo" id="subtitle"]]
+[[!template text="svn/gitクライアントであり、" start="00:07:29.840" video="mainVideo" id="subtitle"]]
+[[!template text="チームプロジェクトがsvn/gitプラットフォームで" start="00:07:32.080" video="mainVideo" id="subtitle"]]
+[[!template text="ホスト可能であることです。" start="00:07:34.240" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳者は、VCSについて" start="00:07:36.319" video="mainVideo" id="subtitle"]]
+[[!template text="何も知る必要はありません。" start="00:07:37.199" video="mainVideo" id="subtitle"]]
+[[!template text="ただ、アクセス認証を必要とし、" start="00:07:38.880" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTは翻訳者の代わりにコミットします。" start="00:07:40.720" video="mainVideo" id="subtitle"]]
+[[!template text="このようにして、" start="00:07:42.400" video="mainVideo" id="subtitle"]]
+[[!template text="醜くて不十分なウェブベースの" start="00:07:44.080" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳システムを使う必要なく、" start="00:07:45.759" video="mainVideo" id="subtitle"]]
+[[!template text="強力なオフラインのプロフェッショナルツールを" start="00:07:47.199" video="mainVideo" id="subtitle"]]
+[[!template text="使うことができるのです。" start="00:07:48.800" video="mainVideo" id="subtitle"]]
+[[!template text="この翻訳プロジェクトを" start="00:07:51.440" video="mainVideo" id="subtitle"]]
+[[!template text="ホストしているプラットフォームを見ると、" start="00:07:52.479" video="mainVideo" id="subtitle"]]
+[[!template text="このように見えます。" start="00:07:54.160" video="mainVideo" id="subtitle"]]
+[[!template text="最後の更新は、このスライドを作成した" start="00:07:55.919" video="mainVideo" id="subtitle"]]
+[[!template text="20日と30秒前のもので、" start="00:07:57.199" video="mainVideo" id="subtitle"]]
+[[!template text="同じファイルセットで" start="00:07:58.639" video="mainVideo" id="subtitle"]]
+[[!template text="一緒に作業したパートナーが" start="00:08:00.720" video="mainVideo" id="subtitle"]]
+[[!template text="いたことがわかります。" start="00:08:02.479" video="mainVideo" id="subtitle"]]
+[[!template text="私たちは翻訳をプラットフォームに" start="00:08:04.639" video="mainVideo" id="subtitle"]]
+[[!template text="コミットしたように見えますが、" start="00:08:05.520" video="mainVideo" id="subtitle"]]
+[[!template text="それは私たちでなく、" start="00:08:06.879" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTでした。" start="00:08:07.680" video="mainVideo" id="subtitle"]]
+[[!template text="すべての面倒臭い仕事はOmegaTが行います。" start="00:08:11.039" video="mainVideo" id="subtitle"]]
+[[!template text="定期的にサーバーに保存し、" start="00:08:13.599" video="mainVideo" id="subtitle"]]
+[[!template text="サーバーから同期します。" start="00:08:15.039" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳者は、仲間の翻訳した内容を" start="00:08:16.879" video="mainVideo" id="subtitle"]]
+[[!template text="定期的に得られます。" start="00:08:18.720" video="mainVideo" id="subtitle"]]
+[[!template text="そして必要に応じて" start="00:08:20.479" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaTは、簡単な" start="00:08:21.680" video="mainVideo" id="subtitle"]]
+[[!template text="コンフリクト解決のためのウインドーを表示します。" start="00:08:23.360" video="mainVideo" id="subtitle"]]
+[[!template text="翻訳者は、svnやgitを使って" start="00:08:25.440" video="mainVideo" id="subtitle"]]
+[[!template text="何かをする必要はありません。" start="00:08:27.039" video="mainVideo" id="subtitle"]]
+[[!template text="そして今、私たちは、" start="00:08:29.360" video="mainVideo" id="subtitle"]]
+[[!template text="マニュアルが翻訳され、" start="00:08:30.800" video="mainVideo" id="subtitle"]]
+[[!template text="最終的にはEmacsに含まれるという" start="00:08:31.599" video="mainVideo" id="subtitle"]]
+[[!template text="そう遠くはない未来を" start="00:08:33.120" video="mainVideo" id="subtitle"]]
+[[!template text="思い描くことができますが、" start="00:08:34.159" video="mainVideo" id="subtitle"]]
+[[!template text="それはこのプレゼンテーションとは" start="00:08:35.279" video="mainVideo" id="subtitle"]]
+[[!template text="別の話になります。" start="00:08:36.080" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="というわけで、セッションの終わりになりました。" start="00:08:39.760" video="mainVideo" id="subtitle"]]
+[[!template text="ご参加いただいた皆様、本当にありがとうございました。" start="00:08:42.080" video="mainVideo" id="subtitle"]]
+[[!template text="たくさんのトピックについて" start="00:08:44.240" video="mainVideo" id="subtitle"]]
+[[!template text="触れないと約束しましたが、" start="00:08:45.600" video="mainVideo" id="subtitle"]]
+[[!template text="約束は守れたのではないでしょうか。" start="00:08:46.880" video="mainVideo" id="subtitle"]]
+[[!template text="Q&Aもありますが、" start="00:08:50.000" video="mainVideo" id="subtitle"]]
+[[!template text="実は、先週の土曜日に" start="00:08:51.600" video="mainVideo" id="subtitle"]]
+[[!template text="Redditでこのセッションに関するスレッドも" start="00:08:52.517" video="mainVideo" id="subtitle"]]
+[[!template text="立ち上げました。" start="00:08:53.600" video="mainVideo" id="subtitle"]]
+[[!template text="emacs-helpやemacs-develのメーリングリストでも" start="00:08:55.519" video="mainVideo" id="subtitle"]]
+[[!template text="私の名前を見つけることができますので、" start="00:08:57.279" video="mainVideo" id="subtitle"]]
+[[!template text="ご質問やご意見がありましたら、" start="00:08:59.200" video="mainVideo" id="subtitle"]]
+[[!template text="遠慮なくお寄せください。" start="00:09:00.480" video="mainVideo" id="subtitle"]]
+[[!template text="それでは、またお会いしましょう。" start="00:09:02.080" video="mainVideo" id="subtitle"]]
+
+# Transcript (French)
+
+[[!template new="1" text="Bonjour tout le monde." start="00:00:01.280" video="mainVideo" id="subtitle"]]
+[[!template text="Je m’appelle Jean-Christophe Helary," start="00:00:02.560" video="mainVideo" id="subtitle"]]
+[[!template text="et aujourd’hui je vais vous parler" start="00:00:04.400" video="mainVideo" id="subtitle"]]
+[[!template text="de la traduction des manuels Emacs avec OmegaT." start="00:00:05.680" video="mainVideo" id="subtitle"]]
+[[!template text="Merci de vous joindre à moi aujourd’hui." start="00:00:08.320" video="mainVideo" id="subtitle"]]
+[[!template text="La traduction dans le monde du logiciel libre" start="00:00:10.960" video="mainVideo" id="subtitle"]]
+[[!template text="est un phénomène très important. Vous savez déjà" start="00:00:12.880" video="mainVideo" id="subtitle"]]
+[[!template text="que la plupart des distributions Linux," start="00:00:15.040" video="mainVideo" id="subtitle"]]
+[[!template text="la plupart des logiciels," start="00:00:17.119" video="mainVideo" id="subtitle"]]
+[[!template text="la plupart des sites web" start="00:00:18.720" video="mainVideo" id="subtitle"]]
+[[!template text="sont traduits par des dizaines de communautés" start="00:00:19.920" video="mainVideo" id="subtitle"]]
+[[!template text="à l’aide de processus" start="00:00:22.320" video="mainVideo" id="subtitle"]]
+[[!template text="et de formats de fichiers tous différents." start="00:00:23.439" video="mainVideo" id="subtitle"]]
+[[!template text="La traduction et la localisation" start="00:00:24.880" video="mainVideo" id="subtitle"]]
+[[!template text="sont des choses que nous connaissons bien." start="00:00:27.359" video="mainVideo" id="subtitle"]]
+[[!template text="C’est un peu différent" start="00:00:29.599" video="mainVideo" id="subtitle"]]
+[[!template text="pour la communauté Emacs." start="00:00:30.400" video="mainVideo" id="subtitle"]]
+[[!template text="Nous n’avons pas de processus de localisation" start="00:00:32.160" video="mainVideo" id="subtitle"]]
+[[!template text="parce que c’est encore trop complexe" start="00:00:34.079" video="mainVideo" id="subtitle"]]
+[[!template text="et parce que nous n’avons pas" start="00:00:35.200" video="mainVideo" id="subtitle"]]
+[[!template text="encore les ressources nécessaires." start="00:00:35.920" video="mainVideo" id="subtitle"]]
+[[!template text="Néanmoins, nous pourrions traduire les manuels," start="00:00:37.600" video="mainVideo" id="subtitle"]]
+[[!template text="et traduire les manuels" start="00:00:39.920" video="mainVideo" id="subtitle"]]
+[[!template text="apporterait probablement beaucoup" start="00:00:41.200" video="mainVideo" id="subtitle"]]
+[[!template text="à la communauté Emacs dans son ensemble." start="00:00:42.399" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="Quel est donc l’état des manuels ?" start="00:00:45.600" video="mainVideo" id="subtitle"]]
+[[!template text="À ce jour, nous avons 182 fichiers" start="00:00:47.920" video="mainVideo" id="subtitle"]]
+[[!template text="aux formats .texi et .org." start="00:00:51.199" video="mainVideo" id="subtitle"]]
+[[!template text="Nous avons plus de 2 millions de mots." start="00:00:54.160" video="mainVideo" id="subtitle"]]
+[[!template text="Nous avons plus de" start="00:00:56.559" video="mainVideo" id="subtitle"]]
+[[!template text="50 millions de caractères." start="00:00:57.360" video="mainVideo" id="subtitle"]]
+[[!template text="C’est donc beaucoup de travail," start="00:00:59.039" video="mainVideo" id="subtitle"]]
+[[!template text="et il est clair qu’une personne ne suffira pas." start="00:01:00.559" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="Quand on ouvre un fichier .texi" start="00:01:04.559" video="mainVideo" id="subtitle"]]
+[[!template text="qu’est-ce qu’on y trouve ?" start="00:01:06.159" video="mainVideo" id="subtitle"]]
+[[!template text="Eh bien, beaucoup de choses en fait" start="00:01:07.760" video="mainVideo" id="subtitle"]]
+[[!template text="que les traducteurs" start="00:01:09.439" video="mainVideo" id="subtitle"]]
+[[!template text="ne devraient pas avoir à traduire." start="00:01:10.560" video="mainVideo" id="subtitle"]]
+[[!template text="Ici, on peut voir que seul" start="00:01:12.400" video="mainVideo" id="subtitle"]]
+[[!template text="le tout dernier segment," start="00:01:13.680" video="mainVideo" id="subtitle"]]
+[[!template text="la toute dernière phrase" start="00:01:15.040" video="mainVideo" id="subtitle"]]
+[[!template text="doit être traduite." start="00:01:16.400" video="mainVideo" id="subtitle"]]
+[[!template text="Toutes ces choses « méta »" start="00:01:18.080" video="mainVideo" id="subtitle"]]
+[[!template text="ne devraient pas être sous" start="00:01:19.360" video="mainVideo" id="subtitle"]]
+[[!template text="les yeux du traducteur." start="00:01:20.240" video="mainVideo" id="subtitle"]]
+[[!template text="Comment faire face à cette situation ?" start="00:01:24.479" video="mainVideo" id="subtitle"]]
+[[!template text="Pour les fichiers de code, nous avons" start="00:01:26.720" video="mainVideo" id="subtitle"]]
+[[!template text="l’utilitaire gettext qui convertit" start="00:01:27.680" video="mainVideo" id="subtitle"]]
+[[!template text="toutes les chaînes de traduisibles" start="00:01:29.360" video="mainVideo" id="subtitle"]]
+[[!template text="dans un format traduisible," start="00:01:30.640" video="mainVideo" id="subtitle"]]
+[[!template text="qui est le format .po." start="00:01:32.079" video="mainVideo" id="subtitle"]]
+[[!template text="Ce format .po est omniprésent," start="00:01:33.840" video="mainVideo" id="subtitle"]]
+[[!template text="même dans l’industrie de la traduction" start="00:01:35.520" video="mainVideo" id="subtitle"]]
+[[!template text="des logiciels non-libres." start="00:01:36.400" video="mainVideo" id="subtitle"]]
+[[!template text="Pour la documentation," start="00:01:38.720" video="mainVideo" id="subtitle"]]
+[[!template text="nous avons quelque chose de différent" start="00:01:39.520" video="mainVideo" id="subtitle"]]
+[[!template text="qui s’appelle po4a," start="00:01:40.720" video="mainVideo" id="subtitle"]]
+[[!template text="l’abréviation de « po for all » (po pour tous)." start="00:01:42.000" video="mainVideo" id="subtitle"]]
+[[!template text="Quand on utilise po4a" start="00:01:45.119" video="mainVideo" id="subtitle"]]
+[[!template text="sur ces 182 fichiers .texi et .org," start="00:01:46.399" video="mainVideo" id="subtitle"]]
+[[!template text="qu’est-ce qu’on obtient ?" start="00:01:49.200" video="mainVideo" id="subtitle"]]
+[[!template text="On obtient quelque chose de bien mieux." start="00:01:50.479" video="mainVideo" id="subtitle"]]
+[[!template text="Maintenant on a trois segments." start="00:01:52.640" video="mainVideo" id="subtitle"]]
+[[!template text="Ce n’est pas parfait, car," start="00:01:54.799" video="mainVideo" id="subtitle"]]
+[[!template text="comme vous pouvez le voir," start="00:01:55.759" video="mainVideo" id="subtitle"]]
+[[!template text="les deux premiers segments" start="00:01:56.399" video="mainVideo" id="subtitle"]]
+[[!template text="ne sont pas à traduire." start="00:01:57.280" video="mainVideo" id="subtitle"]]
+[[!template text="Donc on peut encore" start="00:01:58.880" video="mainVideo" id="subtitle"]]
+[[!template text="améliorer les choses." start="00:01:59.520" video="mainVideo" id="subtitle"]]
+[[!template text="Quand on met ces fichiers" start="00:02:02.479" video="mainVideo" id="subtitle"]]
+[[!template text="dans OmegaT, on réduit considérablement" start="00:02:04.960" video="mainVideo" id="subtitle"]]
+[[!template text="le nombre total de mots." start="00:02:07.119" video="mainVideo" id="subtitle"]]
+[[!template text="On a maintenant 50 % de mots en moins" start="00:02:08.800" video="mainVideo" id="subtitle"]]
+[[!template text="et 23 % de caractères en moins à taper," start="00:02:11.360" video="mainVideo" id="subtitle"]]
+[[!template text="mais c’est toujours encore beaucoup de travail." start="00:02:14.239" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="Je vais donc vous parler d’OmegaT maintenant" start="00:02:15.680" video="mainVideo" id="subtitle"]]
+[[!template text="pour voir où il peut nous être utile." start="00:02:17.599" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT est un logiciel GPL3+, Java8+." start="00:02:22.239" video="mainVideo" id="subtitle"]]
+[[!template text="C’est un outil de Traduction Assistée par Ordinateur." start="00:02:25.440" video="mainVideo" id="subtitle"]]
+[[!template text="On abrège ça TAO." start="00:02:27.599" video="mainVideo" id="subtitle"]]
+[[!template text="La TAO est aux traducteurs" start="00:02:29.440" video="mainVideo" id="subtitle"]]
+[[!template text="ce que les EDI sont aux programmeurs." start="00:02:30.720" video="mainVideo" id="subtitle"]]
+[[!template text="Elle exploite la puissance de l’ordinateur" start="00:02:33.280" video="mainVideo" id="subtitle"]]
+[[!template text="pour automatiser notre travail," start="00:02:35.040" video="mainVideo" id="subtitle"]]
+[[!template text="qui consiste en recherche de références," start="00:02:36.480" video="mainVideo" id="subtitle"]]
+[[!template text="de correspondances, insertions automatiques," start="00:02:38.400" video="mainVideo" id="subtitle"]]
+[[!template text="et d’autres choses comme ça." start="00:02:40.800" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT n’est plus si jeune." start="00:02:44.080" video="mainVideo" id="subtitle"]]
+[[!template text="Il aura 20 ans l’année prochaine," start="00:02:46.319" video="mainVideo" id="subtitle"]]
+[[!template text="et à ce stade" start="00:02:48.319" video="mainVideo" id="subtitle"]]
+[[!template text="nous avons environ 1,5 million de téléchargements" start="00:02:48.959" video="mainVideo" id="subtitle"]]
+[[!template text="sur le site SourceForge" start="00:02:51.440" video="mainVideo" id="subtitle"]]
+[[!template text="ce qui ne veut pas dire grand-chose" start="00:02:53.200" video="mainVideo" id="subtitle"]]
+[[!template text="parce que cela inclut" start="00:02:54.080" video="mainVideo" id="subtitle"]]
+[[!template text="les fichiers utilisés pour la localisation" start="00:02:55.040" video="mainVideo" id="subtitle"]]
+[[!template text="les manuels, mais quand même" start="00:02:56.480" video="mainVideo" id="subtitle"]]
+[[!template text="c’est un chiffre quand même important." start="00:02:57.920" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT est inclus dans" start="00:02:59.599" video="mainVideo" id="subtitle"]]
+[[!template text="beaucoup de distributions Linux," start="00:03:00.720" video="mainVideo" id="subtitle"]]
+[[!template text="mais comme vous pouvez le voir ici," start="00:03:02.400" video="mainVideo" id="subtitle"]]
+[[!template text="il est surtout téléchargé sur Windows" start="00:03:03.680" video="mainVideo" id="subtitle"]]
+[[!template text="car les traducteurs" start="00:03:05.920" video="mainVideo" id="subtitle"]]
+[[!template text="travaillent principalement sous Windows." start="00:03:06.800" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT a un logo sympa" start="00:03:09.680" video="mainVideo" id="subtitle"]]
+[[!template text="et un site sympa aussi," start="00:03:11.120" video="mainVideo" id="subtitle"]]
+[[!template text="et je vous invite vraiment à le visiter." start="00:03:12.080" video="mainVideo" id="subtitle"]]
+[[!template text="L’URL est omegat.org et vous y trouverez" start="00:03:13.920" video="mainVideo" id="subtitle"]]
+[[!template text="toutes les informations dont vous avez besoin" start="00:03:16.159" video="mainVideo" id="subtitle"]]
+[[!template text="ainsi que les téléchargements des versions Linux," start="00:03:17.280" video="mainVideo" id="subtitle"]]
+[[!template text="avec ou sans Java inclus." start="00:03:19.040" video="mainVideo" id="subtitle"]]
+[[!template text="Alors, qu’est-ce qu’OmegaT nous apporte ?" start="00:03:22.080" video="mainVideo" id="subtitle"]]
+[[!template text="Les traducteurs professionnels doivent fournir" start="00:03:24.799" video="mainVideo" id="subtitle"]]
+[[!template text="des traductions rapides, cohérentes," start="00:03:26.560" video="mainVideo" id="subtitle"]]
+[[!template text="et de qualité," start="00:03:27.680" video="mainVideo" id="subtitle"]]
+[[!template text="et nous devons disposer d’outils appropriés" start="00:03:29.519" video="mainVideo" id="subtitle"]]
+[[!template text="pour y parvenir." start="00:03:30.720" video="mainVideo" id="subtitle"]]
+[[!template text="J’aimerais que po-mode fasse partie de nos outils," start="00:03:32.159" video="mainVideo" id="subtitle"]]
+[[!template text="mais ce n’est pas le cas," start="00:03:34.239" video="mainVideo" id="subtitle"]]
+[[!template text="et c’est bien dommage." start="00:03:35.120" video="mainVideo" id="subtitle"]]
+[[!template text="Nous devons donc utiliser ces outils de TAO." start="00:03:36.560" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="Laissez-moi vous montrer à quoi ressemble OmegaT" start="00:03:39.760" video="mainVideo" id="subtitle"]]
+[[!template text="quand j’ouvre ce projet que j’ai créé" start="00:03:41.440" video="mainVideo" id="subtitle"]]
+[[!template text="pour cette présentation." start="00:03:43.120" video="mainVideo" id="subtitle"]]
+[[!template text="La fenêtre est assez impressionnante," start="00:03:45.200" video="mainVideo" id="subtitle"]]
+[[!template text="mais vous pouvez en fait modifier" start="00:03:46.640" video="mainVideo" id="subtitle"]]
+[[!template text="toutes les parties selon vos besoins." start="00:03:47.760" video="mainVideo" id="subtitle"]]
+[[!template text="Je veux juste vous montrer" start="00:03:49.519" video="mainVideo" id="subtitle"]]
+[[!template text="tout en même temps" start="00:03:50.400" video="mainVideo" id="subtitle"]]
+[[!template text="pour vous donner une idée rapide de l’ensemble." start="00:03:51.120" video="mainVideo" id="subtitle"]]
+[[!template text="Vous avez différentes couleurs, fenêtres," start="00:03:53.680" video="mainVideo" id="subtitle"]]
+[[!template text="et tous ces espaces" start="00:03:55.200" video="mainVideo" id="subtitle"]]
+[[!template text="ont des fonctions différentes" start="00:03:55.920" video="mainVideo" id="subtitle"]]
+[[!template text="qui aident le traducteur," start="00:03:57.120" video="mainVideo" id="subtitle"]]
+[[!template text="et qui probablement ne vous sont" start="00:03:58.560" video="mainVideo" id="subtitle"]]
+[[!template text="pas familières." start="00:03:59.360" video="mainVideo" id="subtitle"]]
+[[!template text="Je vais vous présenter" start="00:04:02.879" video="mainVideo" id="subtitle"]]
+[[!template text="l’interface maintenant." start="00:04:04.080" video="mainVideo" id="subtitle"]]
+[[!template text="Tout d’abord, nous avons l’éditeur." start="00:04:05.680" video="mainVideo" id="subtitle"]]
+[[!template text="L’éditeur est composé de deux parties :" start="00:04:07.519" video="mainVideo" id="subtitle"]]
+[[!template text="le segment courant," start="00:04:09.439" video="mainVideo" id="subtitle"]]
+[[!template text="qui est associé à un numéro," start="00:04:10.480" video="mainVideo" id="subtitle"]]
+[[!template text="et tous les autres segments," start="00:04:12.319" video="mainVideo" id="subtitle"]]
+[[!template text="au-dessus ou en dessous." start="00:04:13.519" video="mainVideo" id="subtitle"]]
+[[!template text="En haut de la fenêtre," start="00:04:15.840" video="mainVideo" id="subtitle"]]
+[[!template text="vous pouvez voir les trois premiers segments" start="00:04:16.720" video="mainVideo" id="subtitle"]]
+[[!template text="qui étaient dans le fichier .po." start="00:04:18.720" video="mainVideo" id="subtitle"]]
+[[!template text="Le dernier ici, le quatrième, inclut" start="00:04:20.799" video="mainVideo" id="subtitle"]]
+[[!template text="une insertion automatique de correspondance." start="00:04:22.880" video="mainVideo" id="subtitle"]]
+[[!template text="On appelle ce type de traductions" start="00:04:28.720" video="mainVideo" id="subtitle"]]
+[[!template text="des « mémoires de traduction »." start="00:04:30.880" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT a inséré celle-ci automatiquement" start="00:04:32.720" video="mainVideo" id="subtitle"]]
+[[!template text="parce que j’ai paramétré comme ça," start="00:04:35.280" video="mainVideo" id="subtitle"]]
+[[!template text="et pour ma sécurité, elle est insérée avec" start="00:04:37.120" video="mainVideo" id="subtitle"]]
+[[!template text="le préfixe prédéfini « fuzzy »" start="00:04:38.560" video="mainVideo" id="subtitle"]]
+[[!template text="que je devrai retirer" start="00:04:40.639" video="mainVideo" id="subtitle"]]
+[[!template text="pour valider la traduction." start="00:04:41.919" video="mainVideo" id="subtitle"]]
+[[!template text="La fonctionnalité suivante est le glossaire." start="00:04:44.880" video="mainVideo" id="subtitle"]]
+[[!template text="Dans ce projet," start="00:04:47.919" video="mainVideo" id="subtitle"]]
+[[!template text="on a beaucoup de glossaires." start="00:04:48.479" video="mainVideo" id="subtitle"]]
+[[!template text="Certains sont pertinents, d’autres non." start="00:04:50.160" video="mainVideo" id="subtitle"]]
+[[!template text="Dans le segment que je suis en train de traduire" start="00:04:52.560" video="mainVideo" id="subtitle"]]
+[[!template text="en ce moment, vous pouvez voir" start="00:04:53.919" video="mainVideo" id="subtitle"]]
+[[!template text="des éléments soulignés." start="00:04:55.199" video="mainVideo" id="subtitle"]]
+[[!template text="Ce menu contextuel à droite" start="00:04:57.520" video="mainVideo" id="subtitle"]]
+[[!template text="me permet d’entrer les termes au fur et à mesure que j’écris." start="00:04:59.040" video="mainVideo" id="subtitle"]]
+[[!template text="C’est une sorte de système d’insertion automatique" start="00:05:02.240" video="mainVideo" id="subtitle"]]
+[[!template text="qui propose aussi des prédictions de l’historique," start="00:05:04.639" video="mainVideo" id="subtitle"]]
+[[!template text="des chaînes prédéfinies et d’autres choses comme ça." start="00:05:07.039" video="mainVideo" id="subtitle"]]
+[[!template text="Dans la partie à droite," start="00:05:14.479" video="mainVideo" id="subtitle"]]
+[[!template text="on a des informations de référence" start="00:05:15.440" video="mainVideo" id="subtitle"]]
+[[!template text="qui viennent directement" start="00:05:17.120" video="mainVideo" id="subtitle"]]
+[[!template text="des fichiers .po et .texi." start="00:05:18.240" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="On a également des notes à partager" start="00:05:21.440" video="mainVideo" id="subtitle"]]
+[[!template text="avec des collègues traducteurs," start="00:05:23.440" video="mainVideo" id="subtitle"]]
+[[!template text="et nous avons des chiffres qui me disent" start="00:05:25.759" video="mainVideo" id="subtitle"]]
+[[!template text="qu’il me reste encore 143 000 segments à traduire" start="00:05:28.080" video="mainVideo" id="subtitle"]]
+[[!template text="avant de terminer cette traduction." start="00:05:31.199" video="mainVideo" id="subtitle"]]
+[[!template text="Comme on le voit, il y a beaucoup de chaînes" start="00:05:35.280" video="mainVideo" id="subtitle"]]
+[[!template text="que nous ne voulons vraiment pas avoir à saisir." start="00:05:37.120" video="mainVideo" id="subtitle"]]
+[[!template text="Par exemple, ces chaînes" start="00:05:40.000" video="mainVideo" id="subtitle"]]
+[[!template text="sont des chaînes .texi typiques" start="00:05:42.160" video="mainVideo" id="subtitle"]]
+[[!template text="que le traducteur" start="00:05:43.840" video="mainVideo" id="subtitle"]]
+[[!template text="ne devrait vraiment pas avoir à saisir." start="00:05:45.039" video="mainVideo" id="subtitle"]]
+[[!template text="Nous allons donc devoir" start="00:05:46.479" video="mainVideo" id="subtitle"]]
+[[!template text="faire quelque chose pour gérer ça." start="00:05:47.360" video="mainVideo" id="subtitle"]]
+[[!template text="On va devoir créer des" start="00:05:50.400" video="mainVideo" id="subtitle"]]
+[[!template text="chaînes protégées" start="00:05:51.600" video="mainVideo" id="subtitle"]]
+[[!template text="à l’aide d’expressions régulières," start="00:05:52.479" video="mainVideo" id="subtitle"]]
+[[!template text="afin que les chaînes puissent être visualisées" start="00:05:54.400" video="mainVideo" id="subtitle"]]
+[[!template text="immédiatement dans le segment source," start="00:05:56.800" video="mainVideo" id="subtitle"]]
+[[!template text="saisies de manière semi-automatique" start="00:05:59.120" video="mainVideo" id="subtitle"]]
+[[!template text="dans le segment cible," start="00:06:00.479" video="mainVideo" id="subtitle"]]
+[[!template text="et validables." start="00:06:01.680" video="mainVideo" id="subtitle"]]
+[[!template text="L’expression régulière que j’ai trouvée" start="00:06:04.479" video="mainVideo" id="subtitle"]]
+[[!template text="pour définir la plupart des chaînes" start="00:06:06.479" video="mainVideo" id="subtitle"]]
+[[!template text="est celle-ci," start="00:06:08.160" video="mainVideo" id="subtitle"]]
+[[!template text="et je ne suis pas un pro des regex" start="00:06:09.600" video="mainVideo" id="subtitle"]]
+[[!template text="donc certains d’entre vous pourront me corriger." start="00:06:11.120" video="mainVideo" id="subtitle"]]
+[[!template text="Mais cette expression me donne" start="00:06:13.360" video="mainVideo" id="subtitle"]]
+[[!template text="une définition suffisante" start="00:06:14.560" video="mainVideo" id="subtitle"]]
+[[!template text="même si elle n’inclut pas encore" start="00:06:15.919" video="mainVideo" id="subtitle"]]
+[[!template text="la syntaxe org-mode." start="00:06:17.919" video="mainVideo" id="subtitle"]]
+[[!template text="Donc maintenant on a toutes ces" start="00:06:20.960" video="mainVideo" id="subtitle"]]
+[[!template text="chaînes spécifiques à .texi" start="00:06:22.344" video="mainVideo" id="subtitle"]]
+[[!template text="que nous ne voulons pas toucher" start="00:06:23.440" video="mainVideo" id="subtitle"]]
+[[!template text="affichées en gris." start="00:06:24.960" video="mainVideo" id="subtitle"]]
+[[!template text="En fait, vous avez peut-être remarqué" start="00:06:26.100" video="mainVideo" id="subtitle"]]
+[[!template text="que j’ai un peu triché," start="00:06:27.680" video="mainVideo" id="subtitle"]]
+[[!template text="car ici j’ai ajouté les années" start="00:06:28.479" video="mainVideo" id="subtitle"]]
+[[!template text="et le nom de la Free Software Foundation" start="00:06:30.319" video="mainVideo" id="subtitle"]]
+[[!template text="à la regex précédente" start="00:06:32.000" video="mainVideo" id="subtitle"]]
+[[!template text="pour vous montrer que vous pouvez protéger" start="00:06:34.000" video="mainVideo" id="subtitle"]]
+[[!template text="vraiment n’importe quel type de chaîne." start="00:06:35.520" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="On obtient maintenant" start="00:06:38.560" video="mainVideo" id="subtitle"]]
+[[!template text="une visualisation des chaînes de caractères" start="00:06:39.520" video="mainVideo" id="subtitle"]]
+[[!template text="que nous ne voulons pas toucher," start="00:06:41.360" video="mainVideo" id="subtitle"]]
+[[!template text="mais on doit encore les saisir toutes" start="00:06:43.440" video="mainVideo" id="subtitle"]]
+[[!template text="dans la traduction." start="00:06:45.440" video="mainVideo" id="subtitle"]]
+[[!template text="Pour ça, on a le menu contextuel" start="00:06:46.880" video="mainVideo" id="subtitle"]]
+[[!template text="que j’ai utilisé plus tôt avec le glossaire," start="00:06:48.319" video="mainVideo" id="subtitle"]]
+[[!template text="et on a également des rubriques" start="00:06:50.400" video="mainVideo" id="subtitle"]]
+[[!template text="dans le menu d’édition" start="00:06:51.520" video="mainVideo" id="subtitle"]]
+[[!template text="qui sont accompagnés de raccourcis" start="00:06:52.400" video="mainVideo" id="subtitle"]]
+[[!template text="pour faciliter l’insertion des balises manquantes." start="00:06:53.919" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="Enfin, et ce n’est pas le moins important," start="00:06:57.199" video="mainVideo" id="subtitle"]]
+[[!template text="nous pouvons maintenant valider nos entrées." start="00:06:58.800" video="mainVideo" id="subtitle"]]
+[[!template text="Ici, OmegaT me dit correctement" start="00:07:00.800" video="mainVideo" id="subtitle"]]
+[[!template text="que j’ai raté 7 chaînes protégées." start="00:07:02.479" video="mainVideo" id="subtitle"]]
+[[!template text="Je n’ai entré que 1998," start="00:07:05.759" video="mainVideo" id="subtitle"]]
+[[!template text="mais il y avait cinq autres années," start="00:07:07.599" video="mainVideo" id="subtitle"]]
+[[!template text="la chaîne de copyright," start="00:07:09.280" video="mainVideo" id="subtitle"]]
+[[!template text="et le nom de la FSF." start="00:07:10.479" video="mainVideo" id="subtitle"]]
+[[!template text="Avec ce support presque natif" start="00:07:14.240" video="mainVideo" id="subtitle"]]
+[[!template text="du format Texinfo," start="00:07:15.970" video="mainVideo" id="subtitle"]]
+[[!template text="on a beaucoup moins de choses à saisir," start="00:07:16.960" video="mainVideo" id="subtitle"]]
+[[!template text="et il y a beaucoup moins" start="00:07:18.880" video="mainVideo" id="subtitle"]]
+[[!template text="d’erreurs potentielles." start="00:07:19.919" video="mainVideo" id="subtitle"]]
+[[!template text="Mais on est d’accord, c’est encore beaucoup de travail." start="00:07:21.120" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="Ce qu’on aimerait maintenant" start="00:07:25.199" video="mainVideo" id="subtitle"]]
+[[!template text="c’est de collaborer avec des collègues traducteurs," start="00:07:26.319" video="mainVideo" id="subtitle"]]
+[[!template text="et là, on doit savoir" start="00:07:27.840" video="mainVideo" id="subtitle"]]
+[[!template text="qu’OmegaT est en fait" start="00:07:28.720" video="mainVideo" id="subtitle"]]
+[[!template text="un client svn/git dissimulé," start="00:07:29.840" video="mainVideo" id="subtitle"]]
+[[!template text="et que les projets en équipe peuvent être hébergés" start="00:07:32.080" video="mainVideo" id="subtitle"]]
+[[!template text="sur des plates-formes svn/git." start="00:07:34.240" video="mainVideo" id="subtitle"]]
+[[!template text="Les traducteurs n’ont pas besoin" start="00:07:36.319" video="mainVideo" id="subtitle"]]
+[[!template text="de connaître le contrôle de version." start="00:07:37.199" video="mainVideo" id="subtitle"]]
+[[!template text="Ils ont juste besoin d’identifiants d’accès," start="00:07:38.880" video="mainVideo" id="subtitle"]]
+[[!template text="et OmegaT va commiter pour eux." start="00:07:40.720" video="mainVideo" id="subtitle"]]
+[[!template text="De cette façon, nous n’avons pas besoin d’utiliser" start="00:07:42.400" video="mainVideo" id="subtitle"]]
+[[!template text="d’interfaces de traduction web laides" start="00:07:44.080" video="mainVideo" id="subtitle"]]
+[[!template text="et peu ergonomiques" start="00:07:45.759" video="mainVideo" id="subtitle"]]
+[[!template text="puisqu’on peut utiliser un outil" start="00:07:47.199" video="mainVideo" id="subtitle"]]
+[[!template text="hors ligne professionnel." start="00:07:48.800" video="mainVideo" id="subtitle"]]
+[[!template text="Voici donc à quoi ressemble" start="00:07:51.440" video="mainVideo" id="subtitle"]]
+[[!template text="la plateforme" start="00:07:52.479" video="mainVideo" id="subtitle"]]
+[[!template text="où j’héberge ce projet." start="00:07:54.160" video="mainVideo" id="subtitle"]]
+[[!template text="Les dernières mises à jour datent d’il y a" start="00:07:55.919" video="mainVideo" id="subtitle"]]
+[[!template text="20 jours et 30 secondes" start="00:07:57.199" video="mainVideo" id="subtitle"]]
+[[!template text="quand j’ai créé cette présentation," start="00:07:58.639" video="mainVideo" id="subtitle"]]
+[[!template text="et vous pouvez voir que j’ai un partenaire" start="00:08:00.720" video="mainVideo" id="subtitle"]]
+[[!template text="qui a travaillé avec moi sur le même ensemble de fichiers." start="00:08:02.479" video="mainVideo" id="subtitle"]]
+[[!template text="Bien qu’il semble que" start="00:08:04.639" video="mainVideo" id="subtitle"]]
+[[!template text="que nous avons effectivement commité la traduction" start="00:08:05.520" video="mainVideo" id="subtitle"]]
+[[!template text="sur la plateforme," start="00:08:06.879" video="mainVideo" id="subtitle"]]
+[[!template text="ce n’était pas nous, mais OmegaT." start="00:08:07.680" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT fait le gros du travail." start="00:08:11.039" video="mainVideo" id="subtitle"]]
+[[!template text="Il effectue régulièrement des sauvegardes et" start="00:08:13.599" video="mainVideo" id="subtitle"]]
+[[!template text="se synchronise avec les serveurs." start="00:08:15.039" video="mainVideo" id="subtitle"]]
+[[!template text="Les traducteurs reçoivent régulièrement" start="00:08:16.879" video="mainVideo" id="subtitle"]]
+[[!template text="les mises à jour de leurs collègues," start="00:08:18.720" video="mainVideo" id="subtitle"]]
+[[!template text="et quand il le faut," start="00:08:20.479" video="mainVideo" id="subtitle"]]
+[[!template text="OmegaT affiche un simple" start="00:08:21.680" video="mainVideo" id="subtitle"]]
+[[!template text="dialogue de résolution des conflits." start="00:08:23.360" video="mainVideo" id="subtitle"]]
+[[!template text="Les traducteurs n’ont jamais à manipuler" start="00:08:25.440" video="mainVideo" id="subtitle"]]
+[[!template text="svn ou git, jamais." start="00:08:27.039" video="mainVideo" id="subtitle"]]
+[[!template text="Et maintenant, nous pouvons envisager un avenir" start="00:08:29.360" video="mainVideo" id="subtitle"]]
+[[!template text="pas si lointain" start="00:08:30.800" video="mainVideo" id="subtitle"]]
+[[!template text="où les manuels seraient traduits" start="00:08:31.599" video="mainVideo" id="subtitle"]]
+[[!template text="et éventuellement inclus" start="00:08:33.120" video="mainVideo" id="subtitle"]]
+[[!template text="dans la distribution," start="00:08:34.159" video="mainVideo" id="subtitle"]]
+[[!template text="mais c’est un sujet" start="00:08:35.279" video="mainVideo" id="subtitle"]]
+[[!template text="pour une autre présentation." start="00:08:36.080" video="mainVideo" id="subtitle"]]
+[[!template new="1" text="J’ai atteint la fin de cette session." start="00:08:39.760" video="mainVideo" id="subtitle"]]
+[[!template text="Merci encore d’y avoir participé." start="00:08:42.080" video="mainVideo" id="subtitle"]]
+[[!template text="Il y a beaucoup de sujets" start="00:08:44.240" video="mainVideo" id="subtitle"]]
+[[!template text="que j’avais promis de ne pas aborder," start="00:08:45.600" video="mainVideo" id="subtitle"]]
+[[!template text="et je pense avoir tenu ma promesse." start="00:08:46.880" video="mainVideo" id="subtitle"]]
+[[!template text="Il va y avoir des questions-réponses maintenant" start="00:08:50.000" video="mainVideo" id="subtitle"]]
+[[!template text="et j’ai aussi commencé" start="00:08:51.600" video="mainVideo" id="subtitle"]]
+[[!template text="un fil de discussion sur cette session" start="00:08:52.517" video="mainVideo" id="subtitle"]]
+[[!template text="samedi dernier, sur Reddit." start="00:08:53.600" video="mainVideo" id="subtitle"]]
+[[!template text="Vous pouvez me trouver sur les listes emacs-help" start="00:08:55.519" video="mainVideo" id="subtitle"]]
+[[!template text="et emacs-devel," start="00:08:57.279" video="mainVideo" id="subtitle"]]
+[[!template text="alors n’hésitez pas à m’envoyer" start="00:08:59.200" video="mainVideo" id="subtitle"]]
+[[!template text="vos questions et remarques." start="00:09:00.480" video="mainVideo" id="subtitle"]]
+[[!template text="Merci encore, et à bientôt !" start="00:09:02.080" video="mainVideo" id="subtitle"]]