summaryrefslogtreecommitdiffstats
path: root/2021
diff options
context:
space:
mode:
Diffstat (limited to '2021')
-rw-r--r--2021/all-include.md575
-rw-r--r--2021/all.md2
-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
-rw-r--r--2021/contribute.md41
-rw-r--r--2021/emacsconf-pentabarf.xml14
-rw-r--r--2021/emacsconf.ics118
-rw-r--r--2021/info/babel-schedule.md24
-rw-r--r--2021/info/bidi-schedule.md26
-rw-r--r--2021/info/bindat-schedule.md63
-rw-r--r--2021/info/borg-schedule.md15
-rw-r--r--2021/info/build-schedule.md22
-rw-r--r--2021/info/clede-schedule.md23
-rw-r--r--2021/info/cs-schedule.md35
-rw-r--r--2021/info/dashboard-schedule.md22
-rw-r--r--2021/info/day1-close-schedule.md4
-rw-r--r--2021/info/day1-open-schedule.md4
-rw-r--r--2021/info/day2-close-schedule.md6
-rw-r--r--2021/info/day2-open-schedule.md4
-rw-r--r--2021/info/design-schedule.md23
-rw-r--r--2021/info/dev-update-schedule.md32
-rw-r--r--2021/info/eaf-schedule.md25
-rw-r--r--2021/info/erg-schedule.md42
-rw-r--r--2021/info/exec-schedule.md23
-rw-r--r--2021/info/faster-schedule.md50
-rw-r--r--2021/info/forever-schedule.md75
-rw-r--r--2021/info/form-schedule.md23
-rw-r--r--2021/info/freedom-schedule.md26
-rw-r--r--2021/info/frownies-schedule.md39
-rw-r--r--2021/info/gregorian-schedule.md24
-rw-r--r--2021/info/imaginary-schedule.md25
-rw-r--r--2021/info/invoice-schedule.md15
-rw-r--r--2021/info/janitor-schedule.md59
-rw-r--r--2021/info/maintainers-schedule.md62
-rw-r--r--2021/info/model-schedule.md15
-rw-r--r--2021/info/mold-schedule.md14
-rw-r--r--2021/info/molecular-schedule.md16
-rw-r--r--2021/info/montessori-schedule.md42
-rw-r--r--2021/info/nangulator-schedule.md23
-rw-r--r--2021/info/native-schedule.md57
-rw-r--r--2021/info/news-schedule.md29
-rw-r--r--2021/info/nongnu-schedule.md14
-rw-r--r--2021/info/nyxt-schedule.md14
-rw-r--r--2021/info/omegat-schedule.md17
-rw-r--r--2021/info/org-outside-schedule.md22
-rw-r--r--2021/info/pattern-schedule.md27
-rw-r--r--2021/info/professional-schedule.md14
-rw-r--r--2021/info/project-schedule.md27
-rw-r--r--2021/info/research-schedule.md23
-rw-r--r--2021/info/structural-schedule.md23
-rw-r--r--2021/info/teach-schedule.md23
-rw-r--r--2021/info/tech-schedule.md23
-rw-r--r--2021/info/telega-schedule.md14
-rw-r--r--2021/info/test-schedule.md14
-rw-r--r--2021/info/ui-schedule.md24
-rw-r--r--2021/info/unix-schedule.md40
-rw-r--r--2021/inline-alternate.md2
-rw-r--r--2021/meetings.org32
-rw-r--r--2021/organizers-notebook.md10
-rw-r--r--2021/organizers-notebook.org32
-rw-r--r--2021/playbook.md1411
-rw-r--r--2021/playbook.org1194
-rw-r--r--2021/playbook/restream-flv.sh2
-rw-r--r--2021/playbook/restream-lowres.sh2
-rw-r--r--2021/playbook/restream-youtube.sh2
-rw-r--r--2021/playbook/stream-desktop-and-audio.sh1
-rw-r--r--2021/prepare.md2
-rw-r--r--2021/schedule-details.md110
-rw-r--r--2021/schedule.md18
-rw-r--r--2021/sidebar.md2
-rw-r--r--2021/talks.md19
-rw-r--r--2021/talks/babel.md38
-rw-r--r--2021/talks/bidi.md30
-rw-r--r--2021/talks/binary.md31
-rw-r--r--2021/talks/bindat.md50
-rw-r--r--2021/talks/build.md23
-rw-r--r--2021/talks/clede.md13
-rw-r--r--2021/talks/cs.md23
-rw-r--r--2021/talks/dashboard.md28
-rw-r--r--2021/talks/day1-close.md18
-rw-r--r--2021/talks/day1-open.md2
-rw-r--r--2021/talks/design.md46
-rw-r--r--2021/talks/eaf.md76
-rw-r--r--2021/talks/faster.md75
-rw-r--r--2021/talks/forever.md46
-rw-r--r--2021/talks/form.md40
-rw-r--r--2021/talks/freedom.md24
-rw-r--r--2021/talks/frownies.md43
-rw-r--r--2021/talks/imaginary.md29
-rw-r--r--2021/talks/invoice.md4
-rw-r--r--2021/talks/janitor.md50
-rw-r--r--2021/talks/maintainers.md37
-rw-r--r--2021/talks/model.md22
-rw-r--r--2021/talks/mold.md56
-rw-r--r--2021/talks/molecular.md34
-rw-r--r--2021/talks/montessori.md156
-rw-r--r--2021/talks/nangulator.md21
-rw-r--r--2021/talks/native.md84
-rw-r--r--2021/talks/news.md8
-rw-r--r--2021/talks/nongnu.md3
-rw-r--r--2021/talks/omegat.md4
-rw-r--r--2021/talks/org-outside.md34
-rw-r--r--2021/talks/pattern.md194
-rw-r--r--2021/talks/professional.md2
-rw-r--r--2021/talks/project.md2
-rw-r--r--2021/talks/research.md3
-rw-r--r--2021/talks/structural.md38
-rw-r--r--2021/talks/teach.md8
-rw-r--r--2021/talks/tech.md18
-rw-r--r--2021/talks/telega.md12
-rw-r--r--2021/talks/test.md6
-rw-r--r--2021/talks/ui.md61
-rw-r--r--2021/talks/unix.md20
144 files changed, 15231 insertions, 3027 deletions
diff --git a/2021/all-include.md b/2021/all-include.md
index 0bd62591..77408164 100644
--- a/2021/all-include.md
+++ b/2021/all-include.md
@@ -1,286 +1,289 @@
-<ol class="videos"><li><div class="video-card vid" data-id="mainVideo"><div class="title"><a href="https://emacsconf.org/2021/talks/day1-open">Opening remarks</a></div></figcaption>
-<div class="speakers"></div>The video for "Opening remarks" will be posted here when available. You can also subscribe to the <a href="https://lists.gnu.org/mailman/listinfo/emacsconf-discuss">emacsconf-discuss mailing list</a> for updates.
-<div class="files resources"><ul></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/news">Emacs News Highlights</a></div></figcaption>
-<div class="speakers">Sacha Chua</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm">Download .webm video (4:24, 6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ueMACQQh39buYwf5K9Y5fh">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm"><track label="English" kind="captions" srclang="en" src="/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.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/frownies">The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</a></div></figcaption>
-<div class="speakers">Case Duckworth</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm">Download .webm video (19:40, 26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/5s64FqtX3pqq4uYDwtTvrA">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt" default><track label="French" kind="captions" srclang="fr" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt"><track label="Japanese" kind="captions" srclang="ja" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/omegat">Emacs manuals translation and OmegaT</a></div></figcaption>
-<div class="speakers">Jean-Christophe Helary</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm">Download .webm video (9:07, 9.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/cQbCi4a9E3YVSW9KdiyW2V">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/unix">GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</a></div></figcaption>
-<div class="speakers">Daniel Rose</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm">Download .webm video (6:41, 6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/18qckj5KshdahW5AiUuMHB">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/montessori">Emacs and Montessori Philosophy</a></div></figcaption>
-<div class="speakers">Grant Shangreaux</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm">Download .webm video (10:27, 11.4MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/c5sEmoZbK3ay1b9VGNmP1z">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/pattern">Emacs as Design Pattern Learning</a></div></figcaption>
-<div class="speakers">Greta Goetz</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm">Download .webm video (23:01, 35.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/afvaVspSSR9YypjUqTypQz">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/freedom">How Emacs made me appreciate software freedom</a></div></figcaption>
-<div class="speakers">Protesilaos Stavrou</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm">Download .webm video (38:24, 54.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ktxYMzsYPYguc3HwkDiKea">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/nongnu">NonGNU ELPA Update</a></div></figcaption>
-<div class="speakers">Philip Kaludercic</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm">Download .webm video (6:28, 7.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ovpi53peSt7aX8EtvKMFFy">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a></div></figcaption>
-<div class="speakers">Dhavan (codingquark)</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm">Download .webm video (7:49, 7.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/5oG4HmrCV5REgRHfA1rqa3">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/nangulator">Introducing N-Angulator</a></div></figcaption>
-<div class="speakers">Kevin Haddock</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm">Download .webm video (9:58, 9.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/pHrShaGAJwtXvsqKhNWZ56">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a></div></figcaption>
-<div class="speakers">Spencer King</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm">Download .webm video (8:08, 7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ig7rS3VpJjLXCLeq5GYb5z">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/telega">telega.el and the Emacs community on Telegram</a></div></figcaption>
-<div class="speakers">Gabriele Bozzola</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm">Download .webm video (7:58, 8.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/g1YBMdbNqMHMZu7wCHB5rH">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/janitor">A day in the life of a janitor</a></div></figcaption>
-<div class="speakers">Stefan Monnier</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm">Download .webm video (25:57, 36.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/1h7QmFBDjBQZPBeWtARK9j">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/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.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/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.webm"><track label="English" kind="captions" srclang="en" src="/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.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/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--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/erg">Emacs Research Group, Season Zero: What we did together with Emacs in 2 hours a week for a year</a></div></figcaption>
-<div class="speakers">Noorah Alhasan, Joe Corneli, Raymond Puzio, Leo Vivier</div></figure>
-<div class="files resources"><ul><li><a href="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.webm">Download .webm video (10:23, 11MB)</a></li><li><a href="https://media.emacsconf.org/2021/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.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/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.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/jXni2SVVquM8FLjMLuK4Fg">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/cs">One effective CS grad student workflow</a></div></figcaption>
-<div class="speakers">Greg Coladonato</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm">Download .webm video (9:28, 43.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/mxFkFd9TiUsJ8goGWZNAcz">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/professional">Using Org-Mode For Recording Continuous Professional Development</a></div></figcaption>
-<div class="speakers">Philip Beadling</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm">Download .webm video (10:33, 12.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/rXjPE7hdELfGJhFFUqFhF5">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/tech">Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide</a></div></figcaption>
-<div class="speakers">Jan Ypma</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm">Download .webm video (10:22, 15.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/2pPvDFSAwr2zhGfHGHUbko">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/exec">Org as an executable format</a></div></figcaption>
-<div class="speakers">Tom Gillespie</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm">Download .webm video (7:09, 10.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/6TaLDJ4goGaa2R7dsxMi9F">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/org-outside">The use of Org mode syntax outside of GNU/Emacs</a></div></figcaption>
-<div class="speakers">Karl Voit</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm">Download .webm video (12:09, 27.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/g35zpQfCCqDM39ZMEphNj7">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/teach">Using Org-mode to teach programming</a></div></figcaption>
-<div class="speakers">Daniel German</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm">Download .webm video (20:49, 26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/w6CowfCZotPnYkwhudU32V">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/babel">Babel for academics</a></div></figcaption>
-<div class="speakers">Asilata Bapat</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm">Download .webm video (9:58, 13.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/wPJWkEYqyGKxi9SQ82Hmn6">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a></div></figcaption>
-<div class="speakers">Ahmed Khaled</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm">Download .webm video (8:47, 14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/jTXAtCYNWFPRFR1pt94yi1">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a></div></figcaption>
-<div class="speakers">Blaine Mooers</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm">Download .webm video (8:04, 8.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/tKmTCVtngTLQfQzHpG4BgU">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/invoice">Finding Your (In)voice: Emacs for Invoicing</a></div></figcaption>
-<div class="speakers">Bala Ramadurai</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm">Download .webm video (9:59, 14.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/kD6nFQsJFSQys8DCmR76gi">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a></div></figcaption>
-<div class="speakers">Adolfo Villafiorita</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm">Download .webm video (9:37, 15.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/71vGdiqdkaN1bAcoDd8VkT">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a></div></figcaption>
-<div class="speakers">Mehmet Tekman</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm">Download .webm video (8:31, 5.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ojNW5UwYUzzRTsLhoHZMzG">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a></div></figcaption>
-<div class="speakers">Andrea</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm">Download .webm video (8:26, 24.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qBpVxaayFezJMgG9WVQsoy">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/dev-update">Emacs development updates</a></div></figcaption>
-<div class="speakers">John Wiegley</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm">Download .webm video (7:17, 10.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/aBGWhAhfgB4obi5c58qhFM">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/design">On the design of text editors</a></div></figcaption>
-<div class="speakers">Nicolas P. Rougier</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm">Download .webm video (6:39, 6.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/hmiKha234Q2FygiaspQEP4">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><div class="title"><a href="https://emacsconf.org/2021/talks/day1-close">Closing remarks day 1</a></div></figcaption>
-<div class="speakers"></div>The video for "Closing remarks day 1" will be posted here when available. You can also subscribe to the <a href="https://lists.gnu.org/mailman/listinfo/emacsconf-discuss">emacsconf-discuss mailing list</a> for updates.
-<div class="files resources"><ul></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><div class="title"><a href="https://emacsconf.org/2021/talks/day2-open">Opening remarks day 2</a></div></figcaption>
-<div class="speakers"></div>The video for "Opening remarks day 2" will be posted here when available. You can also subscribe to the <a href="https://lists.gnu.org/mailman/listinfo/emacsconf-discuss">emacsconf-discuss mailing list</a> for updates.
-<div class="files resources"><ul></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/faster">Optimizing Emacs Lisp Code</a></div></figcaption>
-<div class="speakers">Dmitry Gutov</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm">Download .webm video (35:35, 57.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/kJkKrSyfeuhL7Gttgxb572">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/structural">Tree-edit: Structural editing for Java, Python, C, and beyond!</a></div></figcaption>
-<div class="speakers">Ethan Leba</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm">Download .webm video (10:24, 13MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/8Smc22cLzi7UzosijPt7DP">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/ui">Yak-shaving to a UI framework</a></div></figcaption>
-<div class="speakers">Erik Anderson</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm">Download .webm video (9:28, 10.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/cwoEZmDr3YDAkskSq8nYEf">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a></div></figcaption>
-<div class="speakers">Andrea</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm">Download .webm video (9:34, 14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/4CfNuj8YPpB8HreQHqGXWf">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/model">Extending the "model" of Emacs to other applications</a></div></figcaption>
-<div class="speakers">Laszlo Krajnikovszkij</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm">Download .webm video (9:49, 8.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/vsuuxy2SUsWpcLoeAtqJhG">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a></div></figcaption>
-<div class="speakers">Andrea Corallo</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm">Download .webm video (39:08, 40.8MB)</a></li><li><a href="https://toobnix.org/w/aCnFuNEzX1kMKJp3q31YKx">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/form">Old McCarthy Had a Form</a></div></figcaption>
-<div class="speakers">Ian Eure</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm">Download .webm video (12:44, 13.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/mcyaNMBE1QpjvQa2qDayvi">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/bindat">Turbo Bindat</a></div></figcaption>
-<div class="speakers">Stefan Monnier</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm">Download .webm video (29:48, 28.7MB)</a></li><li><a href="https://toobnix.org/w/qQeuipEkbSJgZbDm6xRg9q">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/test">Test blocks</a></div></figcaption>
-<div class="speakers">Eduardo Ochs</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm">Download .webm video (6:04, 7.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qRKLj4VdBG8cFN1MEfcRho">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a></div></figcaption>
-<div class="speakers">Mohsen BANAN</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm">Download .webm video (19:52, 20.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/sBy9n22kgLMjXu9Cr1Ta44">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a></div></figcaption>
-<div class="speakers">Matthew Zeng</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm">Download .webm video (9:15, 10.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/9hMPmTLzAxx4bxHJnSbkMr">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/imaginary">Imaginary Programming</a></div></figcaption>
-<div class="speakers">Shane Mulligan</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm">Download .webm video (10:17, 19.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/3ydn2davFQZPoiwB78KZWm">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/clede">CLEDE: the Common Lisp Emacs Development Environment</a></div></figcaption>
-<div class="speakers">Fermin MF</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm">Download .webm video (18:55, 24.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/1HuHMank52gcpHqf4M7Sa5">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/maintainers">How to help Emacs maintainers?</a></div></figcaption>
-<div class="speakers">Bastien Guerry</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm">Download .webm video (10:07, 9.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/naNvWzM2jjj5ownu9zmbAf">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt" default>
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/build">How to build an Emacs</a></div></figcaption>
-<div class="speakers">Fermin MF</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm">Download .webm video (16:54, 15.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/jJJwKDTmUVeRQhSj7bazhz">View on Toobnix</a></li></ul></div></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--chapters.vtt" default onload="displayChapters(this)">
-</video><figcaption><div class="title"><a href="https://emacsconf.org/2021/talks/forever">M-x Forever: Why Emacs will outlast text editor trends</a></div></figcaption>
-<div class="speakers">David Wilson (System Crafters)</div></figure>
-<div class="files resources"><ul><li><a href="emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm">Download .webm video (24:52, 27.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/jSW4Gk3hsuv2ZfW8jXHz39">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</li>
-<li><div class="video-card vid" data-id="mainVideo"><div class="title"><a href="https://emacsconf.org/2021/talks/day2-close">Closing remarks day 2</a></div></figcaption>
-<div class="speakers"></div>The video for "Closing remarks day 2" will be posted here when available. You can also subscribe to the <a href="https://lists.gnu.org/mailman/listinfo/emacsconf-discuss">emacsconf-discuss mailing list</a> for updates.
-<div class="files resources"><ul></ul></div></div>
-</li></ol> \ No newline at end of file
+<ol class="videos"><li><div class="title"><a href="https://emacsconf.org/2021/talks/day1-open">Opening remarks</a></div><div class="speakers"></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/news">Emacs News Highlights</a></div><div class="speakers">Sacha Chua</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm">Download .webm video (4:24, 6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/ueMACQQh39buYwf5K9Y5fh">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.003" data-stop="11.023">00:00 Introduction</li>
+<li data-start="11.024" data-stop="24.987">00:11 Upcoming Emacs 28 release</li>
+<li data-start="24.988" data-stop="57.125">00:24 Org mode 9.5</li>
+<li data-start="57.126" data-stop="78.107">00:57 Magit major release</li>
+<li data-start="78.108" data-stop="111.283">01:18 Completion</li>
+<li data-start="111.284" data-stop="132.064">01:51 Embark</li>
+<li data-start="132.065" data-stop="164.655">02:12 tree-sitter</li>
+<li data-start="164.656" data-stop="183.656">02:44 Collaborative editing</li>
+<li data-start="183.657" data-stop="221.737">03:03 Graphical experiments</li>
+<li data-start="221.738" data-stop="240.070">03:41 Community</li>
+<li data-start="240.071" data-stop="241.071">04:00 libera.chat</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/frownies">The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</a></div><div class="speakers">Case Duckworth</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm" /><track label="English" kind="captions" srclang="en" src="/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.vtt" default /><track kind="chapters" label="Chapters" src="/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"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm">Download .webm video (19:40, 26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/5s64FqtX3pqq4uYDwtTvrA">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.000" data-stop="61.569">00:00 Introduction</li>
+<li data-start="61.570" data-stop="127.635">01:01 Before the beginning, the Beginning</li>
+<li data-start="127.636" data-stop="176.169">02:07 Oops</li>
+<li data-start="176.170" data-stop="292.935">02:56 Yada yada yada</li>
+<li data-start="292.936" data-stop="411.802">04:52 During all this time...</li>
+<li data-start="411.803" data-stop="449.769">06:51 Pandemic</li>
+<li data-start="449.770" data-stop="530.002">07:29 Anyway</li>
+<li data-start="530.003" data-stop="578.235">08:50 A growing obsession</li>
+<li data-start="578.236" data-stop="632.735">09:38 What is the point of all of this? I thought we were talking about frowing.</li>
+<li data-start="632.736" data-stop="674.669">10:32 Conversation</li>
+<li data-start="674.670" data-stop="693.069">11:14 Later...</li>
+<li data-start="693.070" data-stop="694.070">11:33 frowny.el</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/omegat">Emacs manuals translation and OmegaT</a></div><div class="speakers">Jean-Christophe Helary</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm">Download .webm video (9:07, 9.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/cQbCi4a9E3YVSW9KdiyW2V">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/unix">GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</a></div><div class="speakers">Daniel Rose</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm">Download .webm video (6:41, 6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/18qckj5KshdahW5AiUuMHB">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.080" data-stop="31.598">00:00 Introduction</li>
+<li data-start="31.599" data-stop="57.599">00:31 UNIX Philosophy?</li>
+<li data-start="57.600" data-stop="85.438">00:57 Enter Emacs</li>
+<li data-start="85.439" data-stop="110.798">01:25 Emacs versus the original ideas</li>
+<li data-start="110.799" data-stop="137.439">01:50 Why compare to UNIX?</li>
+<li data-start="137.440" data-stop="179.649">02:17 Emacs /does/ work with the UNIX philosophy</li>
+<li data-start="179.650" data-stop="195.049">02:59 Philosophies don't really matter in computing</li>
+<li data-start="195.050" data-stop="254.382">03:15 Android Studio</li>
+<li data-start="254.383" data-stop="282.899">04:14 Window Managers</li>
+<li data-start="282.900" data-stop="309.299">04:42 Browsers</li>
+<li data-start="309.300" data-stop="334.638">05:09 Vim</li>
+<li data-start="334.639" data-stop="372.232">05:34 Terminals</li>
+<li data-start="372.233" data-stop="373.233">06:12 Do what helps you most, not what a philosophy tells you</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/montessori">Emacs and Montessori Philosophy</a></div><div class="speakers">Grant Shangreaux</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm">Download .webm video (10:27, 11.4MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/c5sEmoZbK3ay1b9VGNmP1z">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="4.960" data-stop="20.319">00:04 Introduction</li>
+<li data-start="20.320" data-stop="35.839">00:20 Respect</li>
+<li data-start="35.840" data-stop="79.118">00:35 The Prepared Environment</li>
+<li data-start="79.119" data-stop="116.559">01:19 Human tendencies</li>
+<li data-start="116.560" data-stop="210.719">01:56 Orientation</li>
+<li data-start="210.720" data-stop="265.999">03:30 Order</li>
+<li data-start="266.000" data-stop="312.079">04:26 Exploration</li>
+<li data-start="312.080" data-stop="346.159">05:12 Communication</li>
+<li data-start="346.160" data-stop="381.198">05:46 Activity</li>
+<li data-start="381.199" data-stop="408.318">06:21 Manipulation</li>
+<li data-start="408.319" data-stop="429.198">06:48 Work (or Purposeful Activity)</li>
+<li data-start="429.199" data-stop="458.959">07:09 Repetition</li>
+<li data-start="458.960" data-stop="496.318">07:38 Exactness</li>
+<li data-start="496.319" data-stop="541.999">08:16 Abstraction</li>
+<li data-start="542.000" data-stop="543.000">09:02 Perfection</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/pattern">Emacs as Design Pattern Learning</a></div><div class="speakers">Greta Goetz</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm">Download .webm video (23:01, 36.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/afvaVspSSR9YypjUqTypQz">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.000" data-stop="76.239">00:00 Introduction</li>
+<li data-start="76.240" data-stop="318.799">01:16 Definition of design patterns and relation to Emacs</li>
+<li data-start="318.800" data-stop="552.239">05:18 Why this approach matters</li>
+<li data-start="552.240" data-stop="689.999">09:12 Managing complexity: Emacs as mind map</li>
+<li data-start="690.000" data-stop="751.679">11:30 Emacs as design pattern framework</li>
+<li data-start="751.680" data-stop="810.638">12:31 Personal customization</li>
+<li data-start="810.639" data-stop="1001.998">13:30 Implementing Emacs as a model for learning</li>
+<li data-start="1001.999" data-stop="1380.920">16:41 Emacs as accommodating complex social, community assemblages</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/freedom">How Emacs made me appreciate software freedom</a></div><div class="speakers">Protesilaos Stavrou</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm">Download .webm video (38:24, 54.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/ktxYMzsYPYguc3HwkDiKea">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.000" data-stop="284.206">00:00 About me and this talk</li>
+<li data-start="284.207" data-stop="557.106">04:44 The inherent Emacs qualities for an autodidact</li>
+<li data-start="557.107" data-stop="847.873">09:17 The interconnectedness of the Emacs space</li>
+<li data-start="847.874" data-stop="1135.039">14:07 The documentation culture of the Emacs community</li>
+<li data-start="1135.040" data-stop="1439.528">18:55 The Promethean Ideal of freeing know-how and expertise</li>
+<li data-start="1439.529" data-stop="1733.139">23:59 The 'killer apps' of Emacs</li>
+<li data-start="1733.140" data-stop="2019.173">28:53 You can't be an Emacs tourist</li>
+<li data-start="2019.174" data-stop="2020.174">33:39 Emacs as a champion of software freedom</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/nongnu">NonGNU ELPA Update</a></div><div class="speakers">Philip Kaludercic</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm">Download .webm video (6:28, 7.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ovpi53peSt7aX8EtvKMFFy">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a></div><div class="speakers">Dhavan (codingquark)</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm">Download .webm video (7:49, 7.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/5oG4HmrCV5REgRHfA1rqa3">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/nangulator">Introducing N-Angulator</a></div><div class="speakers">Kevin Haddock</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm">Download .webm video (9:58, 9.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/pHrShaGAJwtXvsqKhNWZ56">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a></div><div class="speakers">Spencer King</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm">Download .webm video (8:08, 7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ig7rS3VpJjLXCLeq5GYb5z">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.240" data-stop="10.000">00:00 Title</li>
+<li data-start="10.000" data-stop="46.800">00:10 Roadmap</li>
+<li data-start="46.800" data-stop="106.079">00:46 Gregorio</li>
+<li data-start="106.079" data-stop="128.560">01:46 Metadata</li>
+<li data-start="128.560" data-stop="168.640">02:08 `gregorian-mode`</li>
+<li data-start="168.640" data-stop="409.520">02:48 Examples</li>
+<li data-start="409.520" data-stop="487.520">06:49 Useful links</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/telega">telega.el and the Emacs community on Telegram</a></div><div class="speakers">Gabriele Bozzola</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm">Download .webm video (7:58, 8.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/g1YBMdbNqMHMZu7wCHB5rH">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/janitor">A day in the life of a janitor</a></div><div class="speakers">Stefan Monnier</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm">Download .webm video (25:57, 36.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/1h7QmFBDjBQZPBeWtARK9j">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/erg">Emacs Research Group, Season Zero: What we did together with Emacs in 2 hours a week for a year</a></div><div class="speakers">Noorah Alhasan, Joe Corneli, Raymond Puzio, Leo Vivier</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/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.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/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.webm" /><track label="English" kind="captions" srclang="en" src="/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.vtt" default /><track kind="chapters" label="Chapters" src="/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"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/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.webm">Download .webm video (10:23, 11MB)</a></li><li><a href="https://media.emacsconf.org/2021/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.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/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.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/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--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/jXni2SVVquM8FLjMLuK4Fg">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.880" data-stop="105.999">00:00 Introduction</li>
+<li data-start="106.000" data-stop="173.679">01:46 Background and technology: Emacs Research Group</li>
+<li data-start="173.680" data-stop="313.599">02:53 Prerecorded demo</li>
+<li data-start="313.600" data-stop="335.119">05:13 Organising metaphor</li>
+<li data-start="335.120" data-stop="360.719">05:35 Timetable</li>
+<li data-start="360.720" data-stop="392.239">06:00 Project Action Review</li>
+<li data-start="392.240" data-stop="422.318">06:32 Causal Layered Analysis</li>
+<li data-start="422.319" data-stop="462.879">07:02 Design Patterns and Next Steps</li>
+<li data-start="462.880" data-stop="473.598">07:42 Projects</li>
+<li data-start="473.599" data-stop="504.559">07:53 Patterns of Patterns (PLoP 2021)</li>
+<li data-start="504.560" data-stop="537.518">08:24 PLACARD Workshop roles</li>
+<li data-start="537.519" data-stop="578.479">08:57 Initial user studies</li>
+<li data-start="578.480" data-stop="608.559">09:38 Broader context</li>
+<li data-start="608.560" data-stop="609.560">10:08 Conclusion</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/cs">One effective CS grad student workflow</a></div><div class="speakers">Greg Coladonato</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm">Download .webm video (9:28, 43.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/mxFkFd9TiUsJ8goGWZNAcz">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.000" data-stop="27.038">00:00 Self-intro and context of the talk</li>
+<li data-start="27.039" data-stop="43.119">00:27 Goals of the workflow</li>
+<li data-start="43.120" data-stop="93.999">00:43 Requirements of the workflow</li>
+<li data-start="94.000" data-stop="102.719">01:34 Package dependencies</li>
+<li data-start="102.720" data-stop="204.238">01:42 Demo: Class notes PDFs</li>
+<li data-start="204.239" data-stop="492.638">03:24 Pulling down arXiv papers</li>
+<li data-start="492.639" data-stop="539.439">08:12 Small customizations</li>
+<li data-start="539.440" data-stop="568.080">08:59 TODO</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/professional">Using Org-Mode For Recording Continuous Professional Development</a></div><div class="speakers">Philip Beadling</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm">Download .webm video (10:33, 9.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/rXjPE7hdELfGJhFFUqFhF5">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/tech">Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide</a></div><div class="speakers">Jan Ypma</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm">Download .webm video (10:22, 15.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/2pPvDFSAwr2zhGfHGHUbko">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/exec">Org as an executable format</a></div><div class="speakers">Tom Gillespie</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm">Download .webm video (7:09, 10.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/6TaLDJ4goGaa2R7dsxMi9F">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/org-outside">The use of Org mode syntax outside of GNU/Emacs</a></div><div class="speakers">Karl Voit</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm">Download .webm video (12:09, 27.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/g35zpQfCCqDM39ZMEphNj7">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/teach">Using Org-mode to teach programming</a></div><div class="speakers">Daniel German</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm">Download .webm video (20:49, 26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/w6CowfCZotPnYkwhudU32V">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/babel">Babel for academics</a></div><div class="speakers">Asilata Bapat</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm">Download .webm video (9:58, 13.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/wPJWkEYqyGKxi9SQ82Hmn6">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a></div><div class="speakers">Ahmed Khaled</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm">Download .webm video (8:47, 14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/jTXAtCYNWFPRFR1pt94yi1">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.480" data-stop="51.759">00:00 Introduction</li>
+<li data-start="51.760" data-stop="150.238">00:51 Elfeed</li>
+<li data-start="150.239" data-stop="230.559">02:30 org-ref</li>
+<li data-start="230.560" data-stop="348.719">03:50 BibLaTeX</li>
+<li data-start="348.720" data-stop="349.720">05:48 Notes and org-roam</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a></div><div class="speakers">Blaine Mooers</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm">Download .webm video (8:04, 8.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/tKmTCVtngTLQfQzHpG4BgU">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/invoice">Finding Your (In)voice: Emacs for Invoicing</a></div><div class="speakers">Bala Ramadurai</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm">Download .webm video (9:59, 14.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/kD6nFQsJFSQys8DCmR76gi">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a></div><div class="speakers">Adolfo Villafiorita</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm">Download .webm video (9:37, 15.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/71vGdiqdkaN1bAcoDd8VkT">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="1.040" data-stop="10.558">00:01 Introduction</li>
+<li data-start="10.559" data-stop="102.719">00:10 How we build and budget project proposals</li>
+<li data-start="102.720" data-stop="178.399">01:42 Org mode template with embedded Emacs Lisp</li>
+<li data-start="178.400" data-stop="217.279">02:58 The project plan</li>
+<li data-start="217.280" data-stop="280.719">03:37 Effort</li>
+<li data-start="280.720" data-stop="367.439">04:40 Hourly rates</li>
+<li data-start="367.440" data-stop="448.159">06:07 Totals</li>
+<li data-start="448.160" data-stop="501.038">07:28 Payment structure</li>
+<li data-start="501.039" data-stop="547.999">08:21 Export</li>
+<li data-start="548.000" data-stop="549.000">09:08 Advantages</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a></div><div class="speakers">Mehmet Tekman</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm">Download .webm video (8:31, 10.4MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ojNW5UwYUzzRTsLhoHZMzG">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a></div><div class="speakers">Andrea</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm">Download .webm video (8:26, 24.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qBpVxaayFezJMgG9WVQsoy">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/dev-update">Emacs development updates</a></div><div class="speakers">John Wiegley</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm">Download .webm video (7:17, 10.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/aBGWhAhfgB4obi5c58qhFM">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.320" data-stop="18.559">00:00 Introduction</li>
+<li data-start="18.560" data-stop="33.599">00:18 Emacs 28</li>
+<li data-start="33.600" data-stop="156.399">00:33 Native compilation</li>
+<li data-start="156.400" data-stop="175.759">02:36 Build with Cairo by default</li>
+<li data-start="175.760" data-stop="202.958">02:55 New mode, but off by default: context-menus</li>
+<li data-start="202.959" data-stop="217.839">03:22 Tab-bar and tab-line received many enhancements</li>
+<li data-start="217.840" data-stop="260.319">03:37 A command can marked as specific to a mode</li>
+<li data-start="260.320" data-stop="300.879">04:20 Transient input methods</li>
+<li data-start="300.880" data-stop="314.559">05:00 show-paren-mode is enabled by default</li>
+<li data-start="314.560" data-stop="339.519">05:14 We now have a Non-GNU ELPA</li>
+<li data-start="339.520" data-stop="378.399">05:39 repeat-mode</li>
+<li data-start="378.400" data-stop="386.719">06:18 project.el has dozens of new commands</li>
+<li data-start="386.720" data-stop="414.959">06:26 Shorthands for Lisp symbols</li>
+<li data-start="414.960" data-stop="415.960">06:54 Emacs 29 is just beginning</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/design">On the design of text editors</a></div><div class="speakers">Nicolas P. Rougier</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm">Download .webm video (6:39, 6.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/hmiKha234Q2FygiaspQEP4">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/day1-close">Closing remarks day 1</a></div><div class="speakers"></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/day2-open">Opening remarks day 2</a></div><div class="speakers"></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/faster">Optimizing Emacs Lisp Code</a></div><div class="speakers">Dmitry Gutov</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm">Download .webm video (35:35, 57.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/kJkKrSyfeuhL7Gttgxb572">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="1.120" data-stop="156.479">00:01 Introduction</li>
+<li data-start="156.480" data-stop="259.839">02:36 Emacs Lisp is a little old</li>
+<li data-start="259.840" data-stop="303.038">04:19 Benchmark then optimize, not vice versa</li>
+<li data-start="303.039" data-stop="571.199">05:03 profiler-start</li>
+<li data-start="571.200" data-stop="781.359">09:31 elp - Emacs Lisp Profiler</li>
+<li data-start="781.360" data-stop="1153.439">13:01 benchmark</li>
+<li data-start="1153.440" data-stop="1200.239">19:13 Write less code</li>
+<li data-start="1200.240" data-stop="1372.158">20:00 Reduce allocations</li>
+<li data-start="1372.159" data-stop="1852.239">22:52 Recent optimizations in Xref</li>
+<li data-start="1852.240" data-stop="1853.240">30:52 cl-lib, dash, and seq</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/structural">Tree-edit: Structural editing for Java, Python, C, and beyond!</a></div><div class="speakers">Ethan Leba</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm">Download .webm video (10:24, 13MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/8Smc22cLzi7UzosijPt7DP">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/ui">Yak-shaving to a UI framework</a></div><div class="speakers">Erik Anderson</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm">Download .webm video (9:28, 10.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/cwoEZmDr3YDAkskSq8nYEf">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a></div><div class="speakers">Andrea</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm">Download .webm video (9:34, 14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/4CfNuj8YPpB8HreQHqGXWf">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/model">Extending the "model" of Emacs to other applications</a></div><div class="speakers">Laszlo Krajnikovszkij</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm">Download .webm video (9:49, 8.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/vsuuxy2SUsWpcLoeAtqJhG">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a></div><div class="speakers">Andrea Corallo</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm">Download .webm video (39:08, 40.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/aCnFuNEzX1kMKJp3q31YKx">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/form">Old McCarthy Had a Form</a></div><div class="speakers">Ian Eure</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm">Download .webm video (12:44, 13.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/mcyaNMBE1QpjvQa2qDayvi">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/bindat">Turbo Bindat</a></div><div class="speakers">Stefan Monnier</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm">Download .webm video (29:48, 28.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qQeuipEkbSJgZbDm6xRg9q">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="1.360" data-stop="126.006">00:01 Introduction</li>
+<li data-start="126.007" data-stop="327.537">02:06 What is BinDat?</li>
+<li data-start="327.538" data-stop="510.748">05:27 Conversion to lexical scoping</li>
+<li data-start="510.749" data-stop="935.890">08:30 The BinDat specification</li>
+<li data-start="935.891" data-stop="1067.579">15:35 New design</li>
+<li data-start="1067.580" data-stop="1170.225">17:47 Documentation</li>
+<li data-start="1170.226" data-stop="1311.272">19:30 Advantages</li>
+<li data-start="1311.273" data-stop="1388.077">21:51 New features</li>
+<li data-start="1388.078" data-stop="1676.093">23:08 Examples</li>
+<li data-start="1676.094" data-stop="1708.335">27:56 Conclusion</li>
+<li data-start="1708.336" data-stop="1709.336">28:28 Negatives</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/test">Test blocks</a></div><div class="speakers">Eduardo Ochs</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm">Download .webm video (6:04, 7.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qRKLj4VdBG8cFN1MEfcRho">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a></div><div class="speakers">Mohsen BANAN</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm">Download .webm video (19:52, 20.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/sBy9n22kgLMjXu9Cr1Ta44">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a></div><div class="speakers">Matthew Zeng</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm">Download .webm video (9:15, 10.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/9hMPmTLzAxx4bxHJnSbkMr">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="3.040" data-stop="38.045">00:03 Introduction</li>
+<li data-start="38.046" data-stop="125.725">00:38 EAF Overview</li>
+<li data-start="125.726" data-stop="143.285">02:05 New logo</li>
+<li data-start="143.286" data-stop="195.359">02:23 EAF Supports Windows, macOS, and many Linux distros</li>
+<li data-start="195.360" data-stop="236.958">03:15 Multi-language scripting</li>
+<li data-start="236.959" data-stop="345.359">03:56 VueJS extension</li>
+<li data-start="345.360" data-stop="429.598">05:45 EAF core-app separation</li>
+<li data-start="429.599" data-stop="465.319">07:09 Other notable updates Popweb</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/imaginary">Imaginary Programming</a></div><div class="speakers">Shane Mulligan</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm">Download .webm video (10:17, 19.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan.pdf">Download .pdf</a></li><li><a href="https://toobnix.org/w/3ydn2davFQZPoiwB78KZWm">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/clede">CLEDE: the Common Lisp Emacs Development Environment</a></div><div class="speakers">Fermin MF</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm">Download .webm video (18:55, 24.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/1HuHMank52gcpHqf4M7Sa5">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/maintainers">How to help Emacs maintainers?</a></div><div class="speakers">Bastien Guerry</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm">Download .webm video (10:07, 9.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/naNvWzM2jjj5ownu9zmbAf">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="0.799" data-stop="47.567">00:00 Introduction</li>
+<li data-start="47.568" data-stop="139.600">00:47 What is a free software maintainer?</li>
+<li data-start="139.601" data-stop="204.600">02:19 What do I do as the Org maintainer?</li>
+<li data-start="204.601" data-stop="258.400">03:24 Do you see a pattern here?</li>
+<li data-start="258.401" data-stop="303.900">04:18 What a free software maintainer is or should be</li>
+<li data-start="303.901" data-stop="326.900">05:03 Summary</li>
+<li data-start="326.901" data-stop="388.800">05:26 ACDC: Asynchronous Collective Distributed Care</li>
+<li data-start="388.801" data-stop="397.533">06:28 How can you help Emacs maintainers?</li>
+<li data-start="397.534" data-stop="416.500">06:37 Become a maintainer for your own project, however small</li>
+<li data-start="416.501" data-stop="430.900">06:56 Volunteer as a contributor steward for another project</li>
+<li data-start="430.901" data-stop="445.400">07:10 Learn how to teach</li>
+<li data-start="445.401" data-stop="455.633">07:25 Test and enhance the project's contribution process</li>
+<li data-start="455.634" data-stop="472.833">07:35 Take care of the project's calls for help</li>
+<li data-start="472.834" data-stop="488.800">07:52 Encourage users from outside the project to contribute to the core forum</li>
+<li data-start="488.801" data-stop="496.600">08:08 Let the core forum know about what happens in this outside world</li>
+<li data-start="496.601" data-stop="506.100">08:16 Propose your help for non-code tasks</li>
+<li data-start="506.101" data-stop="522.067">08:26 If you expect someone else to fix your bug, try fixing someone else's bug first</li>
+<li data-start="522.068" data-stop="529.233">08:42 Don't expect the maintainer to be a hotline</li>
+<li data-start="529.234" data-stop="537.167">08:49 Complete this list</li>
+<li data-start="537.168" data-stop="575.667">08:57 Yes, this is hard</li>
+<li data-start="575.668" data-stop="576.668">09:35 Thanks</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/build">How to build an Emacs</a></div><div class="speakers">Fermin MF</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt" default /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm">Download .webm video (16:54, 15.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/jJJwKDTmUVeRQhSj7bazhz">View on Toobnix</a></li></ul></div></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/forever">M-x Forever: Why Emacs will outlast text editor trends</a></div><div class="speakers">David Wilson (System Crafters)</div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.png" id="mainVideo"><source src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm" /><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt" default /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm">Download .webm video (24:52, 27.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/jSW4Gk3hsuv2ZfW8jXHz39">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="1.280" data-stop="28.079">00:01 Introduction and conclusion</li>
+<li data-start="28.080" data-stop="67.199">00:28 Who am I?</li>
+<li data-start="67.200" data-stop="146.958">01:07 Is Emacs unpopular?</li>
+<li data-start="146.959" data-stop="255.679">02:26 What does popularity really mean?</li>
+<li data-start="255.680" data-stop="272.399">04:15 How do we measure popularity?</li>
+<li data-start="272.400" data-stop="378.318">04:32 Google Trends</li>
+<li data-start="378.319" data-stop="499.999">06:18 Stack Overflow Survey</li>
+<li data-start="500.000" data-stop="623.199">08:20 Community Activity</li>
+<li data-start="623.200" data-stop="638.319">10:23 How do editors lose popularity?</li>
+<li data-start="638.320" data-stop="745.679">10:38 A new editor with better features appears</li>
+<li data-start="745.680" data-stop="841.039">12:25 Lack of sufficient maintenance</li>
+<li data-start="841.040" data-stop="876.958">14:01 The "fashion" moves on</li>
+<li data-start="876.959" data-stop="1030.239">14:36 What happens when an editor loses popularity?</li>
+<li data-start="1030.240" data-stop="1040.159">17:10 How will Emacs survive *despite* popularity?</li>
+<li data-start="1040.160" data-stop="1191.439">17:20 Emacs is more deeply hackable than almost all other editors</li>
+<li data-start="1191.440" data-stop="1275.279">19:51 Emacs has a strong community of highly skilled package authors</li>
+<li data-start="1275.280" data-stop="1353.439">21:15 Emacs has a very strong user community</li>
+<li data-start="1353.440" data-stop="1420.959">22:33 The Emacs maintainers and contributors care about the users</li>
+<li data-start="1420.960" data-stop="1462.879">23:40 Isn't all this supposed to come when an editor is popular?</li>
+<li data-start="1462.880" data-stop="1463.880">24:22 When someone talks about popularity...</li>
+</ol></div><div class="vid"><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.png" id="qanda"><source src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.webm" /><track kind="chapters" label="Chapters" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt"" /></video><div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.webm">Download .webm video (60:00, 131.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt">Download --answers--chapters.vtt</a></li><li><a href="https://toobnix.org/w/jSW4Gk3hsuv2ZfW8jXHz39">View on Toobnix</a></li></ul></div><ol class="chapters">
+<li data-start="11.120" data-stop="76.158">00:11 Thanks</li>
+<li data-start="76.159" data-stop="239.438">01:16 In your opinion, what is Emacs' Achilles heel?</li>
+<li data-start="239.439" data-stop="356.799">03:59 What is your opinion about the documentation of Emacs in other languages?</li>
+<li data-start="356.800" data-stop="441.679">05:56 Do you think more effort should be made to popularize hacking on the C parts of Emacs?</li>
+<li data-start="441.680" data-stop="481.839">07:21 Can you name a few features from other programming languages that you miss in Emacs Lisp?</li>
+<li data-start="481.840" data-stop="552.239">08:01 What are your opinions on Emacs's commitments to free software?</li>
+<li data-start="552.240" data-stop="752.799">09:12 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?</li>
+<li data-start="752.800" data-stop="827.759">12:32 Another way people can help inspire others to use Emacs</li>
+<li data-start="827.760" data-stop="939.679">13:47 Should Emacs continue to present itself as an esoteric program and culture, or should we try to dispel the myth?</li>
+<li data-start="939.680" data-stop="971.919">15:39 Do you think there could be changes made to the core of Emacs that would betray the ethos you and most people here appreciate?</li>
+<li data-start="971.920" data-stop="988.319">16:11 When will David Wilson and Protesilaos collaborate?</li>
+<li data-start="988.320" data-stop="1038.479">16:28 If you had to choose between graphics or real browser support within Emacs, which would you choose?</li>
+<li data-start="1038.480" data-stop="1159.519">17:18 How do you feel being an Emacs-focused YouTuber?</li>
+<li data-start="1159.520" data-stop="1280.959">19:19 More typesetting capabilities versus better performance</li>
+<li data-start="1280.960" data-stop="1533.039">21:20 Sneak peek of what's coming in the YouTube channel soon?</li>
+<li data-start="1533.040" data-stop="1557.759">25:33 Principles and compromises</li>
+<li data-start="1557.760" data-stop="1620.239">25:57 Understanding the value of Emacs Lisp</li>
+<li data-start="1620.240" data-stop="1654.159">27:00 Will you do a video showing your personal workflow?</li>
+<li data-start="1654.160" data-stop="1742.639">27:34 What do you think about Guix or NixOS?</li>
+<li data-start="1742.640" data-stop="1928.239">29:02 Can you talk about your actual work?</li>
+<li data-start="1928.240" data-stop="2172.959">32:08 Do your colleagues use Emacs as well?</li>
+<li data-start="2172.960" data-stop="2413.439">36:12 Any thoughts on the idea that the best tool to use is the one that is easiest to leave?</li>
+<li data-start="2413.440" data-stop="2599.759">40:13 Do you think there should be an updated initial configuration for fresh Emacs installations with more modern UI features and cool shortcuts?</li>
+<li data-start="2599.760" data-stop="2680.559">43:19 How hard is it to get into the native code side of Emacs?</li>
+<li data-start="2680.560" data-stop="2838.239">44:40 Emacs Chats</li>
+<li data-start="2838.240" data-stop="3264.719">47:18 Livestreams</li>
+<li data-start="3264.720" data-stop="3265.720">54:24 Short-form videos</li>
+</ol></div></li>
+<li><div class="title"><a href="https://emacsconf.org/2021/talks/day2-close">Closing remarks day 2</a></div><div class="speakers"></div><div class="vid">The video for "Closing remarks day 2" will be posted here when available. You can also subscribe to the <a href="https://lists.gnu.org/mailman/listinfo/emacsconf-discuss">emacsconf-discuss mailing list</a> for updates.<div class="files resources"><ul></ul></div></div></li> \ No newline at end of file
diff --git a/2021/all.md b/2021/all.md
index f91e1840..23886e42 100644
--- a/2021/all.md
+++ b/2021/all.md
@@ -1,7 +1,7 @@
[[!meta title="Everything from EmacsConf 2021"]]
[[!meta copyright="Copyright &copy; 2021 Various authors"]]
-You can also play this [M3U playlist](https://media.emacsconf.org/2021/index.m3u) in MPV or other players.
+You can also play this [M3U playlist](https://media.emacsconf.org/2021/index.m3u) in MPV or other players or use `wget -r -l 2 -nc -nd -A '*webm' https://media.emacsconf.org/2021/` to download all the video files. (Thanks to ggoes for the command!)
<div class="all">
[[!inline pages="internal(2021/all-include)" raw="yes"]]
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"]]
diff --git a/2021/contribute.md b/2021/contribute.md
index fd9cfc11..b8d489fa 100644
--- a/2021/contribute.md
+++ b/2021/contribute.md
@@ -1,6 +1,8 @@
[[!meta title="Contribute to EmacsConf 2021"]]
[[!meta copyright="Copyright &copy; 2021 Sacha Chua, Leo Vivier"]]
+[[!toc]]
+
Want to help with EmacsConf 2021? Here's how you can make it even better!
# After the conference
@@ -11,12 +13,8 @@ Here are some things you can do to help out:
- Learn how to edit this wiki and then add new="1" to the caption
directives in `2021/captions/*.md` in order to break them up into
paragraphs.
-- Edit and review captions for the rest of the talks: coordinate with
- <sacha@sachachua.com> to reserve the talk you want to work on and
- get some captioning tips.
-- Harvest questions and answers from IRC and put them into talk pages.
-- Harvest questions and answers from the BBB recordings and put them
- into talk pages.
+- [[Add chapter markers|help_with_chapter_markers]]
+- [[Add or edit captions|help_with_main_captions]]
- Improve the HTML, CSS, and JS used on the wiki pages
- Think of ways to make things even better
- How can we have multiple streams?
@@ -26,23 +24,24 @@ Here are some things you can do to help out:
- ... and other things you can think of!
To volunteer, please
-[e-mail us at emacsconf-submit@gnu.org a quick note to say hi](mailto:emacsconf-submit@gnu.org?subject=Volunteering&body=I+want+to+help!).
-We'd love to hear from you!
+[e-mail us at emacsconf-submit@gnu.org a quick note to say hi](mailto:emacsconf-submit@gnu.org?subject=Volunteering&body=I+want+to+help!) or check out the [volunteer pad](https://etherpad.wikimedia.org/p/emacsconf-2021-volunteers). We'd love to hear from you!
-# Edit and review captions
+<a name="chapter-markers"></a>
+# Add chapter markers
-Want to help make videos easier for people to enjoy during the
-conference, or find and learn from afterwards? Please volunteer to
-help caption recorded talks! You'll get a sneak preview of a talk,
-and possibly auto-generated captions that you can use as a starting
-point.
+See [[Help_with_chapter_markers]] for instructions and a list of pages that need help.
-We’d like to get started on this as soon as possible because the
-pre-recordings will start trickling in until the conference, and doing it
-progressively is a good way to keep the work-load low.
+<a name="update-discussion"></a>
+# Update the discussion section with answers or timestamps
-For an Emacs-based solution, [subed.el](https://github.com/rndusr/subed/) mode
-makes it easier to adjust the timings or edit the text. [[Captioning tips|/captioning]]
+You can add answers or references to the videos to the discussion
+section. That way, people with the same question can easily find the
+answer.
+
+<a name="edit-captions"></a>
+# Edit and review captions
+
+See [[Help_with_main_captions]] for instructions and a list of pages that need help.
# Tech-check speakers
@@ -103,6 +102,10 @@ copying questions from the pad into IRC if that's where the speaker is
paying attention, and so on. It's a bit of a scramble, but it keeps
the conversation going even after the event.
+# Pages tagged `help`
+
+[[!inline pages="tagged(help) and !templates/*" archive="yes" limit="0" trail="yes"]]
+
# Volunteer
Thought of another way to help? Sure, suggest away.
diff --git a/2021/emacsconf-pentabarf.xml b/2021/emacsconf-pentabarf.xml
index f2e87c4e..726f667f 100644
--- a/2021/emacsconf-pentabarf.xml
+++ b/2021/emacsconf-pentabarf.xml
@@ -1,4 +1,4 @@
-<schedule><generator name="EmacsConf" version="0.1"></generator><version>20211128145057</version><conference><acronym>emacsconf2021</acronym><title>EmacsConf 2021</title><start>2021-11-27</start><end>2021-11-28</end><time_zone_name>America/Toronto</time_zone_name><base_url>https://emacsconf.org/2021</base_url></conference><day date="2021-11-27" start="2021-11-27T14:00:00Z" end="2021-11-27T22:05:00Z" index="1"><room name="Main"><event id="01" guid="dc07efcd-6d79-cfd4-fed3-59c885fe2922"><date>2021-11-27T14:00:00Z</date><start>09:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day1-open</slug><duration>0:18</duration><title>Opening remarks</title><abstract></abstract><description>Times are approximate and will probably change.
+<schedule><generator name="EmacsConf" version="0.1"></generator><version>20211206205327</version><conference><acronym>emacsconf2021</acronym><title>EmacsConf 2021</title><start>2021-11-27</start><end>2021-11-28</end><time_zone_name>America/Toronto</time_zone_name><base_url>https://emacsconf.org/2021</base_url></conference><day date="2021-11-27" start="2021-11-27T14:00:00Z" end="2021-11-27T22:05:00Z" index="1"><room name="Main"><event id="01" guid="dc07efcd-6d79-cfd4-fed3-59c885fe2922"><date>2021-11-27T14:00:00Z</date><start>09:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day1-open</slug><duration>0:18</duration><title>Opening remarks</title><abstract></abstract><description>Times are approximate and will probably change.
</description><url>https://emacsconf.org/2021/talks/day1-open</url><persons><person>EmacsConf</person></persons></event><event id="02" guid="393ba3c2-b2a6-6a84-44eb-872aa333d08d"><date>2021-11-27T14:19:00Z</date><start>09:19</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-news</slug><duration>0:05</duration><title>Emacs News Highlights</title><abstract></abstract><description>Times are approximate and will probably change.
@@ -60,7 +60,7 @@
</description><url>https://emacsconf.org/2021/talks/design</url><persons><person>Nicolas P. Rougier</person></persons></event><event id="28" guid="5287b003-f368-36c4-4f9b-8135734cad39"><date>2021-11-27T22:00:00Z</date><start>17:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day1-close</slug><duration>0:05</duration><title>Closing remarks day 1</title><abstract></abstract><description>Times are approximate and will probably change.
-</description><url>https://emacsconf.org/2021/talks/day1-close</url><persons><person>EmacsConf</person></persons></event></room></day><day date="2021-11-28" start="2021-11-28T14:00:00Z" end="2021-11-28T22:02:00Z" index="2"><room name="Main"><event id="30" guid="d877a57a-14cf-a194-99c3-a344ecb24acc"><date>2021-11-28T14:00:00Z</date><start>09:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day2-open</slug><duration>0:05</duration><title>Opening remarks day 2</title><abstract></abstract><description>Times are approximate and will probably change.
+</description><url>https://emacsconf.org/2021/talks/day1-close</url><persons><person>EmacsConf</person></persons></event></room></day><day date="2021-11-28" start="2021-11-28T14:00:00Z" end="2021-11-28T22:17:00Z" index="2"><room name="Main"><event id="30" guid="d877a57a-14cf-a194-99c3-a344ecb24acc"><date>2021-11-28T14:00:00Z</date><start>09:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day2-open</slug><duration>0:05</duration><title>Opening remarks day 2</title><abstract></abstract><description>Times are approximate and will probably change.
</description><url>https://emacsconf.org/2021/talks/day2-open</url><persons><person>EmacsConf</person></persons></event><event id="31" guid="35d1d9e4-dfdf-f254-6aab-7a466fbfaf09"><date>2021-11-28T14:07:00Z</date><start>09:07</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-faster</slug><duration>0:36</duration><title>Optimizing Emacs Lisp Code</title><abstract></abstract><description>Times are approximate and will probably change.
@@ -92,16 +92,16 @@
</description><url>https://emacsconf.org/2021/talks/eaf</url><persons><person>Matthew Zeng</person></persons></event><event id="45" guid="f03ae971-4d2b-ccc4-2643-4ae2391ce1ab"><date>2021-11-28T19:39:00Z</date><start>14:39</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-imaginary</slug><duration>0:11</duration><title>Imaginary Programming</title><abstract></abstract><description>Times are approximate and will probably change.
-</description><url>https://emacsconf.org/2021/talks/imaginary</url><persons><person>Shane Mulligan</person></persons></event><event id="44" guid="daf3570b-3df3-9db4-a1f3-ce98d9863717"><date>2021-11-28T19:55:00Z</date><start>14:55</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-clede</slug><duration>0:19</duration><title>CLEDE: the Common Lisp Emacs Development Environment</title><abstract></abstract><description>Times are approximate and will probably change.
+</description><url>https://emacsconf.org/2021/talks/imaginary</url><persons><person>Shane Mulligan</person></persons></event><event id="44" guid="daf3570b-3df3-9db4-a1f3-ce98d9863717"><date>2021-11-28T19:59:00Z</date><start>14:59</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-clede</slug><duration>0:19</duration><title>CLEDE: the Common Lisp Emacs Development Environment</title><abstract></abstract><description>Times are approximate and will probably change.
-</description><url>https://emacsconf.org/2021/talks/clede</url><persons><person>Fermin MF</person></persons></event><event id="10" guid="51c360e6-188f-9a34-05bb-0a8d2eb09cdc"><date>2021-11-28T20:21:00Z</date><start>15:21</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-maintainers</slug><duration>0:10</duration><title>How to help Emacs maintainers?</title><abstract></abstract><description>Times are approximate and will probably change.
+</description><url>https://emacsconf.org/2021/talks/clede</url><persons><person>Fermin MF</person></persons></event><event id="10" guid="51c360e6-188f-9a34-05bb-0a8d2eb09cdc"><date>2021-11-28T20:25:00Z</date><start>15:25</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-maintainers</slug><duration>0:11</duration><title>How to help Emacs maintainers?</title><abstract></abstract><description>Times are approximate and will probably change.
</description><url>https://emacsconf.org/2021/talks/maintainers</url><persons><person>Bastien Guerry</person></persons></event><event id="41" guid="51023225-018f-cf24-9d73-3c267907c13e"><date>2021-11-28T20:19:00Z</date><start>15:19</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-bug</slug><duration>0:20</duration><title>Let's talk about bug trackers</title><abstract></abstract><description>Times are approximate and will probably change.
-</description><url>https://emacsconf.org/2021/talks/bug</url><persons><person>Bastien Guerry</person></persons></event><event id="46" guid="27595637-b6b9-f764-805b-ff1b7f009006"><date>2021-11-28T20:43:00Z</date><start>15:43</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-build</slug><duration>0:17</duration><title>How to build an Emacs</title><abstract></abstract><description>Times are approximate and will probably change.
+</description><url>https://emacsconf.org/2021/talks/bug</url><persons><person>Bastien Guerry</person></persons></event><event id="46" guid="27595637-b6b9-f764-805b-ff1b7f009006"><date>2021-11-28T20:52:00Z</date><start>15:52</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-build</slug><duration>0:17</duration><title>How to build an Emacs</title><abstract></abstract><description>Times are approximate and will probably change.
-</description><url>https://emacsconf.org/2021/talks/build</url><persons><person>Fermin MF</person></persons></event><event id="48" guid="80d1ad02-5fe4-03b4-c573-17ea6cdb61aa"><date>2021-11-28T21:07:00Z</date><start>16:07</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-forever</slug><duration>0:25</duration><title>M-x Forever: Why Emacs will outlast text editor trends</title><abstract></abstract><description>Times are approximate and will probably change.
+</description><url>https://emacsconf.org/2021/talks/build</url><persons><person>Fermin MF</person></persons></event><event id="48" guid="80d1ad02-5fe4-03b4-c573-17ea6cdb61aa"><date>2021-11-28T21:15:00Z</date><start>16:15</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-forever</slug><duration>0:25</duration><title>M-x Forever: Why Emacs will outlast text editor trends</title><abstract></abstract><description>Times are approximate and will probably change.
-</description><url>https://emacsconf.org/2021/talks/forever</url><persons><person>David Wilson (System Crafters)</person></persons></event><event id="49" guid="828e7c62-8430-f1a4-431b-63c308d58688"><date>2021-11-28T21:52:00Z</date><start>16:52</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day2-close</slug><duration>0:10</duration><title>Closing remarks day 2</title><abstract></abstract><description>Times are approximate and will probably change.
+</description><url>https://emacsconf.org/2021/talks/forever</url><persons><person>David Wilson (System Crafters)</person></persons></event><event id="49" guid="828e7c62-8430-f1a4-431b-63c308d58688"><date>2021-11-28T22:07:00Z</date><start>17:07</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-day2-close</slug><duration>0:10</duration><title>Closing remarks day 2</title><abstract></abstract><description>Times are approximate and will probably change.
</description><url>https://emacsconf.org/2021/talks/day2-close</url><persons><person>EmacsConf</person></persons></event></room></day></schedule> \ No newline at end of file
diff --git a/2021/emacsconf.ics b/2021/emacsconf.ics
index 001dde91..6c971270 100644
--- a/2021/emacsconf.ics
+++ b/2021/emacsconf.ics
@@ -13,7 +13,7 @@ UID:dc07efcd-6d79-cfd4-fed3-59c885fe2922
URL:https://emacsconf.org/2021/talks/day1-open
DTSTART:20211127T140000Z
DTEND:20211127T141800Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/day1-open\n
END:VEVENT
@@ -25,7 +25,7 @@ UID:393ba3c2-b2a6-6a84-44eb-872aa333d08d
URL:https://emacsconf.org/2021/talks/news
DTSTART:20211127T141900Z
DTEND:20211127T142400Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Sacha Chua":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/news\n
@@ -39,7 +39,7 @@ UID:06df8309-bd04-eb24-d443-a780c56adc0a
URL:https://emacsconf.org/2021/talks/frownies
DTSTART:20211127T142500Z
DTEND:20211127T144500Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Case Duckworth":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/frownies\n
@@ -52,7 +52,7 @@ UID:db4ccb28-867f-df24-c073-eaca6edad438
URL:https://emacsconf.org/2021/talks/omegat
DTSTART:20211127T145900Z
DTEND:20211127T150900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Jean-Christophe Helary":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/omegat\n
@@ -66,7 +66,7 @@ UID:ea5bab3c-f31e-68a4-fa23-81ca67fa1990
URL:https://emacsconf.org/2021/talks/unix
DTSTART:20211127T151300Z
DTEND:20211127T152000Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Daniel Rose":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/unix\n
@@ -79,7 +79,7 @@ UID:6fccae45-04b5-5524-662b-fdba87754d06
URL:https://emacsconf.org/2021/talks/montessori
DTSTART:20211127T152500Z
DTEND:20211127T153600Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Grant Shangreaux":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/montessori\n
@@ -92,7 +92,7 @@ UID:fe959e43-441b-ed34-854b-87f6f481f55a
URL:https://emacsconf.org/2021/talks/pattern
DTSTART:20211127T154000Z
DTEND:20211127T160400Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Greta Goetz":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/pattern\n
@@ -105,7 +105,7 @@ UID:48a8580f-52ce-cc84-6a23-1eddf720ae02
URL:https://emacsconf.org/2021/talks/freedom
DTSTART:20211127T160700Z
DTEND:20211127T164600Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Protesilaos Stavrou":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/freedom\n
@@ -118,7 +118,7 @@ UID:525d972d-1e34-bcb4-e9c3-861942549357
URL:https://emacsconf.org/2021/talks/nongnu
DTSTART:20211127T164600Z
DTEND:20211127T165300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Philip Kaludercic":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/nongnu\n
@@ -132,7 +132,7 @@ UID:245a575a-965a-caa4-8d3b-75f8519c2f3e
URL:https://emacsconf.org/2021/talks/borg
DTSTART:20211127T165500Z
DTEND:20211127T170300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Dhavan (codingquark)":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/borg\n
@@ -145,7 +145,7 @@ UID:e4bdc2c1-e4b6-67e4-aafb-87ec9aaf846b
URL:https://emacsconf.org/2021/talks/nangulator
DTSTART:20211127T170300Z
DTEND:20211127T171300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Kevin Haddock":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/nangulator\n
@@ -158,7 +158,7 @@ UID:716d913f-de8b-91a4-5f33-e04ba0905fa5
URL:https://emacsconf.org/2021/talks/gregorian
DTSTART:20211127T171400Z
DTEND:20211127T172300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Spencer King":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/gregorian\n
@@ -171,7 +171,7 @@ UID:86158391-53a2-7cb4-d7d3-020afbf6d8d9
URL:https://emacsconf.org/2021/talks/telega
DTSTART:20211127T180100Z
DTEND:20211127T180900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Gabriele Bozzola":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/telega\n
@@ -184,7 +184,7 @@ UID:14ab7a54-d75d-45e4-85ab-8fd2e391ea41
URL:https://emacsconf.org/2021/talks/janitor
DTSTART:20211127T181000Z
DTEND:20211127T183600Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Stefan Monnier":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/janitor\n
@@ -199,7 +199,7 @@ UID:9cee7e43-bcb1-7f64-c40b-5f9ea938d11a
URL:https://emacsconf.org/2021/talks/erg
DTSTART:20211127T185100Z
DTEND:20211127T190200Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Noorah Alhasan":invalid:nomail
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Joe Corneli":invalid:nomail
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Raymond Puzio":invalid:nomail
@@ -215,7 +215,7 @@ UID:0f98a5bb-53ce-fb74-1003-0b1f320d414e
URL:https://emacsconf.org/2021/talks/cs
DTSTART:20211127T190300Z
DTEND:20211127T191300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Greg Coladonato":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/cs\n
@@ -229,7 +229,7 @@ UID:43cc5db4-e26f-fb44-9aeb-b16c38d8cef3
URL:https://emacsconf.org/2021/talks/professional
DTSTART:20211127T191500Z
DTEND:20211127T192600Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Philip Beadling":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/professional\n
@@ -243,7 +243,7 @@ UID:a10ce62e-6454-d784-21bb-f6a0488e883c
URL:https://emacsconf.org/2021/talks/tech
DTSTART:20211127T192600Z
DTEND:20211127T193700Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Jan Ypma":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/tech\n
@@ -256,7 +256,7 @@ UID:b092bc88-e74c-a9c4-611b-d47c99ef578c
URL:https://emacsconf.org/2021/talks/exec
DTSTART:20211127T193800Z
DTEND:20211127T194600Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Tom Gillespie":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/exec\n
@@ -269,7 +269,7 @@ UID:69763d57-be4e-7e74-509b-92e48a0e7ba6
URL:https://emacsconf.org/2021/talks/org-outside
DTSTART:20211127T194600Z
DTEND:20211127T195900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Karl Voit":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/org-outside\n
@@ -282,7 +282,7 @@ UID:aed5e190-66a0-3dd4-e5eb-be09be94e6c3
URL:https://emacsconf.org/2021/talks/teach
DTSTART:20211127T200000Z
DTEND:20211127T202100Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Daniel German":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/teach\n
@@ -295,7 +295,7 @@ UID:db5821ed-fef4-4934-8fb3-87a0282714de
URL:https://emacsconf.org/2021/talks/babel
DTSTART:20211127T202100Z
DTEND:20211127T203100Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Asilata Bapat":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/babel\n
@@ -309,7 +309,7 @@ UID:fd246cee-b5d6-7cc4-2b63-20e87bb7d750
URL:https://emacsconf.org/2021/talks/research
DTSTART:20211127T203300Z
DTEND:20211127T204200Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Ahmed Khaled":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/research\n
@@ -322,7 +322,7 @@ UID:1fc4917c-aab4-1924-2983-e78f8bca6af9
URL:https://emacsconf.org/2021/talks/molecular
DTSTART:20211127T204200Z
DTEND:20211127T205100Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Blaine Mooers":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/molecular\n
@@ -335,7 +335,7 @@ UID:c9870e10-2600-85a4-24fb-793dfc51164e
URL:https://emacsconf.org/2021/talks/invoice
DTSTART:20211127T205300Z
DTEND:20211127T210300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Bala Ramadurai":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/invoice\n
@@ -349,7 +349,7 @@ UID:c54c7930-51cc-5184-9dfb-5033e577b95e
URL:https://emacsconf.org/2021/talks/project
DTSTART:20211127T210300Z
DTEND:20211127T211300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Adolfo Villafiorita":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/project\n
@@ -362,7 +362,7 @@ UID:e4e995c0-6e06-8544-a8c3-5f9a06c856fb
URL:https://emacsconf.org/2021/talks/dashboard
DTSTART:20211127T211400Z
DTEND:20211127T212300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Mehmet Tekman":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/dashboard\n
@@ -376,7 +376,7 @@ UID:33776e08-e815-db94-971b-a151236e11be
URL:https://emacsconf.org/2021/talks/nyxt
DTSTART:20211127T212600Z
DTEND:20211127T213500Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Andrea":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/nyxt\n
@@ -389,7 +389,7 @@ UID:59e4daca-1e46-9054-9573-9c91966d6987
URL:https://emacsconf.org/2021/talks/dev-update
DTSTART:20211127T214100Z
DTEND:20211127T214900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="John Wiegley":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/dev-update\n
@@ -402,7 +402,7 @@ UID:86d4470a-8d19-7bd4-0c53-6aba1b49baef
URL:https://emacsconf.org/2021/talks/design
DTSTART:20211127T214900Z
DTEND:20211127T215600Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Nicolas P. Rougier":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/design\n
@@ -415,7 +415,7 @@ UID:5287b003-f368-36c4-4f9b-8135734cad39
URL:https://emacsconf.org/2021/talks/day1-close
DTSTART:20211127T220000Z
DTEND:20211127T220500Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/day1-close\n
END:VEVENT
@@ -427,7 +427,7 @@ UID:d877a57a-14cf-a194-99c3-a344ecb24acc
URL:https://emacsconf.org/2021/talks/day2-open
DTSTART:20211128T140000Z
DTEND:20211128T140500Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/day2-open\n
END:VEVENT
@@ -439,7 +439,7 @@ UID:35d1d9e4-dfdf-f254-6aab-7a466fbfaf09
URL:https://emacsconf.org/2021/talks/faster
DTSTART:20211128T140700Z
DTEND:20211128T144300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Dmitry Gutov":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/faster\n
@@ -453,7 +453,7 @@ UID:599ef3fa-4c73-6c94-4953-75bbc7830681
URL:https://emacsconf.org/2021/talks/structural
DTSTART:20211128T150000Z
DTEND:20211128T151100Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Ethan Leba":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/structural\n
@@ -466,7 +466,7 @@ UID:8f62e571-91da-bd14-e7c3-b445c7b19d23
URL:https://emacsconf.org/2021/talks/ui
DTSTART:20211128T151900Z
DTEND:20211128T152900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Erik Anderson":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/ui\n
@@ -479,7 +479,7 @@ UID:3364aedb-a496-5c64-5383-b0080afa6d7b
URL:https://emacsconf.org/2021/talks/mold
DTSTART:20211128T153800Z
DTEND:20211128T154800Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Andrea":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/mold\n
@@ -493,7 +493,7 @@ UID:5e1baaaf-56a3-b5b4-31cb-5437cf465cf9
URL:https://emacsconf.org/2021/talks/model
DTSTART:20211128T154900Z
DTEND:20211128T155900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Laszlo Krajnikovszkij":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/model\n
@@ -507,7 +507,7 @@ UID:1ddbe380-b4f3-2b84-3cc3-9e799536db8e
URL:https://emacsconf.org/2021/talks/native
DTSTART:20211128T160000Z
DTEND:20211128T164000Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Andrea Corallo":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/native\n
@@ -520,7 +520,7 @@ UID:5947c3e9-93c1-1014-7ffb-aa0e0097e3e4
URL:https://emacsconf.org/2021/talks/form
DTSTART:20211128T180100Z
DTEND:20211128T181400Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Ian Eure":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/form\n
@@ -533,7 +533,7 @@ UID:49a35f05-b71f-1d14-2343-a6638bec0d08
URL:https://emacsconf.org/2021/talks/bindat
DTSTART:20211128T181900Z
DTEND:20211128T184900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Stefan Monnier":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/bindat\n
@@ -546,7 +546,7 @@ UID:5e162d34-ea19-8544-b693-dd6da0e885cd
URL:https://emacsconf.org/2021/talks/test
DTSTART:20211128T185500Z
DTEND:20211128T190200Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Eduardo Ochs":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/test\n
@@ -560,7 +560,7 @@ UID:1407591a-29fd-3f64-1beb-01dea6e9d7d2
URL:https://emacsconf.org/2021/talks/bidi
DTSTART:20211128T190300Z
DTEND:20211128T192300Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Mohsen BANAN":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/bidi\n
@@ -573,7 +573,7 @@ UID:e7981936-6d72-93d4-8783-5ac64a0ae5bb
URL:https://emacsconf.org/2021/talks/eaf
DTSTART:20211128T192900Z
DTEND:20211128T193900Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Matthew Zeng":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/eaf\n
@@ -586,7 +586,7 @@ UID:f03ae971-4d2b-ccc4-2643-4ae2391ce1ab
URL:https://emacsconf.org/2021/talks/imaginary
DTSTART:20211128T193900Z
DTEND:20211128T195000Z
-DTSTAMP:20211128T195056Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Shane Mulligan":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/imaginary\n
@@ -597,9 +597,9 @@ ORGANIZER:EmacsConf
LOCATION:https://emacsconf.org/
UID:daf3570b-3df3-9db4-a1f3-ce98d9863717
URL:https://emacsconf.org/2021/talks/clede
-DTSTART:20211128T195500Z
-DTEND:20211128T201400Z
-DTSTAMP:20211128T195056Z
+DTSTART:20211128T195900Z
+DTEND:20211128T201800Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Fermin MF":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/clede\n
@@ -610,9 +610,9 @@ ORGANIZER:EmacsConf
LOCATION:https://emacsconf.org/
UID:51c360e6-188f-9a34-05bb-0a8d2eb09cdc
URL:https://emacsconf.org/2021/talks/maintainers
-DTSTART:20211128T202100Z
-DTEND:20211128T203100Z
-DTSTAMP:20211128T195056Z
+DTSTART:20211128T202500Z
+DTEND:20211128T203600Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Bastien Guerry":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/maintainers\n
@@ -623,9 +623,9 @@ ORGANIZER:EmacsConf
LOCATION:https://emacsconf.org/
UID:27595637-b6b9-f764-805b-ff1b7f009006
URL:https://emacsconf.org/2021/talks/build
-DTSTART:20211128T204300Z
-DTEND:20211128T210000Z
-DTSTAMP:20211128T195056Z
+DTSTART:20211128T205200Z
+DTEND:20211128T210900Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Fermin MF":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/build\n
@@ -637,9 +637,9 @@ ORGANIZER:EmacsConf
LOCATION:https://emacsconf.org/
UID:80d1ad02-5fe4-03b4-c573-17ea6cdb61aa
URL:https://emacsconf.org/2021/talks/forever
-DTSTART:20211128T210700Z
-DTEND:20211128T213200Z
-DTSTAMP:20211128T195056Z
+DTSTART:20211128T211500Z
+DTEND:20211128T214000Z
+DTSTAMP:20211207T015326Z
ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="David Wilson (System Crafters)":invalid:nomail
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/forever\n
@@ -650,9 +650,9 @@ ORGANIZER:EmacsConf
LOCATION:https://emacsconf.org/
UID:828e7c62-8430-f1a4-431b-63c308d58688
URL:https://emacsconf.org/2021/talks/day2-close
-DTSTART:20211128T215200Z
-DTEND:20211128T220200Z
-DTSTAMP:20211128T195056Z
+DTSTART:20211128T220700Z
+DTEND:20211128T221700Z
+DTSTAMP:20211207T015326Z
DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
conf.org/2021/talks/day2-close\n
END:VEVENT
diff --git a/2021/info/babel-schedule.md b/2021/info/babel-schedule.md
index baecbe4b..37ee874d 100644
--- a/2021/info/babel-schedule.md
+++ b/2021/info/babel-schedule.md
@@ -1,18 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: maybe live (early morning in Australia)
-Status: Finished
Duration: 9:58
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm">Download .webm video (9:58, 13.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/wPJWkEYqyGKxi9SQ82Hmn6">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt" default />"""
+size="21.4M" duration="9:58" other_resources="""[Download .pdf](https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat.pdf)
+[Download --compressed56.webm (13.3MB)](https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt)
+[View on Toobnix](https://toobnix.org/w/wPJWkEYqyGKxi9SQ82Hmn6)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--answers.png"
+size="11.1M" duration="5:19" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/bidi-schedule.md b/2021/info/bidi-schedule.md
index e2476772..931bd976 100644
--- a/2021/info/bidi-schedule.md
+++ b/2021/info/bidi-schedule.md
@@ -1,17 +1,31 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 19:52
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm">Download .webm video (19:52, 20.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/sBy9n22kgLMjXu9Cr1Ta44">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt" default />"""
+size="32.5M" duration="19:52" other_resources="""[Download .pdf](https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan.pdf)
+[Download --compressed56.webm (20.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/sBy9n22kgLMjXu9Cr1Ta44)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--answers.png"
+size="52.4M" duration="19:04" other_resources="""[Download --answers--compressed32.webm (42.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--answers--compressed32.webm)
+"""]]
+
+
# Description
diff --git a/2021/info/bindat-schedule.md b/2021/info/bindat-schedule.md
index 70aca76d..d30d1e0c 100644
--- a/2021/info/bindat-schedule.md
+++ b/2021/info/bindat-schedule.md
@@ -1,18 +1,69 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 29:48
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm">Download .webm video (29:48, 28.7MB)</a></li><li><a href="https://toobnix.org/w/qQeuipEkbSJgZbDm6xRg9q">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt" default />"""
+size="36.6M" duration="29:48" other_resources="""[Download --compressed56.webm (28.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/qQeuipEkbSJgZbDm6xRg9q)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:01 Introduction
+02:06 What is BinDat?
+05:27 Conversion to lexical scoping
+08:30 The BinDat specification
+15:35 New design
+17:47 Documentation
+19:30 Advantages
+21:51 New features
+23:08 Examples
+27:56 Conclusion
+28:28 Negatives
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--answers.png"
+size="89.8M" duration="47:23" other_resources=""""""]]
+[[!template id="chapters" vidid="qanda" data="""
+00:00 bindat seems very similar to GNU Poke.
+00:55 Is your dog's name something Lisp or PL related?
+01:15 Is it merged into mainline Emacs, a patch, an external library?
+01:35 Are there benchmarks of this vs. the older bindat?
+02:13 Do you know of any CL or Scheme libs similar to bindat.el?
+02:55 You are a hero of kittens everywhere. Do you have any feline pets as well?
+03:47 (Q&A logistics)
+05:35 I hope cl-loop is more efficient than intermediate lists...
+06:16 BBB chat: Curious: how is GNU Poke more flexible?
+07:55 How Stefan got involved with bindat
+08:33 BBB chat: What hobbies/interests do you have besides Emacs (and PL)?
+09:42 BBB chat: Thoughts on making Emacsconf better?
+11:40 BBB chat: Poke's from-scratch DSL vs. building on an existing language
+14:10 Winnie the dog interjects.
+15:15 BBB chat: Favorite talks so far?
+19:00 BBB chat: What kind of dog is Winnie?
+20:05 BBB chat: More control over types coming into Elisp?
+24:15 Andrea Corallo joins discussion about types and performance.
+38:19 BBB chat: Do you plan to add bit-level support?
+41:15 Is there an automated way to convert bindat C type specs to Lisp specs?
+43:00 BBB chat: That's a classic hard problem that essentially requires a C compiler.
+43:51 BBB chat: And there's a problem of object size being arch dependent.
+44:54 BBB chat: Parsing a generic .h file is way more difficult.
+46:05 BBB chat: Automatic translation is more for automatically writing C bindings.
+46:50 Thanks
+"""]]
+
+
# Description
diff --git a/2021/info/borg-schedule.md b/2021/info/borg-schedule.md
index 9e4727df..e9d2d264 100644
--- a/2021/info/borg-schedule.md
+++ b/2021/info/borg-schedule.md
@@ -1,17 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 7:49
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm">Download .webm video (7:49, 7.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/5oG4HmrCV5REgRHfA1rqa3">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt" default />"""
+size="16.8M" duration="7:49" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark.org)
+[Download --compressed56.webm (7.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt)
+[View on Toobnix](https://toobnix.org/w/5oG4HmrCV5REgRHfA1rqa3)
+"""]]
+
+
# Description
diff --git a/2021/info/build-schedule.md b/2021/info/build-schedule.md
index 24f3f655..bc5ee716 100644
--- a/2021/info/build-schedule.md
+++ b/2021/info/build-schedule.md
@@ -1,17 +1,27 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 16:54
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm">Download .webm video (16:54, 15.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/jJJwKDTmUVeRQhSj7bazhz">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.png"
+size="18.7M" duration="16:54" other_resources="""[Download --compressed56.webm (15.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--compressed56.webm)
+[View on Toobnix](https://toobnix.org/w/jJJwKDTmUVeRQhSj7bazhz)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--answers.png"
+size="32.1M" duration="15:19" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/clede-schedule.md b/2021/info/clede-schedule.md
index e6ed271f..702f0209 100644
--- a/2021/info/clede-schedule.md
+++ b/2021/info/clede-schedule.md
@@ -1,17 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 18:55
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm">Download .webm video (18:55, 24.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/1HuHMank52gcpHqf4M7Sa5">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.png"
+size="39.8M" duration="18:55" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt" default />""" other_resources="""[Download --compressed56.webm (24.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt)
+[View on Toobnix](https://toobnix.org/w/1HuHMank52gcpHqf4M7Sa5)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--answers.png"
+size="10.1M" duration="4:52" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/cs-schedule.md b/2021/info/cs-schedule.md
index af9012b6..28b03909 100644
--- a/2021/info/cs-schedule.md
+++ b/2021/info/cs-schedule.md
@@ -1,17 +1,40 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A
-Status: Finished
Duration: 9:28
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm">Download .webm video (9:28, 43.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/mxFkFd9TiUsJ8goGWZNAcz">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt" default />"""
+size="23.4M" duration="9:28" other_resources="""[Download --compressed56.webm (43.2MB)](https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/mxFkFd9TiUsJ8goGWZNAcz)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Self-intro and context of the talk
+00:27 Goals of the workflow
+00:43 Requirements of the workflow
+01:34 Package dependencies
+01:42 Demo: Class notes PDFs
+03:24 Pulling down arXiv papers
+08:12 Small customizations
+08:59 TODO
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--answers.png"
+size="65.6M" duration="15:25" other_resources="""[Download --answers--compressed32.webm (55.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--answers--compressed32.webm)
+"""]]
+
+
# Description
diff --git a/2021/info/dashboard-schedule.md b/2021/info/dashboard-schedule.md
index e5ea4988..1ed954d2 100644
--- a/2021/info/dashboard-schedule.md
+++ b/2021/info/dashboard-schedule.md
@@ -1,17 +1,27 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A and Matrix Chat (@mtekman:matrix.org)
-Status: Finished
Duration: 8:31
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm">Download .webm video (8:31, 5.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ojNW5UwYUzzRTsLhoHZMzG">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt" default />"""
+size="10.4M" duration="8:31" other_resources="""[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt)
+[View on Toobnix](https://toobnix.org/w/ojNW5UwYUzzRTsLhoHZMzG)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--answers.png" captions=""""""
+size="9M" duration="2:24" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/day1-close-schedule.md b/2021/info/day1-close-schedule.md
index 0febee07..f80dc8e3 100644
--- a/2021/info/day1-close-schedule.md
+++ b/2021/info/day1-close-schedule.md
@@ -1,8 +1,8 @@
<!-- Automatically generated by conf-create-info-pages -->
-Status: Will be live
+[[!toc ]]
Duration: 5 minutes
-<div class="times" start="2021-11-27T22:00:00Z" end="2021-11-27T22:05:00Z">Saturday, Nov 27 2021, ~ 5:00 PM - 5:05 PM EST<br />Saturday, Nov 27 2021, ~ 2:00 PM - 2:05 PM PST<br />Saturday, Nov 27 2021, ~10:00 PM - 10:05 PM UTC<br />Saturday, Nov 27 2021, ~11:00 PM - 11:05 PM CET<br />Sunday, Nov 28 2021, ~12:00 AM - 12:05 AM EET<br />Sunday, Nov 28 2021, ~ 3:30 AM - 3:35 AM IST<br />Sunday, Nov 28 2021, ~ 6:00 AM - 6:05 AM +08<br />Sunday, Nov 28 2021, ~ 7:00 AM - 7:05 AM JST<br /><a href="/2021/">Find out how to watch and participate</a></div>
+
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
diff --git a/2021/info/day1-open-schedule.md b/2021/info/day1-open-schedule.md
index 9e239f32..05eaea7f 100644
--- a/2021/info/day1-open-schedule.md
+++ b/2021/info/day1-open-schedule.md
@@ -1,8 +1,8 @@
<!-- Automatically generated by conf-create-info-pages -->
-Status: Will be live
+[[!toc ]]
Duration: 18 minutes
-<div class="times" start="2021-11-27T14:00:00Z" end="2021-11-27T14:18:00Z">Saturday, Nov 27 2021, ~ 9:00 AM - 9:18 AM EST<br />Saturday, Nov 27 2021, ~ 6:00 AM - 6:18 AM PST<br />Saturday, Nov 27 2021, ~ 2:00 PM - 2:18 PM UTC<br />Saturday, Nov 27 2021, ~ 3:00 PM - 3:18 PM CET<br />Saturday, Nov 27 2021, ~ 4:00 PM - 4:18 PM EET<br />Saturday, Nov 27 2021, ~ 7:30 PM - 7:48 PM IST<br />Saturday, Nov 27 2021, ~10:00 PM - 10:18 PM +08<br />Saturday, Nov 27 2021, ~11:00 PM - 11:18 PM JST<br /><a href="/2021/">Find out how to watch and participate</a></div>
+
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
diff --git a/2021/info/day2-close-schedule.md b/2021/info/day2-close-schedule.md
index 02b76366..dd041cfe 100644
--- a/2021/info/day2-close-schedule.md
+++ b/2021/info/day2-close-schedule.md
@@ -1,12 +1,12 @@
<!-- Automatically generated by conf-create-info-pages -->
-Status: Will be live
+[[!toc ]]
Duration: 10 minutes
-<div class="times" start="2021-11-28T21:52:00Z" end="2021-11-28T22:02:00Z">Sunday, Nov 28 2021, ~ 4:52 PM - 5:02 PM EST<br />Sunday, Nov 28 2021, ~ 1:52 PM - 2:02 PM PST<br />Sunday, Nov 28 2021, ~ 9:52 PM - 10:02 PM UTC<br />Sunday, Nov 28 2021, ~10:52 PM - 11:02 PM CET<br />Sunday, Nov 28 2021, ~11:52 PM - 12:02 AM EET<br />Monday, Nov 29 2021, ~ 3:22 AM - 3:32 AM IST<br />Monday, Nov 29 2021, ~ 5:52 AM - 6:02 AM +08<br />Monday, Nov 29 2021, ~ 6:52 AM - 7:02 AM JST<br /><a href="/2021/">Find out how to watch and participate</a></div>
-If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
+If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
+The video for "Closing remarks day 2" will be posted here when available. You can also subscribe to the <a href="https://lists.gnu.org/mailman/listinfo/emacsconf-discuss">emacsconf-discuss mailing list</a> for updates.
# Description
diff --git a/2021/info/day2-open-schedule.md b/2021/info/day2-open-schedule.md
index 1ec62724..f80dc8e3 100644
--- a/2021/info/day2-open-schedule.md
+++ b/2021/info/day2-open-schedule.md
@@ -1,8 +1,8 @@
<!-- Automatically generated by conf-create-info-pages -->
-Status: Will be live
+[[!toc ]]
Duration: 5 minutes
-<div class="times" start="2021-11-28T14:00:00Z" end="2021-11-28T14:05:00Z">Sunday, Nov 28 2021, ~ 9:00 AM - 9:05 AM EST<br />Sunday, Nov 28 2021, ~ 6:00 AM - 6:05 AM PST<br />Sunday, Nov 28 2021, ~ 2:00 PM - 2:05 PM UTC<br />Sunday, Nov 28 2021, ~ 3:00 PM - 3:05 PM CET<br />Sunday, Nov 28 2021, ~ 4:00 PM - 4:05 PM EET<br />Sunday, Nov 28 2021, ~ 7:30 PM - 7:35 PM IST<br />Sunday, Nov 28 2021, ~10:00 PM - 10:05 PM +08<br />Sunday, Nov 28 2021, ~11:00 PM - 11:05 PM JST<br /><a href="/2021/">Find out how to watch and participate</a></div>
+
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
diff --git a/2021/info/design-schedule.md b/2021/info/design-schedule.md
index 63ed6727..582fe240 100644
--- a/2021/info/design-schedule.md
+++ b/2021/info/design-schedule.md
@@ -1,18 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: maybe live
-Status: Finished
Duration: 6:39
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm">Download .webm video (6:39, 6.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/hmiKha234Q2FygiaspQEP4">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt" default />"""
+size="9.3M" duration="6:39" other_resources="""[Download --compressed56.webm (6.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt)
+[View on Toobnix](https://toobnix.org/w/hmiKha234Q2FygiaspQEP4)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--answers.png"
+size="17.4M" duration="6:34" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/dev-update-schedule.md b/2021/info/dev-update-schedule.md
index cd23180a..de6b6940 100644
--- a/2021/info/dev-update-schedule.md
+++ b/2021/info/dev-update-schedule.md
@@ -1,18 +1,38 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: maybe after the conference; will try to attend
-Status: Finished
Duration: 7:17
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm">Download .webm video (7:17, 10.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/aBGWhAhfgB4obi5c58qhFM">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt" default />"""
+size="10.3M" duration="7:17" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley.org)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/aBGWhAhfgB4obi5c58qhFM)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+00:18 Emacs 28
+00:33 Native compilation
+02:36 Build with Cairo by default
+02:55 New mode, but off by default: context-menus
+03:22 Tab-bar and tab-line received many enhancements
+03:37 A command can marked as specific to a mode
+04:20 Transient input methods
+05:00 show-paren-mode is enabled by default
+05:14 We now have a Non-GNU ELPA
+05:39 repeat-mode
+06:18 project.el has dozens of new commands
+06:26 Shorthands for Lisp symbols
+06:54 Emacs 29 is just beginning
+
+"""]]
+
# Description
diff --git a/2021/info/eaf-schedule.md b/2021/info/eaf-schedule.md
index 317bfa3f..04e92fbf 100644
--- a/2021/info/eaf-schedule.md
+++ b/2021/info/eaf-schedule.md
@@ -1,17 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC or Etherpad
-Status: Finished
Duration: 9:15
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm">Download .webm video (9:15, 10.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/9hMPmTLzAxx4bxHJnSbkMr">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt" default />"""
+size="13.4M" duration="9:15" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng.org)
+[Download --compressed56.webm (10.7MB)](https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/9hMPmTLzAxx4bxHJnSbkMr)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:03 Introduction
+00:38 EAF Overview
+02:05 New logo
+02:23 EAF Supports Windows, macOS, and many Linux distros
+03:15 Multi-language scripting
+03:56 VueJS extension
+05:45 EAF core-app separation
+07:09 Other notable updates Popweb
+"""]]
+
# Description
diff --git a/2021/info/erg-schedule.md b/2021/info/erg-schedule.md
index dc36b167..fbe0c9ef 100644
--- a/2021/info/erg-schedule.md
+++ b/2021/info/erg-schedule.md
@@ -1,17 +1,47 @@
<!-- Automatically generated by conf-create-info-pages -->
-Status: Finished
+[[!toc ]]
Duration: 10:23
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/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.webm"><track label="English" kind="captions" srclang="en" src="/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.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/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--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/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.webm">Download .webm video (10:23, 11MB)</a></li><li><a href="https://media.emacsconf.org/2021/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.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/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.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/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--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/jXni2SVVquM8FLjMLuK4Fg">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/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.webm" poster="https://media.emacsconf.org/2021/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.png" captions="""<track label="English" kind="captions" srclang="en" src="/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.vtt" default />"""
+size="33.7M" duration="10:23" other_resources="""[Download .org](https://media.emacsconf.org/2021/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.org)
+[Download --compressed56.webm (11MB)](https://media.emacsconf.org/2021/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--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/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.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/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--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/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)
+[View on Toobnix](https://toobnix.org/w/jXni2SVVquM8FLjMLuK4Fg)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+01:46 Background and technology: Emacs Research Group
+02:53 Prerecorded demo
+05:13 Organising metaphor
+05:35 Timetable
+06:00 Project Action Review
+06:32 Causal Layered Analysis
+07:02 Design Patterns and Next Steps
+07:42 Projects
+07:53 Patterns of Patterns (PLoP 2021)
+08:24 PLACARD Workshop roles
+08:57 Initial user studies
+09:38 Broader context
+10:08 Conclusion
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/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--answers.webm" poster="https://media.emacsconf.org/2021/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--answers.png"
+size="40.1M" duration="14:05" other_resources="""[Download --answers--compressed32.webm (35.7MB)](https://media.emacsconf.org/2021/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--answers--compressed32.webm)
+"""]]
+
+
# Description
diff --git a/2021/info/exec-schedule.md b/2021/info/exec-schedule.md
index ff5a83eb..34f1fa1f 100644
--- a/2021/info/exec-schedule.md
+++ b/2021/info/exec-schedule.md
@@ -1,17 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 7:09
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm">Download .webm video (7:09, 10.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/6TaLDJ4goGaa2R7dsxMi9F">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt" default />"""
+size="13.8M" duration="7:09" other_resources="""[Download --compressed56.webm (10.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt)
+[View on Toobnix](https://toobnix.org/w/6TaLDJ4goGaa2R7dsxMi9F)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--answers.png"
+size="38.7M" duration="16:26" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/faster-schedule.md b/2021/info/faster-schedule.md
index 96f05540..4ae1edb7 100644
--- a/2021/info/faster-schedule.md
+++ b/2021/info/faster-schedule.md
@@ -1,17 +1,55 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 35:35
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm">Download .webm video (35:35, 57.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.el">Download .el</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/kJkKrSyfeuhL7Gttgxb572">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt" default />"""
+size="97.5M" duration="35:35" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.org)
+[Download .el](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.el)
+[Download --compressed56.webm (57.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/kJkKrSyfeuhL7Gttgxb572)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:01 Introduction
+02:36 Emacs Lisp is a little old
+04:19 Benchmark then optimize, not vice versa
+05:03 profiler-start
+09:31 elp - Emacs Lisp Profiler
+13:01 benchmark
+19:13 Write less code
+20:00 Reduce allocations
+22:52 Recent optimizations in Xref
+30:52 cl-lib, dash, and seq
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--answers.png"
+size="96.9M" duration="41:29" other_resources="""[Download --answers--compressed32.webm (85.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--answers--compressed32.webm)
+"""]]
+[[!template id="chapters" vidid="qanda" data="""
+00:00 Why are overlays slow compared to text properties?
+03:21 Would these optimizations be helpful in a personal init.el?
+04:28 What's a good approach for benchmarking destructive operations?
+06:06 Do you recommend avoiding cl-defstruct in favour of "pure" lists/vectors?
+08:20 Possible to optimize Emacs packages with code compiled from other languages?
+10:26 (Q&A logistics)
+12:25 What about text properties vs. buffer-local variables to store position cache?
+18:40 Followup on earlier cl-defstruct benchmark discussion RE: AVL trees
+30:48 Does cl-defstruct have memory overhead/general memory usage discussion
+"""]]
+
+
# Description
diff --git a/2021/info/forever-schedule.md b/2021/info/forever-schedule.md
index 96ebe201..6131ff19 100644
--- a/2021/info/forever-schedule.md
+++ b/2021/info/forever-schedule.md
@@ -1,7 +1,7 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 24:52
@@ -9,17 +9,72 @@ If you have questions and the speaker has not indicated public contact informati
# Talk
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm">Download .webm video (24:52, 27.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/jSW4Gk3hsuv2ZfW8jXHz39">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt" default />"""
+size="51.4M" duration="24:52" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters.org)
+[Download --compressed56.webm (27.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/jSW4Gk3hsuv2ZfW8jXHz39)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:01 Introduction and conclusion
+00:28 Who am I?
+01:07 Is Emacs unpopular?
+02:26 What does popularity really mean?
+04:15 How do we measure popularity?
+04:32 Google Trends
+06:18 Stack Overflow Survey
+08:20 Community Activity
+10:23 How do editors lose popularity?
+10:38 A new editor with better features appears
+12:25 Lack of sufficient maintenance
+14:01 The "fashion" moves on
+14:36 What happens when an editor loses popularity?
+17:10 How will Emacs survive *despite* popularity?
+17:20 Emacs is more deeply hackable than almost all other editors
+19:51 Emacs has a strong community of highly skilled package authors
+21:15 Emacs has a very strong user community
+22:33 The Emacs maintainers and contributors care about the users
+23:40 Isn't all this supposed to come when an editor is popular?
+24:22 When someone talks about popularity...
+"""]]
-# Questions and answers
-<div class="qanda"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.png" id="qanda">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.webm"><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt" default onload="displayChapters(this)">
-</video><ol class="chapters"></ol></figure></div></div>
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers.png"
+size="116M" duration="56:57" other_resources="""[Download --answers--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt)
+"""]]
+[[!template id="chapters" vidid="qanda" data="""
+00:00 Thanks
+00:26 In your opinion, what is Emacs' Achilles heel?
+03:09 What is your opinion about the documentation of Emacs in other languages?
+05:06 Do you think more effort should be made to popularize hacking on the C parts of Emacs?
+06:31 Can you name a few features from other programming languages that you miss in Emacs Lisp?
+07:12 What are your opinions on Emacs's commitments to free software?
+08:22 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?
+11:42 Another way people can help inspire others to use Emacs
+12:57 Should Emacs continue to present itself as an esoteric program and culture, or should we try to dispel the myth?
+14:49 Do you think there could be changes made to the core of Emacs that would betray the ethos you and most people here appreciate?
+15:22 When will David Wilson and Protesilaos collaborate?
+15:38 If you had to choose between graphics or real browser support within Emacs, which would you choose?
+16:28 How do you feel being an Emacs-focused YouTuber?
+18:29 More typesetting capabilities versus better performance
+20:31 Sneak peek of what's coming in the YouTube channel soon?
+24:43 Principles and compromises
+25:07 Understanding the value of Emacs Lisp
+26:10 Will you do a video showing your personal workflow?
+26:44 What do you think about Guix or NixOS?
+28:12 Can you talk about your actual work?
+31:18 Do your colleagues use Emacs as well?
+35:23 Any thoughts on the idea that the best tool to use is the one that is easiest to leave?
+39:23 Do you think there should be an updated initial configuration for fresh Emacs installations with more modern UI features and cool shortcuts?
+42:29 How hard is it to get into the native code side of Emacs?
+43:50 Emacs Chats
+46:28 Livestreams
+53:34 Short-form videos
+"""]]
# Description
diff --git a/2021/info/form-schedule.md b/2021/info/form-schedule.md
index 11d04054..106dfef6 100644
--- a/2021/info/form-schedule.md
+++ b/2021/info/form-schedule.md
@@ -1,17 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 12:44
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm">Download .webm video (12:44, 13.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/mcyaNMBE1QpjvQa2qDayvi">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt" default />"""
+size="24.9M" duration="12:44" other_resources="""[Download --compressed56.webm (13.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt)
+[View on Toobnix](https://toobnix.org/w/mcyaNMBE1QpjvQa2qDayvi)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--answers.png"
+size="5.5M" duration="2:41" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/freedom-schedule.md b/2021/info/freedom-schedule.md
index 634bb9fc..c3871089 100644
--- a/2021/info/freedom-schedule.md
+++ b/2021/info/freedom-schedule.md
@@ -1,18 +1,32 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 38:24
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm">Download .webm video (38:24, 54.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/ktxYMzsYPYguc3HwkDiKea">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt" default />"""
+size="85.9M" duration="38:24" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou.org)
+[Download --compressed56.webm (54.9MB)](https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/ktxYMzsYPYguc3HwkDiKea)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 About me and this talk
+04:44 The inherent Emacs qualities for an autodidact
+09:17 The interconnectedness of the Emacs space
+14:07 The documentation culture of the Emacs community
+18:55 The Promethean Ideal of freeing know-how and expertise
+23:59 The 'killer apps' of Emacs
+28:53 You can't be an Emacs tourist
+33:39 Emacs as a champion of software freedom
+"""]]
+
# Description
diff --git a/2021/info/frownies-schedule.md b/2021/info/frownies-schedule.md
index 5c5cbb14..bdb26131 100644
--- a/2021/info/frownies-schedule.md
+++ b/2021/info/frownies-schedule.md
@@ -1,17 +1,44 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: maybe live
-Status: Finished
Duration: 19:40
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm"><track label="English" kind="captions" srclang="en" src="/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.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm">Download .webm video (19:40, 26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/5s64FqtX3pqq4uYDwtTvrA">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/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.vtt" default />"""
+size="65.3M" duration="19:40" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth.org)
+[Download --compressed56.webm (26.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/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)
+[View on Toobnix](https://toobnix.org/w/5s64FqtX3pqq4uYDwtTvrA)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+01:01 Before the beginning, the Beginning
+02:07 Oops
+02:56 Yada yada yada
+04:52 During all this time...
+06:51 Pandemic
+07:29 Anyway
+08:50 A growing obsession
+09:38 What is the point of all of this? I thought we were talking about frowing.
+10:32 Conversation
+11:14 Later...
+11:33 frowny.el
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--answers.png"
+size="9.6M" duration="4:34" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/gregorian-schedule.md b/2021/info/gregorian-schedule.md
index 8d47d7d4..37defbee 100644
--- a/2021/info/gregorian-schedule.md
+++ b/2021/info/gregorian-schedule.md
@@ -1,18 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 8:08
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm">Download .webm video (8:08, 7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/ig7rS3VpJjLXCLeq5GYb5z">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt" default />"""
+size="7.9M" duration="8:06" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king.org)
+[Download --compressed56.webm (7MB)](https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/ig7rS3VpJjLXCLeq5GYb5z)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Title
+00:10 Roadmap
+00:46 Gregorio
+01:46 Metadata
+02:08 `gregorian-mode`
+02:48 Examples
+06:49 Useful links
+"""]]
+
# Description
diff --git a/2021/info/imaginary-schedule.md b/2021/info/imaginary-schedule.md
index 155ca51f..21e9eda8 100644
--- a/2021/info/imaginary-schedule.md
+++ b/2021/info/imaginary-schedule.md
@@ -1,17 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 10:17
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm">Download .webm video (10:17, 19.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/3ydn2davFQZPoiwB78KZWm">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt" default />"""
+size="32.2M" duration="10:17" other_resources="""[Download .pdf](https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan.pdf)
+[Download --compressed56.webm (19.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt)
+[View on Toobnix](https://toobnix.org/w/3ydn2davFQZPoiwB78KZWm)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--answers.png"
+size="24.1M" duration="32:18" other_resources="""[Download --answers--compressed32.webm (20.9MB)](https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--answers--compressed32.webm)
+"""]]
+
+
# Description
diff --git a/2021/info/invoice-schedule.md b/2021/info/invoice-schedule.md
index 0287e786..842c97f3 100644
--- a/2021/info/invoice-schedule.md
+++ b/2021/info/invoice-schedule.md
@@ -1,18 +1,21 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: answering after the conference
-Status: Finished
Duration: 9:59
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm">Download .webm video (9:59, 14.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/kD6nFQsJFSQys8DCmR76gi">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt" default />"""
+size="31.7M" duration="9:59" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai.org)
+[Download --compressed56.webm (14.9MB)](https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt)
+[View on Toobnix](https://toobnix.org/w/kD6nFQsJFSQys8DCmR76gi)
+"""]]
+
+
# Description
diff --git a/2021/info/janitor-schedule.md b/2021/info/janitor-schedule.md
index b337f9d7..f84df3e2 100644
--- a/2021/info/janitor-schedule.md
+++ b/2021/info/janitor-schedule.md
@@ -1,18 +1,65 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 25:57
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm">Download .webm video (25:57, 36.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/1h7QmFBDjBQZPBeWtARK9j">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt" default />"""
+size="53.4M" duration="25:57" other_resources="""[Download --compressed56.webm (36.3MB)](https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt)
+[View on Toobnix](https://toobnix.org/w/1h7QmFBDjBQZPBeWtARK9j)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--answers.png"
+size="76.8M" duration="41:05" other_resources=""""""]]
+[[!template id="chapters" vidid="qanda" data="""
+00:00 BBB: Tools like coccinelle might work with changes like this in Lisp...
+02:19 BBB: I thought lexical binding conversion would be more proof-based...
+05:01 BBB: Is the Emacs in the presentation your personal config?
+06:04 How often these changes break packages/maintainers complain about changes
+08:52 Which Emacs subsystem was the hardest to convert to lexical binding?
+10:10 BBB: Would you consider making more short informal videos to help others?
+10:32 BBB: I'm curious about your style of signing your mailing list messages.
+11:25 BBB: Older code being harder to convert
+12:40 BBB: Could metaobject protocol support come to Elisp?
+14:10 BBB: What features do you see as higher priority for future development?
+16:55 BBB: Would ELPA download counts be difficult to code?
+17:55 BBB: Do you install packages from MELPA?
+18:55 BBB: Are you using native-comp already?
+20:10 BBB: Do you use Org much?
+21:10 BBB: Do you use magit?
+22:05 BBB: Some future Emacs improvements you're looking forward to?
+23:10 BBB: Opinion about recent GStreamer patches?
+24:20 BBB: Have you ever met other Emacs maintainers/developers in person?
+25:25 BBB: What's Lars like in real life? He seems fun.
+25:58 BBB: How do you hack on installed packages?
+27:43 BBB: Is Lars tall?
+28:06 BBB: How Elisp should evolve, or is another language the long-term path?
+30:29 BBB: Do you use paredit?
+30:33 BBB: Do you lean toward Scheme-style macros rather than CL ones?
+32:04 BBB: What non-Lisp languages could we take inspiration from?
+32:43 BBB: I'd like to see something like a with-gensyms macro to make them easier.
+33:42 BBB: Can namespaces solve some macro issues?
+34:15 BBB: Difficulties preserving source code data for symbols and sexps?
+36:24 BBB: Doesn't adding code/data distinction break homoiconicity?
+36:40 BBB: Could a Clojure-like metadata approach to this be useful?
+37:14 Fat cons cells/symbols
+38:32 BBB: Could fat cons cells be used for CL-style VALUES too?
+38:57 Concurrent garbage collection
+39:52 BBB: GC work even more tedious than janitorial work?
+40:50 BBB: Are you Canadian/Quebecois, or do you just live and work there?
+"""]]
+
# Description
diff --git a/2021/info/maintainers-schedule.md b/2021/info/maintainers-schedule.md
index 258dd02a..44c78276 100644
--- a/2021/info/maintainers-schedule.md
+++ b/2021/info/maintainers-schedule.md
@@ -1,17 +1,67 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 10:07
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" poster="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.png" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm">Download .webm video (10:07, 9.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/naNvWzM2jjj5ownu9zmbAf">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt" default />"""
+size="14.7M" duration="10:07" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry.org)
+[Download --compressed56.webm (9.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/naNvWzM2jjj5ownu9zmbAf)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+00:47 What is a free software maintainer?
+02:19 What do I do as the Org maintainer?
+03:24 Do you see a pattern here?
+04:18 What a free software maintainer is or should be
+05:03 Summary
+05:26 ACDC: Asynchronous Collective Distributed Care
+06:28 How can you help Emacs maintainers?
+06:37 Become a maintainer for your own project, however small
+06:56 Volunteer as a contributor steward for another project
+07:10 Learn how to teach
+07:25 Test and enhance the project's contribution process
+07:35 Take care of the project's calls for help
+07:52 Encourage users from outside the project to contribute to the core forum
+08:08 Let the core forum know about what happens in this outside world
+08:16 Propose your help for non-code tasks
+08:26 If you expect someone else to fix your bug, try fixing someone else's bug first
+08:42 Don't expect the maintainer to be a hotline
+08:49 Complete this list
+08:57 Yes, this is hard
+09:35 Thanks
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers.png"
+size="153M" duration="58:55" other_resources="""[Download --answers--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--answers--chapters.vtt)
+"""]]
+[[!template id="chapters" vidid="qanda" data="""
+00:00 Thanks
+04:30 How did you come up with this knowledge? By doing or by experience or by reading books? Which?
+06:10 How did you come to start using Org?
+08:39 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?
+10:55 Which place is the right place to request a dark mode in Org Mode website?
+11:27 More thanks
+15:09 Does this mean that you do not need to be technical to become a maintainer?
+17:24 What does the day of the Org Mode maintainer look like? Lots of hours of work every day?
+21:11 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)?
+24:21 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"?
+27:52 Could you expand a little on what's happening on contrib?
+35:32 Orgdown
+54:54 What about backlinks?
+"""]]
+
# Description
diff --git a/2021/info/model-schedule.md b/2021/info/model-schedule.md
index d041ad23..1c9dee62 100644
--- a/2021/info/model-schedule.md
+++ b/2021/info/model-schedule.md
@@ -1,17 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: after the conference
-Status: Finished
Duration: 9:49
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm">Download .webm video (9:49, 8.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/vsuuxy2SUsWpcLoeAtqJhG">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt" default />"""
+size="9.6M" duration="9:49" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij.org)
+[Download --compressed56.webm (8.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt)
+[View on Toobnix](https://toobnix.org/w/vsuuxy2SUsWpcLoeAtqJhG)
+"""]]
+
+
# Description
diff --git a/2021/info/mold-schedule.md b/2021/info/mold-schedule.md
index 9e53514f..f277166a 100644
--- a/2021/info/mold-schedule.md
+++ b/2021/info/mold-schedule.md
@@ -1,18 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC or Etherpad
-Status: Finished
Duration: 9:34
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm">Download .webm video (9:34, 14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/4CfNuj8YPpB8HreQHqGXWf">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt" default />"""
+size="22.7M" duration="9:34" other_resources="""[Download --compressed56.webm (14.2MB)](https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt)
+[View on Toobnix](https://toobnix.org/w/4CfNuj8YPpB8HreQHqGXWf)
+"""]]
+
+
# Description
diff --git a/2021/info/molecular-schedule.md b/2021/info/molecular-schedule.md
index 7371577f..e978279b 100644
--- a/2021/info/molecular-schedule.md
+++ b/2021/info/molecular-schedule.md
@@ -1,17 +1,21 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or Etherpad
-Status: Finished
Duration: 8:04
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm">Download .webm video (8:04, 8.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/tKmTCVtngTLQfQzHpG4BgU">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt" default />"""
+size="11.8M" duration="8:04" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.org)
+[Download .pdf (3.3MB)](https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.pdf)
+[Download --compressed56.webm (8.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt)
+[View on Toobnix](https://toobnix.org/w/tKmTCVtngTLQfQzHpG4BgU)
+"""]]
+
+
# Description
diff --git a/2021/info/montessori-schedule.md b/2021/info/montessori-schedule.md
index 4ced9dc5..75891ba0 100644
--- a/2021/info/montessori-schedule.md
+++ b/2021/info/montessori-schedule.md
@@ -1,18 +1,48 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 10:27
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm">Download .webm video (10:27, 11.4MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/c5sEmoZbK3ay1b9VGNmP1z">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt" default />"""
+size="15.1M" duration="10:27" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux.org)
+[Download --compressed56.webm (11.4MB)](https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/c5sEmoZbK3ay1b9VGNmP1z)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:04 Introduction
+00:20 Respect
+00:35 The Prepared Environment
+01:19 Human tendencies
+01:56 Orientation
+03:30 Order
+04:26 Exploration
+05:12 Communication
+05:46 Activity
+06:21 Manipulation
+06:48 Work (or Purposeful Activity)
+07:09 Repetition
+07:38 Exactness
+08:16 Abstraction
+09:02 Perfection
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--answers.png"
+size="5.6M" duration="2:19" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/nangulator-schedule.md b/2021/info/nangulator-schedule.md
index 436d721f..21604bb8 100644
--- a/2021/info/nangulator-schedule.md
+++ b/2021/info/nangulator-schedule.md
@@ -1,17 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 9:58
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm">Download .webm video (9:58, 9.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt">Download --main.vtt</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt" default />"""
+size="13.7M" duration="9:58" other_resources="""[Download --compressed56.webm (9.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt)
+[View on Toobnix](https://toobnix.org/w/pHrShaGAJwtXvsqKhNWZ56)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--answers.png"
+size="2.7M" duration="1:07" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/native-schedule.md b/2021/info/native-schedule.md
index ab340281..49712db5 100644
--- a/2021/info/native-schedule.md
+++ b/2021/info/native-schedule.md
@@ -1,17 +1,62 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 39:08
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm">Download .webm video (39:08, 40.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo.odp">Download .odp</a></li><li><a href="https://toobnix.org/w/aCnFuNEzX1kMKJp3q31YKx">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt" default />"""
+size="89M" duration="39:08" other_resources="""[Download .odp (3.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo.odp)
+[Download --compressed56.webm (40.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt)
+[View on Toobnix](https://toobnix.org/w/aCnFuNEzX1kMKJp3q31YKx)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers.png"
+size="141.8M" duration="75:02" other_resources="""[Download --answers--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--answers--chapters.vtt)
+"""]]
+[[!template id="chapters" vidid="qanda" data="""
+00:00 Thanks
+01:16 Why is Elisp not a general-purpose programming language, at least not completely?
+02:05 Is this activity related to the garbage collector?
+02:37 Is the idea to eventually develop Emacs itself in Elisp?
+03:42 How did you work on this?
+04:27 Does this compilation pipeline introduce vulnerabilities?
+05:39 What code, if any, will still benefit significantly from being written in C?
+07:28 What's the risk of (setq native-comp-speed 3)?
+08:49 Are there any limits introduced by native comp with respect to runtime introspectability, changeability/redefinability, etc?
+09:15 Is there a benefit in setting native-comp-compiler-options to "-mtune=native -march="?
+10:11 You mentioned native-comp coming in emacs 28. Will this be the default at build time, or will distros have to set this themselves?
+11:54 Could we avoid libgccjit.so? Or consider using another jit lib (e.g. dynasm used by luajit) et al to gain better optimization?
+14:22 How much of Emacs's C code base could be translated to emacs-lisp? What is the minimum C code base necessary?
+16:23 Could we statically type elisp code (via macros?) to provide more optimization hints to compiler?
+17:27 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?
+18:55 Did you try to optimize with Rust too? What are your thoughts on Rust for this particular optimization and security?
+21:35 Does the native compilation interface with the Emacs profiling tools?
+22:59 Where did funding for your work come from?
+27:04 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?
+28:36 Is this the first real-world practical use of libgccjit?
+29:47 Is there any task you need help with?
+33:49 What's a good way to proceed?
+38:37 What kind of packages do you think could now be practical with native comp?
+40:46 Why not implement Emacs Lisp in Guile and use Guile's compiler?
+46:29 What are some other hobbies/interests of yours besides Emacs?
+48:27 Will you be presenting at ELS or anywhere else in the next year?
+51:04 How to make Emacs more popular?
+59:46 Do you have 'wish list' features, things you long for Emacs to be able to do?
+01:02:04 From BBB chat: dickmao has a patch that makes Gnus async....
+01:05:33 Advice for anyone who wants to bring something into Emacs core
+01:10:20 Do you have any advice on how to approach the upstream development community?
+"""]]
+
# Description
diff --git a/2021/info/news-schedule.md b/2021/info/news-schedule.md
index d6a61494..17eabbb3 100644
--- a/2021/info/news-schedule.md
+++ b/2021/info/news-schedule.md
@@ -1,18 +1,35 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: answering after the conference
-Status: Finished
Duration: 4:24
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm">Download .webm video (4:24, 6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/ueMACQQh39buYwf5K9Y5fh">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt" default />"""
+size="13M" duration="4:23" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua.org)
+[Download --compressed56.webm (6.1MB)](https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/ueMACQQh39buYwf5K9Y5fh)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+00:11 Upcoming Emacs 28 release
+00:24 Org mode 9.5
+00:57 Magit major release
+01:18 Completion
+01:51 Embark
+02:12 tree-sitter
+02:44 Collaborative editing
+03:03 Graphical experiments
+03:41 Community
+04:00 libera.chat
+"""]]
+
# Description
diff --git a/2021/info/nongnu-schedule.md b/2021/info/nongnu-schedule.md
index 6ead50e1..e0faeac9 100644
--- a/2021/info/nongnu-schedule.md
+++ b/2021/info/nongnu-schedule.md
@@ -1,18 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 6:28
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm">Download .webm video (6:28, 7.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/ovpi53peSt7aX8EtvKMFFy">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt" default />"""
+size="10.6M" duration="6:28" other_resources="""[Download --compressed56.webm (7.2MB)](https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt)
+[View on Toobnix](https://toobnix.org/w/ovpi53peSt7aX8EtvKMFFy)
+"""]]
+
+
# Description
diff --git a/2021/info/nyxt-schedule.md b/2021/info/nyxt-schedule.md
index e143dba8..0b4003b3 100644
--- a/2021/info/nyxt-schedule.md
+++ b/2021/info/nyxt-schedule.md
@@ -1,18 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC or Etherpad
-Status: Finished
Duration: 8:26
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm">Download .webm video (8:26, 24.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qBpVxaayFezJMgG9WVQsoy">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt" default />"""
+size="27.2M" duration="8:26" other_resources="""[Download --compressed56.webm (24.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt)
+[View on Toobnix](https://toobnix.org/w/qBpVxaayFezJMgG9WVQsoy)
+"""]]
+
+
# Description
diff --git a/2021/info/omegat-schedule.md b/2021/info/omegat-schedule.md
index 91a8cdab..5d2312d0 100644
--- a/2021/info/omegat-schedule.md
+++ b/2021/info/omegat-schedule.md
@@ -1,18 +1,23 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A / IRC / pad
-Status: Finished
Duration: 9:07
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt" default><track label="French" kind="captions" srclang="fr" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt"><track label="Japanese" kind="captions" srclang="ja" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm">Download .webm video (9:07, 9.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt">Download --main_fr.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt">Download --main_ja.vtt</a></li><li><a href="https://toobnix.org/w/cQbCi4a9E3YVSW9KdiyW2V">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt" default /><track label="French" kind="captions" srclang="fr" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt" /><track label="Japanese" kind="captions" srclang="ja" src="/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt" />"""
+size="15.2M" duration="9:07" other_resources="""[Download .pdf (3.8MB)](https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary.pdf)
+[Download --compressed56.webm (9.3MB)](https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt)
+[Download --main_fr.vtt](https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt)
+[Download --main_ja.vtt](https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt)
+[View on Toobnix](https://toobnix.org/w/cQbCi4a9E3YVSW9KdiyW2V)
+"""]]
+
+
# Description
diff --git a/2021/info/org-outside-schedule.md b/2021/info/org-outside-schedule.md
index 7e1c7e4a..eabc3e85 100644
--- a/2021/info/org-outside-schedule.md
+++ b/2021/info/org-outside-schedule.md
@@ -1,17 +1,27 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 12:09
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm">Download .webm video (12:09, 27.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/g35zpQfCCqDM39ZMEphNj7">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt" default />"""
+size="27.1M" duration="12:09" other_resources="""[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt)
+[View on Toobnix](https://toobnix.org/w/g35zpQfCCqDM39ZMEphNj7)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--answers.png" captions=""""""
+size="64.9M" duration="27:32" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/pattern-schedule.md b/2021/info/pattern-schedule.md
index cc9c56dc..8ac855cc 100644
--- a/2021/info/pattern-schedule.md
+++ b/2021/info/pattern-schedule.md
@@ -1,18 +1,33 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 23:01
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm">Download .webm video (23:01, 35.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/afvaVspSSR9YypjUqTypQz">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt" default />"""
+size="131.8M" duration="23:01" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.org)
+[Download .pdf](https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.pdf)
+[Download --compressed56.webm (36.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/afvaVspSSR9YypjUqTypQz)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+01:16 Definition of design patterns and relation to Emacs
+05:18 Why this approach matters
+09:12 Managing complexity: Emacs as mind map
+11:30 Emacs as design pattern framework
+12:31 Personal customization
+13:30 Implementing Emacs as a model for learning
+16:41 Emacs as accommodating complex social, community assemblages
+"""]]
+
# Description
diff --git a/2021/info/professional-schedule.md b/2021/info/professional-schedule.md
index 2878173f..c86ca03c 100644
--- a/2021/info/professional-schedule.md
+++ b/2021/info/professional-schedule.md
@@ -1,17 +1,19 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 10:33
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm">Download .webm video (10:33, 12.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/rXjPE7hdELfGJhFFUqFhF5">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt" default />"""
+size="15.1M" duration="10:33" other_resources="""[Download --compressed56.webm (9.1MB)](https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt)
+[View on Toobnix](https://toobnix.org/w/rXjPE7hdELfGJhFFUqFhF5)
+"""]]
+
+
# Description
diff --git a/2021/info/project-schedule.md b/2021/info/project-schedule.md
index 0f76f50f..bea8f069 100644
--- a/2021/info/project-schedule.md
+++ b/2021/info/project-schedule.md
@@ -1,17 +1,32 @@
<!-- Automatically generated by conf-create-info-pages -->
-Status: Finished
+[[!toc ]]
Duration: 9:37
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm">Download .webm video (9:37, 15.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/71vGdiqdkaN1bAcoDd8VkT">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt" default />"""
+size="37.5M" duration="9:37" other_resources="""[Download --compressed56.webm (15.3MB)](https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/71vGdiqdkaN1bAcoDd8VkT)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:01 Introduction
+00:10 How we build and budget project proposals
+01:42 Org mode template with embedded Emacs Lisp
+02:58 The project plan
+03:37 Effort
+04:40 Hourly rates
+06:07 Totals
+07:28 Payment structure
+08:21 Export
+09:08 Advantages
+"""]]
+
# Description
diff --git a/2021/info/research-schedule.md b/2021/info/research-schedule.md
index 55818b2b..0513a189 100644
--- a/2021/info/research-schedule.md
+++ b/2021/info/research-schedule.md
@@ -1,18 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: maybe live
-Status: Finished
Duration: 8:47
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm">Download .webm video (8:47, 14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled.el">Download .el</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/jTXAtCYNWFPRFR1pt94yi1">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt" default />"""
+size="19.2M" duration="8:47" other_resources="""[Download .el](https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled.el)
+[Download --compressed56.webm (14.2MB)](https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/jTXAtCYNWFPRFR1pt94yi1)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+00:51 Elfeed
+02:30 org-ref
+03:50 BibLaTeX
+05:48 Notes and org-roam
+"""]]
+
# Description
diff --git a/2021/info/structural-schedule.md b/2021/info/structural-schedule.md
index 4485aa12..1bd2d149 100644
--- a/2021/info/structural-schedule.md
+++ b/2021/info/structural-schedule.md
@@ -1,17 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 10:24
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm">Download .webm video (10:24, 13MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt">Download --main.vtt</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt" default />"""
+size="15M" duration="10:24" other_resources="""[Download --compressed56.webm (13MB)](https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt)
+[View on Toobnix](https://toobnix.org/w/8Smc22cLzi7UzosijPt7DP)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--answers.png"
+size="3.3M" duration="1:59" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/teach-schedule.md b/2021/info/teach-schedule.md
index 7ad3d305..3159ab62 100644
--- a/2021/info/teach-schedule.md
+++ b/2021/info/teach-schedule.md
@@ -1,17 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 20:49
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm">Download .webm video (20:49, 26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/w6CowfCZotPnYkwhudU32V">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt" default />"""
+size="42.7M" duration="20:49" other_resources="""[Download --compressed56.webm (26.5MB)](https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt)
+[View on Toobnix](https://toobnix.org/w/w6CowfCZotPnYkwhudU32V)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--answers.png"
+size="28.6M" duration="12:13" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/tech-schedule.md b/2021/info/tech-schedule.md
index eb8e4ab5..397c0e10 100644
--- a/2021/info/tech-schedule.md
+++ b/2021/info/tech-schedule.md
@@ -1,18 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or IRC
-Status: Finished
Duration: 10:22
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm">Download .webm video (10:22, 15.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/2pPvDFSAwr2zhGfHGHUbko">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt" default />"""
+size="17.1M" duration="10:22" other_resources="""[Download --compressed56.webm (15.9MB)](https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt)
+[View on Toobnix](https://toobnix.org/w/2pPvDFSAwr2zhGfHGHUbko)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--answers.png"
+size="1.7M" duration="0:48" other_resources=""""""]]
+
+
# Description
diff --git a/2021/info/telega-schedule.md b/2021/info/telega-schedule.md
index 9a616ffc..633faf90 100644
--- a/2021/info/telega-schedule.md
+++ b/2021/info/telega-schedule.md
@@ -1,17 +1,19 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: after the conference
-Status: Finished
Duration: 7:58
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm">Download .webm video (7:58, 8.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/g1YBMdbNqMHMZu7wCHB5rH">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt" default />"""
+size="10.5M" duration="7:58" other_resources="""[Download --compressed56.webm (8.1MB)](https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt)
+[View on Toobnix](https://toobnix.org/w/g1YBMdbNqMHMZu7wCHB5rH)
+"""]]
+
+
# Description
diff --git a/2021/info/test-schedule.md b/2021/info/test-schedule.md
index 8c31ba08..e5c0b9b0 100644
--- a/2021/info/test-schedule.md
+++ b/2021/info/test-schedule.md
@@ -1,17 +1,19 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: IRC
-Status: Finished
Duration: 6:04
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm">Download .webm video (6:04, 7.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/qRKLj4VdBG8cFN1MEfcRho">View on Toobnix</a></li></ul></div></div>
-</div>
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt" default />"""
+size="10M" duration="6:04" other_resources="""[Download --compressed56.webm (7.7MB)](https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt)
+[View on Toobnix](https://toobnix.org/w/qRKLj4VdBG8cFN1MEfcRho)
+"""]]
+
+
# Description
diff --git a/2021/info/ui-schedule.md b/2021/info/ui-schedule.md
index 80c27794..c01ea6e1 100644
--- a/2021/info/ui-schedule.md
+++ b/2021/info/ui-schedule.md
@@ -1,17 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live Q&A or Etherpad
-Status: Finished
Duration: 9:28
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt" default>
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm">Download .webm video (9:28, 10.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt">Download --main.vtt</a></li><li><a href="https://toobnix.org/w/cwoEZmDr3YDAkskSq8nYEf">View on Toobnix</a></li></ul></div></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt" default />"""
+size="13.5M" duration="9:28" other_resources="""[Download --compressed56.webm (10.6MB)](https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt)
+[View on Toobnix](https://toobnix.org/w/cwoEZmDr3YDAkskSq8nYEf)
+"""]]
+
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--answers.png"
+size="31M" duration="20:54" other_resources="""[Download --answers--compressed32.webm (28MB)](https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--answers--compressed32.webm)
+"""]]
+
+
# Description
diff --git a/2021/info/unix-schedule.md b/2021/info/unix-schedule.md
index da19cd0f..7c8e0715 100644
--- a/2021/info/unix-schedule.md
+++ b/2021/info/unix-schedule.md
@@ -1,18 +1,46 @@
<!-- Automatically generated by conf-create-info-pages -->
+[[!toc ]]
Q&A: live
-Status: Finished
Duration: 6:41
[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
If you have questions and the speaker has not indicated public contact information on this page, please feel free to e-mail us at <emacsconf-submit@gnu.org> and we'll forward your question to the speaker.
-<div class="mainVideo"><div class="video-card vid" data-id="mainVideo"><figure><video controls preload="metadata" id="mainVideo">
-<source src="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm"><track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt" default><track kind="chapters" label="Chapters" srclang="en" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt" default onload="displayChapters(this)">
-</video></figure>
-<div class="files resources"><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm">Download .webm video (6:41, 6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://toobnix.org/w/18qckj5KshdahW5AiUuMHB">View on Toobnix</a></li></ul></div><ol class="chapters"></ol></div>
-</div>
+# Talk
+
+[[!template id="vid" vidid="mainVideo" src="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.png" captions="""<track label="English" kind="captions" srclang="en" src="/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt" default />"""
+size="10.4M" duration="6:41" other_resources="""[Download .org](https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose.org)
+[Download --compressed56.webm (6.1MB)](https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--compressed56.webm)
+[Download --main.vtt](https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt)
+[Download --chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt)
+[Download --main--chapters.vtt](https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt)
+[View on Toobnix](https://toobnix.org/w/18qckj5KshdahW5AiUuMHB)
+"""]]
+[[!template id="chapters" vidid="mainVideo" data="""
+00:00 Introduction
+00:31 UNIX Philosophy?
+00:57 Enter Emacs
+01:25 Emacs versus the original ideas
+01:50 Why compare to UNIX?
+02:17 Emacs /does/ work with the UNIX philosophy
+02:59 Philosophies don't really matter in computing
+03:15 Android Studio
+04:14 Window Managers
+04:42 Browsers
+05:09 Vim
+05:34 Terminals
+06:12 Do what helps you most, not what a philosophy tells you
+"""]]
+
+
+# Q&A
+
+[[!template id="vid" vidid="qanda" src="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--answers.webm" poster="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--answers.png"
+size="9.7M" duration="3:39" other_resources=""""""]]
+
+
# Description
diff --git a/2021/inline-alternate.md b/2021/inline-alternate.md
index 3011b4b2..22257c05 100644
--- a/2021/inline-alternate.md
+++ b/2021/inline-alternate.md
@@ -1 +1 @@
-This talk will also be streamed at an alternate time for APAC hours: <https://libreau.org/upcoming.html#emacsconf21>
+This talk was also streamed at an alternate time for APAC hours: <https://libreau.org/past.html#emacsconf21>
diff --git a/2021/meetings.org b/2021/meetings.org
index 2b28a9bd..0a29043f 100644
--- a/2021/meetings.org
+++ b/2021/meetings.org
@@ -117,6 +117,38 @@
* EmacsConf 2021: Long-running TODOs
+* December 11, 2021
+
+- Check-in:
+ - Time feels weird; it’s been both short and long since we last saw one another
+ - bandali
+
+- zaeph: We’ve talked about a lot of interesting stuff, but I couldn’t make significant points *and* take notes at the same time. The few haphazard notes I’ve written are in the next block.
+#+begin_quote
+- Async vs live meeting
+ - How do we keep all the organizers up to speed on what sachac and zaeph are working quasi-synchronously via IRC?
+ - bandali: Could we have a weekly email keeping everyone up to speed?
+ - corwin: It should be a 5-min read (not taking more than 15 min to write) allowing orgas who were busy elsewhere to be brought up to speed
+
+- Assessment of our organisation in the two weeks that followed EmacsConf
+ - Moving away from weekly minutes with TODOs to near-synchronous communication on IRC with a pad making it difficult to see the log resulted in a net loss of traceability of our projects
+ - corwin: Maybe it’s not an actual problem right now; yes, better communication would be better, but it can probably wait.
+ - Solutions:
+ - Splitting up #emacsconf-org into *thematic* topics like #emacsconf-infra, #emacsconf-post
+#+end_quote
+
+- Summary of changes, written hastily so as to not forget
+ - As a project grows, it becomes harder and harder for organisers to one-person-army everything; specialisation is a good solution.
+ - Core-organisers are in charge of the project and are the guarantor of its philosophy; we should keep an initial distinction between volunteers and core-organisers so as to maintain governance.
+ - Core-organisers should move away from the “I need to keep up with everything”, FOMO-like mentality; instead, they should specialise on *themes* that they enjoy working on and were they can satisfactorily handle the work-load.
+ - Volunteers are piped to relevant themes/projects relative to their interest; they become the soft-responsibility of the core-organiser in charge of the theme.
+ - Core-organisers manage their theme with as much flexibility as they want; the only important part is about keeping other core-organisers in the loop (potential solutions: weekly blurb for each theme written by the responsible core-organisers)
+ - If a core-organiser wants to participate in another theme than the one they’re responsible for, it’s completely fine.
+ - Weekly core-organisers meetings are phased out in favour of a new regular format where the core-organisers can hang out, check-in and discuss weekly blurbs if need be (≈ 20 min), and then have flexible sessions which can either be casual discussions or longer-term planning that would require brain-storming (like creating a new theme/project, e.g. “how to have another in-person EmacsConf?”).
+ - IRC has been instrumental to good communication for EmacsConf 2020 & 2021, and it’s only recently proved to be a bit of a burden with the line-backlogs. Splitting the channels according to themes might leverage that issue.
+ - Only the core-organisers in charge of a particular theme would be expected to keep track of the backlog; other core-organisers or volunteers are not expected to do that.
+ - We need to adapt our culture of note-taking an documentation to this new model to ensure that all core-organisers can contribute to the effort and benefit from it.
+
* November 20, 2021
- Check-in:
diff --git a/2021/organizers-notebook.md b/2021/organizers-notebook.md
new file mode 100644
index 00000000..1234cf00
--- /dev/null
+++ b/2021/organizers-notebook.md
@@ -0,0 +1,10 @@
+<!-- organizers-notebook.md is exported from organizers-notebook.org, please modify that instead. -->
+[[!toc levels=4]]
+
+
+# Notes for next time
+
+- sachac: It might be more inclusive to call it a "Call for
+ Participation" instead of a "Call for Proposals", since we're
+ inviting more than proposals.
+
diff --git a/2021/organizers-notebook.org b/2021/organizers-notebook.org
index ede3ed28..7cca07a0 100644
--- a/2021/organizers-notebook.org
+++ b/2021/organizers-notebook.org
@@ -1,3 +1,33 @@
+#+todo: TODO(t) INPROGRESS(i) | DONE(d) CANCELLED(c)
+#+OPTIONS: h:6 toc:nil
+#+PROPERTY: header-args :results silent :exports code :tangle yes
+
+#+begin_export md
+<!-- organizers-notebook.md is exported from organizers-notebook.org, please modify that instead. -->
+[[!toc levels=4]]
+#+end_export
+
+* COMMENT How to export this file :noexport:
+
+- [[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
+- [[elisp:(org-babel-execute-buffer)][Execute buffer]]
+
* Notes for next time
-- sachac: It might be more inclusive to call it a "Call for Participation" instead of a "Call for Proposals", since we're inviting more than proposals.
+- sachac: It might be more inclusive to call it a "Call for
+ Participation" instead of a "Call for Proposals", since we're
+ inviting more than proposals.
+
+** COMMENT Copyright & License
+
+ Copyright (C) 2020, 2021 Sacha Chua
+
+ The EmacsConf 2021 organizers' notebook is part of the EmacsConf
+ wiki, and is dual-licensed under the terms of the Creative Commons
+ Attribution-ShareAlike 4.0 International Public License; and the GNU
+ General Public License as published by the Free Software Foundation,
+ either version 3 of the License, or (at your option) any later
+ version.
+
+ A copy of these two licenses is available on the EmacsConf wiki, in
+ the [[https://emacsconf.org/COPYING.CC-BY-SA][COPYING.CC-BY-SA]] and [[https://emacsconf.org/COPYING.GPL][COPYING.GPL]] files.
diff --git a/2021/playbook.md b/2021/playbook.md
new file mode 100644
index 00000000..cbee525a
--- /dev/null
+++ b/2021/playbook.md
@@ -0,0 +1,1411 @@
+
+# Table of Contents
+
+- [Roles/values](#roles)
+- [After the conference](#org9010597)
+ - [Update captions](#org1ede55a)
+ - [Update](#org9a1dcfd)
+ - [Send thanks](#thanks):email:
+- [Thursday or Friday before the conference](#days-before)
+- [On the day of the conference](#day-of)
+ - [Set up](#setup)
+ - [Arrange screens](#screens)
+ - [Start streaming](#start-streaming):stream:
+ - [Talk process](#talk)
+ - [Check in a speaker](#check-in)
+ - [Present talk](#present)
+ - [Publish information](#publish)
+ - [Handle Q&A](#questions)
+ - [Break time](#break)
+ - [End of stream](#end)
+ - [In case of&#x2026;](#exceptions)
+ - [Last-minute prerecording submission](#last-minute-prerec)
+ - [Last-minute caption update](#last-minute-captions)
+ - [Speaker has not checked in](#missing)
+ - [Speaker does not have a prerec and has not checked in](#really-missing)
+ - [Speaker whose talk was reallocated shows up and has a prerec](#reallocated-prerec)
+ - [Speaker whose talk was reallocated shows up and wants to do it live](#reallocated-live)
+ - [Alternate stream volunteer wants to stream (nice to have, at risk)](#alternate)
+ - [Pad malfunction or mess-up](#pad-broken)
+ - [CRDT malfunctions](#crdt-broken)
+ - [Conduct guidelines issue](#conduct)
+ - [CHECK is unavailable](#check-gone)
+ - [HOST is unavailable](#host-gone)
+ - [Technical issues during a live presentation](#live-issues)
+ - [Big technical issues with streaming](#stream-issues)
+ - [live0 can't handle the load or is close to network transfer limit](#network)
+- [Before the conference](#before)
+ - [Send calls for proposals](#cfp-mails)
+ - [[ANN] EmacsConf 2021 Call for Proposals](#first-cfp):email:
+ - [Second (and final) call for proposals (closing Sep 30)](#second-cfp):email:
+ - [Accept talks](#accept):email:
+ - [E-mail text](#orgb8732b7)
+ - [Thank speakers for submissions](#acknowledge-submission):email:
+ - [Captions prepared](#orge92309b)
+ - [Captions pending](#org6bed7ae)
+ - [Help speakers with tech checks](#tech-checks)
+ - [Follow up with speakers we haven't heard from](#follow-up-silence):email:
+ - [Send check-in instructions](#check-in-instructions):email:
+ - [Unknown Q&A preference](#org4fa4a70)
+ - [Speakers will handle Q&A live](#org55b075e)
+ - [Speakers will handle questions after the event](#org544baed)
+ - [Announce schedule and watching instructions](#announce-schedule):email:
+ - [E-mail text](#org41b2906)
+ - [Follow up regarding prerecorded videos](#follow-up-prerecs):email:
+ - [Offer speakers the opportunity to go live if they really really want to](#go-live-maybe):email:
+ - [Email text](#orgb88fbb1)
+ - [Compress video](#orgbe5dce0)
+ - [Experiment with setup to allow MPV / BBB sound isolation](#sound)
+ - [Check for video encoding issues](#orgde63d42)
+
+<!-- This file was automatically generated from playbook.org. Instead of editing the .md, please edit the .org and republish. Thanks! -->
+
+
+<a id="roles"></a>
+
+# Roles/values
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+
+<colgroup>
+<col class="org-left" />
+
+<col class="org-left" />
+
+<col class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">B</td>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">bandali</td>
+</tr>
+
+
+<tr>
+<td class="org-left">CHECK</td>
+<td class="org-left">check-ins</td>
+<td class="org-left">sachac</td>
+</tr>
+
+
+<tr>
+<td class="org-left">HOST</td>
+<td class="org-left">hosting, streaming, intros, reading, moving questions/answers around</td>
+<td class="org-left">zaeph</td>
+</tr>
+</tbody>
+</table>
+
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+
+
+<colgroup>
+<col class="org-left" />
+
+<col class="org-left" />
+</colgroup>
+<tbody>
+<tr>
+<td class="org-left">${protected}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/media.emacsconf.org/2021/protected/">file://ssh:front:/var/www/media.emacsconf.org/2021/protected/</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${stream-status}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/live.emacsconf.org/index.html">file://ssh:front:/var/www/live.emacsconf.org/index.html</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${upcoming}</td>
+<td class="org-left">upcoming.org shared over CRDT</td>
+</tr>
+
+
+<tr>
+<td class="org-left">${conf}</td>
+<td class="org-left">conf.org shared over CRDT</td>
+</tr>
+
+
+<tr>
+<td class="org-left">${playbook}</td>
+<td class="org-left">playbook.org shared over CRDT</td>
+</tr>
+
+
+<tr>
+<td class="org-left">${dump}</td>
+<td class="org-left"><a href="file://ssh:live:/data/">file://ssh:live:/data/</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${media}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/media.emacsconf.org/2021/">file://ssh:front:/var/www/media.emacsconf.org/2021/</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${live-main}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/live.emacsconf.org/main.html">file://ssh:front:/var/www/live.emacsconf.org/main.html</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${live-480p}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/live.emacsconf.org/main-480p.html">file://ssh:front:/var/www/live.emacsconf.org/main-480p.html</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${live-index}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/live.emacsconf.org/index.html">file://ssh:front:/var/www/live.emacsconf.org/index.html</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${live-alt}</td>
+<td class="org-left"><a href="file://ssh:front:/var/www/live.emacsconf.org/alt.html">file://ssh:front:/var/www/live.emacsconf.org/alt.html</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${profile}</td>
+<td class="org-left"><a href="file://ssh:live:~/.profile">file://ssh:live:~/.profile</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">${emacsconf-el}</td>
+<td class="org-left"><a href="https://git.emacsconf.org/emacsconf-el/">https://git.emacsconf.org/emacsconf-el/</a></td>
+</tr>
+
+
+<tr>
+<td class="org-left">&#xa0;</td>
+<td class="org-left">&#xa0;</td>
+</tr>
+</tbody>
+</table>
+
+
+<a id="org9010597"></a>
+
+# After the conference
+
+
+<a id="org1ede55a"></a>
+
+## Update captions
+
+- Merge them into the video with `add-captions.sh`
+
+ #!/usr/bin/zsh
+ BASE="${1%.*}"
+ BASE="${BASE%--main}"
+ ffmpeg -y -i "$1" ${BASE}--main.vtt
+ if [ -f "${BASE}--normalized.webm" ]; then
+ ffmpeg -y -i "$1" -i "${BASE}--normalized.webm" -c:a copy -c:v copy "${BASE}--captioned.webm"
+ else
+ ffmpeg -y -i "$1" -i "${BASE}--compressed.webm" -c:a copy -c:v copy "${BASE}--captioned.webm"
+ fi
+ cp ${BASE}--main.vtt ${BASE}--chapters.vtt ~/vendor/emacsconf-wiki/2021/captions
+ scp "${BASE}--captioned.webm" "${BASE}--main.webm"
+ scp "${BASE}--main.webm" front:~/protected
+ scp "${BASE}--main.vtt" front:~/protected
+ scp "${BASE}--chapters.vtt" front:~/protected
+ ssh front 'cd protected; chmod ugo+r *'
+- Update Toobnix and Youtube captions with `conf-video-share`.
+- Update Toobnix and Youtube descriptions with chapters.
+- Update ${conf-year}/${captions}/${slug}.md in the wiki. To make this from scratch, use `M-x conf-prepare-transcript-directives` from the talk heading in the conference Org file.
+
+
+<a id="org9a1dcfd"></a>
+
+## Update
+
+
+<a id="thanks"></a>
+
+## Send thanks :email:
+
+Thank you so much for being part of EmacsConf ${conf-year}! Hundreds of people
+enjoyed it, and I'm sure even more will come across the videos in the
+days to follow.
+
+Your prerecorded video is available on the talk page at ${url} , and
+we've added the questions and comments that we've collected from
+IRC/BBB/Etherpad. The recording of your Q&A session is also on the
+talk page.
+
+We've also uploaded your talk video to ToobNix (a PeerTube instance)
+at ${toobnix-url} and YouTube at ${youtube-url} . If you
+want to reupload the video to your own channel, feel free to do
+so. You can add the subtitles by downloading them from the talk page
+and uploading them to your video. If you let me know where you've
+uploaded it, I can switch our playlist to include your version of the
+video instead. That way, it might be easier for you to respond to
+questions on videos. (Which some people have already been adding,
+yay!)
+
+If you would like to share more resources, you can add them to the
+talk page or e-mail them to us and we can add them for you.
+
+Thanks again for speaking at EmacsConf!
+
+
+<a id="days-before"></a>
+
+# Thursday or Friday before the conference
+
+- STREAM: Download prerecorded videos from ${protected}
+
+ rsync -avzue ssh front:/var/www/media.emacsconf.org/2021/protected/*--main.webm .
+
+
+<a id="day-of"></a>
+
+# On the day of the conference
+
+
+<a id="setup"></a>
+
+## Set up
+
+
+<a id="screens"></a>
+
+### Arrange screens
+
+- CHECK:
+ - Share ${upcoming}, ${playbook}, and ${conf} via CRDT: `conf-crdt-connect-and-share`
+ - Current schedule, filenames/commands for playing, Q&A preference, IRC nick, pronunciation, intro notes, prerec duration, emergency contact information
+ - `conf-upcoming-add-subtree`
+ - Have #emacsconf-org, #emacsconf, #emacsconf-accessible, and #emacsconf-questions open
+ - Use `/opall` to get op privileges in all the channels
+ - Start backup process for pad
+
+ while true; do
+ curl https://etherpad.wikimedia.org/p/emacsconf-2021/export/html > emacsconf-$(date +"%Y%m%d-%H%M%S").html
+ sleep 15m
+ done
+ - Computer for alternate streaming:
+ - Open browser for joining BBB
+ - Open MPV for playing <http://live0.emacsconf.org:8000/main.webm>
+- HOST:
+ - rsync the newest &#x2013;main.webm from front: rsync -avze ssh front:/var/www/media.emacsconf.org/2021/protected/\*&#x2013;main.webm .
+ - Check OBS scenes for sharing windows/tabs as a virtual camera:
+ - chat.emacsconf.org with #emacsconf
+ - Etherpad
+ - Schedule
+ - next talk page
+ - Clock with current time on screen: `watch TZ=America/Toronto date`
+ - Set up backchannel for easy viewing
+ - ${upcoming}
+ - \#emacsconf-org and #emacsconf channels
+ - (?) Join organizer room S
+
+
+<a id="start-streaming"></a>
+
+### Start streaming :stream:
+
+- HOST: Display getting-ready message and start streaming to main.webm
+- HOST: Confirm that the stream is live at <https://live.emacsconf.org/main.webm>
+- B: Update ${status} to say that the stream is live
+- CHECK: Start low-resolution stream, confirm at <https://live.emacsconf.org/main-480p.webm>
+ Call this on live0 with $CONF480PASS as the first parameter. The Icecast configuration is on `live0` at <file:///ssh:live|sudo:/etc/icecast2/icecast.xml>=.
+
+ PASS=$1
+ while true; do ffmpeg -loglevel 24 -f webm -reconnect_at_eof 1 -reconnect_streamed 1 -re -i http://localhost:8000/main.webm -vf scale=854:480 -f webm -c:a copy -b:v 500k -maxrate 1M -bufsize 1M -content_type video/webm -c:v libvpx icecast://ec2020main480pmu:$PASS@localhost:8000/main-480p.webm; done
+- CHECK: Start Youtube and Toobnix streams. Call this with $YOUTUBE1PASS, $YOUTUBE2PASS, or $TOOBNIX as the parameter
+
+ MOUNT=$1
+ while true; do ffmpeg -loglevel 24 -i http://localhost:8000/main.webm -cluster_size_limit 2M -cluster_time_limit 5100 -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -vcodec libx264 -acodec libmp3lame -f flv $MOUNT; done
+- CHECK: Verify YouTube and Toobnix streams and the CPU load on live0.
+- CHECK: Set the YouTube and Toobnix streams to public.
+- B: Verify with #emacsconf that the stream is active.
+- CHECK: Play main stream on alternate laptop. Start alternate stream and verify. Update ${status}.
+- CHECK: Announce on Twitter (@emacs, @emacsconf, @sachac) and in #emacs
+ EmacsConf 2021 starting now: <https://emacsconf.org/2021/>
+
+
+<a id="talk"></a>
+
+## Talk process
+
+
+<a id="check-in"></a>
+
+### Check in a speaker
+
+Exception: [CHECK is unavailable](#check-gone)
+
+- Speaker checks in on #emacsconf-org via IRC or via e-mail ~30m before
+- CHECK notes IRC nick for speaker.
+- CHECK confirms Q&A preference: live/IRC/Etherpad, preferred way of getting questions
+- [? unknown] Thanks for checking in! How would you like to handle Q&A
+ today - live video, the collaborative Etherpad at
+ <https://etherpad.wikimedia.org/p/emacsconf-2021> , or IRC (like
+ this)?
+- [? IRC] Thanks for checking in! Feel free to keep an eye on
+ \#emacsconf for questions and discussion, and we'll copy things from
+ the pad to there. If the volume gets overwhelming, let us know and
+ we can forward questions to #emacsconf-questions for you. If you'd
+ like to try Q&A over live video or the collaborative pad instead, or
+ if you need help, please let us know.
+- [? Etherpad] Thanks for checking in! The collaborative pad we'll be
+ using for questions is at
+ <https://etherpad.wikimedia.org/p/emacsconf-2021> . We'll collect
+ questions from #emacsconf and put them there. If you'd like to jump
+ to your part of the document, you might be able to keep an eye on
+ questions. Please let us know if you need help, or if you want to
+ switch to live Q&A.
+- [? live] Thanks for checking in! I'll send you some private messages
+ with instructions, so please check there. Let me know if you don't
+ get them.
+ - Private messages:
+ - (erc-message "PRIVMSG" (format "%s You can use this BBB room: %s . I'll join you there shortly to set up the room and do the last-minute tech check." nick room-url))
+ - (erc-message "PRIVMSG" (format "%s The collaborative pad we'll be using for questions is at %s . We'll collect questions from #emacsconf and put them there. If you'd like to jump to your part of the document, you might be able to keep an eye on questions. Alternatively, we can read questions to you." nick conf-collaborative-pad))
+ - (erc-message "PRIVMSG" (format "%s Leo Vivier will join when it's time, and he will give you the go-ahead when it's time to present. See you in the BBB room!" nick))
+ - CHECK directs speaker to available room with `/checkin <room> <nick>`
+ - Speaker joins talk room
+ - CHECK makes speaker presenter and moderator, does last-minute tech check
+ - Hello, thanks
+ - Speaker tries screen sharing and webcam (optional)
+ - check screen readability
+ - CHECK briefs speaker on process, including:
+ - live Q&A: reading questions themselves (can do in any order,
+ can skip; coach possible responses for awkward things) or asking HOST to read questions to them
+ - HOST can share the pad or IRC; speaker shares screen only if doing demo
+ - encouragement of webcam, although it's optional
+ - how HOST will join shortly before the prerec ends and then
+ give them the go-ahead
+ - closing any tabs watching the stream as their talk starts
+ (otherwise the audio is confusing)
+ - If the speaker will be giving a live presentation, CHECK
+ collects emergency contact information (in case of technical
+ issues) and shares it with HOST in the CRDT buffer
+ - Okay to do other things until the prerec ends
+ - CHECK updates ${upcoming} with link to the talk room and
+ preferences for Q&A-. CHECK will also /msg the relevant
+ information.
+
+
+<a id="present"></a>
+
+### Present talk
+
+- CHECK announces the next talk on IRC and marks the previous talk as done. (`conf-announce`)
+- PAD clears pad colours.
+- [? prerec]
+ - HOST switches to MPV scene in OBS and plays the video (with captions if available).
+ - Exception: [Last-minute prerecording submission](#last-minute-prerec)
+ - Exception: [Last-minute caption update](#last-minute-captions)
+ - [CHECK publishes information](#publish)
+ - [HOST gets a head start on handling Q&A](#questions)
+ - When prerec finishes, HOST switches the OBS scene to show BBB.
+- [? live]
+ - Exception: [Speaker does not have a prerec and has not checked in](#really-missing)
+ - HOST joins the BBB room and double-checks that recording is on.
+ - CHECK-alternate joins the BBB room and pauses main MPV.
+ - HOST switches to OBS scene for BBB.
+ - Speaker presents.
+ - Exception: [Technical issues during a live presentation](#live-issues)
+ - [? talk needs to be wrapped up]
+ - HOST nudges speaker verbally.
+
+
+<a id="publish"></a>
+
+### Publish information
+
+- CHECK updates the schedule in:
+ - ${conf}
+ - ${upcoming}
+ - wiki
+- CHECK publishes the video to media.emacsconf.org using `conf-publish-files`
+- CHECK commits the wiki page and the captions for the talk.
+- CHECK publishes the video on YouTube and ToobNix using `conf-video-share`.
+ - Update description:
+
+ This video is available under the terms of the
+ Creative Commons Attribution-ShareAlike 4.0 International (CC
+ BY-SA 4.0) license.
+
+ You can view it using free and open source software at
+ ${url}
+
+ ${description}
+ - Mark it as public.
+ - Add it to EmacsConf 2021 playlist.
+ - Update title and description.
+ - Mark it as public.
+ - Doublecheck subtitles
+ - Add it to the EmacsConf 2021 playlist.
+- [? live sections]
+ - CHECK does a rough-cut of the recording from ${dump} to get the last X minutes or by time range. There's about a 1-2 minute delay.
+ Ex: `(kill-new (conf-dump-get "alt" "10:24" "10:30" "qa_"))`
+ - When there's an opportunity to do so:
+ - CHECK finetunes the rough-cut recording (trim start and end) and posts it to:
+ - media.emacsconf.org/2021
+ - wiki page for talk
+
+
+<a id="questions"></a>
+
+### Handle Q&A
+
+Exceptions:
+
+- [Speaker has not checked in](#missing)
+
+- [? live]
+ - CHECK-alternate joins the BBB room and pauses MPV.
+ - HOST joins the BBB room
+ - HOST starts recording in BBB or confirms that it's already recording
+ - HOST switches to the BBB scene in OBS.
+ - HOST describes how to ask questions.
+ - [? No questions yet]
+ - HOST thanks speaker, says nice things about talk, and asks a couple of prepared questions
+ - [? Awkward question]
+ - HOST can try rephrasing the question.
+ - HOST adds note to IRC/Etherpad that speakers can answer in any order, skip questions, answer afterwards, etc.
+ - [? Q&A needs to be wrapped up]
+ - HOST writes in Etherpad/IRC or nudges speaker verbally.
+ - CHECK notes the time that the live Q&A finished and switches back to the main stream on CHECK-alternate.
+- [? IRC/pad]
+ - HOST switches to pad/chat OBS scene.
+ - HOST describes Q&A method and shows it on the screen.
+ - While there's buffer time before the next talk, HOST can read out
+ questions and answers, or transition to the next talk early
+ - HOST: It's time for the next talk, but if you want to keep
+ discussing the previous talk, please feel free to continue doing
+ so on IRC or the pad.
+- [? speaker will answer after the conference]
+ - HOST switches to pad/chat OBS scene.
+ - HOST says the speaker is not available right now, but we'll
+ forward the questions to the speaker and we'll post the speaker's
+ answers on the wiki page. Leave your contact information if you
+ want to be notified, or subscribe to the emacsconf-discuss mailing
+ list to get the announcement. Please feel free to continue
+ discussing the talk on IRC or the pad.
+- [Present next talk](#present)
+
+
+<a id="break"></a>
+
+## Break time
+
+- CHECK marks the last talk as done. `conf-end-current-talk`
+- CHECK stops and restarts the Toobnix restreaming process, and re-checks the stream
+- CHECK uses `conf-upcoming-add-subtree` to add the afternoon talks to upcoming.org
+- HOST doublechecks network transfer limit and server health
+
+
+<a id="end"></a>
+
+## End of stream
+
+- CHECK removes live Q&A links
+- CHECK stops ffmpeg process for Youtube
+- CHECK stops ffmpeg process for Toobnix
+- CHECK stops ffmpeg process for main-480p
+- STREAM stops streaming
+- B updates the status pages
+- bandali figures out the downstream
+
+
+<a id="exceptions"></a>
+
+## In case of&#x2026;
+
+
+<a id="last-minute-prerec"></a>
+
+### Last-minute prerecording submission
+
+- CHECK will copy it from the FTP upload server to ${protected} and name it appropriately.
+- CHECK will notify STREAM with the scp command and the mpv command so that STREAM can choose.
+
+
+<a id="last-minute-captions"></a>
+
+### Last-minute caption update
+
+- CHECK uploads the &#x2013;main.vtt file to ${protected}
+- CHECK notifies STREAM via ${upcoming}
+- STREAM uses the provided commands to download the VTT file and load it into MPV with `--sub-file`
+
+
+<a id="missing"></a>
+
+### Speaker has not checked in
+
+- Let the previous talk run a little longer for Q&A; end at least in time for the prerec
+- After the previous Q&A wraps up, play the prerec
+- [? still not around after prerec finishes]
+ - HOST: Speaker might be having some difficulty connecting, but we'll collect your questions on the pad and send them afterwards.
+ - Can play next prerec a few minutes early
+
+
+<a id="really-missing"></a>
+
+### Speaker does not have a prerec and has not checked in
+
+- Let the previous talk do live Q&A/demo if ready
+- Close to the time of the missing talk:
+ - See if any of the previous speakers want to be set up for an impromptu talk/extension in a BBB room, just in case
+ - HOST: The next speaker might be having some difficulty connecting. In the meantime, let's&#x2026;
+ - OR:
+ - highlight ongoing discussions
+ - invite another speaker for an impromptu extension; mplsCorwin will keep a list of possible speakers who are still active
+ - replay a short prerec
+ - let mplsCorwin or zaeph fill in
+
+
+<a id="reallocated-prerec"></a>
+
+### Speaker whose talk was reallocated shows up and has a prerec
+
+- CHECK copies it to ${protected}
+- Plan to play prerec at the end of the day, or in any gaps if a live talk falls through
+
+
+<a id="reallocated-live"></a>
+
+### Speaker whose talk was reallocated shows up and wants to do it live
+
+- See if there's enough time if buffers are shuffled back; if so, set up for a live presentation
+- Check for alternate stream volunteers
+- [? not enough time] Offer to set up a BBB room for recording or to
+ accept a prerecording afterwards, then include it on the site and in
+ post-conference communication
+
+
+<a id="alternate"></a>
+
+### Alternate stream volunteer wants to stream (nice to have, at risk)
+
+- CHECK gives ALTERNATE the BBB room URL for the talk they are interested in
+- ALTERNATE starts streaming to assigned end point
+- CHECK confirms stream
+- CHECK updates ${stream-status}
+- CHECK notifies STREAM and HOST
+ - After prerec plays:
+ - HOST: This talk has an extended demo/Q&A. You can go to ${alternate-url} to watch it, and we'll post a recording afterwards.
+ - HOST sends ${alternate-url} to IRC: Alternate stream for ${title}: ${alternate-url}
+- ALTERNATE notifies #emacsconf-org when the stream is done.
+- CHECK updates ${stream-status} to note that the alternate stream is finished.
+
+ FFMPEG process for sending the desktop and audio to the $CONFALT mountpoint on Linux with X11 and Alsa:
+
+ 1. Set the CONFALT environment variable to icecast://user:password@live0.emacsconf.org:8000/alt.webm
+ 2. Install pavucontrol if you don't have it already.
+ 3. Start the following command (<playbook/stream-desktop-and-audio.sh>:
+
+ while true; do ffmpeg -loglevel 0 -ar 48000 -f alsa -channels 2 -sample_rate 48000 -i default -re -video_size 1280x720 -framerate 25 -f x11grab -i :0.0 -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm -c:v libvpx -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -f webm $CONFALT; done
+ 4. Use pavucontrol to set the recording source for the ffmpeg
+ command to be the audio monitor, so you get system output as
+ well.
+ - OR:
+ - [? splitting audio] [Set up sinks for sound](#sound)
+ - [? same audio]
+ - Set up audio monitor as the input for FFMPEG
+ - MPV goes to MPV sink, browser goes to recording sink, FFMPEG takes in recording monitor
+
+
+<a id="pad-broken"></a>
+
+### Pad malfunction or mess-up
+
+- PAD resets the pad using <https://etherpad.wikimedia.org/p/emacsconf-2021/timeslider>
+- [? still not recovered]
+ - PAD reimports the pad from backup
+
+
+<a id="crdt-broken"></a>
+
+### CRDT malfunctions
+
+- HOST notifies CHECK and tries reconnecting
+- [? still doesn't work]
+ - Switch to backup Etherpad
+
+
+<a id="conduct"></a>
+
+### Conduct guidelines issue
+
+- HOST addresses it (on-camera if needed) with a reminder and/or a kick or a ban
+
+
+<a id="check-gone"></a>
+
+### CHECK is unavailable
+
+- HOST does check-ins
+- HOST refers to conf.org for Q&A preference etc.
+- STREAM checks conf.org for prerec filenames etc.
+- Dropped goals:
+ - Publishing recordings ASAP
+ - Updating schedule/wiki on the fly
+
+
+<a id="host-gone"></a>
+
+### HOST is unavailable
+
+- STREAM joins the BBB room and streams directly from there (or streams the prerecs).
+- STREAM will do the hosting.
+
+
+<a id="live-issues"></a>
+
+### Technical issues during a live presentation
+
+- HOST tries to contact the speaker
+- [? back on track]
+ - [? can be squeezed into remaining time]: Continue
+ - [? need extra time]: CHECK fiddles with buffer of following talks in conf.org and updates schedule
+ - [? need too much extra time (ex: 10min)]: HOST acknowledges
+ technical issues and says we may be able to follow up after the
+ conference
+- [? can't resume]: HOST acknowledges technical issues and says we may
+ be able to follow up after the conference
+
+
+<a id="stream-issues"></a>
+
+### Big technical issues with streaming
+
+- HOST notifies #emacsconf and #emacsconf-org and adds a note at the top of the ${pad}.
+- HOST updates the 2021.md wiki page
+- CHECK publishes prerecordings
+ - media.emacsconf.org
+ - wiki
+ - Toobnix
+ - Peertube
+- STREAM e-mails the mailing list
+
+
+<a id="network"></a>
+
+### live0 can't handle the load or is close to network transfer limit
+
+- OR:
+ - Redirect some viewers via asking in #emacsconf:
+ - watch via main-480p
+ - watch via Toobnix (if we can get that working)
+ - Consider dropping the restream to Toobnix (lower audience?) or to Youtube
+ - Add additional node to Linode account for shared transfer pool (TODO: doublecheck)
+
+
+<a id="before"></a>
+
+# Before the conference
+
+
+<a id="cfp-mails"></a>
+
+## Send calls for proposals
+
+
+<a id="first-cfp"></a>
+
+### [ANN] EmacsConf 2021 Call for Proposals :email:
+
+Sent on August 5, 2021 to emacsconf-discuss, emacs-devel, emacs-orgmode, emacs-tangents, Cc: emacsconf-org.
+Included inline Markdown and attached Org version of the CFP
+
+- E-mail text
+
+ #+title: EmacsConf 2021
+ #+subtitle: Online Conference
+ #+date: November 27 and 28, 2021
+ #+options: author:nil
+
+ [[https://emacsconf.org/2021/][EmacsConf 2021]] will be a virtual conference on *November 27 and 28,
+ 2021 (Sat-Sun)*. If you'd like to present at the conference, please
+ [[https://emacsconf.org/2021/cfp/][submit your proposal]] by *September 30, 2021*.
+
+ EmacsConf 2021 is about the joy of [[https://www.gnu.org/software/emacs/][Emacs]] and Emacs Lisp. Come share
+ your experiments and adventures with the Emacs text editor / operating
+ system / way of life! We welcome speakers of *all backgrounds* and
+ *all levels of experience*, including newcomers giving their first
+ talk. What have you found exciting about Emacs lately? What do you
+ wish someone had told you when you were starting out? What part of
+ your workflow might inspire someone to get into Emacs or go deeper?
+
+ A great way to get started with writing a proposal is to start by
+ exploring the programs from previous years: [[https://emacsconf.org/2020/schedule/][2020]], [[https://emacsconf.org/2019/schedule/][2019]], [[https://emacsconf.org/2015/schedule/][2015]], [[https://emacsconf.org/2013/#program][2013]].
+ You might also find some neat ideas on the [[https://emacsconf.org/2021/ideas/][ideas]] page. Feel free to
+ add yours there too! If you're still not sure, come by our IRC
+ channel =#emacsconf= on =irc.libera.chat= and say hi. You can join
+ the chat using [[ircs://irc.libera.chat:6697/emacsconf][your favourite IRC client]], or by visiting
+ [[https://chat.emacsconf.org][chat.emacsconf.org]] in your web browser.
+
+ All kinds of people use Emacs for all kinds of things. We'd love it
+ if EmacsConf 2021 could highlight interesting perspectives and reflect
+ the diversity of our community. If you know someone who might have a
+ good idea for a talk, please reach out to them and encourage them to
+ submit a proposal. Many people (especially from underrepresented
+ groups such as women, people of colour, non-developers, etc.) might
+ not consider themselves expert enough to share their thoughts. If you
+ let them know that you value their knowledge and maybe even suggest
+ something that you think others would like to hear more about, they
+ may realize that they have something worth sharing and that we would
+ love to hear from them.
+
+ * Important dates
+
+ For EmacsConf 2021, we are planning for 9am to 5pm Toronto/EST
+ (2pm-10pm UTC) on November 27 and 28. Depending on people's
+ availability, it might be two half-days.
+
+ | CFP opens | August 5, 2021 |
+ | CFP closes | September 30, 2021 |
+ | Speaker notifications | October 15, 2021 |
+ | Schedule published | October 31, 2021 |
+ | EmacsConf 2021! | November 27 and 28, 2021 |
+
+ If you are not available during the conference itself but you have a
+ neat idea that you'd like to share, please propose it anyway! You can
+ always handle questions after the conference, and we might even be
+ able to coordinate with other Emacs meetups for regional events (if
+ you're an Emacs meetup organizer and would like to make this happen
+ let's [[https://emacsconf.org/contact/][get in touch]]!).
+
+ Please note that although we will try our best to stick to the above
+ dates in the coming months, given the current state of the world, we
+ may have to move things around a bit in case of unforeseen events.
+ Thank you for your patience and understanding.
+
+ * Talk formats
+
+ We'd like EmacsConf 2021 to inspire lots of different people to
+ explore lots of different things in Emacs. We hope to put together a
+ stream of quick ideas followed by lots of conversation over IRC and/or
+ Q&A sessions, with occasional deep dives into topics that many people
+ might find interesting or useful.
+
+ As you think about your talk, consider what you can share in:
+
+ - *Up to 10 minutes total:* What is the core idea? What do you want
+ people to do or remember? You can show just enough to get people
+ interested and then point them to where they can learn more
+ afterwards. You can answer questions over IRC, the pad, or the
+ wiki, and there's no limit to how long that conversation can go.
+
+ - *Up to 20 minutes total:* How would you flesh out some of the points
+ from your 5-10 minute presentation? How can you show the pieces
+ working together?
+
+ - *Up to 40 minutes total:* What would benefit from a deep dive?
+ How do you keep it engaging?
+
+ When writing your proposal, please write an outline of what you plan
+ to talk about if you have 5-10 minutes. If you'd like to propose a
+ longer talk, outline what you might include if you had more time to
+ present (up to 40 minutes, including Q&A).
+
+ Here's an example for a potentially 40-minute talk:
+
+ - 5-10 minutes: quick demo of the abc package working together with
+ xyz package.
+ - 20 minutes: same as above, with some customization options to
+ accommodate a different workflow.
+ - 40 minutes: all of the above, including modifying the behaviour of
+ the package in order to add something new.
+
+ This flexibility would help us in devising the conference schedule so
+ that as many people as possible could get a chance to present their
+ ideas, while still allowing for featuring longer deep dive talks.
+
+ Other session formats such as tutorials, workshops, and hangouts are
+ welcome as well, in case you would find those other formats preferable
+ to a traditional talk format. If you're interested in these or other
+ session types, please let us know [[https://lists.gnu.org/mailman/listinfo/emacsconf-org][publicly]] or [[https://lists.gnu.org/mailman/listinfo/emacsconf-org-private][privately]]. We'll be
+ happy to work something out with you.
+
+ * Office hours
+
+ We're aware that it can be intimidating to submit a proposal to a
+ conference, so we thought we'd try to help! This year, we're opening
+ up the doors of our virtual offices for you to come talk to us about
+ your proposals with hopes of helping you with any hurdles you may be
+ facing with preparing your proposal.
+
+ We'd like to publish a schedule of availabilities of volunteers for
+ holding office hours. Currently these volunteers consist of some of
+ the EmacsConf organizers, but we'd love to have the help of other
+ members of the Emacs community as well. If you are a more experienced
+ Emacs user and would like to help with this, please [[https://emacsconf.org/contact/][get in touch]]!
+
+ Our first office hour this year is planned for Saturday, August 14,
+ from 3pm to 4pm UTC with zaeph (Leo Vivier) at the following
+ BigBlueButton room: https://bbb.emacsverse.org/b/ban-qye-fd1-5kw.
+
+ * Submitting your proposal
+
+ Once you're ready to submit your proposal, the [[https://emacsconf.org/2021/submit/][submit]] page has the
+ instructions on how to submit your talk.
+
+ We use an anonymized submission process to reduce bias and encourage
+ contribution. Identifying information will be removed from
+ submissions by a conference organizer who will not participate in
+ talk selection. The anonymized submissions will then be reviewed by
+ a selection committee.
+
+ If your talk is approved, we'd love it if you could help us make sure
+ the conference runs smoothly. After we email you with the time
+ allotted for your talk, we'll ask you to
+
+ - prepare a prerecording of your talk, or record it with our help if
+ that'd be easier for you; and
+ - schedule a short tech-check if you'd like to be able to answer
+ questions in a live session.
+
+ Don't forget to subscribe to our main mailing list, [[https://lists.gnu.org/mailman/listinfo/emacsconf-discuss][emacsconf-discuss]],
+ for discussion and announcements about the EmacsConf conference.
+
+ We look forward to your ideas and submissions!
+
+ * Getting involved
+
+ If you would like to help with the conference (planning the sessions,
+ reviewing proposals, helping with infrastructure, making sessions more
+ accessible, editing video transcripts, etc.), see our [[https://emacsconf.org/2021/planning/][planning]] page
+ and come say hi to us at =#emacsconf= on =irc.libera.chat=.
+
+ In addition to the [[https://lists.gnu.org/mailman/listinfo/emacsconf-discuss][emacsconf-discuss]] list, feel free to subscribe to
+ [[https://lists.gnu.org/mailman/listinfo/emacsconf-org][emacsconf-org]] as well, for discussions related to organizing the
+ conference by the EmacsConf organizers and volunteers.
+
+ We'd really appreciate your help in making EmacsConf 2021 the best one
+ so far!
+
+ * Commitment to freedom
+
+ We remain fully committed to freedom, and we will continue
+ using our infrastructure and streaming setup consisting entirely
+ of [[https://www.gnu.org/philosophy/free-sw.html][free software]], much like previous EmacsConf conferences.
+ An article describing our infrastructure and tools is underway,
+ and will be announced on the emacsconf-discuss list when published.
+
+
+ * COMMENT Copyright & License
+
+ Copyright (c) 2020 Amin Bandali, Sacha Chua, David Bremner
+ Copyright (c) 2021 Amin Bandali, Sacha Chua, Leo Vivier,
+ Sebastian Crane
+
+ The EmacsConf 2021 Call for Proposals is part of the EmacsConf wiki,
+ and is dual-licensed under the terms of the Creative Commons
+ Attribution-ShareAlike 4.0 International Public License; and the GNU
+ General Public License as published by the Free Software Foundation,
+ either version 3 of the License, or (at your option) any later
+ version.
+
+ A copy of these two licenses is available on the EmacsConf wiki, in
+ the [[https://emacsconf.org/COPYING.CC-BY-SA][COPYING.CC-BY-SA]] and [[https://emacsconf.org/COPYING.GPL][COPYING.GPL]] files.
+
+ * COMMENT How to export this file
+
+ As of the time of writing this document (Org mode version 9.3.7), the
+ Org links library (=ol.el=) does not yet recognize =ircs= link types,
+ and will throw an error if you try to export a file containing them,
+ such as this file.
+
+ To work around that, you can use something along the lines of the
+ Emacs Lisp code below, by either adding it to your init file, or by
+ putting the point in the code block and hitting =C-c C-v e= (that is,
+ hold Ctrl, then hit c followed by v, then release Ctrl, and hit e) to
+ evaluate the code, working around the issue only for the current
+ session.
+
+ #+begin_src emacs-lisp :results silent
+ (org-link-set-parameters
+ "ircs"
+ :export
+ (lambda (link description format)
+ "Export an ircs link.
+ See `org-link-parameters' for details about LINK, DESCRIPTION and
+ FORMAT."
+ (let ((desc (or description link)))
+ (pcase format
+ (`html (format "<a href=\"ircs:%s\">%s</a>" link desc))
+ (`md (format "[%s](ircs:%s)" desc link))
+ (_ nil)))))
+ #+end_src
+
+
+<a id="second-cfp"></a>
+
+### Second (and final) call for proposals (closing Sep 30) :email:
+
+Sent Sept 27, 2021 to the same lists as the CFP
+Included inline Markdown and attached Org version of the CFP
+
+- E-mail text
+
+ Dear fellow Emacsians,
+
+ This is the second and final Call for Proposals for EmacsConf 2021,
+ open until September 30. Please see below for details on how to send
+ in your proposal(s), or chat about them with us in the #emacsconf IRC
+ channel on Libera.Chat.
+
+ If you're considering submitting a proposal but think the remaining
+ time is not enough, please reach out to me off-list as soon as
+ possible and I'd be happy to try and work something out with you.
+
+ I'll close this portion of this email with a big thank you to all the
+ folks who have submitted their talk proposal(s) or will be doing so.
+ Myself and the other EmacsConf organizers look forward to reading over
+ them and getting back to you about them and about the next steps. :)
+
+ Best,
+ amin
+
+ P.S. please direct any replies to this post either to myself or to the
+ emacsconf-discuss list, so as to help avoid generating extra off-topic
+ chatter in the other lists cc'd in this message.
+
+ P.P.S. as a volunteer-run conference, we are always looking for new
+ fellow volunteers and/or organizers to help with various aspects of
+ organizing and running the conference, including reviewing proposal
+ submissions. If you're interested in getting involved, please come by
+ our IRC channel or one of our public mailing lists (info below), or
+ any of the current organizers directly and say hi. We look forward to
+ hearing from you!
+
+
+<a id="accept"></a>
+
+## Accept talks :email:
+
+
+<a id="orgb8732b7"></a>
+
+### E-mail text
+
+Dear ${name},
+
+We would love to have your talk "${title}" as part of EmacsConf
+${conf-year}, and we've allocated ${duration} minutes for
+it. ${time-note}
+
+Your talk is tentatively scheduled for ${schedule}. The times may
+move around a bit as we update the schedule, so we'll check in with
+you if things change a lot. We've scheduled a few minutes for live
+questions and answers via web conference. Will you be available
+around this time? If there are more questions, you can also continue
+over Etherpad/IRC.
+
+Please plan to prerecord your ${duration}-minute talk(s) by ${deadline}
+at the latest. If you can, please send it in as early as possible.
+Submitting your video early lets us ask volunteers to help caption the
+video, making your talk more accessible and searchable.
+
+Please see <https://emacsconf.org/${conf-year}/prepare/> for tips and
+instructions on preparing, recording, and sending in your talk. If
+you have any questions or concerns, please let us know.
+
+Thanks,
+
+Amin Bandali
+EmacsConf organization team
+
+P.S. Please keep emacsconf-submit@gnu.org in To or Cc when replying.
+
+
+<a id="acknowledge-submission"></a>
+
+## Thank speakers for submissions :email:
+
+
+<a id="orge92309b"></a>
+
+### Captions prepared
+
+Because you sent in your video early, we were able to caption it so
+that more people can find and enjoy your talk. I've attached the
+caption text file in case you want to review it, suggest any
+corrections, or use the text in a blog post or elsewhere. Thanks again
+for your contribution!
+
+
+<a id="org6bed7ae"></a>
+
+### Captions pending
+
+Just a quick note to let you know that I've downloaded your submission for "${title}".
+
+Now we have the following files starting with ${video-slug}:
+${details}
+
+A quick check shows that it's about ${video-duration} minutes long.
+
+We'll be working on captioning it over the next few weeks. We'll e-mail
+again a little closer to the conference with schedule updates and other
+useful information. If you want to upload a new version, you can upload
+it the same way you did the previous one.
+
+Please feel free to e-mail us at emacsconf-submit@gnu.org if you need
+help updating the talk wiki page at
+${url} or if you have other questions.
+
+Thank you so much for all the work you put into preparing a talk for
+EmacsConf ${conf-year}, and thank you for submitting the prerecorded video
+before the conference!
+
+
+<a id="tech-checks"></a>
+
+## Help speakers with tech checks
+
+- Explain process
+- Test audio, webcam, screensharing, collaborative pad
+ - Music demos and other things that use system audio will need to be prerecorded (or done through virtual loopback device, maybe? Technical risk.)
+ - Multi-monitor setups might not be handled well by BBB; share window instead of desktop
+- Check if comfortable checking into IRC: chat.emacsconf.org/?join=emacsconf,emacsconf-org
+- Get IRC nick, phone number for emergency contact, store in private wiki
+- Try to record name pronunciation
+- Encourage webcam for Q&A, although make it clear that it's totally optional
+- Possible picture-in-picture approach to maximize screen real estate
+
+
+<a id="follow-up-silence"></a>
+
+## Follow up with speakers we haven't heard from :email:
+
+I think we haven't heard from you since we accepted your EmacsConf 2021
+proposal for "${title}" in early October.
+EmacsConf is in less than two weeks, so I wanted to check in with you to
+see how you're doing.
+
+Could you please e-mail us to let us know if you're still working on
+your prerecorded video, if you're planning to present live, or if you
+can't make it this year? I know it's a strange time for everyone, so
+no worries if other priorities have come up and you don't have the
+time for a presentation.
+
+If you've been having technical issues recording your presentation on
+your computer, one of our volunteers could set up a BigBlueButton web
+conference with you to record the presentation. You can find a list of
+volunteers and their availability at
+<https://emacsconf.org/2021/prepare/#tech-check> . It takes a little time
+to get the recording out of BBB, so please plan to record your
+presentation before Tuesday, November 23.
+
+If you plan to present live, please go through the self-check at
+<https://test.bigbluebutton.org/> . Some speakers have encountered
+technical issues with BigBlueButton that they didn't have with Zoom or
+Google Meet, so this is something we definitely want to look into
+earlier rather than later. If that works for you, please e-mail us
+back so that I can keep your timeslot. The tentative schedule for your
+talk is on the talk page at ${url} .
+
+**Please e-mail us your plans before ${deadline}.** I'm
+planning to shift the schedule around to give more time to confirmed
+speakers for Q&A and possibly live demos. If I don't hear from you by
+then (maybe an over-enthusiastic spam filter has been swallowing up
+all our mail?), I'll probably reallocate the 10 minutes that had
+been set aside for your talk. We might be able to squeeze it back in
+afterwards or play a video from you at the end of the conference day,
+but it would be nice to get the schedule sorted out instead of
+scrambling to fill gaps on the day of the conference.
+
+Hope to hear from you by ${deadline}!
+
+Sacha Chua
+
+(Please use Reply to All to keep emacsconf-submit@gnu.org in the loop. Thanks!)
+
+
+<a id="check-in-instructions"></a>
+
+## Send check-in instructions :email:
+
+
+<a id="org4fa4a70"></a>
+
+### Unknown Q&A preference
+
+We're looking forward to having you join us at EmacsConf if you can! I
+don't seem to have your Q&A preference in my notes, but if you can
+join us at EmacsConf for questions and answers over video, IRC, or
+Etherpad, that would be great. If not, that's cool, we can collect the
+questions and forward them to you after the conference.
+
+If you want to join us, you can get a rough idea of when your talk is
+scheduled at ${url} . We'll probably keep
+updating the schedule even on the day of the conference. You might want
+to check it some time next week to get a rough sense of where it is, and
+then check it again on the day of your talk.
+
+Please check in at least 30 minutes before the scheduled start of your
+prerecorded talk so that we can deal with small scheduling changes or
+technical issues. You can find the check-in process at
+<https://emacsconf.org/2021/speakers/> .
+
+If something comes up, please let us know as soon as you can. Here's
+our emergency contact information:
+
+${emergency-contact-info}
+
+Hope to see you soon if you can join us!
+
+Sacha
+
+
+<a id="org55b075e"></a>
+
+### Speakers will handle Q&A live
+
+We're looking forward to having you join us for questions and answers at
+EmacsConf!
+
+We'll probably keep updating the schedule even on the day of the
+conference. You can get a rough idea of when your talk is scheduled at
+${url} . You might want to check it some time next week to get a rough
+sense of where it is, and then check it again on the day of your talk.
+
+Please check in at least 30 minutes before the scheduled start of your
+prerecorded talk so that we can deal with small scheduling changes or
+technical issues. You can find the check-in process at
+<https://emacsconf.org/2021/speakers/> .
+
+If something comes up, please let us know as soon as you can. Here's
+our emergency contact information:
+
+${emergency-contact-info}
+
+Looking forward to seeing you soon!
+
+
+<a id="org544baed"></a>
+
+### Speakers will handle questions after the event
+
+Thank you so much for contributing a talk for EmacsConf 2021! We're
+looking forward to collecting questions and forwarding them to you by
+e-mail after the conference. We'll also post the prerecording at the
+time that it gets streamed, so people will be able to access it at
+${url} once it has gone live.
+
+If it turns out that you can make it to the conference after all, feel
+free to drop us a line at #emacsconf-org and we'll let people know
+you're around. You can find the check-in process at
+<https://emacsconf.org/2021/speakers/> .
+
+Thank you so much for being part of EmacsConf 2021!
+
+
+<a id="announce-schedule"></a>
+
+## Announce schedule and watching instructions :email:
+
+Sent Nov 20, 2021
+
+
+<a id="org41b2906"></a>
+
+### E-mail text
+
+Dear Emacsian friends,
+
+This is it, the final stretch until EmacsConf 2021, coming up on
+November 27 and 28 less than a week from now! A few weeks ago,
+we excitedly shared the EmacsConf 201 program with you. We're now
+happy to share the conference schedule with you, i.e. the program
+plus each talk's (approximate) scheduled time slot:
+
+<https://emacsconf.org/2021/schedule>
+
+All of the times listed on the schedule are in EST (UTC-5). You can
+click on each talk's title to open its page for more information,
+including its scheduled time in your local time (displaying local time
+requires running a tiny bit of AGPLv3+-licensed free/libre JavaScript
+code, included on the talk pages). For prerecorded talks, this time
+is also when the talk's video will be made available on the same page.
+Please note the '~' tildes near the times, indicating that they are
+approximations and not meant to be taken as exact times.
+
+On November 27 and 28 you will be able to watch the livestreams via
+<https://live.emacsconf.org>, which also has details on how to watch the
+streams using media players that support streaming (like mpv and VLC).
+Also, for Asia-Pacific folks, there will be an alternate stream by
+LibreAustralia, at 11:00-17:30 UTC+11 on Sunday, November 28. Please
+see the <https://libreau.org/upcoming.html#emacsconf21> page on their
+site for more details and how to tune into the alternate stream.
+
+Last but not least, please see the <https://emacsconf.org/2021> page
+of the EmacsConf wiki for more details on watching and participating
+in the conference.
+
+We hope to see you all around on November 27-28 for EmacsConf 2021!
+
+Amin Bandali, Leo Vivier, and Sacha Chua,
+On behalf of the EmacsConf 2021 organizers team
+
+
+<a id="follow-up-prerecs"></a>
+
+## Follow up regarding prerecorded videos :email:
+
+EmacsConf is in a few days and I don't think we have your prerecorded
+video yet, so I'm getting miiiildly stressed about the schedule. And
+you're probably stressing out about it too, so let's go figure out how
+we can make this work.
+
+Option A: If you happen to have the prerecording or can get it done by
+tomorrow, we can probably squeeze it in. Please upload it to
+ftp-upload.emacsconf.org by following the instructions in
+<https://emacsconf.org/2021/prepare#ftp-upload> , or send us a link using
+your favourite file-sharing service (especially if FTP is giving you
+problems).
+
+Option B: If you want to present live, it might be an option. I'm a little
+worried about the potential for technical issues, since we've had
+problems with that in previous EmacsConfs. The tight schedule means
+there's not a lot of time to figure things out, and it can be hard to
+make something as focused as a prerecorded video when you're doing it
+live. We will definitely want to make sure that:
+
+- your self-serve tech check works: <https://test.bigbluebutton.org>
+ at your convenience;
+- we have your emergency contact information in case of frozen
+ Internet connection, etc. Please e-mail us the phone number we can
+ use to call you. We promise to use it only for EmacsConf 2021
+ emergency coordination; and
+- you check in as early as possible (at least 1 hour before, so we
+ know if the speaker before you needs to extend) and let us know
+ that you want to do it live <https://emacsconf.org/2021/speakers> .
+ We keep adapting the schedule as things come up, so please check
+ <https://emacsconf.org/2021/schedule/> on the day of the conference.
+
+If there are technical issues or your talk runs a little over time, we
+might have to stop streaming it on the main stream when it's time for
+the next talk. We may be able to continue streaming it on the
+alternate stream. If so, people can continue watching it there if they
+wish to.
+
+Option C: If you can't make it, that's okay. Life gets crazy
+sometimes. Please let us know and we can update the wiki. If you
+happen to be able to make a prerecorded video afterwards, we can add
+that to the wiki, playlists, and announcements. We hope you can join
+us next year.
+
+Since EmacsConf is **this weekend** (aaaaaaah), please let us know by
+tomorrow noon EST (Friday; 9AM PST, 5PM GMT, 6PM CET) so that we can
+keep the time allocated for you in the schedule. If we don't hear from
+you, we'll probably reallocate the ${duration} minutes reserved for you so
+that other talks can have longer Q&A. If you can still make it, check
+in early and let us know so that we can try to work out an alternate
+stream for you. Hope to hear from you soon!
+
+Sacha
+
+
+<a id="go-live-maybe"></a>
+
+## Offer speakers the opportunity to go live if they really really want to :email:
+
+Sent November 25
+
+
+<a id="orgb88fbb1"></a>
+
+### Email text
+
+Thank you so much for sending in your prerecording. We were able to
+caption most of the talks, yay! That will help more people appreciate
+the talks, and it'll make it easier for people to look up technical
+terms too. The talks will be streamed with open captions, and the talk
+pages will have the videos with closed captions when they're streamed.
+
+We're still adapting the schedule as stuff comes up, so please check
+the schedule again on the day of the conference and check in as early
+as you can. (Check-in instructions: <https://emacsconf.org/2021/speakers>)
+
+&#x2014; Presenting live? &#x2014;
+
+If you really, really, really want to present live, we can keep the
+prerecorded talk as a backup plan. I'm a little worried about the
+potential for technical issues, since we've had problems with that in
+previous EmacsConfs. The tight schedule means there's not a lot of
+time to figure things out, and it can be hard to make something as
+focused as a prerecorded video when you're doing it live. If you want
+to present live, we will definitely want to make sure that:
+
+- your self-serve tech check works: <https://test.bigbluebutton.org>
+ at your convenience;
+- we have your emergency contact information in case of frozen
+ Internet connection, etc. Please e-mail us the phone number we can
+ use to call you. We promise to use it only for EmacsConf 2021
+ emergency coordination; and
+- you check in as early as possible (at least 30 minutes before) and
+ let us know that you want to do it live
+ <https://emacsconf.org/2021/speakers>
+
+Going with the prerecorded video is probably the least-stress option
+for everyone, but we wanted to offer you the option to go live just in case.
+
+Looking forward to seeing you soon!
+
+
+<a id="orgbe5dce0"></a>
+
+## Compress video
+
+Usage: `compress-video.sh original-file output-file`:
+
+ Q=32
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -an -tile-columns 0 -tile-rows 0 -frame-parallel 0 -cpu-used 8 -auto-alt-ref 1 -lag-in-frames 25 -g 240 -pass 1 -f webm -threads 8 /dev/null &&
+ ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a copy -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -threads 8 "$2"
+
+We tried using q56 before, but it was a little too aggressive. Q=32 is the default and is probably a reasonable space vs. quality compromise.
+
+
+<a id="sound"></a>
+
+## Experiment with setup to allow MPV / BBB sound isolation
+
+Set MIC and OUTPUT appropriately.
+
+ MIC=alsa_input.usb-046d_0819_A68D6BE0-02.mono-fallback
+ OUTPUT=alsa_output.pci-0000_00_1b.0.analog-stereo
+ if [ "$1" == "-u" ]; then
+ pactl unload-module module-loopback
+ pactl unload-module module-null-sink
+ else
+ pacmd load-module module-null-sink sink_name=recording sink_properties=device.description=recording channels=2
+ pacmd load-module module-null-sink sink_name=mpv sink_properties=device.description=mpv
+ pacmd load-module module-loopback source=$MIC sink=recording
+ pacmd load-module module-loopback source=mpv.monitor sink=recording
+ pacmd load-module module-loopback source=recording.monitor sink=$OUTPUT
+ fi
+
+You can probably then use `pavucontrol` (choose All Streams instead of
+Applications on the Playback tab) or something like the following to
+redirect the mpv output to the mpv sink.
+
+ pacmd list-sink-inputs # notice the ID for the process you want to redirect
+ pacmd move-sink-input 1 mpv
+
+
+<a id="orgde63d42"></a>
+
+## Check for video encoding issues
+
+Sometimes the compression may get cut off. You can use
+`compile-media-verify-video-frames` from
+<https://github.com/sachac/compile-media> to check that videos have
+enough frames for their expected duration
+
diff --git a/2021/playbook.org b/2021/playbook.org
new file mode 100644
index 00000000..fe9968d1
--- /dev/null
+++ b/2021/playbook.org
@@ -0,0 +1,1194 @@
+#+PROPERTY: header-args:emacs-lisp :tangle playbook/emacsconf-playbook.el :eval no
+#+OPTIONS: toc:4
+#+begin_export md
+<!-- This file was automatically generated from playbook.org. Instead of editing the .md, please edit the .org and republish. Thanks! -->
+#+end_export
+
+* Commands :noexport:
+
+- [[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
+
+* Roles/values
+:PROPERTIES:
+:CUSTOM_ID: roles
+:END:
+
+| B | | bandali |
+| CHECK | check-ins | sachac |
+| HOST | hosting, streaming, intros, reading, moving questions/answers around | zaeph |
+
+| ${protected} | [[/ssh:front:/var/www/media.emacsconf.org/2021/protected/]] |
+| ${stream-status} | [[/ssh:front:/var/www/live.emacsconf.org/index.html]] |
+| ${upcoming} | upcoming.org shared over CRDT |
+| ${conf} | conf.org shared over CRDT |
+| ${playbook} | playbook.org shared over CRDT |
+| ${dump} | [[/ssh:live:/data/]] |
+| ${media} | [[/ssh:front:/var/www/media.emacsconf.org/2021/]] |
+| ${live-main} | [[/ssh:front:/var/www/live.emacsconf.org/main.html]] |
+| ${live-480p} | [[/ssh:front:/var/www/live.emacsconf.org/main-480p.html]] |
+| ${live-index} | [[/ssh:front:/var/www/live.emacsconf.org/index.html]] |
+| ${live-alt} | [[/ssh:front:/var/www/live.emacsconf.org/alt.html]] |
+| ${profile} | [[/ssh:live:~/.profile]] |
+| ${emacsconf-el} | https://git.emacsconf.org/emacsconf-el/ |
+| | |
+* After the conference
+** Update captions
+
+- Merge them into the video with =add-captions.sh=
+ #+begin_src sh :eval no
+ #!/usr/bin/zsh
+ BASE="${1%.*}"
+ BASE="${BASE%--main}"
+ ffmpeg -y -i "$1" ${BASE}--main.vtt
+ if [ -f "${BASE}--normalized.webm" ]; then
+ ffmpeg -y -i "$1" -i "${BASE}--normalized.webm" -c:a copy -c:v copy "${BASE}--captioned.webm"
+ else
+ ffmpeg -y -i "$1" -i "${BASE}--compressed.webm" -c:a copy -c:v copy "${BASE}--captioned.webm"
+ fi
+ cp ${BASE}--main.vtt ${BASE}--chapters.vtt ~/vendor/emacsconf-wiki/2021/captions
+ scp "${BASE}--captioned.webm" "${BASE}--main.webm"
+ scp "${BASE}--main.webm" front:~/protected
+ scp "${BASE}--main.vtt" front:~/protected
+ scp "${BASE}--chapters.vtt" front:~/protected
+ ssh front 'cd protected; chmod ugo+r *'
+ #+end_src
+- Update Toobnix and Youtube captions with =conf-video-share=.
+- Update Toobnix and Youtube descriptions with chapters.
+- Update ${conf-year}/${captions}/${slug}.md in the wiki. To make this from scratch, use =M-x conf-prepare-transcript-directives= from the talk heading in the conference Org file.
+** Update
+** Send thanks :email:
+:PROPERTIES:
+:CUSTOM_ID: thanks
+:END:
+
+Thank you so much for being part of EmacsConf ${conf-year}! Hundreds of people
+enjoyed it, and I'm sure even more will come across the videos in the
+days to follow.
+
+Your prerecorded video is available on the talk page at ${url} , and
+we've added the questions and comments that we've collected from
+IRC/BBB/Etherpad. The recording of your Q&A session is also on the
+talk page.
+
+We've also uploaded your talk video to ToobNix (a PeerTube instance)
+at ${toobnix-url} and YouTube at ${youtube-url} . If you
+want to reupload the video to your own channel, feel free to do
+so. You can add the subtitles by downloading them from the talk page
+and uploading them to your video. If you let me know where you've
+uploaded it, I can switch our playlist to include your version of the
+video instead. That way, it might be easier for you to respond to
+questions on videos. (Which some people have already been adding,
+yay!)
+
+If you would like to share more resources, you can add them to the
+talk page or e-mail them to us and we can add them for you.
+
+Thanks again for speaking at EmacsConf!
+
+* Thursday or Friday before the conference
+:PROPERTIES:
+:CUSTOM_ID: days-before
+:END:
+
+- STREAM: Download prerecorded videos from ${protected}
+ #+begin_src sh :eval no
+ rsync -avzue ssh front:/var/www/media.emacsconf.org/2021/protected/*--main.webm .
+ #+end_src
+* On the day of the conference
+:PROPERTIES:
+:CUSTOM_ID: day-of
+:END:
+** Set up
+:PROPERTIES:
+:CUSTOM_ID: setup
+:END:
+*** Arrange screens
+:PROPERTIES:
+:CUSTOM_ID: screens
+:END:
+
+- CHECK:
+ - Share ${upcoming}, ${playbook}, and ${conf} via CRDT: =conf-crdt-connect-and-share=
+ - Current schedule, filenames/commands for playing, Q&A preference, IRC nick, pronunciation, intro notes, prerec duration, emergency contact information
+ - =conf-upcoming-add-subtree=
+ - Have #emacsconf-org, #emacsconf, #emacsconf-accessible, and #emacsconf-questions open
+ - Use =/opall= to get op privileges in all the channels
+ - Start backup process for pad
+ #+begin_src sh :eval no :tangle playbook/backup-pad.sh
+ while true; do
+ curl https://etherpad.wikimedia.org/p/emacsconf-2021/export/html > emacsconf-$(date +"%Y%m%d-%H%M%S").html
+ sleep 15m
+ done
+ #+end_src
+ - Computer for alternate streaming:
+ - Open browser for joining BBB
+ - Open MPV for playing http://live0.emacsconf.org:8000/main.webm
+- HOST:
+ - rsync the newest --main.webm from front: rsync -avze ssh front:/var/www/media.emacsconf.org/2021/protected/*--main.webm .
+ - Check OBS scenes for sharing windows/tabs as a virtual camera:
+ - chat.emacsconf.org with #emacsconf
+ - Etherpad
+ - Schedule
+ - next talk page
+ - Clock with current time on screen: =watch TZ=America/Toronto date=
+ - Set up backchannel for easy viewing
+ - ${upcoming}
+ - #emacsconf-org and #emacsconf channels
+ - (?) Join organizer room S
+
+*** Start streaming :stream:
+:PROPERTIES:
+:CUSTOM_ID: start-streaming
+:END:
+
+- HOST: Display getting-ready message and start streaming to main.webm
+- HOST: Confirm that the stream is live at https://live.emacsconf.org/main.webm
+- B: Update ${status} to say that the stream is live
+- CHECK: Start low-resolution stream, confirm at https://live.emacsconf.org/main-480p.webm
+ Call this on live0 with $CONF480PASS as the first parameter. The Icecast configuration is on =live0= at [[file:/ssh:live|sudo:/etc/icecast2/icecast.xml]]=.
+ #+begin_src sh :eval no :tangle "playbook/restream-lowres.sh"
+ PASS=$1
+ while true; do ffmpeg -loglevel 24 -f webm -reconnect_at_eof 1 -reconnect_streamed 1 -re -i http://localhost:8000/main.webm -vf scale=854:480 -f webm -c:a copy -b:v 500k -maxrate 1M -bufsize 1M -content_type video/webm -c:v libvpx icecast://ec2020main480pmu:$PASS@localhost:8000/main-480p.webm; done
+ #+end_src
+- CHECK: Start Youtube and Toobnix streams. Call this with $YOUTUBE1PASS, $YOUTUBE2PASS, or $TOOBNIX as the parameter
+ #+begin_src sh :eval no :tangle "playbook/restream-flv.sh"
+ MOUNT=$1
+ while true; do ffmpeg -loglevel 24 -i http://localhost:8000/main.webm -cluster_size_limit 2M -cluster_time_limit 5100 -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -vcodec libx264 -acodec libmp3lame -f flv $MOUNT; done
+ #+end_src
+- CHECK: Verify YouTube and Toobnix streams and the CPU load on live0.
+- CHECK: Set the YouTube and Toobnix streams to public.
+- B: Verify with #emacsconf that the stream is active.
+- CHECK: Play main stream on alternate laptop. Start alternate stream and verify. Update ${status}.
+- CHECK: Announce on Twitter (@emacs, @emacsconf, @sachac) and in #emacs
+ EmacsConf 2021 starting now: https://emacsconf.org/2021/
+
+** Talk process
+:PROPERTIES:
+:CUSTOM_ID: talk
+:END:
+*** Check in a speaker
+:PROPERTIES:
+:CUSTOM_ID: check-in
+:END:
+
+Exception: [[*CHECK is unavailable][CHECK is unavailable]]
+
+- Speaker checks in on #emacsconf-org via IRC or via e-mail ~30m before
+- CHECK notes IRC nick for speaker.
+- CHECK confirms Q&A preference: live/IRC/Etherpad, preferred way of getting questions
+- [? unknown] Thanks for checking in! How would you like to handle Q&A
+ today - live video, the collaborative Etherpad at
+ https://etherpad.wikimedia.org/p/emacsconf-2021 , or IRC (like
+ this)?
+- [? IRC] Thanks for checking in! Feel free to keep an eye on
+ #emacsconf for questions and discussion, and we'll copy things from
+ the pad to there. If the volume gets overwhelming, let us know and
+ we can forward questions to #emacsconf-questions for you. If you'd
+ like to try Q&A over live video or the collaborative pad instead, or
+ if you need help, please let us know.
+- [? Etherpad] Thanks for checking in! The collaborative pad we'll be
+ using for questions is at
+ https://etherpad.wikimedia.org/p/emacsconf-2021 . We'll collect
+ questions from #emacsconf and put them there. If you'd like to jump
+ to your part of the document, you might be able to keep an eye on
+ questions. Please let us know if you need help, or if you want to
+ switch to live Q&A.
+- [? live] Thanks for checking in! I'll send you some private messages
+ with instructions, so please check there. Let me know if you don't
+ get them.
+ - Private messages:
+ - (erc-message "PRIVMSG" (format "%s You can use this BBB room: %s . I'll join you there shortly to set up the room and do the last-minute tech check." nick room-url))
+ - (erc-message "PRIVMSG" (format "%s The collaborative pad we'll be using for questions is at %s . We'll collect questions from #emacsconf and put them there. If you'd like to jump to your part of the document, you might be able to keep an eye on questions. Alternatively, we can read questions to you." nick conf-collaborative-pad))
+ - (erc-message "PRIVMSG" (format "%s Leo Vivier will join when it's time, and he will give you the go-ahead when it's time to present. See you in the BBB room!" nick))
+ - CHECK directs speaker to available room with =/checkin <room> <nick>=
+ - Speaker joins talk room
+ - CHECK makes speaker presenter and moderator, does last-minute tech check
+ - Hello, thanks
+ - Speaker tries screen sharing and webcam (optional)
+ - check screen readability
+ - CHECK briefs speaker on process, including:
+ - live Q&A: reading questions themselves (can do in any order,
+ can skip; coach possible responses for awkward things) or asking HOST to read questions to them
+ - HOST can share the pad or IRC; speaker shares screen only if doing demo
+ - encouragement of webcam, although it's optional
+ - how HOST will join shortly before the prerec ends and then
+ give them the go-ahead
+ - closing any tabs watching the stream as their talk starts
+ (otherwise the audio is confusing)
+ - If the speaker will be giving a live presentation, CHECK
+ collects emergency contact information (in case of technical
+ issues) and shares it with HOST in the CRDT buffer
+ - Okay to do other things until the prerec ends
+ - CHECK updates ${upcoming} with link to the talk room and
+ preferences for Q&A-. CHECK will also /msg the relevant
+ information.
+
+**** bandali's check-in steps
+
+- please leave webcam quality on 'medium'
+- please read each audience question out loud before responding
+- please mute stream on your machine if you're watching
+- would you like to stay around for a longer q&a?
+- would you like to share your webcam or screen? (quickly mention how)
+
+*** Present talk
+:PROPERTIES:
+:CUSTOM_ID: present
+:END:
+
+- CHECK announces the next talk on IRC and marks the previous talk as done. (=conf-announce=)
+- PAD clears pad colours.
+- [? prerec]
+ - HOST switches to MPV scene in OBS and plays the video (with captions if available).
+ - Exception: [[*Last-minute prerecording submission][Last-minute prerecording submission]]
+ - Exception: [[*Last-minute caption update][Last-minute caption update]]
+ - [[*Publish information][CHECK publishes information]]
+ - [[*Handle Q&A][HOST gets a head start on handling Q&A]]
+ - When prerec finishes, HOST switches the OBS scene to show BBB.
+- [? live]
+ - Exception: [[*Speaker does not have a prerec and has not checked in][Speaker does not have a prerec and has not checked in]]
+ - HOST joins the BBB room and double-checks that recording is on.
+ - CHECK-alternate joins the BBB room and pauses main MPV.
+ - HOST switches to OBS scene for BBB.
+ - Speaker presents.
+ - Exception: [[*Technical issues during a live presentation][Technical issues during a live presentation]]
+ - [? talk needs to be wrapped up]
+ - HOST nudges speaker verbally.
+
+*** Publish information
+:PROPERTIES:
+:CUSTOM_ID: publish
+:END:
+
+ - CHECK updates the schedule in:
+ - ${conf}
+ - ${upcoming}
+ - wiki
+ - CHECK publishes the video to media.emacsconf.org using =conf-publish-files=
+ - CHECK commits the wiki page and the captions for the talk.
+ - CHECK publishes the video on YouTube and ToobNix using =conf-video-share=.
+ - Update description:
+ #+begin_example
+This video is available under the terms of the
+Creative Commons Attribution-ShareAlike 4.0 International (CC
+BY-SA 4.0) license.
+
+You can view it using free and open source software at
+${url}
+
+${description}
+ #+end_example
+ - Mark it as public.
+ - Add it to EmacsConf 2021 playlist.
+ - Update title and description.
+ - Mark it as public.
+ - Doublecheck subtitles
+ - Add it to the EmacsConf 2021 playlist.
+ - [? live sections]
+ - CHECK does a rough-cut of the recording from ${dump} to get the last X minutes or by time range. There's about a 1-2 minute delay.
+ Ex: =(kill-new (conf-dump-get "alt" "10:24" "10:30" "qa_"))=
+ - When there's an opportunity to do so:
+ - CHECK finetunes the rough-cut recording (trim start and end) and posts it to:
+ - media.emacsconf.org/2021
+ - wiki page for talk
+
+*** Handle Q&A
+:PROPERTIES:
+:CUSTOM_ID: questions
+:END:
+
+Exceptions:
+- [[*Speaker has not checked in][Speaker has not checked in]]
+
+- [? live]
+ - CHECK-alternate joins the BBB room and pauses MPV.
+ - HOST joins the BBB room
+ - HOST starts recording in BBB or confirms that it's already recording
+ - HOST switches to the BBB scene in OBS.
+ - HOST describes how to ask questions.
+ - [? No questions yet]
+ - HOST thanks speaker, says nice things about talk, and asks a couple of prepared questions
+ - [? Awkward question]
+ - HOST can try rephrasing the question.
+ - HOST adds note to IRC/Etherpad that speakers can answer in any order, skip questions, answer afterwards, etc.
+ - [? Q&A needs to be wrapped up]
+ - HOST writes in Etherpad/IRC or nudges speaker verbally.
+ - CHECK notes the time that the live Q&A finished and switches back to the main stream on CHECK-alternate.
+- [? IRC/pad]
+ - HOST switches to pad/chat OBS scene.
+ - HOST describes Q&A method and shows it on the screen.
+ - While there's buffer time before the next talk, HOST can read out
+ questions and answers, or transition to the next talk early
+ - HOST: It's time for the next talk, but if you want to keep
+ discussing the previous talk, please feel free to continue doing
+ so on IRC or the pad.
+- [? speaker will answer after the conference]
+ - HOST switches to pad/chat OBS scene.
+ - HOST says the speaker is not available right now, but we'll
+ forward the questions to the speaker and we'll post the speaker's
+ answers on the wiki page. Leave your contact information if you
+ want to be notified, or subscribe to the emacsconf-discuss mailing
+ list to get the announcement. Please feel free to continue
+ discussing the talk on IRC or the pad.
+- [[*Present talk][Present next talk]]
+
+** Break time
+:PROPERTIES:
+:CUSTOM_ID: break
+:END:
+
+- CHECK marks the last talk as done. =conf-end-current-talk=
+- CHECK stops and restarts the Toobnix restreaming process, and re-checks the stream
+- CHECK uses =conf-upcoming-add-subtree= to add the afternoon talks to upcoming.org
+- HOST doublechecks network transfer limit and server health
+
+** End of stream
+:PROPERTIES:
+:CUSTOM_ID: end
+:END:
+
+- CHECK removes live Q&A links
+- CHECK stops ffmpeg process for Youtube
+- CHECK stops ffmpeg process for Toobnix
+- CHECK stops ffmpeg process for main-480p
+- STREAM stops streaming
+- B updates the status pages
+- bandali figures out the downstream
+
+** In case of...
+:PROPERTIES:
+:CUSTOM_ID: exceptions
+:END:
+*** Last-minute prerecording submission
+:PROPERTIES:
+:CUSTOM_ID: last-minute-prerec
+:END:
+
+- CHECK will copy it from the FTP upload server to ${protected} and name it appropriately.
+- CHECK will notify STREAM with the scp command and the mpv command so that STREAM can choose.
+
+*** Last-minute caption update
+:PROPERTIES:
+:CUSTOM_ID: last-minute-captions
+:END:
+
+- CHECK uploads the --main.vtt file to ${protected}
+- CHECK notifies STREAM via ${upcoming}
+- STREAM uses the provided commands to download the VTT file and load it into MPV with =--sub-file=
+
+*** Speaker has not checked in
+:PROPERTIES:
+:CUSTOM_ID: missing
+:END:
+- Let the previous talk run a little longer for Q&A; end at least in time for the prerec
+- After the previous Q&A wraps up, play the prerec
+- [? still not around after prerec finishes]
+ - HOST: Speaker might be having some difficulty connecting, but we'll collect your questions on the pad and send them afterwards.
+ - Can play next prerec a few minutes early
+*** Speaker does not have a prerec and has not checked in
+:PROPERTIES:
+:CUSTOM_ID: really-missing
+:END:
+- Let the previous talk do live Q&A/demo if ready
+- Close to the time of the missing talk:
+ - See if any of the previous speakers want to be set up for an impromptu talk/extension in a BBB room, just in case
+ - HOST: The next speaker might be having some difficulty connecting. In the meantime, let's...
+ - OR:
+ - highlight ongoing discussions
+ - invite another speaker for an impromptu extension; mplsCorwin will keep a list of possible speakers who are still active
+ - replay a short prerec
+ - let mplsCorwin or zaeph fill in
+*** Speaker whose talk was reallocated shows up and has a prerec
+:PROPERTIES:
+:CUSTOM_ID: reallocated-prerec
+:END:
+- CHECK copies it to ${protected}
+- Plan to play prerec at the end of the day, or in any gaps if a live talk falls through
+*** Speaker whose talk was reallocated shows up and wants to do it live
+:PROPERTIES:
+:CUSTOM_ID: reallocated-live
+:END:
+- See if there's enough time if buffers are shuffled back; if so, set up for a live presentation
+- Check for alternate stream volunteers
+- [? not enough time] Offer to set up a BBB room for recording or to
+ accept a prerecording afterwards, then include it on the site and in
+ post-conference communication
+*** Alternate stream volunteer wants to stream (nice to have, at risk)
+:PROPERTIES:
+:CUSTOM_ID: alternate
+:END:
+- CHECK gives ALTERNATE the BBB room URL for the talk they are interested in
+- ALTERNATE starts streaming to assigned end point
+- CHECK confirms stream
+- CHECK updates ${stream-status}
+- CHECK notifies STREAM and HOST
+ - After prerec plays:
+ - HOST: This talk has an extended demo/Q&A. You can go to ${alternate-url} to watch it, and we'll post a recording afterwards.
+ - HOST sends ${alternate-url} to IRC: Alternate stream for ${title}: ${alternate-url}
+- ALTERNATE notifies #emacsconf-org when the stream is done.
+- CHECK updates ${stream-status} to note that the alternate stream is finished.
+
+ FFMPEG process for sending the desktop and audio to the $CONFALT mountpoint on Linux with X11 and Alsa:
+
+ 1. Set the CONFALT environment variable to icecast://user:password@live0.emacsconf.org:8000/alt.webm
+ 2. Install pavucontrol if you don't have it already.
+ 3. Start the following command ([[file:playbook/stream-desktop-and-audio.sh]]:
+ #+begin_src sh :eval no :tangle playbook/stream-desktop-and-audio.sh
+ while true; do ffmpeg -loglevel 0 -ar 48000 -f alsa -channels 2 -sample_rate 48000 -i default -re -video_size 1280x720 -framerate 25 -f x11grab -i :0.0 -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm -c:v libvpx -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -f webm $CONFALT; done
+ #+end_src
+ 4. Use pavucontrol to set the recording source for the ffmpeg
+ command to be the audio monitor, so you get system output as
+ well.
+ - OR:
+ - [? splitting audio] [[#sound][Set up sinks for sound]]
+ - [? same audio]
+ - Set up audio monitor as the input for FFMPEG
+ - MPV goes to MPV sink, browser goes to recording sink, FFMPEG takes in recording monitor
+
+*** Pad malfunction or mess-up
+:PROPERTIES:
+:CUSTOM_ID: pad-broken
+:END:
+
+- PAD resets the pad using https://etherpad.wikimedia.org/p/emacsconf-2021/timeslider
+- [? still not recovered]
+ - PAD reimports the pad from backup
+
+*** CRDT malfunctions
+:PROPERTIES:
+:CUSTOM_ID: crdt-broken
+:END:
+
+- HOST notifies CHECK and tries reconnecting
+- [? still doesn't work]
+ - Switch to backup Etherpad
+
+*** Conduct guidelines issue
+:PROPERTIES:
+:CUSTOM_ID: conduct
+:END:
+
+- HOST addresses it (on-camera if needed) with a reminder and/or a kick or a ban
+
+*** CHECK is unavailable
+:PROPERTIES:
+:CUSTOM_ID: check-gone
+:END:
+
+- HOST does check-ins
+- HOST refers to conf.org for Q&A preference etc.
+- STREAM checks conf.org for prerec filenames etc.
+- Dropped goals:
+ - Publishing recordings ASAP
+ - Updating schedule/wiki on the fly
+
+*** HOST is unavailable
+:PROPERTIES:
+:CUSTOM_ID: host-gone
+:END:
+
+- STREAM joins the BBB room and streams directly from there (or streams the prerecs).
+- STREAM will do the hosting.
+
+*** Technical issues during a live presentation
+:PROPERTIES:
+:CUSTOM_ID: live-issues
+:END:
+
+- HOST tries to contact the speaker
+- [? back on track]
+ - [? can be squeezed into remaining time]: Continue
+ - [? need extra time]: CHECK fiddles with buffer of following talks in conf.org and updates schedule
+ - [? need too much extra time (ex: 10min)]: HOST acknowledges
+ technical issues and says we may be able to follow up after the
+ conference
+- [? can't resume]: HOST acknowledges technical issues and says we may
+ be able to follow up after the conference
+
+*** Big technical issues with streaming
+:PROPERTIES:
+:CUSTOM_ID: stream-issues
+:END:
+
+- HOST notifies #emacsconf and #emacsconf-org and adds a note at the top of the ${pad}.
+- HOST updates the 2021.md wiki page
+- CHECK publishes prerecordings
+ - media.emacsconf.org
+ - wiki
+ - Toobnix
+ - Peertube
+- STREAM e-mails the mailing list
+
+*** live0 can't handle the load or is close to network transfer limit
+:PROPERTIES:
+:CUSTOM_ID: network
+:END:
+
+- OR:
+ - Redirect some viewers via asking in #emacsconf:
+ - watch via main-480p
+ - watch via Toobnix (if we can get that working)
+ - Consider dropping the restream to Toobnix (lower audience?) or to Youtube
+ - Add additional node to Linode account for shared transfer pool (TODO: doublecheck)
+
+* Before the conference
+:PROPERTIES:
+:CUSTOM_ID: before
+:END:
+** Send calls for proposals
+:PROPERTIES:
+:CUSTOM_ID: cfp-mails
+:END:
+*** [ANN] EmacsConf 2021 Call for Proposals :email:
+:PROPERTIES:
+:CUSTOM_ID: first-cfp
+:END:
+Sent on August 5, 2021 to emacsconf-discuss, emacs-devel, emacs-orgmode, emacs-tangents, Cc: emacsconf-org.
+Included inline Markdown and attached Org version of the CFP
+
+**** E-mail text
+:PROPERTIES:
+:SUBJECT: [ANN] EmacsConf 2021 Call for Proposals
+:END:
+
+#+begin_src org
+#+title: EmacsConf 2021
+#+subtitle: Online Conference
+#+date: November 27 and 28, 2021
+#+options: author:nil
+
+[[https://emacsconf.org/2021/][EmacsConf 2021]] will be a virtual conference on *November 27 and 28,
+2021 (Sat-Sun)*. If you'd like to present at the conference, please
+[[https://emacsconf.org/2021/cfp/][submit your proposal]] by *September 30, 2021*.
+
+EmacsConf 2021 is about the joy of [[https://www.gnu.org/software/emacs/][Emacs]] and Emacs Lisp. Come share
+your experiments and adventures with the Emacs text editor / operating
+system / way of life! We welcome speakers of *all backgrounds* and
+*all levels of experience*, including newcomers giving their first
+talk. What have you found exciting about Emacs lately? What do you
+wish someone had told you when you were starting out? What part of
+your workflow might inspire someone to get into Emacs or go deeper?
+
+A great way to get started with writing a proposal is to start by
+exploring the programs from previous years: [[https://emacsconf.org/2020/schedule/][2020]], [[https://emacsconf.org/2019/schedule/][2019]], [[https://emacsconf.org/2015/schedule/][2015]], [[https://emacsconf.org/2013/#program][2013]].
+You might also find some neat ideas on the [[https://emacsconf.org/2021/ideas/][ideas]] page. Feel free to
+add yours there too! If you're still not sure, come by our IRC
+channel =#emacsconf= on =irc.libera.chat= and say hi. You can join
+the chat using [[ircs://irc.libera.chat:6697/emacsconf][your favourite IRC client]], or by visiting
+[[https://chat.emacsconf.org][chat.emacsconf.org]] in your web browser.
+
+All kinds of people use Emacs for all kinds of things. We'd love it
+if EmacsConf 2021 could highlight interesting perspectives and reflect
+the diversity of our community. If you know someone who might have a
+good idea for a talk, please reach out to them and encourage them to
+submit a proposal. Many people (especially from underrepresented
+groups such as women, people of colour, non-developers, etc.) might
+not consider themselves expert enough to share their thoughts. If you
+let them know that you value their knowledge and maybe even suggest
+something that you think others would like to hear more about, they
+may realize that they have something worth sharing and that we would
+love to hear from them.
+
+,* Important dates
+
+For EmacsConf 2021, we are planning for 9am to 5pm Toronto/EST
+(2pm-10pm UTC) on November 27 and 28. Depending on people's
+availability, it might be two half-days.
+
+| CFP opens | August 5, 2021 |
+| CFP closes | September 30, 2021 |
+| Speaker notifications | October 15, 2021 |
+| Schedule published | October 31, 2021 |
+| EmacsConf 2021! | November 27 and 28, 2021 |
+
+If you are not available during the conference itself but you have a
+neat idea that you'd like to share, please propose it anyway! You can
+always handle questions after the conference, and we might even be
+able to coordinate with other Emacs meetups for regional events (if
+you're an Emacs meetup organizer and would like to make this happen
+let's [[https://emacsconf.org/contact/][get in touch]]!).
+
+Please note that although we will try our best to stick to the above
+dates in the coming months, given the current state of the world, we
+may have to move things around a bit in case of unforeseen events.
+Thank you for your patience and understanding.
+
+,* Talk formats
+
+We'd like EmacsConf 2021 to inspire lots of different people to
+explore lots of different things in Emacs. We hope to put together a
+stream of quick ideas followed by lots of conversation over IRC and/or
+Q&A sessions, with occasional deep dives into topics that many people
+might find interesting or useful.
+
+As you think about your talk, consider what you can share in:
+
+- *Up to 10 minutes total:* What is the core idea? What do you want
+ people to do or remember? You can show just enough to get people
+ interested and then point them to where they can learn more
+ afterwards. You can answer questions over IRC, the pad, or the
+ wiki, and there's no limit to how long that conversation can go.
+
+- *Up to 20 minutes total:* How would you flesh out some of the points
+ from your 5-10 minute presentation? How can you show the pieces
+ working together?
+
+- *Up to 40 minutes total:* What would benefit from a deep dive?
+ How do you keep it engaging?
+
+When writing your proposal, please write an outline of what you plan
+to talk about if you have 5-10 minutes. If you'd like to propose a
+longer talk, outline what you might include if you had more time to
+present (up to 40 minutes, including Q&A).
+
+Here's an example for a potentially 40-minute talk:
+
+- 5-10 minutes: quick demo of the abc package working together with
+ xyz package.
+- 20 minutes: same as above, with some customization options to
+ accommodate a different workflow.
+- 40 minutes: all of the above, including modifying the behaviour of
+ the package in order to add something new.
+
+This flexibility would help us in devising the conference schedule so
+that as many people as possible could get a chance to present their
+ideas, while still allowing for featuring longer deep dive talks.
+
+Other session formats such as tutorials, workshops, and hangouts are
+welcome as well, in case you would find those other formats preferable
+to a traditional talk format. If you're interested in these or other
+session types, please let us know [[https://lists.gnu.org/mailman/listinfo/emacsconf-org][publicly]] or [[https://lists.gnu.org/mailman/listinfo/emacsconf-org-private][privately]]. We'll be
+happy to work something out with you.
+
+,* Office hours
+
+We're aware that it can be intimidating to submit a proposal to a
+conference, so we thought we'd try to help! This year, we're opening
+up the doors of our virtual offices for you to come talk to us about
+your proposals with hopes of helping you with any hurdles you may be
+facing with preparing your proposal.
+
+We'd like to publish a schedule of availabilities of volunteers for
+holding office hours. Currently these volunteers consist of some of
+the EmacsConf organizers, but we'd love to have the help of other
+members of the Emacs community as well. If you are a more experienced
+Emacs user and would like to help with this, please [[https://emacsconf.org/contact/][get in touch]]!
+
+Our first office hour this year is planned for Saturday, August 14,
+from 3pm to 4pm UTC with zaeph (Leo Vivier) at the following
+BigBlueButton room: https://bbb.emacsverse.org/b/ban-qye-fd1-5kw.
+
+,* Submitting your proposal
+
+Once you're ready to submit your proposal, the [[https://emacsconf.org/2021/submit/][submit]] page has the
+instructions on how to submit your talk.
+
+We use an anonymized submission process to reduce bias and encourage
+contribution. Identifying information will be removed from
+submissions by a conference organizer who will not participate in
+talk selection. The anonymized submissions will then be reviewed by
+a selection committee.
+
+If your talk is approved, we'd love it if you could help us make sure
+the conference runs smoothly. After we email you with the time
+allotted for your talk, we'll ask you to
+
+- prepare a prerecording of your talk, or record it with our help if
+ that'd be easier for you; and
+- schedule a short tech-check if you'd like to be able to answer
+ questions in a live session.
+
+Don't forget to subscribe to our main mailing list, [[https://lists.gnu.org/mailman/listinfo/emacsconf-discuss][emacsconf-discuss]],
+for discussion and announcements about the EmacsConf conference.
+
+We look forward to your ideas and submissions!
+
+,* Getting involved
+
+If you would like to help with the conference (planning the sessions,
+reviewing proposals, helping with infrastructure, making sessions more
+accessible, editing video transcripts, etc.), see our [[https://emacsconf.org/2021/planning/][planning]] page
+and come say hi to us at =#emacsconf= on =irc.libera.chat=.
+
+In addition to the [[https://lists.gnu.org/mailman/listinfo/emacsconf-discuss][emacsconf-discuss]] list, feel free to subscribe to
+[[https://lists.gnu.org/mailman/listinfo/emacsconf-org][emacsconf-org]] as well, for discussions related to organizing the
+conference by the EmacsConf organizers and volunteers.
+
+We'd really appreciate your help in making EmacsConf 2021 the best one
+so far!
+
+,* Commitment to freedom
+
+We remain fully committed to freedom, and we will continue
+using our infrastructure and streaming setup consisting entirely
+of [[https://www.gnu.org/philosophy/free-sw.html][free software]], much like previous EmacsConf conferences.
+An article describing our infrastructure and tools is underway,
+and will be announced on the emacsconf-discuss list when published.
+
+
+,* COMMENT Copyright & License
+
+Copyright (c) 2020 Amin Bandali, Sacha Chua, David Bremner
+Copyright (c) 2021 Amin Bandali, Sacha Chua, Leo Vivier,
+Sebastian Crane
+
+The EmacsConf 2021 Call for Proposals is part of the EmacsConf wiki,
+and is dual-licensed under the terms of the Creative Commons
+Attribution-ShareAlike 4.0 International Public License; and the GNU
+General Public License as published by the Free Software Foundation,
+either version 3 of the License, or (at your option) any later
+version.
+
+A copy of these two licenses is available on the EmacsConf wiki, in
+the [[https://emacsconf.org/COPYING.CC-BY-SA][COPYING.CC-BY-SA]] and [[https://emacsconf.org/COPYING.GPL][COPYING.GPL]] files.
+
+,* COMMENT How to export this file
+
+As of the time of writing this document (Org mode version 9.3.7), the
+Org links library (=ol.el=) does not yet recognize =ircs= link types,
+and will throw an error if you try to export a file containing them,
+such as this file.
+
+To work around that, you can use something along the lines of the
+Emacs Lisp code below, by either adding it to your init file, or by
+putting the point in the code block and hitting =C-c C-v e= (that is,
+hold Ctrl, then hit c followed by v, then release Ctrl, and hit e) to
+evaluate the code, working around the issue only for the current
+session.
+
+,#+begin_src emacs-lisp :results silent
+(org-link-set-parameters
+ "ircs"
+ :export
+ (lambda (link description format)
+ "Export an ircs link.
+See `org-link-parameters' for details about LINK, DESCRIPTION and
+FORMAT."
+ (let ((desc (or description link)))
+ (pcase format
+ (`html (format "<a href=\"ircs:%s\">%s</a>" link desc))
+ (`md (format "[%s](ircs:%s)" desc link))
+ (_ nil)))))
+,#+end_src
+
+#+end_src
+*** Second (and final) call for proposals (closing Sep 30) :email:
+:PROPERTIES:
+:CUSTOM_ID: second-cfp
+:END:
+Sent Sept 27, 2021 to the same lists as the CFP
+Included inline Markdown and attached Org version of the CFP
+
+**** E-mail text
+:PROPERTIES:
+:SUBJECT: [ANN] EmacsConf 2021 Second (and final) Call for Proposals (closing Sep 30)
+:END:
+
+Dear fellow Emacsians,
+
+This is the second and final Call for Proposals for EmacsConf 2021,
+open until September 30. Please see below for details on how to send
+in your proposal(s), or chat about them with us in the #emacsconf IRC
+channel on Libera.Chat.
+
+If you're considering submitting a proposal but think the remaining
+time is not enough, please reach out to me off-list as soon as
+possible and I'd be happy to try and work something out with you.
+
+I'll close this portion of this email with a big thank you to all the
+folks who have submitted their talk proposal(s) or will be doing so.
+Myself and the other EmacsConf organizers look forward to reading over
+them and getting back to you about them and about the next steps. :)
+
+Best,
+amin
+
+P.S. please direct any replies to this post either to myself or to the
+emacsconf-discuss list, so as to help avoid generating extra off-topic
+chatter in the other lists cc'd in this message.
+
+P.P.S. as a volunteer-run conference, we are always looking for new
+fellow volunteers and/or organizers to help with various aspects of
+organizing and running the conference, including reviewing proposal
+submissions. If you're interested in getting involved, please come by
+our IRC channel or one of our public mailing lists (info below), or
+any of the current organizers directly and say hi. We look forward to
+hearing from you!
+** Accept talks :email:
+:PROPERTIES:
+:CUSTOM_ID: accept
+:END:
+*** E-mail text
+Dear ${name},
+
+We would love to have your talk "${title}" as part of EmacsConf
+${conf-year}, and we've allocated ${duration} minutes for
+it. ${time-note}
+
+Your talk is tentatively scheduled for ${schedule}. The times may
+move around a bit as we update the schedule, so we'll check in with
+you if things change a lot. We've scheduled a few minutes for live
+questions and answers via web conference. Will you be available
+around this time? If there are more questions, you can also continue
+over Etherpad/IRC.
+
+Please plan to prerecord your ${duration}-minute talk(s) by ${deadline}
+at the latest. If you can, please send it in as early as possible.
+Submitting your video early lets us ask volunteers to help caption the
+video, making your talk more accessible and searchable.
+
+Please see https://emacsconf.org/${conf-year}/prepare/ for tips and
+instructions on preparing, recording, and sending in your talk. If
+you have any questions or concerns, please let us know.
+
+Thanks,
+
+Amin Bandali
+EmacsConf organization team
+
+P.S. Please keep emacsconf-submit@gnu.org in To or Cc when replying.
+
+** Thank speakers for submissions :email:
+:PROPERTIES:
+:CUSTOM_ID: acknowledge-submission
+:END:
+*** Captions prepared
+Because you sent in your video early, we were able to caption it so
+that more people can find and enjoy your talk. I've attached the
+caption text file in case you want to review it, suggest any
+corrections, or use the text in a blog post or elsewhere. Thanks again
+for your contribution!
+*** Captions pending
+Just a quick note to let you know that I've downloaded your submission for "${title}".
+
+Now we have the following files starting with ${video-slug}:
+${details}
+
+A quick check shows that it's about ${video-duration} minutes long.
+
+We'll be working on captioning it over the next few weeks. We'll e-mail
+again a little closer to the conference with schedule updates and other
+useful information. If you want to upload a new version, you can upload
+it the same way you did the previous one.
+
+Please feel free to e-mail us at emacsconf-submit@gnu.org if you need
+help updating the talk wiki page at
+${url} or if you have other questions.
+
+Thank you so much for all the work you put into preparing a talk for
+EmacsConf ${conf-year}, and thank you for submitting the prerecorded video
+before the conference!
+** Help speakers with tech checks
+:PROPERTIES:
+:CUSTOM_ID: tech-checks
+:END:
+- Explain process
+- Test audio, webcam, screensharing, collaborative pad
+ - Music demos and other things that use system audio will need to be prerecorded (or done through virtual loopback device, maybe? Technical risk.)
+ - Multi-monitor setups might not be handled well by BBB; share window instead of desktop
+- Check if comfortable checking into IRC: chat.emacsconf.org/?join=emacsconf,emacsconf-org
+- Get IRC nick, phone number for emergency contact, store in private wiki
+- Try to record name pronunciation
+- Encourage webcam for Q&A, although make it clear that it's totally optional
+- Possible picture-in-picture approach to maximize screen real estate
+** Follow up with speakers we haven't heard from :email:
+:PROPERTIES:
+:CUSTOM_ID: follow-up-silence
+:END:
+
+I think we haven't heard from you since we accepted your EmacsConf 2021
+proposal for "${title}" in early October.
+EmacsConf is in less than two weeks, so I wanted to check in with you to
+see how you're doing.
+
+Could you please e-mail us to let us know if you're still working on
+your prerecorded video, if you're planning to present live, or if you
+can't make it this year? I know it's a strange time for everyone, so
+no worries if other priorities have come up and you don't have the
+time for a presentation.
+
+If you've been having technical issues recording your presentation on
+your computer, one of our volunteers could set up a BigBlueButton web
+conference with you to record the presentation. You can find a list of
+volunteers and their availability at
+https://emacsconf.org/2021/prepare/#tech-check . It takes a little time
+to get the recording out of BBB, so please plan to record your
+presentation before Tuesday, November 23.
+
+If you plan to present live, please go through the self-check at
+<https://test.bigbluebutton.org/> . Some speakers have encountered
+technical issues with BigBlueButton that they didn't have with Zoom or
+Google Meet, so this is something we definitely want to look into
+earlier rather than later. If that works for you, please e-mail us
+back so that I can keep your timeslot. The tentative schedule for your
+talk is on the talk page at ${url} .
+
+*Please e-mail us your plans before ${deadline}.* I'm
+planning to shift the schedule around to give more time to confirmed
+speakers for Q&A and possibly live demos. If I don't hear from you by
+then (maybe an over-enthusiastic spam filter has been swallowing up
+all our mail?), I'll probably reallocate the 10 minutes that had
+been set aside for your talk. We might be able to squeeze it back in
+afterwards or play a video from you at the end of the conference day,
+but it would be nice to get the schedule sorted out instead of
+scrambling to fill gaps on the day of the conference.
+
+Hope to hear from you by ${deadline}!
+
+Sacha Chua
+
+(Please use Reply to All to keep emacsconf-submit@gnu.org in the loop. Thanks!)
+** Send check-in instructions :email:
+:PROPERTIES:
+:CUSTOM_ID: check-in-instructions
+:END:
+*** Unknown Q&A preference
+We're looking forward to having you join us at EmacsConf if you can! I
+don't seem to have your Q&A preference in my notes, but if you can
+join us at EmacsConf for questions and answers over video, IRC, or
+Etherpad, that would be great. If not, that's cool, we can collect the
+questions and forward them to you after the conference.
+
+If you want to join us, you can get a rough idea of when your talk is
+scheduled at ${url} . We'll probably keep
+updating the schedule even on the day of the conference. You might want
+to check it some time next week to get a rough sense of where it is, and
+then check it again on the day of your talk.
+
+Please check in at least 30 minutes before the scheduled start of your
+prerecorded talk so that we can deal with small scheduling changes or
+technical issues. You can find the check-in process at
+https://emacsconf.org/2021/speakers/ .
+
+If something comes up, please let us know as soon as you can. Here's
+our emergency contact information:
+
+${emergency-contact-info}
+
+Hope to see you soon if you can join us!
+
+Sacha
+
+*** Speakers will handle Q&A live
+
+We're looking forward to having you join us for questions and answers at
+EmacsConf!
+
+We'll probably keep updating the schedule even on the day of the
+conference. You can get a rough idea of when your talk is scheduled at
+${url} . You might want to check it some time next week to get a rough
+sense of where it is, and then check it again on the day of your talk.
+
+Please check in at least 30 minutes before the scheduled start of your
+prerecorded talk so that we can deal with small scheduling changes or
+technical issues. You can find the check-in process at
+https://emacsconf.org/2021/speakers/ .
+
+If something comes up, please let us know as soon as you can. Here's
+our emergency contact information:
+
+${emergency-contact-info}
+
+Looking forward to seeing you soon!
+
+*** Speakers will handle questions after the event
+
+Thank you so much for contributing a talk for EmacsConf 2021! We're
+looking forward to collecting questions and forwarding them to you by
+e-mail after the conference. We'll also post the prerecording at the
+time that it gets streamed, so people will be able to access it at
+${url} once it has gone live.
+
+If it turns out that you can make it to the conference after all, feel
+free to drop us a line at #emacsconf-org and we'll let people know
+you're around. You can find the check-in process at
+https://emacsconf.org/2021/speakers/ .
+
+Thank you so much for being part of EmacsConf 2021!
+** Announce schedule and watching instructions :email:
+:PROPERTIES:
+:CUSTOM_ID: announce-schedule
+:END:
+Sent Nov 20, 2021
+
+*** E-mail text
+Dear Emacsian friends,
+
+This is it, the final stretch until EmacsConf 2021, coming up on
+November 27 and 28 less than a week from now! A few weeks ago,
+we excitedly shared the EmacsConf 201 program with you. We're now
+happy to share the conference schedule with you, i.e. the program
+plus each talk's (approximate) scheduled time slot:
+
+ https://emacsconf.org/2021/schedule
+
+All of the times listed on the schedule are in EST (UTC-5). You can
+click on each talk's title to open its page for more information,
+including its scheduled time in your local time (displaying local time
+requires running a tiny bit of AGPLv3+-licensed free/libre JavaScript
+code, included on the talk pages). For prerecorded talks, this time
+is also when the talk's video will be made available on the same page.
+Please note the '~' tildes near the times, indicating that they are
+approximations and not meant to be taken as exact times.
+
+On November 27 and 28 you will be able to watch the livestreams via
+https://live.emacsconf.org, which also has details on how to watch the
+streams using media players that support streaming (like mpv and VLC).
+Also, for Asia-Pacific folks, there will be an alternate stream by
+LibreAustralia, at 11:00-17:30 UTC+11 on Sunday, November 28. Please
+see the https://libreau.org/upcoming.html#emacsconf21 page on their
+site for more details and how to tune into the alternate stream.
+
+Last but not least, please see the https://emacsconf.org/2021 page
+of the EmacsConf wiki for more details on watching and participating
+in the conference.
+
+We hope to see you all around on November 27-28 for EmacsConf 2021!
+
+Amin Bandali, Leo Vivier, and Sacha Chua,
+On behalf of the EmacsConf 2021 organizers team
+** Follow up regarding prerecorded videos :email:
+:PROPERTIES:
+:SUBJECT: [need answer by Friday noon EST] EmacsConf 2021: Don't have a prerec from you yet, aaah!
+:CUSTOM_ID: follow-up-prerecs
+:END:
+
+EmacsConf is in a few days and I don't think we have your prerecorded
+video yet, so I'm getting miiiildly stressed about the schedule. And
+you're probably stressing out about it too, so let's go figure out how
+we can make this work.
+
+Option A: If you happen to have the prerecording or can get it done by
+tomorrow, we can probably squeeze it in. Please upload it to
+ftp-upload.emacsconf.org by following the instructions in
+https://emacsconf.org/2021/prepare#ftp-upload , or send us a link using
+your favourite file-sharing service (especially if FTP is giving you
+problems).
+
+Option B: If you want to present live, it might be an option. I'm a little
+worried about the potential for technical issues, since we've had
+problems with that in previous EmacsConfs. The tight schedule means
+there's not a lot of time to figure things out, and it can be hard to
+make something as focused as a prerecorded video when you're doing it
+live. We will definitely want to make sure that:
+ - your self-serve tech check works: https://test.bigbluebutton.org
+ at your convenience;
+ - we have your emergency contact information in case of frozen
+ Internet connection, etc. Please e-mail us the phone number we can
+ use to call you. We promise to use it only for EmacsConf 2021
+ emergency coordination; and
+ - you check in as early as possible (at least 1 hour before, so we
+ know if the speaker before you needs to extend) and let us know
+ that you want to do it live https://emacsconf.org/2021/speakers .
+ We keep adapting the schedule as things come up, so please check
+ https://emacsconf.org/2021/schedule/ on the day of the conference.
+
+If there are technical issues or your talk runs a little over time, we
+might have to stop streaming it on the main stream when it's time for
+the next talk. We may be able to continue streaming it on the
+alternate stream. If so, people can continue watching it there if they
+wish to.
+
+Option C: If you can't make it, that's okay. Life gets crazy
+sometimes. Please let us know and we can update the wiki. If you
+happen to be able to make a prerecorded video afterwards, we can add
+that to the wiki, playlists, and announcements. We hope you can join
+us next year.
+
+Since EmacsConf is *this weekend* (aaaaaaah), please let us know by
+tomorrow noon EST (Friday; 9AM PST, 5PM GMT, 6PM CET) so that we can
+keep the time allocated for you in the schedule. If we don't hear from
+you, we'll probably reallocate the ${duration} minutes reserved for you so
+that other talks can have longer Q&A. If you can still make it, check
+in early and let us know so that we can try to work out an alternate
+stream for you. Hope to hear from you soon!
+
+Sacha
+** Offer speakers the opportunity to go live if they really really want to :email:
+:PROPERTIES:
+:CUSTOM_ID: go-live-maybe
+:END:
+Sent November 25
+*** Email text
+Thank you so much for sending in your prerecording. We were able to
+caption most of the talks, yay! That will help more people appreciate
+the talks, and it'll make it easier for people to look up technical
+terms too. The talks will be streamed with open captions, and the talk
+pages will have the videos with closed captions when they're streamed.
+
+We're still adapting the schedule as stuff comes up, so please check
+the schedule again on the day of the conference and check in as early
+as you can. (Check-in instructions: https://emacsconf.org/2021/speakers)
+
+--- Presenting live? ---
+
+If you really, really, really want to present live, we can keep the
+prerecorded talk as a backup plan. I'm a little worried about the
+potential for technical issues, since we've had problems with that in
+previous EmacsConfs. The tight schedule means there's not a lot of
+time to figure things out, and it can be hard to make something as
+focused as a prerecorded video when you're doing it live. If you want
+to present live, we will definitely want to make sure that:
+ - your self-serve tech check works: https://test.bigbluebutton.org
+ at your convenience;
+ - we have your emergency contact information in case of frozen
+ Internet connection, etc. Please e-mail us the phone number we can
+ use to call you. We promise to use it only for EmacsConf 2021
+ emergency coordination; and
+ - you check in as early as possible (at least 30 minutes before) and
+ let us know that you want to do it live
+ https://emacsconf.org/2021/speakers
+Going with the prerecorded video is probably the least-stress option
+for everyone, but we wanted to offer you the option to go live just in case.
+
+Looking forward to seeing you soon!
+
+** Compress video
+
+Usage: =compress-video.sh original-file output-file=:
+
+#+begin_src sh :eval no :tangle compress-video.sh
+Q=32
+ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -an -tile-columns 0 -tile-rows 0 -frame-parallel 0 -cpu-used 8 -auto-alt-ref 1 -lag-in-frames 25 -g 240 -pass 1 -f webm -threads 8 /dev/null &&
+ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a copy -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -threads 8 "$2"
+#+end_src
+
+We tried using q56 before, but it was a little too aggressive. Q=32 is the default and is probably a reasonable space vs. quality compromise.
+
+** Experiment with setup to allow MPV / BBB sound isolation
+:PROPERTIES:
+:CUSTOM_ID: sound
+:END:
+
+Set MIC and OUTPUT appropriately.
+
+#+begin_src sh :eval no
+MIC=alsa_input.usb-046d_0819_A68D6BE0-02.mono-fallback
+OUTPUT=alsa_output.pci-0000_00_1b.0.analog-stereo
+if [ "$1" == "-u" ]; then
+ pactl unload-module module-loopback
+ pactl unload-module module-null-sink
+else
+ pacmd load-module module-null-sink sink_name=recording sink_properties=device.description=recording channels=2
+ pacmd load-module module-null-sink sink_name=mpv sink_properties=device.description=mpv
+ pacmd load-module module-loopback source=$MIC sink=recording
+ pacmd load-module module-loopback source=mpv.monitor sink=recording
+ pacmd load-module module-loopback source=recording.monitor sink=$OUTPUT
+fi
+#+end_src
+
+You can probably then use =pavucontrol= (choose All Streams instead of
+Applications on the Playback tab) or something like the following to
+redirect the mpv output to the mpv sink.
+
+#+begin_src sh :eval no
+pacmd list-sink-inputs # notice the ID for the process you want to redirect
+pacmd move-sink-input 1 mpv
+#+end_src
+** Check for video encoding issues
+
+Sometimes the compression may get cut off. You can use
+=compile-media-verify-video-frames= from
+https://github.com/sachac/compile-media to check that videos have
+enough frames for their expected duration
+
diff --git a/2021/playbook/restream-flv.sh b/2021/playbook/restream-flv.sh
new file mode 100644
index 00000000..dc632762
--- /dev/null
+++ b/2021/playbook/restream-flv.sh
@@ -0,0 +1,2 @@
+ MOUNT=$1
+ while true; do ffmpeg -loglevel 24 -i http://localhost:8000/main.webm -cluster_size_limit 2M -cluster_time_limit 5100 -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -vcodec libx264 -acodec libmp3lame -f flv $MOUNT; done
diff --git a/2021/playbook/restream-lowres.sh b/2021/playbook/restream-lowres.sh
new file mode 100644
index 00000000..bd6f5bfb
--- /dev/null
+++ b/2021/playbook/restream-lowres.sh
@@ -0,0 +1,2 @@
+ PASS=$1
+ while true; do ffmpeg -loglevel 24 -f webm -reconnect_at_eof 1 -reconnect_streamed 1 -re -i http://localhost:8000/main.webm -vf scale=854:480 -f webm -c:a copy -b:v 500k -maxrate 1M -bufsize 1M -content_type video/webm -c:v libvpx icecast://ec2020main480pmu:$PASS@localhost:8000/main-480p.webm; done
diff --git a/2021/playbook/restream-youtube.sh b/2021/playbook/restream-youtube.sh
new file mode 100644
index 00000000..1cc2994b
--- /dev/null
+++ b/2021/playbook/restream-youtube.sh
@@ -0,0 +1,2 @@
+ KEY=$1
+ while true; do ffmpeg -loglevel 8 -f webm -reconnect_at_eof 1 -reconnect_streamed 1 -re -i http://localhost:8000/main.webm -f webm -c:a copy -c:v copy rtmp://a.rtmp.youtube.com/live2/$KEY; done
diff --git a/2021/playbook/stream-desktop-and-audio.sh b/2021/playbook/stream-desktop-and-audio.sh
new file mode 100644
index 00000000..d3a7e6f8
--- /dev/null
+++ b/2021/playbook/stream-desktop-and-audio.sh
@@ -0,0 +1 @@
+ while true; do ffmpeg -loglevel 0 -ar 48000 -f alsa -channels 2 -sample_rate 48000 -i default -re -video_size 1280x720 -framerate 25 -f x11grab -i :0.0 -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm -c:v libvpx -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -f webm $CONFALT; done
diff --git a/2021/prepare.md b/2021/prepare.md
index 5a24bb17..115d8432 100644
--- a/2021/prepare.md
+++ b/2021/prepare.md
@@ -120,7 +120,7 @@ WebM format if possible.*
If you would like to compress your video before uploading, the following shell script may be useful:
- Q=56
+ Q=32
ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -aq-mode 2 -an -tile-columns 0 -tile-rows 0 -frame-parallel 0 -cpu-used 8 -auto-alt-ref 1 -lag-in-frames 25 -g 240 -pass 1 -f webm -threads 8 /dev/null &&
ffmpeg -y -i "$1" -c:v libvpx-vp9 -b:v 0 -crf $Q -c:a copy -tile-columns 2 -tile-rows 2 -frame-parallel 0 -cpu-used -5 -auto-alt-ref 1 -lag-in-frames 25 -pass 2 -g 240 -threads 8 "$2"
diff --git a/2021/schedule-details.md b/2021/schedule-details.md
index ffd720dc..17a516bc 100644
--- a/2021/schedule-details.md
+++ b/2021/schedule-details.md
@@ -1,58 +1,58 @@
-<div>45 talks total: 40 captioned (513 min), 5 waiting for captions (117 min)</div>
-<table width="100%"><tr><th>Status</th><th>Start</th><th>Title</th><th>Speaker(s)</th></tr><tr><td colspan="4"><strong>Saturday morning<strong></td></tr>
-<tr><td></td><td width=100>~ 9:00 AM</td><td><a href="/2021/talks/day1-open">Opening remarks</a></td><td></td></tr>
-<tr><td>done</td><td width=100>~ 9:19 AM</td><td><a href="/2021/talks/news">Emacs News Highlights</a></td><td>Sacha Chua</td></tr>
-<tr><td>done</td><td width=100>~ 9:25 AM</td><td><a href="/2021/talks/frownies">The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</a></td><td>Case Duckworth</td></tr>
-<tr><td>done</td><td width=100>~ 9:59 AM</td><td><a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a></td><td>Jean-Christophe Helary</td></tr>
-<tr><td>done</td><td width=100>~10:13 AM</td><td><a href="/2021/talks/unix">GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</a></td><td>Daniel Rose</td></tr>
-<tr><td>done</td><td width=100>~10:25 AM</td><td><a href="/2021/talks/montessori">Emacs and Montessori Philosophy</a></td><td>Grant Shangreaux</td></tr>
-<tr><td>done</td><td width=100>~10:40 AM</td><td><a href="/2021/talks/pattern">Emacs as Design Pattern Learning</a></td><td>Greta Goetz</td></tr>
-<tr><td>done</td><td width=100>~11:07 AM</td><td><a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a></td><td>Protesilaos Stavrou</td></tr>
-<tr><td>done</td><td width=100>~11:46 AM</td><td><a href="/2021/talks/nongnu">NonGNU ELPA Update</a></td><td>Philip Kaludercic</td></tr>
-<tr><td>done</td><td width=100>~11:55 AM</td><td><a href="/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a></td><td>Dhavan (codingquark)</td></tr>
-<tr><td>done</td><td width=100>~12:03 PM</td><td><a href="/2021/talks/nangulator">Introducing N-Angulator</a></td><td>Kevin Haddock</td></tr>
-<tr><td>done</td><td width=100>~12:14 PM</td><td><a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a></td><td>Spencer King</td></tr>
-<tr><td colspan="4"><strong>Saturday afternoon<strong></td></tr>
-<tr><td>done</td><td width=100>~ 1:01 PM</td><td><a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a></td><td>Gabriele Bozzola</td></tr>
-<tr><td>done</td><td width=100>~ 1:10 PM</td><td><a href="/2021/talks/janitor">A day in the life of a janitor</a></td><td>Stefan Monnier</td></tr>
-<tr><td>done</td><td width=100>~ 1:51 PM</td><td><a href="/2021/talks/erg">Emacs Research Group, Season Zero: What we did together with Emacs in 2 hours a week for a year</a></td><td>Noorah Alhasan, Joe Corneli, Raymond Puzio, Leo Vivier</td></tr>
-<tr><td>done</td><td width=100>~ 2:03 PM</td><td><a href="/2021/talks/cs">One effective CS grad student workflow</a></td><td>Greg Coladonato</td></tr>
-<tr><td>done</td><td width=100>~ 2:15 PM</td><td><a href="/2021/talks/professional">Using Org-Mode For Recording Continuous Professional Development</a></td><td>Philip Beadling</td></tr>
-<tr><td>done</td><td width=100>~ 2:26 PM</td><td><a href="/2021/talks/tech">Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide</a></td><td>Jan Ypma</td></tr>
-<tr><td>done</td><td width=100>~ 2:38 PM</td><td><a href="/2021/talks/exec">Org as an executable format</a></td><td>Tom Gillespie</td></tr>
-<tr><td>done</td><td width=100>~ 2:46 PM</td><td><a href="/2021/talks/org-outside">The use of Org mode syntax outside of GNU/Emacs</a></td><td>Karl Voit</td></tr>
-<tr><td>done</td><td width=100>~ 3:00 PM</td><td><a href="/2021/talks/teach">Using Org-mode to teach programming</a></td><td>Daniel German</td></tr>
-<tr><td>done</td><td width=100>~ 3:21 PM</td><td><a href="/2021/talks/babel">Babel for academics</a></td><td>Asilata Bapat</td></tr>
-<tr><td>done</td><td width=100>~ 3:33 PM</td><td><a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a></td><td>Ahmed Khaled</td></tr>
-<tr><td>done</td><td width=100>~ 3:42 PM</td><td><a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a></td><td>Blaine Mooers</td></tr>
-<tr><td>done</td><td width=100>~ 3:53 PM</td><td><a href="/2021/talks/invoice">Finding Your (In)voice: Emacs for Invoicing</a></td><td>Bala Ramadurai</td></tr>
-<tr><td>done</td><td width=100>~ 4:03 PM</td><td><a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a></td><td>Adolfo Villafiorita</td></tr>
-<tr><td>done</td><td width=100>~ 4:14 PM</td><td><a href="/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a></td><td>Mehmet Tekman</td></tr>
-<tr><td>done</td><td width=100>~ 4:26 PM</td><td><a href="/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a></td><td>Andrea</td></tr>
-<tr><td>done</td><td width=100>~ 4:41 PM</td><td><a href="/2021/talks/dev-update">Emacs development updates</a></td><td>John Wiegley</td></tr>
-<tr><td>done</td><td width=100>~ 4:49 PM</td><td><a href="/2021/talks/design">On the design of text editors</a></td><td>Nicolas P. Rougier</td></tr>
-<tr><td></td><td width=100>~ 5:00 PM</td><td><a href="/2021/talks/day1-close">Closing remarks day 1</a></td><td></td></tr>
-<tr><td colspan="4"><strong>Sunday, Nov 28, 2021: Development talks<strong></td></tr>
-<tr><td colspan="4"><strong>Sunday morning<strong></td></tr>
-<tr><td></td><td width=100>~ 9:00 AM</td><td><a href="/2021/talks/day2-open">Opening remarks day 2</a></td><td></td></tr>
-<tr><td>done</td><td width=100>~ 9:07 AM</td><td><a href="/2021/talks/faster">Optimizing Emacs Lisp Code</a></td><td>Dmitry Gutov</td></tr>
-<tr><td>done</td><td width=100>~10:00 AM</td><td><a href="/2021/talks/structural">Tree-edit: Structural editing for Java, Python, C, and beyond!</a></td><td>Ethan Leba</td></tr>
-<tr><td>done</td><td width=100>~10:19 AM</td><td><a href="/2021/talks/ui">Yak-shaving to a UI framework</a></td><td>Erik Anderson</td></tr>
-<tr><td>done</td><td width=100>~10:38 AM</td><td><a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a></td><td>Andrea</td></tr>
-<tr><td>done</td><td width=100>~10:49 AM</td><td><a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a></td><td>Laszlo Krajnikovszkij</td></tr>
-<tr><td>done</td><td width=100>~11:00 AM</td><td><a href="/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a></td><td>Andrea Corallo</td></tr>
-<tr><td colspan="4"><strong>Sunday afternoon<strong></td></tr>
-<tr><td>done</td><td width=100>~ 1:01 PM</td><td><a href="/2021/talks/form">Old McCarthy Had a Form</a></td><td>Ian Eure</td></tr>
-<tr><td>done</td><td width=100>~ 1:19 PM</td><td><a href="/2021/talks/bindat">Turbo Bindat</a></td><td>Stefan Monnier</td></tr>
-<tr><td>done</td><td width=100>~ 1:55 PM</td><td><a href="/2021/talks/test">Test blocks</a></td><td>Eduardo Ochs</td></tr>
-<tr><td>done</td><td width=100>~ 2:03 PM</td><td><a href="/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a></td><td>Mohsen BANAN</td></tr>
-<tr><td>done</td><td width=100>~ 2:29 PM</td><td><a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a></td><td>Matthew Zeng</td></tr>
-<tr><td>done</td><td width=100>~ 2:39 PM</td><td><a href="/2021/talks/imaginary">Imaginary Programming</a></td><td>Shane Mulligan</td></tr>
-<tr><td>done</td><td width=100>~ 2:59 PM</td><td><a href="/2021/talks/clede">CLEDE: the Common Lisp Emacs Development Environment</a></td><td>Fermin MF</td></tr>
-<tr><td>done</td><td width=100>~ 3:25 PM</td><td><a href="/2021/talks/maintainers">How to help Emacs maintainers?</a></td><td>Bastien Guerry</td></tr>
-<tr><td>done</td><td width=100>~ 3:52 PM</td><td><a href="/2021/talks/build">How to build an Emacs</a></td><td>Fermin MF</td></tr>
-<tr><td>done</td><td width=100>~ 4:15 PM</td><td><a href="/2021/talks/forever">M-x Forever: Why Emacs will outlast text editor trends</a></td><td>David Wilson (System Crafters)</td></tr>
-<tr><td></td><td width=100>~ 4:56 PM</td><td><a href="/2021/talks/day2-close">Closing remarks day 2</a></td><td></td></tr></table><div class="cancelled">Cancelled:<ul><li><a href="/2021/talks/dsl">Self-Describing Smart DSL's: The Next Magits</a> - Psionic</li>
+<div>45 talks total: 43 captioned (594 min), 2 waiting for captions (36 min)</div>
+<table width="100%"><tr><th>Title</th><th>Speaker(s)</th><th>Resources</th></tr><tr><td colspan="3"><strong>Saturday morning<strong></td></tr>
+<tr><td><a href="/2021/talks/day1-open">Opening remarks</a></td><td></td><td><ul></ul></td></tr>
+<tr><td><a href="/2021/talks/news">Emacs News Highlights</a></td><td>Sacha Chua</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--compressed56.webm">Download --compressed56.webm (6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.webm">Download --main.webm (13MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/frownies">The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</a></td><td>Case Duckworth</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--compressed56.webm">Download --compressed56.webm (26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/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">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.webm">Download --main.webm (65.3MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a></td><td>Jean-Christophe Helary</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary.pdf">Download .pdf (3.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--compressed56.webm">Download --compressed56.webm (9.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt">Download --main_fr.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt">Download --main_ja.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.webm">Download --main.webm (15.2MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/unix">GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</a></td><td>Daniel Rose</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--compressed56.webm">Download --compressed56.webm (6.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.webm">Download --main.webm (10.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/montessori">Emacs and Montessori Philosophy</a></td><td>Grant Shangreaux</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--compressed56.webm">Download --compressed56.webm (11.4MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.webm">Download --main.webm (15.1MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/pattern">Emacs as Design Pattern Learning</a></td><td>Greta Goetz</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--compressed56.webm">Download --compressed56.webm (36.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.webm">Download --main.webm (131.8MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a></td><td>Protesilaos Stavrou</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--compressed56.webm">Download --compressed56.webm (54.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.webm">Download --main.webm (85.9MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/nongnu">NonGNU ELPA Update</a></td><td>Philip Kaludercic</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--compressed56.webm">Download --compressed56.webm (7.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.webm">Download --main.webm (10.6MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a></td><td>Dhavan (codingquark)</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--compressed56.webm">Download --compressed56.webm (7.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.webm">Download --main.webm (16.8MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/nangulator">Introducing N-Angulator</a></td><td>Kevin Haddock</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--compressed56.webm">Download --compressed56.webm (9.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.webm">Download --main.webm (13.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a></td><td>Spencer King</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--compressed56.webm">Download --compressed56.webm (7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.webm">Download --main.webm (7.9MB)</a></li></ul></td></tr>
+<tr><td colspan="3"><strong>Saturday afternoon<strong></td></tr>
+<tr><td><a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a></td><td>Gabriele Bozzola</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--compressed56.webm">Download --compressed56.webm (8.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.webm">Download --main.webm (10.5MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/janitor">A day in the life of a janitor</a></td><td>Stefan Monnier</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--compressed56.webm">Download --compressed56.webm (36.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.webm">Download --main.webm (53.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/erg">Emacs Research Group, Season Zero: What we did together with Emacs in 2 hours a week for a year</a></td><td>Noorah Alhasan, Joe Corneli, Raymond Puzio, Leo Vivier</td><td><ul><li><a href="https://media.emacsconf.org/2021/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.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/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--compressed56.webm">Download --compressed56.webm (11MB)</a></li><li><a href="https://media.emacsconf.org/2021/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.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/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--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/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">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/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.webm">Download --main.webm (33.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/cs">One effective CS grad student workflow</a></td><td>Greg Coladonato</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--compressed56.webm">Download --compressed56.webm (43.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.webm">Download --main.webm (23.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/professional">Using Org-Mode For Recording Continuous Professional Development</a></td><td>Philip Beadling</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--compressed56.webm">Download --compressed56.webm (9.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.webm">Download --main.webm (15.1MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/tech">Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide</a></td><td>Jan Ypma</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--compressed56.webm">Download --compressed56.webm (15.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.webm">Download --main.webm (17.1MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/exec">Org as an executable format</a></td><td>Tom Gillespie</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--compressed56.webm">Download --compressed56.webm (10.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.webm">Download --main.webm (13.8MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/org-outside">The use of Org mode syntax outside of GNU/Emacs</a></td><td>Karl Voit</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--compressed56.webm">Download --compressed56.webm (27.1MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.webm">Download --main.webm (114MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/teach">Using Org-mode to teach programming</a></td><td>Daniel German</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--compressed56.webm">Download --compressed56.webm (26.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.webm">Download --main.webm (42.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/babel">Babel for academics</a></td><td>Asilata Bapat</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--compressed56.webm">Download --compressed56.webm (13.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.webm">Download --main.webm (21.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a></td><td>Ahmed Khaled</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled.el">Download .el</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--compressed56.webm">Download --compressed56.webm (14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.webm">Download --main.webm (19.2MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a></td><td>Blaine Mooers</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers.pdf">Download .pdf (3.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--compressed56.webm">Download --compressed56.webm (8.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.webm">Download --main.webm (11.8MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/invoice">Finding Your (In)voice: Emacs for Invoicing</a></td><td>Bala Ramadurai</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--compressed56.webm">Download --compressed56.webm (14.9MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.webm">Download --main.webm (31.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a></td><td>Adolfo Villafiorita</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--compressed56.webm">Download --compressed56.webm (15.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.webm">Download --main.webm (37.5MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a></td><td>Mehmet Tekman</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--compressed56.webm">Download --compressed56.webm (10.4MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.webm">Download --main.webm (11MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a></td><td>Andrea</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--compressed56.webm">Download --compressed56.webm (24.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.webm">Download --main.webm (27.2MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/dev-update">Emacs development updates</a></td><td>John Wiegley</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--compressed56.webm">Download --compressed56.webm (10.3MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.webm">Download --main.webm (30.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/design">On the design of text editors</a></td><td>Nicolas P. Rougier</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--compressed56.webm">Download --compressed56.webm (6.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.webm">Download --main.webm (9.3MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/day1-close">Closing remarks day 1</a></td><td></td><td><ul></ul></td></tr>
+<tr><td colspan="3"><strong>Sunday, Nov 28, 2021: Development talks<strong></td></tr>
+<tr><td colspan="3"><strong>Sunday morning<strong></td></tr>
+<tr><td><a href="/2021/talks/day2-open">Opening remarks day 2</a></td><td></td><td><ul></ul></td></tr>
+<tr><td><a href="/2021/talks/faster">Optimizing Emacs Lisp Code</a></td><td>Dmitry Gutov</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.el">Download .el</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--compressed56.webm">Download --compressed56.webm (57.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.webm">Download --main.webm (97.5MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/structural">Tree-edit: Structural editing for Java, Python, C, and beyond!</a></td><td>Ethan Leba</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--compressed56.webm">Download --compressed56.webm (13MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.webm">Download --main.webm (15MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/ui">Yak-shaving to a UI framework</a></td><td>Erik Anderson</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--compressed56.webm">Download --compressed56.webm (10.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-ui--yak-shaving-to-a-ui-framework-help-i-accidentally-yak-shaved-my-way-to-writing-a-ui-framework-because-overlays-were-slow--erik-anderson--main.webm">Download --main.webm (13.5MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a></td><td>Andrea</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--compressed56.webm">Download --compressed56.webm (14.2MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.webm">Download --main.webm (22.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a></td><td>Laszlo Krajnikovszkij</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--compressed56.webm">Download --compressed56.webm (8.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.webm">Download --main.webm (9.6MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a></td><td>Andrea Corallo</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo.odp">Download .odp (3.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--compressed56.webm">Download --compressed56.webm (40.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-native--emacs-lisp-native-compiler-current-status-and-future-developments--andrea-corallo--main.webm">Download --main.webm (89MB)</a></li></ul></td></tr>
+<tr><td colspan="3"><strong>Sunday afternoon<strong></td></tr>
+<tr><td><a href="/2021/talks/form">Old McCarthy Had a Form</a></td><td>Ian Eure</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--compressed56.webm">Download --compressed56.webm (13.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.webm">Download --main.webm (24.9MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/bindat">Turbo Bindat</a></td><td>Stefan Monnier</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--compressed56.webm">Download --compressed56.webm (28.8MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bindat--turbo-bindat--stefan-monnier--main.webm">Download --main.webm (36.6MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/test">Test blocks</a></td><td>Eduardo Ochs</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--compressed56.webm">Download --compressed56.webm (7.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-test--test-blocks--eduardo-ochs--main.webm">Download --main.webm (10MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a></td><td>Mohsen BANAN</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--compressed56.webm">Download --compressed56.webm (20.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.webm">Download --main.webm (32.5MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a></td><td>Matthew Zeng</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--compressed56.webm">Download --compressed56.webm (10.7MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.webm">Download --main.webm (13.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/imaginary">Imaginary Programming</a></td><td>Shane Mulligan</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan.pdf">Download .pdf</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--compressed56.webm">Download --compressed56.webm (19.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.webm">Download --main.webm (32.2MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/clede">CLEDE: the Common Lisp Emacs Development Environment</a></td><td>Fermin MF</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--compressed56.webm">Download --compressed56.webm (24.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.webm">Download --main.webm (39.8MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/maintainers">How to help Emacs maintainers?</a></td><td>Bastien Guerry</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--compressed56.webm">Download --compressed56.webm (9.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.webm">Download --main.webm (14.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/build">How to build an Emacs</a></td><td>Fermin MF</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--compressed56.webm">Download --compressed56.webm (15.5MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.webm">Download --main.webm (18.7MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/forever">M-x Forever: Why Emacs will outlast text editor trends</a></td><td>David Wilson (System Crafters)</td><td><ul><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters.org">Download .org</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--compressed56.webm">Download --compressed56.webm (27.6MB)</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--chapters.vtt">Download --chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2021/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.webm">Download --main.webm (51.4MB)</a></li></ul></td></tr>
+<tr><td><a href="/2021/talks/day2-close">Closing remarks day 2</a></td><td></td><td><ul></ul></td></tr></table><div class="cancelled">Cancelled:<ul><li><a href="/2021/talks/dsl">Self-Describing Smart DSL's: The Next Magits</a> - Psionic</li>
<li><a href="/2021/talks/devel">Don't write that package! or: How I learned to stop worrying and love emacs-devel</a> - Stefan Kangas</li>
<li><a href="/2021/talks/rust">Extending Emacs in Rust with Dynamic Modules</a> - Tuấn-Anh Nguyễn</li>
<li><a href="/2021/talks/bug">Let's talk about bug trackers</a> - Bastien Guerry</li></ul></div> \ No newline at end of file
diff --git a/2021/schedule.md b/2021/schedule.md
index 943d7938..cbf61f19 100644
--- a/2021/schedule.md
+++ b/2021/schedule.md
@@ -1,17 +1 @@
-[[!meta title="Schedule"]]
-[[!meta copyright="Copyright &copy; 2021 Amin Bandali and Sacha Chua"]]
-
-EmacsConf 2021 was on November 27 (Sat) and November 28 (Sun),
-2021 from 9am-~5:30pm Toronto/EST time; equivalently, 6am-2:30pm PST,
-2pm-10:30pm UTC, 3pm-11:30pm Zurich/CET, 7:30pm-4:00am(next-day) India/IST, 10pm-6:30am GMT+8. You
-can also get this in [iCalendar format](https://media.emacsconf.org/2021/emacsconf.ics), and there's
-some experimental code over at
-<https://git.emacsconf.org/emacsconf-el/> for downloading the
-schedule and updating an Org file with the data.
-
-You can also view all the videos and download resources from the index of [[all EmacsConf 2021 resources|all]].
-
-There was also an alternate stream for APAC hours, see
-<https://libreau.org/upcoming.html#emacsconf21>.
-
-[[!inline pages="internal(2021/schedule-details)" raw="yes"]]
+[[!meta redir=/2021/talks]]
diff --git a/2021/sidebar.md b/2021/sidebar.md
index 7d2183af..7257fdcf 100644
--- a/2021/sidebar.md
+++ b/2021/sidebar.md
@@ -4,7 +4,7 @@
---
-* [[**Schedule**|schedule]]
+* [[**Schedule**|talks]]
* [[**All resources**|all]]
* [[Posters|poster]]
* [[Prepare]]
diff --git a/2021/talks.md b/2021/talks.md
index 83cc52ad..f36b0f86 100644
--- a/2021/talks.md
+++ b/2021/talks.md
@@ -1 +1,18 @@
-[[!meta redir=/2021/schedule]]
+[[!meta title="Schedule"]]
+[[!meta copyright="Copyright &copy; 2021 Amin Bandali and Sacha Chua"]]
+[[!sidebar content=""]]
+
+EmacsConf 2021 was on November 27 (Sat) and November 28 (Sun),
+2021 from 9am-~5:30pm Toronto/EST time; equivalently, 6am-2:30pm PST,
+2pm-10:30pm UTC, 3pm-11:30pm Zurich/CET, 7:30pm-4:00am(next-day) India/IST, 10pm-6:30am GMT+8. You
+can also get this in [iCalendar format](https://media.emacsconf.org/2021/emacsconf.ics), and there's
+some experimental code over at
+<https://git.emacsconf.org/emacsconf-el/> for downloading the
+schedule and updating an Org file with the data.
+
+You can also view all the videos and download resources from the index of [[all EmacsConf 2021 resources|all]].
+
+There was also an alternate stream for APAC hours, see
+<https://libreau.org/past.html#emacsconf21>.
+
+[[!inline pages="internal(2021/schedule-details)" raw="yes"]]
diff --git a/2021/talks/babel.md b/2021/talks/babel.md
index 19fa63f5..cd28d54b 100644
--- a/2021/talks/babel.md
+++ b/2021/talks/babel.md
@@ -7,6 +7,8 @@
# Babel for academics
Asilata Bapat
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/babel-schedule)" raw="yes"]]
Plain org-mode is already an extremely powerful and
@@ -54,6 +56,28 @@ would also like to be inspired by other people's babel workflows!
IRC nick: asilata
+Pad:
+
+- Q1: The talk was amazing thanks! I show the img inline in the Org
+ file with org-toggle-inline-images, maybe useful to others too.
+ - A: Thanks! I do that if I want to look at previews, too, but
+ sometimes it slows down my document. Any tips for that?
+- Q2: I always tried to use Tikz for showing diagrams in Org Mode
+ documents, but dot code blocks definitively make drawing graphics
+ easier! Thanks for sharing!
+ - Remark by Karl: In my personal workflows, I love the abstraction
+ layer of <https://plantuml.com/>
+
+From BBB:
+
+- Don't have a question, just to say inspiring to see how you use org-mode + babel. Thx!
+- Ha, a question, is your setup online somewhere?
+- Asilata Bapat: <https://github.com/asilata/emacsconf2021>
+- thanks so much for the presentation and sharing the details of your workflow
+- I particularly appreciated your "causal use" of skel :D
+
+IRC:
+
- the export-setup block is a great use case for orgstrap :)
- asilata: I was just thinking that after the orgstrap presentation :)
- Man I was just wondering how to write LateX in Emacs this is incredible.
@@ -69,13 +93,15 @@ IRC nick: asilata
- some very nice examples of wicked-cool org stuff there :)
- I also use python to generate latex from babel so that I don't mess things up
-From BBB:
+From [YouTube](https://www.youtube.com/watch?v=1Ooi4KAd2FM&feature=em-comments):
-- Don't have a question, just to say inspiring to see how you use org-mode + babel. Thx!
-- Ha, a question, is your setup online somewhere?
-- Asilata Bapat: <https://github.com/asilata/emacsconf2021>
-- thanks so much for the presentation and sharing the details of your workflow
-- I particularly appreciated your "causal use" of skel :D
+- Cool talk! I suggest to export your diagrams to some vector format (PDF, SVG, etc.) if you (as you say) embed it in LaTeX/PDF later. Otherwise, you can see blur on a large enough scale.
+
+
+Links:
+
+- <https://asilata.github.io/ggm/2021/>
+- <https://github.com/asilata/emacsconf2021/>
# Speaker information
- Name pronunciation: /ˈəsɪʟət̪ɑ ˈbɑpəʈ/ UH-si-luh-tah BAH-putt
diff --git a/2021/talks/bidi.md b/2021/talks/bidi.md
index 6038cf48..5669a817 100644
--- a/2021/talks/bidi.md
+++ b/2021/talks/bidi.md
@@ -127,6 +127,36 @@ of bidi on existing emacs applications, including:
# Discussion
+Pad:
+
+- Q1: is there any additions that you have to add to emacs for using
+ non-English/latin characters or does it work mostly out of the box? 
+ - A: [Prot] :  I only set the default-input-method to "greek".
+ Then switch to it with C- (toggle-input-method)
+- Q2: One stuggle I have with this input method option is, why not use
+ an IME that's installed on the host OS?
+ - A:I live inside Emacs, and that the host OS typically provides
+ an unintelligent keyboard, and Farsi and transliterate BANAN
+ provides multi-character input, which is a lot more powerful.
+- Q3: Do you write any lisp or other code/markup with these scripts?
+ (Sorry if I missed you mentioning this.)
+ - A:No, everything is in pure Elisp.
+- Q4: What alternatives have you looked into for solving the problem
+ related to your markup language idea? What isn't achieved by them?
+ - A:The way that Emacs has evovled about properties about string
+ and text. And I suggest we adopt the "web" model for Emacs
+ application development. If you step back and look at where we
+ are, there's no such thing as no 'emacs native markup language
+ mode' similar to HTML for web.  Emacs's display engine is
+ capable of doing everything, but we're not exposing ....
+ (sorry, missed this part)
+ - Makes sense to me, thanks!
+- Q5: bandali: genenrally curious about the state of writing/reading
+ Persian in the TTY
+- Q6: Does your input method also solves problems with exporting
+ doctuments ? usually when  you exporting a Persian-Enlight doc it
+ redirects the Persian scripts to LTR
+
Questions/comments:
- Thanks for giving such a nice presentation of the Emacs input method framework! I'm just curious about if you've made any plans for setting up your markup language? I know you said you hadn't written any code for it yet.
diff --git a/2021/talks/binary.md b/2021/talks/binary.md
deleted file mode 100644
index 8181050c..00000000
--- a/2021/talks/binary.md
+++ /dev/null
@@ -1,31 +0,0 @@
-[[!meta title="Turbo Bindat"]]
-[[!meta copyright="Copyright &copy; 2021 Stefan Monnier"]]
-[[!inline pages="internal(2021/info/binary-nav)" raw="yes"]]
-
-<!-- You can manually edit this file to update the abstract, add links, etc. --->
-
-
-# Turbo Bindat
-Stefan Monnier
-
-[[!inline pages="internal(2021/info/binary-schedule)" raw="yes"]]
-
-Bindat is an ELisp library to help manipulate binary data.
- This is a niche library that is used by packages such as Websocket,
- EMMS, and cpio-mode. Its implementation was repeatedly caught
- harassing hapless kitten while at the same time providing poor
- service slowly. For Emacs-28, Bindat was rewritten so as
- to make it more efficient and flexible while respecting the kitten.
- In this presentation I intent to show how we saved those.
- Not recommended for birds.
-
-- ~20 minutes:
- 5 min: Intro and presentation of Bindat
- 5 min: Showcase some of its problems
- 5 min: Present the new design
- 5 min: Examples of what can be done with it
-
-
-[[!inline pages="internal(2021/captions/binary)" raw="yes"]]
-
-[[!inline pages="internal(2021/info/binary-nav)" raw="yes"]]
diff --git a/2021/talks/bindat.md b/2021/talks/bindat.md
index 87da714b..e9cfffaa 100644
--- a/2021/talks/bindat.md
+++ b/2021/talks/bindat.md
@@ -25,8 +25,58 @@ show how we saved those. Not recommended for birds.
# Discussion
+- Q1: bindat seems very similar to GNU Poke (except that GNU Poke is a
+ superset, and then some, with a different syntax). I'm wondering if
+ it might be good to add a bindat variant that translates to/from
+ Poke if need be (using libpoke), for sheer insane blazing
+ native-code JITted speed. (And, later, maybe letting bindat gain
+ some of the insanely expressive capabilities GNU Poke has got). Its
+ use of eval blocked this in times past. but now...
+ - A:GNU Poke is indeed the natural evolution, and is much more
+ powerful.  Given the fairly little use of BinDat so far, I'm
+ not sure there will be enough motivation to give access to GNU
+ Poke from Emacs, tho.  One of the main benefits of using GNU
+ Poke would probably be that lots of formats are already
+ available for GNU Poke, so you could directly re-use them.
+- Q2: Is your dog's name something Lisp or PL related...? :)
+ - A:Winnie?  I don't think so, no (we didn't choose the name, in
+ any case)
+- Q3: This looks amazing!  Is it merged into mainline Emacs, a patch,
+ an external library?
+ - A: It's in Emacs-28
+- Q4: Are there benchmarks of this vs. the older bindat?
+ - A:There is a benchmark for it in the `elisp-benchmarks`
+- Q5: Do you know of any CL or Scheme libs similar to bindat.el?
+ - A: No, but I'd be interested to hear about it if someone else
+ does.
+- Q7:  You are a hero of kittens everywhere.  Do you have any feline
+ pets as well?  :)
+ - A: Not yet.  If you're near Montreal and you have a kitten for
+ me, I'm interested
- I *hope* cl-loop is more efficient than building a bunch of intermediate lists when you chain map/filter/reduce operations.
+- Curious: how is gnu poke more flexible?
+- What hobbies/interests do you have besides Emacs (and PL)? :)
+- do you have any thoughts about how to make EmacsConf even better next year?
+- I was surprised to see that a whole new DSL was developed for poke from scratch. Do you think would have been better to develop/improve a library like bindat on top of an existing language instead?
+- What are some of your favorite talks from this conf so far?
+- what kind of dog is Winnie?
+ - comment: I hadn't heard of that breed before
+- How do you see more control over types (type hints/decl through type specifiers etc) (SBCL like programming model) coming into Elisp?
+- Do you plan to add bit-level support?
+Other comments:
+
+- I can imagine using bindat to improve Emacs's music player packages
+- yes last year the Q&A periods were much longer
+ - last year some of the presentations were live though
+- I've asked this question to them during LPC 2020 but infact haven't got a very satisfactory answer :)
+- If you ever write a library for window management in Emacs, you could call it winnie.el :)
+- hints in unoptimized code should be assertions
+- we probably need both ways of compiling: safe and less safe :)
+- I think this is classic problem that is almost impossible to accomplish. many libraries try to do that but in the end the only working ones are relaying on C compilers.
+- also you have the problem of size of objects. like how big is a long? this is not specified and is arch dependent
+- parsing a generic .h file is way more difficult but is another subject.
+- yep, the automatic translation is more for libraries trying to write automatically C bindings
[[!inline pages="internal(2021/captions/bindat)" raw="yes"]]
diff --git a/2021/talks/build.md b/2021/talks/build.md
index 7ec0da46..c8edc0d8 100644
--- a/2021/talks/build.md
+++ b/2021/talks/build.md
@@ -8,10 +8,16 @@
# How to build an Emacs
Fermin MF
-
-
[[!inline pages="internal(2021/info/build-schedule)" raw="yes"]]
+[[!template id="help"
+summary="main talk does not have captions"
+volunteer="João Pedro"
+tags="help_with_main_captions"
+message="""This talk does not have captions yet. Would you like to help [caption this talk](/2021/contribute/#edit-captions)? You may be able to start with these
+[autogenerated captions](https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf--main.vtt)
+and [timing information](https://media.emacsconf.org/2021/emacsconf-2021-build--how-to-build-an-emacs--fermin-mf.en.srv2)."""]]
+
This is a deep dive in the Emacs philosophical and technical
aspect on what makes our beloved GNU Emacs
what it it. It's also a talk about the early LISP machines and
@@ -30,6 +36,19 @@ For more details about CEDAR: <https://gitlab.com/sasanidas/cedar>
# Discussion
+Pad:
+
+- Q1: Which level of compatibility with GNU Emacs do you want to achieve?
+ - A: I want to achieve 100% compatibility (when possible)
+- Q2: Are you then planning to reimplment all Emacs C primitives?
+ - A:No, the underlayer would be different
+- Q3: Do you plan on doing something to ease interaction between redundant "components" in both Elisp and Common Lisp (like CLOS and EIEIO)? How about semantic differences between both?
+ - A: (Probably answered by voice.)
+- Q4: Have you used Nyxt, which is Emacs-like and written in Common Lisp? If so, what did you think about it?
+ - A: I think it's a great project and I would like to use it as a my main Browse (with the firefox extension layer)
+- Q5: "Emacs is a great operating system, just lacking a good editor." How do you feel about the push to use Emacs as a full computing interface, and do you think Cedar could thrive in some of the fully common lisp system ideas that might catch on (like Robert Strandh's proposed CLOSOS)?
+ - A: I think CEDAR can achieve more integration with the OS (the same as the CL implementations) but I think the goal of been a good Emacs is good enought
+
IRC nick: akrl
- I think the performance stuff is mostly orthogonal to elisp. ex. very large files or files with really long lines grind horribly.
diff --git a/2021/talks/clede.md b/2021/talks/clede.md
index 71178af7..59bb10f6 100644
--- a/2021/talks/clede.md
+++ b/2021/talks/clede.md
@@ -5,11 +5,9 @@
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-# CLEDE the Common Lisp Emacs Development Environment.
+# CLEDE the Common Lisp Emacs Development Environment
Fermin MF
-
-
[[!inline pages="internal(2021/info/clede-schedule)" raw="yes"]]
I've been developing a package that helps with the development of
@@ -30,6 +28,15 @@ For more details: <https://gitlab.com/sasanidas/clede>
and then An explanation on how to use the package, how to extend it
and the future of it.
+# Discussion
+
+Pad:
+
+- Q1: You mentioned clede-start - is there also some kind of clede-stop? (I often get frustrated with functionality that I cannot disable / revert)
+ - A: There is no stop, you should never stop doing common lisp :)
+- Q2: Is writing common lisp a big context switch between elisp?
+ - A: In some regards, it is, Ithink even more when you work Common Lisp professionally.
+
[[!inline pages="internal(2021/captions/clede)" raw="yes"]]
diff --git a/2021/talks/cs.md b/2021/talks/cs.md
index 931b323e..0b1fb3ad 100644
--- a/2021/talks/cs.md
+++ b/2021/talks/cs.md
@@ -8,7 +8,7 @@
# One effective CS grad student workflow
Greg Coladonato
-
+[[!taglink CategoryOrgMode]]
[[!inline pages="internal(2021/info/cs-schedule)" raw="yes"]]
@@ -24,6 +24,27 @@ inspire others to build workflows that make them more productive.
IRC nick: gcoladon
+Pad:
+
+- Q1: Can org-roam also be used with EPUB files? It would be nice to
+ make notes for books as well.
+ - A: Interesting question -- I've never considered doing it that
+ way. When there is a textbook I want to take notes on, I find
+ the PDF for the textbook and split it into one PDF file per
+ section or chapter, and then use those PDFs just like any other
+ PDFs. What do you like about EPUB files?
+- Q2: How does pdf-tools not being maintained as it used to affect
+ you. Since emacs have replaced image magic library and pdf-tools is
+ dependent on it how are you going to transition your work flow?
+ - A: Hmm I have not considered this at all. Is there some time in
+ the near future at which pdf-tools will stop working on the
+ current version of Emacs? I was not aware of that if that's the
+ case. Thanks for bringing that to my attention!
+- Q3: Your workflow is very impressive.  Would it be possible that you
+ share your emacs configuration files? (via email)
+ - A: Yes, I will work on collecting up the bits of elisp that make
+ up that configuration and share it , probably via Github gist. 
+
BBB:
- I'm trying to develop one, but haven't spent enough time on it. (My interests are mostly related to programming language standards and history, and the PDFs are generally enormous and inscrutable.)
diff --git a/2021/talks/dashboard.md b/2021/talks/dashboard.md
index d20c3804..53572fff 100644
--- a/2021/talks/dashboard.md
+++ b/2021/talks/dashboard.md
@@ -54,6 +54,24 @@ easily managed from Emacs within a single Org-Mode file.
# Discussion
+- Q1: I know almost nothing about this stuff so please forgive my
+ ignorance (Actually, I did I dip a toe into some basic jail
+ breakage a few years ago and was delighted/intimidated to find a
+ capable community on mobilereads, as you mentioned; I was living
+ cheaply at the time, and having KUAL and KO and kterm around
+ improved my QOL considerably.) As for your talk, I enjoyed it very
+ much.  I was wondering if you'd given any thought to possible
+ real-world applications for your dashboards. Just spitballing a
+ bit, a few possibilities came to mind, like perhaps disseminating
+ information on a work floor or lab setting where cable runs or
+ temperature increases from LCD monitors might be unwelcome; or
+ perhaps doing so in more a public setting like a refugee or
+ detention camp where power might be limited and where mounting TVs
+ behind protective glass or restraining them with cables might be
+ bad for morale.  Also, have you thought about putting together
+ and/or selling "kits" so folks with limited time could acquire a
+ basic setup as a turnkey solution (perhaps with some assembly
+ required)? Thanks.
- Hi. Lovely idea to use an ebook reader as dashboard. Are all kindle devices supported or only older ones?
- Mehmet Tekman: I recorded this in two parts: with caffeine, and without
- As soon as i can get my hands on a kindle i will give this a try. Lovely Idea.
@@ -76,6 +94,16 @@ easily managed from Emacs within a single Org-Mode file.
- Mehmet Tekman: Welcome! For a more stripped down version I can really heavily recommend the kindle-dashboard from Pascal Widdershoven
- Mehmet Tekman: And yep -- I can definitely relate!
+Links:
+
+- Main Repo : <https://gitlab.com/mtekman/kindle-sync>
+- Mobile Read Forum (Kindle) :
+ <https://www.mobileread.com/forums/showthread.php?t=180113>
+- Mentioned Repos :
+ - <https://gitlab.com/mtekman/org-calories.el>
+ - <https://github.com/takaxp/org-tree-slide>
+ - <https://github.com/pascalw/kindle-dash>
+
# Outline
- 5-10 minutes:
diff --git a/2021/talks/day1-close.md b/2021/talks/day1-close.md
index 7c825a63..0425d237 100644
--- a/2021/talks/day1-close.md
+++ b/2021/talks/day1-close.md
@@ -21,12 +21,20 @@
# Discussion
+- Q1: To anyone who can answer this, what is a good method to request
+ speakers for next EmacsConf?
+ - A: Encourage the speaker directly when you see the next call for proposals.
+- Q3: Is there a way to donate to the volunteers of EmacsConf?
+ - A: sachac: That's very thoughtful of you! We cover EmacsConf costs out of pocket. I think the speakers have some support links on their pages. So if you particularly liked a talk, please feel free to e-mail a speaker or see if they have a tip jar!
+ - sachac: also, if you want to contribute time by volunteering to help with EmacsConf this year or next year, that would be even better =) For example, it was super-helpful to have a couple of volunteers help me caption all the day 1 talks and most of the day 2 talks this year, _and_ they got early access to all the talks and could caption the talks they wanted. We did the captioning using subed.el in Emacs, using the speakers' Org files or autogenerated captions from Youtube as starting points.
+ - sachac: for example, if some people could help with streaming alternate tracks, we could have longer talks and longer Q&As, because I think we're just going to have more and more awesome Emacs talks, and I think we're reaching the limit of how much we can physically squeeze into two days ;) so our current strategy is lots of short talks/demos, and then people can learn more about the stuff that they find interesting. but it would be so nice to have more deep dives too.
+ - I think having alternate tracks is a great idea sachac, I think I noticed that speakers were very rushed because time was tight, and it'd be cool to that have that alleviated. And it would likely reduce stress for you guys so that technical issues aren't as dire.
+ - maybe if we can figure out some topics that would be good to dive deeper into (attendee feedback) that could be looked in to
+- Q4: How can we sign up to volunteer for next year if there is need?
+ - A: <https://emacsconf.org/2021/contribute/> has some ideas and
+ an e-mail address you can reach us at.
+
- Is there any documentation anywhere how to give financial support to EmacsConf?
- - sachac: That's very thoughtful of you! We cover EmacsConf costs out of pocket. I think the speakers have some support links on their pages. So if you particularly liked a talk, please feel free to e-mail a speaker or see if they have a tip jar!
- - sachac: also, if you want to contribute time by volunteering to help with EmacsConf this year or next year, that would be even better =) For example, it was super-helpful to have a couple of volunteers help me caption all the day 1 talks and most of the day 2 talks this year, _and_ they got early access to all the talks and could caption the talks they wanted. We did the captioning using subed.el in Emacs, using the speakers' Org files or autogenerated captions from Youtube as starting points.
- - sachac: for example, if some people could help with streaming alternate tracks, we could have longer talks and longer Q&As, because I think we're just going to have more and more awesome Emacs talks, and I think we're reaching the limit of how much we can physically squeeze into two days ;) so our current strategy is lots of short talks/demos, and then people can learn more about the stuff that they find interesting. but it would be so nice to have more deep dives too.
- - I think having alternate tracks is a great idea sachac, I think I noticed that speakers were very rushed because time was tight, and it'd be cool to that have that alleviated. And it would likely reduce stress for you guys so that technical issues aren't as dire.
- - maybe if we can figure out some topics that would be good to dive deeper into (attendee feedback) that could be looked in to
- maybe each presentation should allocated five or ten minutes for a Q&A session afterwards before the next presentation starts.
- the subtitles are really good! you can tell it was human-written :) even nasty names are right
- Love the citations in subtitles.
diff --git a/2021/talks/day1-open.md b/2021/talks/day1-open.md
index 8c3f4b3b..47bc4a0b 100644
--- a/2021/talks/day1-open.md
+++ b/2021/talks/day1-open.md
@@ -19,7 +19,7 @@
- Lots of talks! Shorter time, Q&A might be live/pad/IRC, might have alternate stream if needed
- Streaming with open captions thanks to volunteers - all the day 1 talks have been captioned, and we might get day 2 sorted out too
- Prerecorded videos will be published as soon as we can (aiming for publishing them as the talks stream, so you can easily catch up with any talks you've missed)
- - APAC-time-friendly alternate stream by LibreAustralia folks <https://libreau.org/upcoming.html#emacsconf21>
+ - APAC-time-friendly alternate stream by LibreAustralia folks <https://libreau.org/past.html#emacsconf21>
- Thanks
- Speakers, volunteers
- Karl Voit for managing the pad
diff --git a/2021/talks/design.md b/2021/talks/design.md
index 943114b4..84a89de9 100644
--- a/2021/talks/design.md
+++ b/2021/talks/design.md
@@ -38,6 +38,50 @@ alternatives using GNU Emacs.
# Discussion
+- Q1: Do you have any plans for somewhat scientific testing of colors,
+ layout, etc?
+ - A: There are already some studies on the usefulness of
+ colorization but they're not consistent. I would love to make a
+ study with some students but it's a bit beyond my expertise.
+- Q2: I have really enjoyed looking at the development of NANO emacs.
+ The only thing I slightly disagree with are the colours: on my
+ system some of them are extremely low-contrast and faded. Otherwise
+ the design is fantastic! Do you have any comments on the colour
+ scheme?
+ - A: I think you're right and I might need to revise the color
+ scheme, taking inspiration (or copying) some of the colors from
+ modus themes since Prot designed proper colors backed by
+ scientific theory.
+- Q3: Are your examples hand-selected from design-perspective or does
+ "everything" look good automatically with your setup?
+ - A: Screenshots I've shown are available on GitHub and you
+ should obtain the same if you install them. Some parts come from
+ my personal configuration (org-agenda and mu4e mostly) but I can
+ post the code if you're interested.
+- Q4: Should we use monocromatic colour schemes over full-coloured
+ ones?
+ - A: I'm not sure I can answer this question, I would need to
+ search if there are any recommendation on that matter.
+- Q5: Are there ways that emacs could be improved to make these kinds
+ of usability experiments easier and more accessible to users? For
+ example making it easier to switch between such experiments?
+ - A: <https://github.com/plexus/chemacs> is a perfect answer. It
+ allows you to switch from one configuration to another without
+ messing up your own.
+- Q6: Would it be possible to integrate nano emacs design to default
+ emacs design? What would the pushback be for integrating "better"
+ UI changes?
+ - A: I think Emacs would benefit from better defaults and I would
+ vote for modus themes to be the new default theme. Next would be
+ to package Emacs with a decent font (e.g. Julia Mono, Iosevka,
+ Inconsolata, Victor Mono) that would really help changing the
+ first impression of new users. Last would be to tweak a the
+ mode-line a bit.
+- Q7:Spellchecking now highlights the whole word, to me this is a bit
+ too emphasized. Are there plans to make these less intrusive; i.e.
+ underline or similar? (And no, no bright red crinkles ;)
+ - A: Good point, can you open an issuer on GitHub?
+
- What's this theme?
- i'll be sharing this with my friends that praise on vscode
- Wow, incredible analysis of that editor.
@@ -59,6 +103,8 @@ alternatives using GNU Emacs.
- hmmm maybe Emacs needs to be able to handle WOFF! sounds like a job for fontconfig, I might look at it some day
- Nano Emacs + modus-themes would be a perfect combination, as it were.
+- From [YouTube](www.youtube.com/watch?v=7OTe26RZH9A&feature=em-comments): Great efforts & I'm rooting for you! but you might consider rebranding, because of the GNU nano text editor (22 years of recognition)
+
# Contact information
* Contact [nicolas.rougier@inria.fr](mailto:nicolas.rougier@inria.fr)
* Follow my work at [github.com/rougier](https://github.com/rougier)
diff --git a/2021/talks/eaf.md b/2021/talks/eaf.md
index 78a52c78..3c8f9bf3 100644
--- a/2021/talks/eaf.md
+++ b/2021/talks/eaf.md
@@ -17,8 +17,73 @@ last year, this talk will briefly go over them.
# Feedback
+Pad:
+
+- Q1: is there any additions that you have to add to emacs for using
+ non-English/latin characters or does it work mostly out of the box? 
+ - A: [Prot] :  I only set the default-input-method to "greek".
+ Then switch to it with C- (toggle-input-method)
+- Q1: Any plans for supporting other languages? It'd be great to use EAF to offload processing to Common Lisp, for example.
+ - A: You're able to use Python & JavaScrpt/Vue to extend on top of Elisp, it is so far enough (Python for Qt apps and JS for web apps). Currently I don't see a clear advantage of using Common Lisp as well, but there could definitely be a support in theory.
+- Q2: is there an eaf-app that's not a bootstrapping nightmare? (having Vue as a dependency, eg)
+ - A: I don't fully understand what you mean by "bootstrapping nightmare", all these dependencies are system dependencies that you install like any other system dependency, it doesn't slow the Emacs startup nor the system startup. But if you're asking for an app suggestion with lightweight dependencies without JS or Vue dependencies, the popular EAF Browser and EAF PDF Viewer are cool app options.
+- Q3: Are there security implications to having a browser in emacs?
+ - A [opalvaults]: With how Emacs deals with things like GPG/pass/etc. I feel like it's probably as secure as you make it?
+ - A: [matthewzmd] the browser application is independent from emacs itself, you're using a browser in emacs, but the browser is not actually *in* emacs. The browser is QtWebEngine, a modified Chromium without Google stuff, it is as safe as a Chromium can be.
+- Q4: maybe i misunderstood, but is every eaf app essentially embedded QT?
+ - A: yes, it's built upon qt-webengine
+ - A: Yes, it uses PyQt5 and it's essentially painting the Qt frame on top of emacs, simulating a buffer. EPC is used for Elisp <-> Python <-> JS communication so that you can extend Emacs in various langauges
+ - Q: I guess/hope this is using qtwebengine, not qtwebkit?
+ - A: right, qtwebengine. If you wanna dig more into the internals of EAF, I suggest you to read this part of the Wiki (https://github.com/emacs-eaf/emacs-application-framework/wiki/Hacking) or my talk from last year (https://emacsconf.org/2020/talks/34/)
+- Q5: Can the EAF dependencies be made into dynamically loadable modules for Emacs, so there will be no need to rebuilt Emacs?
+ - A: There is no need to rebuilt Emacs, they're simply dependencies that you can install using the system package managers (pacman, apt, etc), npm install and pip install
+
IRC nick: matthewzmd
+- Q1: Any plans for supporting other languages?  It'd be great to use
+ EAF to offload processing to Common Lisp, for example.
+ - A: You're able to use Python & JavaScrpt/Vue to extend on top
+ of Elisp, it is so far enough (Python for Qt apps and JS for web
+ apps). Currently I don't see a clear advantage of using Common
+ Lisp as well, but there could definitely be a support in theory.
+- Q2: is there an eaf-app that's not a bootstrapping nightmare?
+ (having Vue as a dependency, eg)
+ - A: I don't fully understand what you mean by "bootstrapping
+ nightmare", all these dependencies are system dependencies that
+ you install like any other system dependency, it doesn't slow
+ the Emacs startup nor the system startup. But if you're asking
+ for an app suggestion with lightweight dependencies without JS
+ or Vue dependencies, the popular EAF Browser and EAF PDF Viewer
+ are cool app options.
+- Q3: Are there security implications to having a browser in emacs?
+ - A [opalvaults]: With how Emacs deals with things like
+ GPG/pass/etc. I feel like it's probably as secure as you make
+ it?
+ - A: [matthewzmd] the browser application is independent from
+ emacs itself, you're using a browser in emacs, but the browser
+ is not actually *in* emacs. The browser is QtWebEngine, a
+ modified Chromium without Google stuff, it is as safe as a
+ Chromium can be.
+- Q4: maybe i misunderstood, but is every eaf app essentially embedded
+ QT?
+ - A: yes, it's built upon qt-webengine 
+ - A: Yes, it uses PyQt5 and it's essentially painting the Qt
+ frame on top of emacs, simulating a buffer. EPC is used for
+ Elisp <-> Python <-> JS communication so that you can extend
+ Emacs in various langauges
+ - Q: I guess/hope this is using qtwebengine, not qtwebkit?
+ - A: right, qtwebengine.  If you wanna dig more into the
+ internals of EAF, I suggest you to read this part of the
+ Wiki
+ (<https://github.com/emacs-eaf/emacs-application-framework/wiki/Hacking)>
+ or my talk from last year
+ (<https://emacsconf.org/2020/talks/34/)>
+- Q5: Can the EAF dependencies be made into dynamically loadable
+ modules for Emacs, so there will be no need to rebuilt Emacs?
+ - A: There is no need to rebuilt Emacs, they're simply
+ dependencies that you can install using the system package
+ managers (pacman, apt, etc), npm install and pip install
+
- One thing I never tried watching all this is viewing PDF files within emacs.
- is there an eaf-app that's not a bootstrapping nightmare? I suppose having Vue as dependency makes that not so for a large number
- This is pretty cool, from a security standpoint, I'm not sure I'd want a web browser in emacs all that much.
@@ -31,6 +96,17 @@ IRC nick: matthewzmd
- I guess/hope this is using qtwebengine, not qtwebkit? ('cos qtwebkit is unmaintained and by now massively insecure)
- matthewzmd: if you wanna dig more into the internals of EAF, I suggest you to read this part of the Wiki (<https://github.com/emacs-eaf/emacs-application-framework/wiki/Hacking>) or my talk from last year (<https://emacsconf.org/2020/talks/34/>)
+Links and other notes:
+
+- <https://github.com/emacs-eaf/emacs-application-framework>
+- <https://github.com/emacs-eaf/eaf-file-manager>
+- <https://github.com/emacs-eaf/eaf-rss-reader>
+- <https://github.com/manateelazycat/popweb>
+- if you wanna dig more into the internals of EAF, I suggest you to
+ read this part of the Wiki
+ (<https://github.com/emacs-eaf/emacs-application-framework/wiki/Hacking)>
+ or my talk from last year (<https://emacsconf.org/2020/talks/34/)> 
+
[[!inline pages="internal(2021/captions/eaf)" raw="yes"]]
[[!inline pages="internal(2021/info/eaf-nav)" raw="yes"]]
diff --git a/2021/talks/faster.md b/2021/talks/faster.md
index e8a13489..0434db61 100644
--- a/2021/talks/faster.md
+++ b/2021/talks/faster.md
@@ -30,6 +30,59 @@ Preferred contact info | <dgutov@yandex.ru>
IRC nick: dgutov
+Pad:
+
+- Q1: Why are overlays slow compared to text-properties? I (believe
+ to) understand that it is (in part only?) due to "get element n in
+ vector vs list". If so, then why don't we change that? There could
+ be a text-property called "overlays", so that lookup would also be
+ like in a vector. What benefits does the datastructure currently
+ used for overlays have that make that undesirable? Would a mixed
+ approach make sense; i.e. allow non-modifiyng lookups to use the
+ "cached" overlays that are stored in the "overlay" text-property
+ and make text-inserting and overlay-moving actions store in the
+ currently used datastructure as well as in the indirect
+ text-property=>overlay cache?
+ - A: "There is a pending patch to represent the set of a
+ buffer's overlays as an AAtree or somesuch.."
+ - Sounds promising :)
+ - For more details, check out these threads:
+ - <https://lists.gnu.org/archive/html/emacs-devel/2014-09/msg00616.html>
+ - <https://lists.gnu.org/archive/html/emacs-devel/2016-11/msg00475.html>
+ - <https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00565.html>
+ - <https://lists.gnu.org/archive/html/emacs-devel/2019-12/msg00115.html>
+- Q2: As a non-programmer, would these sorts of optimizations be
+ helpful to do on a personal init.el file?
+ - A: Probably not
+ - Though too much mode-line customisation may slow things down.
+- Q3: What's a good approach for benchmarking destructive
+ operations?  If you delete elements from a list in-place, all
+ subsequent runs will be artificially fast.
+ - A: There is an example of a comparison between operations from
+ different libraries in the example file provided by the talk.
+ Particularly check the benchmarks for delete and remove
+ operations (destructive and non-destructive, respectively).
+- Q4:Cl-lib constructors, getters, and setters usually expand into
+ multiple levels of let-bindings. AFAIU, every let-binding is an
+ extra memory allocation. Do you recommend avoiding cl-defstruct in
+ favour of "pure" lists/vectors?
+ - A: basically no. if defstruct allows you to organise better, go
+ ahead.
+- Q5: Is it possible to optimize some emacs packages by making use of
+ code compiled from other languages (like C or Common Lisp) ((i.e. in
+ the same way python is able to import C code))?
+ - A: yes emacs modules allow you to run C or Rust, transitioning
+ between emacs proper and module (passing the data) might slow
+ things down? Because of copying that's necessary to avoid
+ issues with gc.
+- Q6:You mentioned that overlays are much slower compared to text
+ properties. What about text properties vs. buffer-local variables to
+ store position cache?
+ - A: I haven't measured it but offhand I'm going to guess that
+ buffer-local variables will be faster.
+ - Also depends on the structure you're going to use for the
+ cache - is it a single cons, or a list, or a tree, etc.
+
BBB:
- AVL tree
@@ -53,6 +106,28 @@ IRC:
- For more info about the performance of overlays vs text properties data structure, there's an Emacs TODO about it. C-h C-t and search for "Move overlays to intervals.c".
- cl-defstruct getters/setters have compiler macros that expand into simple aref calls on vectors, they are very efficient
+Links:
+
+- you might find the this bench-multi-lexical macro useful:
+ <https://alphapapa.github.io/emacs-package-dev-handbook/#outline-container-Optimization>
+ or
+ <https://github.com/alphapapa/emacs-package-dev-handbook#bench-multi-lexical> 
+- <https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/emacs-lisp/elp.el>
+- <https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/emacs-lisp/benchmark.el>
+- "Use hash tables kids!"
+- PSA: buffer-local-value is generally much faster than
+ with-current-buffer if all you need to do is get the value of a
+ variable in a buffer 
+- EIEIO's object construction is slow because it goes through
+ `make-instance` which is a generic function and it itself calls
+ various other generic functions, so there's a lot of cl-generic
+ dispatch overhead; and then there's the fact that the (keyword)
+ arguments are laboriously parsed at run-time so it itself is slow as
+ well.
+- There is a pending patch to represent the set of a buffer's
+ overlays as an AAtree or somesuch.
+- <https://media.emacsconf.org/2021/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov.el>
+
[[!inline pages="internal(2021/captions/faster)" raw="yes"]]
[[!inline pages="internal(2021/info/faster-nav)" raw="yes"]]
diff --git a/2021/talks/forever.md b/2021/talks/forever.md
index 98df1104..f8c29489 100644
--- a/2021/talks/forever.md
+++ b/2021/talks/forever.md
@@ -20,6 +20,42 @@ regardless of mainstream popularity.
# Discussion
+
+Pad:
+
+- Q1: In your opinion, what is Emacs achilles heel? It's obviously a powerful tool, but no tool is perfect. What would make your life easier in day to day use with Emacs (either a package you wish existed, or a core Emacs infrastructure change).
+ - A: (Probably answered by voice.)
+- Q2:Comparing Emacs just to *code* editors is not a good measure as Emacs is so much more; GTD, word processor, (reference) organizer, or recently expressed on reddit as being a text productivity platform.
+ - A: (Probably answered by voice.)
+- Q3: What is your opinion about the documentation of Emacs in another language in addition of english. There aren't too much non-english community. The people from another non-english countries should write documentation in own language or in english?
+ - A: (Probably answered by voice.)
+- Q4: Do you think more effort should be made to popularize hacking on the C-parts of Emacs? It seems that this is the achilles-heal for the the long-term maintainance of Emacs, if less and less people understand what is going on underneeth eval and apply.
+ - A: (Probably answered by voice.)
+- Q5: Can you name a couple or a few features from other programming languages that you miss in Emacs Lisp?
+ - A: (Probably answered by voice.)
+- Q6: A lot of people take issue with Emacs commitment to to Free Software. They claim it holds it back, and that it should be more "pragmatic". What are your oppinions on this?
+ - A: (Probably answered by voice.)
+- Q7: Do you think that packages like Magit or Org-Mode make people see Emacs as an obstacle to these applications they want to use? Is this an issue, or should it be seen as an opportunity to teach them about Emacs/Free Software?
+ - A: (Probably answered by voice.)
+- Q8: Should Emacs continue to present itself as a esotetic program and culture? Or should we try to dispell the myth, and make clear that anyone can use it, not just extreem entusiasts? Or is this needed to motiviate people to invest time into properly learning Emacs?
+ - A: (Probably answered by voice.)
+- Q9: Do you think there could be changes made to the core of Emacs that would betray the ethos you (and most people here) appriciate? I am thinking of points that some of Emacs' critics demand, to allegedly make Emacs more popular. Do you think this is a realistic threat, or could we save ourselves by forking?
+ - A: (Probably answered by voice.)
+- Q10: The kids want to know : when an ongoing joint video collaboration between @daviwil and @protesilaos?
+ - A: (Probably answered by voice.)
+- Q11: If you had to choose between graphics layer (2D & 3D), or "real" browser support inside Emacs, which would you choose?
+ - A: (Probably answered by voice.)
+- Q12: How'd you feel on being an Emacs focused Youtuber? Do you think Youtube generates a lot of new users?
+ - A: (Probably answered by voice.)
+- Q13: There might once have been a debate whether to add more typesetting capablities to emacs to make it more of a word processor or work on the core performance issues. The current work on native compilation and the community's response to that work show users are actually very interested in perfomance enhancements. What is your opinion on it?
+ - A: (Probably answered by voice.)
+- Q14: Can you give us a sneak peek of what's coming in the YouTube Channel soon?
+ - A: (Probably answered by voice.)
+- Q15: what about guix ? videos about emacs and guix
+ - A: (Probably answered by voice.)
+- Q16: Are you interested in making Youtube videos on the new cool things happening in Emacs, like EAF or Nyxt?
+ - A: (Probably answered by voice.)
+
BBB:
- Hey Daviwil, I'm curious if you'll do a video showing your personal workflow?
@@ -56,6 +92,16 @@ IRC:
- The concurrent pushes for reproducible science, literate programming, literate devops, and so on, also contribute to making the case for Emacs & Org-mode
- the performance point is spot on. That is one of the main reason why the neovim community is thriving
+- From [YouTube](https://www.youtube.com/watch?v=9ahR5K_wkNQ&feature=em-comments):
+ - Emacs has changed the way I use my computer. It is absolutely
+ amazing. I use Emacs to: write latex files, write code, organize my life
+ (with the help of org mode), check my email, use git , use terminal etc.
+ Actually I have recently switched my desktop environment to exwm and it is
+ perfect for my workflow. I guess nothing can beat this tool.
+ - What I noticed from one graph you showed was that most people using stack overflow also use visual studio code, is there a correlation there I wonder.
+ - As for Google analytics ranking, some other factors to consider: - What percentage of emacs users search via Google? I may be wrong, but I think emacs users are more likely to use alternative search engines like Duck Duck Go. - There is so much help info built into emacs compared to other editors that is easy to look up right from inside our editor, I wonder what percentage of the searches on Google for the other editors are basic usage questions of the kind emacs users wouldn't need to search online for? I don't know how much weight these factors have in skewing results, but as you said, it doesn't really matter!
+ - This goes too show in 2004 less people where on the internet and most of then where hard core programmers, and now with more an more people coming into tech , new peeps just want to code and don't care about tools as much . So yeah , I am grateful to you david for introducing me to emacs even though I am too in this new wave
+
# Outline
- Discuss the core thesis, the features that make Emacs
diff --git a/2021/talks/form.md b/2021/talks/form.md
index 093887ed..41ef151c 100644
--- a/2021/talks/form.md
+++ b/2021/talks/form.md
@@ -18,6 +18,8 @@ Preferred contact info: ian@retrospec.tv / ieure on Libera
[[!inline pages="internal(2021/info/form-schedule)" raw="yes"]]
+<http://atomized.org/blog/2021/11/28/old-mccarthy-had-a-form/>
+
Most practical languages are multi-paradigm, offering several
abstractions for the programmer. But did you know that Emacs Lisp
comes with a powerful system for object-oriented programming? Join me
@@ -28,6 +30,40 @@ modular, flexible Emacs Lisp.
IRC nick: ieure
+- Q2: AFAIK, EIEIO is generally slower than, e.g. cl-defstructs.  When
+ do you think EIEIO is not suitable for performance reasons?
+ - A: I agree with Dmitry: first make it work, then make it fast. 
+ I don't think there's a blanket reason not to use EIEIO, but
+ definitely profile if you're using it in a performance-critical
+ context.  EXWM is one project that uses EIEIO extensively and
+ seems to perform well, so I don't think it's off-limits for
+ performance-critical code.
+- Q3: Do you have any tips about introspection?  e.g. IIRC there's an
+ EIEIO introspection facility, though it may be somewhat primitive.
+ - A: It is somewhat primitive, but seems to work okay
+ (<https://www.gnu.org/software/emacs/manual/html_node/eieio/Introspection.html)>. 
+ I haven't found a need for anything fancier (yet).
+- Q4: Have you used any of the EIEIO-related serialization tools? 
+ IIRC there are some limitations with regard to printable/readable
+ values.
+ - A: I haven't had call for this, but
+ <https://www.gnu.org/software/emacs/manual/html_mono/eieio.html#eieio_002dpersistent>
+ is the mechanism (for anyone wondering)
+- Q5: I did not get how generic functions can work with non class
+ objects
+ - A: Dynamic dispatch is very powerful!
+- Q6:So with that Emacs is on pair with Smalltalk development
+ environments now (?)
+ - A: Not very familiar
+- Q7: Most of what you presented can be done without `defclass`. 
+ AFAICT, the only exception is *multiple* inheritance (since
+ `cl-defstruct` also supports single inheritance via `:include`).
+ - A: Yes, you can mix and match structs/objects or any other
+ type.  You need classes if you want the EIEIO customization
+ editing facility or MI.  I think also `initialize-instance` is
+ class-only, so you need classes if you have to do some kinds of
+ complex (cross-slot) initializtaion.
+
- I didn't know that custom.el works with EIEIO that way, very nice
- Dang Ian. What a talk, great demos.
- Wow, that's a great talk.
@@ -45,7 +81,11 @@ IRC nick: ieure
- ieure: This is the thing that implements (thing (eql :whatever)) specialization, should be a good starting point if you want (thing (string-match-p "^foo")): <https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/emacs-lisp/cl-generic.el#n1164>
- thanks for the pointer, but I think I have some more pressing cl-defgeneric reimplementations to make before I touch that
- ieure: Extremely fair. One thing I didn't get to touch on is that you can extend generic functions from anywhere. So you don't have to patch up cl-generic.el, you can define a new method for a generic function defined anywhere, in any file. Which rules.
+- This is not a question: Brilliant title for the presentation. :)
+
+Links:
+- <https://www.gnu.org/software/emacs/manual/html_mono/eieio.html>
# Outline
- What is EIEIO?
diff --git a/2021/talks/freedom.md b/2021/talks/freedom.md
index 9328e7ae..0b2af117 100644
--- a/2021/talks/freedom.md
+++ b/2021/talks/freedom.md
@@ -8,6 +8,8 @@
# How Emacs made me appreciate software freedom
Protesilaos Stavrou
+[[!taglink CategoryPhilosophy]]
+
[[!inline pages="internal(2021/info/freedom-schedule)" raw="yes"]]
The theme will be "how Emacs empowered my software freedom".
@@ -40,9 +42,30 @@ by it and thus reserve the right to modify it ahead of the main event.
Questions:
+- Q1:  (Unrelated, feel free not to answer): Is there an Emacs or
+ GNU/FSF group in Cyprus? I know it's a politically motivated
+ country, with a strong student-base, so I'm interested whether the
+ Emacs circles and political circles have any overlap.
+- Q2: What do you think is the most effecitve way to demonstrate the
+ value of software freedom to non-techincal people? For a person who
+ can't program (or doesn't want to learn) the freedom seems less
+ immediate.
+- Q3: your quote "emacs makes emergent workflow's possible" reminds
+ me very much of the previous talk (Emacs as Design Pattern
+ Learning). Can you share/reflect how you go about making/designing
+ your personal workflows?
- are "Prometheas" & "Prometheus" both forms acceptable? Is one "truer" than the other?
- protesilaos: Both are correct. The former is modern Greek.
+Other notes:
+
+- Emacs documentation is first class.
+- Emacs is inclusive to both new users and experienced users alike,
+ which empowers all users.
+- Knowledge is to be shared not hoarded..
+- Emacs is an ecosystem you have to spend a lot of time with to fully
+ appreciate.
+
Feedback:
- "I'll definitly use this talk to try to convert more colleagues :D (not joking)"
@@ -58,3 +81,4 @@ Feedback:
[[!inline pages="internal(2021/captions/freedom)" raw="yes"]]
[[!inline pages="internal(2021/info/freedom-nav)" raw="yes"]]
+
diff --git a/2021/talks/frownies.md b/2021/talks/frownies.md
index ff5514b4..87320134 100644
--- a/2021/talks/frownies.md
+++ b/2021/talks/frownies.md
@@ -15,7 +15,7 @@ extensible; in fact, that's probably the biggest reason it's still
being used after 40+ years of existence, and even has enough clout to
generate an entire conference in its name. In this medium-length
presentation, I will add another point to the data set proving Emacs's
-abilities, by narrating the latest package I made, \`frowny.el\`, from
+abilities, by narrating the latest package I made, `frowny.el`, from
its conception to its current, nearly-completed state.
I wrote frowny.el to scratch someone else's itch as a joke on IRC, but
@@ -38,15 +38,37 @@ teeth into.
- [my Mastodon account](https://writing.exchange/@acdw) (though I'm moving to
[tiny.tilde.website](https://tiny.tilde.website/@acdw) ... soon™)
-## Other notes
+# Discussion
-- Compulsively C-q anything electric. Don't need a hook when you've got one in your brain.
+- How do we obtain frowny.el?
+ - A: Please check <https://github.com/duckwork/frowny.el>
+- What was the funniest time a frown emerged from unintended code?
+ Or any similar occurrence.
+ - A: I frown a lot when I'm problem solving ;)
+- What packages you used for writing?
+ - A: I just use org-mode for its markup. If you mean the
+ presentation, I think... org-present?
+- You wrote the package quite fast. Would you say you knew what
+ you were going to program before you did it? Or was it iterative
+ process? 
+ - A: pretty iterative, but very fast b/c it's a small project
+ space!
+- from chat (Cairn): do you have a personal site?
+ - A: <https://www.acdw.net>
+- not related to the talk, but on a different note: I like the
+ emacs background image used in the video stream. is it available
+ somewhere for download? :-)
+ - A: <https://emacsconf.org/i/emacsconf-logo1-256.png> (nervous
+ laugh)
+- Why host it on GitHub? or codeberg.org, or sr.ht, or (non-)GNU savannah, or your own server
- Does frowny work with ;)
+
+- Compulsively C-q anything electric. Don't need a hook when you've got one in your brain.
- TBH you should transform it into a patch for electric-pair-mode
- So I want to contribute to Emacs, but I don't know enough elisp. Perhaps I could contribute some documentation? But I have no idea what that would be...
-- From the speaker: i'd love ot hear more about licensing, basically i don't care how my stuff is used at all
-- Why host it on GitHub? or codeberg.org, or sr.ht, or (non-)GNU savannah, or your own server
-- do you have a personal site?
+- From the speaker: i'd love to hear more about licensing, basically i don't care how my stuff is used at all
+
+- From [YouTube](https://www.youtube.com/watch?v=CZn_H93wc5A&feature=em-comments): Hey Case! Thanks for the great talk. I feel like I have had a similar experience to yours by also learning from vanilla Emacs. I like how you're showcasing how easy it is to scratch your own itch in Emacs.
Feedback:
@@ -55,6 +77,15 @@ Feedback:
- These ‘how I got suckered into programming emacs by [hilariously trivial thing]’ are always fun.
- frowny.el shows how writing a package can help learn things---all sorts of things to consider and lots of "aha!" moments
+Links:
+
+- <https://breadpunk.club>
+- /r/emacs - <https://old.reddit.com/r/emacs>
+- Planet Emacs - <https://planet.emacslife.com>
+- HISTORY.org - <https://github.com/duckwork/frowny.el/blob/main/HISTORY.org>
+- <https://github.com/duckwork/frowny.el>
+
+
[[!inline pages="internal(2021/captions/frownies)" raw="yes"]]
[[!inline pages="internal(2021/info/frownies-nav)" raw="yes"]]
diff --git a/2021/talks/imaginary.md b/2021/talks/imaginary.md
index 0f9a030c..01f1e7a7 100644
--- a/2021/talks/imaginary.md
+++ b/2021/talks/imaginary.md
@@ -33,6 +33,30 @@ GPL. Please keep an open mind.
IRC nick: libertyprime
+Pad:
+
+- Q1: Do you have a site we can follow more of your writing on?
+ - A:Pen.el Tutorial: https://semiosis.github.io/posts/pen-el-tutorial/
+ - https://semiosis.github.io/posts/ilambda-tutorial/
+ - https://emacsconf.org/2021/talks/imaginary/
+- Q2: re slide 27, would it mean that 2 such "idefined" functions would be the "same", meaning do the same thing the same way, given that they are defined without a "body"? (i'm trying to get a better grasp on the objects that get so "imagined" under the hood)
+ - A: The first time a function is run with given parameters, the results are remembered. I use the memoize library. You can update the function every time by surrounding the call the the function with the (upd ...) macro. The body evaluation is completely short-circuited with idefun. The imacro works a bit differently. It will generate real code. You can use the normal macro-expand on an imacro.
+- Q3:Opalvaults :What are some underlying concepts/papers, that we could read to become more familiar with your overarching ideas? (i.e. for instance things that inspired your ideas)
+ - A: paper: pretrain, prompt and predict
+- Q4: Sorry, I just don't get it: How is a function that does something different each time it's called useful?
+ - A: Each time you run one of these functions, you are getting the computer to imagine for you. It's a bicycle for the imagination. You can automate the filtration of the results you want, say by doing many generations and applying grep, or other prompts such as the semantic search prompt to the results. The functions are memoised, so they technicaly do the same thing every time if you want them to. Also, if you use a temperature of 0 for the prompt functions (I demonstrate how to override that, somewhere in the slides), it will be deterministic too, even when bypassing the cache.
+- Q5: How on earth do you ensure that what ilambda gets back from GPT-3 is Lisp and not, say, Harry Potter fanfic? :)
+ - A: A combination of good prompt design, filtering the results, and validating the results. Also, you can fine-tune models to the task you want to eliminate the possibility of unwanted generations.
+- Q6: Your views on the pluses and minuses of GPT-3?
+ - A:It's something we have to live with because of its transformative nature on computing. These language models unfortunately are license-blind.
+- Q7: Any interesting ideas about potential applications of GPT-3 to Emacs itself (or Emacs-adjacent things)?
+ - A: Emacs is the ultimate text-centric operating system. It will become a kernel for AGI, I think. That's what I plan on making. The power-user's terminal of human-ai interaction. I'm trying to extend as many modes in emacs as possible. Org-brain, eww browser, org-mode, comint, emacs lisp primitives, etc.
+- Q8: Follow-up on Q2: how does infering functions in this manner differ from, say, how in the Haskell ecosystem functions are infered by specifying inputs and return type (such as when searching for a suitable function for a given purpose)?
+ - A: Where in haskell, type-declarative function search look through a discrete set of functions by type, the domain of possible functions that are search for using language models is qualatively and quantatively infinite.
+- Q9: Are you deriving functions from their names? What do you do when this is ambiguous - for example, when the name of the function is "get-element-from-pair"?
+ - A: idefun will infer computation and short-circuit the code. Given either 'function name', alone, function name + args, or function name, + args + docstring, or function nae + args + docstring + function body, it will make use of the context you have provided and imagine evaluation. It will create functions which infer rather than properly evaluate, based on merely the name of the function, for example.
+ - A (re: ambiguity): If you had an imaginary defun for this, you'd need to send the final list
+
BBB:
- libertyprime: What kinds of software is IP (imaginary programming) not suitable for?
@@ -108,7 +132,7 @@ BBB:
- libertyprime: Yeah, so the best way to interact with these types of chatbots is to imagine the situation you are in before hand. the initial phrases can be anything you can think of really. Why are you in the bath tub?, for example. But I tend to open with something like, may I interrupt? What were you just working on? so by choosing the prompt very carefully, you can tease out the information you require.
- libertyprime: <https://semiosis.github.io/nlsh/> and this, which is a natural language shell
- libertyprime: I also have a way to filter results semantically, with my semantic search prompt <http://github.com/semiosis/prompts/blob/master/prompts/textual-semantic-search-filter-2.prompt>
-- libertyprime: YOu can run all these prompts also from bash like so: pl "[\"It's cool. I used to dance zouk.\",\"I don't know.\",\"I'm not sure.\",\"I can't stop dancing to it.\",\"I think it's ok.\",\"It's cool but I prefer rock and roll.\",\"I don't know. It sounds good.\",\"Nice but a bit too fast,\"Oh, I know zouk, you can teach it to me.\",\"Zouk is nice.\"]" | "penf" "-u" "pf-textual-semantic-search-filter/2" "positive response". That will pipe json results into Pen.el, and have it filtered. all prompting functions are also available as shell commands.
+- libertyprime: YOu can run all these prompts also from bash like so: pl "["It's cool. I used to dance zouk.","I don't know.","I'm not sure.","I can't stop dancing to it.","I think it's ok.","It's cool but I prefer rock and roll.","I don't know. It sounds good.","Nice but a bit too fast,"Oh, I know zouk, you can teach it to me.","Zouk is nice."]" | "penf" "-u" "pf-textual-semantic-search-filter/2" "positive response". That will pipe json results into Pen.el, and have it filtered. all prompting functions are also available as shell commands.
- well I think this is the coolest thing I've seen in a long time. how do we follow up with you and get involved? run it etc?
- libertyprime: hehe thanks aindilis: i'm on #emacs as libertyprime. Feel free to hit me up any time. Otherwise, the setup for pen.el is fairly straight forward. If you have any issues demoing, I'd be very interested, so I can make Pen.el more reliable. I have a discord server. I'll copy the link. One sec
- Do you think you could run an IRC channel too?
@@ -139,7 +163,10 @@ IRC:
- is it still invite only?
- no, it's been opened recently
+From [YouTube](https://www.youtube.com/watch?v=pJm4TaCyDnk&feature=em-comments):
+- Is this Emacs with smooth scrolling? How is that possible? I tired that really hard. Or is it just a PDF reader?
+- Lets go!!!!! Imaginary Programming all the way.
# Outline
diff --git a/2021/talks/invoice.md b/2021/talks/invoice.md
index 43e8a845..c3534656 100644
--- a/2021/talks/invoice.md
+++ b/2021/talks/invoice.md
@@ -8,6 +8,8 @@
# Find Your (In)voice: Emacs for Invoicing
Bala Ramadurai
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/invoice-schedule)" raw="yes"]]
[[!table header="no" class="speaker-details" data="""
@@ -50,6 +52,8 @@ We will use the following packages:
- The accounting system transactions are a nice touch
- it's really hard to tell that came from org :)
- European format would be DD.MM.YYYY and not with dashes which can be mixed up with ISO or other formats. in the UK it's often with slashes: DD/MM/YYYY
+- From [YouTube](https://www.youtube.com/watch?v=b__d04aHEbI&feature=em-comments): This looks great! Much better than my amateurish attempts. Thanks!!!
+
[[!inline pages="internal(2021/captions/invoice)" raw="yes"]]
diff --git a/2021/talks/janitor.md b/2021/talks/janitor.md
index 5fb6b78c..ab903616 100644
--- a/2021/talks/janitor.md
+++ b/2021/talks/janitor.md
@@ -21,6 +21,56 @@ Because of a reckless former Emacs maintainer that shall
# Discussion
+Pad:
+
+- Q1: How did you narrow to two specific areas in a single buffer when
+ compering the two functions. I can be handy 
+ - A:In this case I just split the window into 2.  In other cases I
+ use `M-x smerge-make-conflict`.  Oh wait, did you really mean
+ "narrow"?  I don't use narrowing, I only use
+ outline-minor-mode (with reveal-mode to un-hide as I move)
+ - I will look into both work flows they look very handy. Thanks.
+- Q2: Could you further elaborate on quoting functions with #'fun
+ (aka (function fun)) instead of 'fun (aka (quote fun))?
+ - A:Not sure what further elaboration you want (e.g. "why?" or
+ "when?")
+ - I would like why? Is it just style since Emacs understand both,
+ or not?
+ - The why is to be more explicit (i.e. a form of documentation, so
+ as a reader I can see that this refers to the function rather
+ than being just a use of a symbol for other purposes)).  The
+ compiler knows about it and will hence give you a warning if you
+ refer this way to a function it's not aware of.  There are also
+ corner cases where the two behave differently, mostly when
+ referring to a function defined via `cl-flet` or `cl-labels`
+ (or `named-let`, ...)
+ - Thanks!
+- Q3: Stefan, you mentioned a lot of conventions, I really like to
+ read more about them: Where can I find a list of these conventions
+ (like #'function for functions )? Is there a page or info about
+ ELisp conventions used nowadays? 
+ - A:Good question.  We have several of them documented in the
+ ELisp reference manual (searching for "convention" should get
+ you there), but that only covers those conventions with which
+ Emacs maintainers agree.  Others are much less clearly
+ formalized.  I seem to remember someone collecting such
+ information and making a webpage out of it, but I can't
+ remember where nor who it was.
+ - Probably,
+ <https://github.com/alphapapa/emacs-package-dev-handbook>
+ - Thanks! I'll take a look at the reference manual and search for
+ this information. 👍
+- Q4: Stefan, that was really amazing to watch. After the changes you
+ made, how confident are you that the package still works as
+ intended? It seems as though there might be some room for errors
+ that the byte compiler wouldn't necessarily catch.
+ - A: I think for those three packages I'm quite confident that
+ they should work as well as before.  Not because the compiler
+ did not complain but because the changes were sufficiently
+ simple.  Sadly in ELisp, I can't rely on the compiler to catch
+ errors.  I can only use it ask it to point me to suspicious
+ code, and I know that it will miss some.
+
BBB:
- I couldn't help but note that in the C world we are more and more making large-scale changes like this to the whole tree at once using tools like coccinelle. it feels like the regular structure of Lisp would lend itself to this very well... It feels like a better use of your time, is all :)
diff --git a/2021/talks/maintainers.md b/2021/talks/maintainers.md
index 8a542316..8a39e41a 100644
--- a/2021/talks/maintainers.md
+++ b/2021/talks/maintainers.md
@@ -18,6 +18,40 @@ care of Emacs maintainance by taking care of Emacs maintainers.
# Discussion
+Pad:
+
+- [[!template text="Q1: How did you come up with this knowledge? By doing or by experience or by reading books (which?)?" start="00:04:30.840" video="qanda" time="1" id=subtitle]]
+ - A: All 3 of them.
+ - He was reading the book: Fred turner : counter culture to cyberculture
+ - The other one he mentioned appears to be Eghbal, Nadia [Stripe Press] (2020) Working in public: the making and maintenance of open source software
+- [[!template text="Q2: (Maybe answer this last, if time permits) How did you come to start using Org?" start="00:06:10.000" video="qanda" time="1" id=subtitle]]
+ - A: Bastien started with his own library BHL and was introduced/invited to contribute to Org by Carsten.
+- [[!template text="Q3: 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?" start="00:08:39.720" video="qanda" time="1" id=subtitle]]
+ - A: (Probably answered by voice.)
+- [[!template text="Q4: What do you think about the latest Orgdown thing? (Yes, it's me, Karl :-) )" start="00:35:32.840" video="qanda" time="1" id="subtitle"]]
+ - A: (Probably answered by voice.)
+- Q5: Could you settle this "Org" vs "Org-mode" vs "orgmode" vs ... once and for all (i.e. which one, capitalized how, and where)? :)
+ - A: (Probably answered by voice.)
+- [[!template text="Q6: Does this mean that you do not need to be technical to be(come) a maintainer? Would that really work?" start="00:15:09.880" video="qanda" time="1" id="subtitle"]]
+ - A: The co-maintainer could be a person with less technical background.
+- [[!template text="Q7: If time — what does the day of the orgmode maintainer look like? Lots of hours of work every day? Spread out?" start="00:17:24.520" video="qanda" time="1" id="subtitle"]]
+ - A: Not always. Last two months "MIA." Bastien wants to step down as maintainer but wants to prepare project/community for the next maintainer. "When I was working hard on this it was something like two hours a day. But usually it would be 2-4 hours per week." Most of time spent on mailing list (Bastien notes that he likes mailing list isn't split between users/developers).
+- [[!template text="Q8: Thanks for the hard work. Which place is the right place to request a dark mode for orgmode.org website ?" start="00:10:55.200" video="qanda" time="1" id="subtitle"]]
+ - A: write an email to the Org-mode team. This seems to be a reasonable request.
+- [[!template text="Q9: 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" start="00:21:11.800" video="qanda" time="1" id="subtitle"]] (in contrast to "every person take an issue of their own choosing", which leaves parts of maintenance and documentation neglected)? From personal experience, sometimes it can be easier for those to be told "hey, we need this area maintanined, or a focus on contribution to this particular area". If we take a page from Catalonian Spain of the early 1900's, even the most decentralized organizations have to dedicate certain persons to specific tasks. Sorry for the long winded question.
+ - A: (Probably answered by voice.)
+- [[!template text="Q10: 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" start="00:24:21.440" video="qanda" time="1" id="subtitle"]] incluence org? Key areas where org is clearly "leading the way"?
+ - A: "Org is to Emacs was Emacs is to computer systems"
+- [[!template text="Q11: Could you expound a little on what's happening with contrib ... I'm a little confused. Mechanics/technical. " start="00:27:52.320" video="qanda" time="1" id="subtitle"]]
+ - (Karl: Do you mean technically "how to migrate" or the background why this happened? I personally did the conversion this week. I got the separate repository (or package) and had to do more local "use-packages" (the way of loading elisp files in my setup) and that's it. The hard thing was to find out which error refers to which org file to load separately.) Thanks. Seems like time for bankrupcy again :-/.
+ - A: contrib = stuff that didn't go to Emacs (copyright assignment not necessary). This was not a clean solution because it was mixed with copyright-transferred files in the same repository. New contrib goes now to "non-GNU" which is a clear separation according to copyright assignments. The way to install Org is via Org MELPA and contrib for Non-GNU MELPA. YES. THANKS.
+- Q12: (Maybe not a question, just an observation) I like the analogy to gardening. FOSS projects seem much like community gardens. Also, shepherding seems like an apt analogy; I could imagine files having "shepherds" :)
+ - A: (Probably answered by voice.)
+- [[!template text="Q13: Has splitting contrib actually reduced maintenance load? Is it too soon to tell? (I have found that splitting repos ultimately increases maintenance overhead due to multiplying" start="" video="qanda" time="1" id="subtitle"]] release overhead etc.)
+ - A: It is clearly easier now and less confusing for contributors. org-contrib is soon to die: packages will be moved to their own packages since contrib was founded when there was no packaging around.
+- Q14: So was BHL the basis for org-export?
+ - A: https://bzg.fr/en/theorgfather/
+
BBB:
- agreed, I appreciate that the list isn't split.
@@ -30,7 +64,7 @@ BBB:
- interestingly Timothy has solved most of the markdown &> org
- plain orgmode is easy to visualize. with markdown you need to export this if you have many md lines. org tables is a clear example of the visualization
- I think the argument of the best syntax is a hard battle to fight, but where the bar is clear is the software (org-mode) and what it can do with it, as of today.
-- FYI org-sidebar provides a backlinks tool
+- [[!template text="FYI org-sidebar provides a backlinks tool" start="00:54:54.080" video="qanda" time="1" id="subtitle"]]
- Backlinks! Yes!
- Backlinks for me: <https://karl-voit.at/2020/07/22/org-super-links/>
- was going to say : many of the org-roam features should make their way into core org-mode eventually
@@ -41,6 +75,7 @@ BBB:
- it is a hard problem
BBB feedback:
+
- Thank you for taking the time to share your accumulated wisdom with us, Bastien :)
- merci Bastien!
diff --git a/2021/talks/model.md b/2021/talks/model.md
index 17ee1022..ad33ff8f 100644
--- a/2021/talks/model.md
+++ b/2021/talks/model.md
@@ -53,7 +53,27 @@ who don't possess the neccessarry technical skills to adjust it themselves, but
are keen to learn it, and potentially how to attract more users to greater
productivity, computer literacy and the ideas of free software.
-
+# Discussion
+
+- Q1: What is the URL of your web page? I guess the URL on your slide
+ is currently not available (see links below).
+ - A: The URL written is correct, but unfortunately the website is
+ down due to some misconfiguration and will be back soon. You can
+ contact me at laszlo.lk@protonmail.com until it is resolved
+- Q2: It is important to note that for EAF to extend to the web apps
+ you mentioned (Asana, Jira) in a deeper way than just displaying the
+ web app using EAF Browser, the APIs of these web apps need to be
+ exposed too.
+ - A:Exactly, otherwise only a one way update would be possible. As
+ long as they have integration with other external tools, there
+ must be a closed API documentation for making it work.
+
+Links:
+
+- different form
+ <https://github.com/emacs-eaf/emacs-application-framework> in that
+ the goal here is not to do everything in emacs buffers.
+- <https://github.com/ag91/emacs-with-nyxt>
# Outline
diff --git a/2021/talks/mold.md b/2021/talks/mold.md
index 95e55e03..7c5eb707 100644
--- a/2021/talks/mold.md
+++ b/2021/talks/mold.md
@@ -39,12 +39,68 @@ You can learn more about this at: <https://github.com/ag91/moldable-emacs>
IRC nick: `andrea
+Pad:
+
+- Q1: How to find a balance between «generic» molds that do not
+ provide specific enough info vs writing a new mold for every new
+ query/question?
+ - A: You can write molds that are private for your special
+ problem. I created molds for my work that I don't share: like
+ find the stories I am working on and how long time I spent on
+ tasks lately. Also, moldable-emacs is to make these tools easy
+ to write, so you should free to throw away tools when you need
+ them once only. If I believe a tool is a good start for many
+ other tools, I put them among the core molds, else if I use them
+ often I store them as contrib. If it is a one off, I throw it
+ away.
+- Q2: How would you evaluate this workflow for package managemnt in
+ large independent codebases. Can one integrate it with code sematic
+ analyzers to make for a better work flow?
+ - A: moldable-emacs is about creating custom tools you can apply
+ to your situation. I started experimenting with molding NPM json
+ packages + security data from OWASP to view/display security
+ issues in my packages to my colleagues in the past.
+ moldable-emacs gives me the infrastructure to answer my question
+ about security, and I now started asking myself about
+ architecture coherence, so I have scaled up tree-sitter over
+ projects to check that modules don't use packages from other
+ modules. By that I mean that as long as your code semantic
+ analyzers output data, you can mold that (context) data to tell
+ your story (answer the question you have). Does this answer your
+ question?
+ - You answered it very well. I am also a security auditor for
+ multiple development teams. And I am incharge of code analysis
+ in an understaffed security team. So your usecase example got my
+ usecase spot on. 
+ - Cool! For now you can define insecure patterns using tree-sitter
+ expressions (for example, I find a variable called "password"
+ in the code set to a string. For the package.json I linked to
+ OWASP API and looped through the packages using tree-sitter
+ tokens. I didn't get there, but I wanted to see an Org Mode
+ buffer with the list of the most vulnerable deps highlighted by
+ color + how to solve them: so I could pass them to developers to
+ resolve them (I am a dev, but sometimes others don't know about
+ security risks).
+ - Often molds are to tell stories to others.
+ - This is probably the most important thing for my personal
+ usecase. Thank you very much. Now it's my turn to learn it and
+ use it well. 
+ - Please open issues or email me, and I will try to help if you
+ like how it works :)
+ - I'll do so.
+
+IRC:
+
- cool...so essentially you are developing a text based version of Glamorous Toolkit.
- `andrea: yup, but only because I don't have good imaging in Emacs yet (but with tui.el...)
- your talk helped a lot with that though. I'd been seeing posts from you for a little while, but now I "get it"
- `andrea: yeah sorry, I am still building my vision: it may look I have been all over the place (image recognition, editing css, parse English lately), but the common thread is the easing of creation of micro tools that help me tell the stories I need
- I love your approach of mining other 'nuggets' from other contexts and bringing them to Emacs. I really look forward to looking in to your work and see if I can implement some of it. Thank you so much for your talk.
+Links:
+
+- Telling a story about code using buffer views <https://moldabledevelopment.com/>
+
# Outline
- 5-10 minutes: quick demo of moldable-emacs
diff --git a/2021/talks/molecular.md b/2021/talks/molecular.md
index bd768c8b..3cc7d829 100644
--- a/2021/talks/molecular.md
+++ b/2021/talks/molecular.md
@@ -8,7 +8,7 @@
# Reproducible molecular graphics with Org-mode
Blaine Mooers
-
+[[!taglink CategoryOrgMode]]
[[!inline pages="internal(2021/info/molecular-schedule)" raw="yes"]]
@@ -48,6 +48,37 @@ from Org-mode documents.
# Discussion
+Pad:
+
+- Q1:  Do you also do any hydrogen-bond analysis in your workflows?
+ Also, could your snippet library be extended for other non-python
+ simulation programs like GROMAC?
+ - A: Yes, i have a snippet that generate publication qualtiy
+ hydrogen bonds. Yes, I have thought of making snippet library
+ molecular simulation like Gromacs and AMNER and drug design
+ software packages like autodock Vvna and rdkit. They can help
+ lower the barrier to entry. I made library for crystallographic
+ computing with CCTBX for use in Jupyter. I should make it
+ available for org-mode.
+- Q2: We've seen a few talks regarding managing academic papers and
+ citations in emacs/org, what does your workflow look like?
+ - A: I switched to Emacs as my primary editor 3 months ago. I have
+ yet to write a paper in Org. I am very comfortable with LaTeX
+ and I have been writing my papers on Overleaf in LaTeX for
+ several years. I used bibtex and JabRef to manage by refernces.
+ I have started playing by org-ref. It looks super promising.
+- Q3: Hi Blain, you mentioned that you have been able to come back to
+ a file years later, how do you manage the environment that the org
+ file executes in?
+ - A: Good question. The PyMOL code is good for years so the images
+ should be reproducible regardless of the version of org.
+ PyMOL's domain specific language is very stable. The Python
+ code largely just wraps around the DSL code.
+- Q4: Have you used Org Mode and pyMOL for publications? Could you
+ share a link to any of them?
+ - A: I have yet to use org in a publication. The first step will
+ be to use it for supplemental material.
+
BBB discussion:
- We've seen a few talks regarding managing academic papers and citations in emacs/org, what does your workflow look like?
@@ -64,6 +95,7 @@ BBB discussion:
- Blaine: Good question. The PyMOL code is good for years so the images should be reproducible regardless of the version of org.
BBB feedback:
+
- Blane, great job with the talk. Awesome presentation.
- I know people loved it in the IRC chat :D
- I can share that I was excited to see how you made things so seamless and integrated feeling into Emacs. The results are really eyepopping.
diff --git a/2021/talks/montessori.md b/2021/talks/montessori.md
index b10396c8..8c734ad9 100644
--- a/2021/talks/montessori.md
+++ b/2021/talks/montessori.md
@@ -7,6 +7,7 @@
# Emacs and Montessori Philosophy
+[[!taglink CategoryPhilosophy]]
[[!inline pages="internal(2021/info/montessori-schedule)" raw="yes"]]
@@ -19,6 +20,154 @@ drives present in everybody that allow us to explore and make sense of our world
# Discussion
+- Q1:  Would you say that the Montessori philosophy follows a "verb"
+ based methodology, where an abstract action is performed on an item,
+ without locking the action to what the item can support, like an
+ Object-oriented language would do? 
+ - e.g.  `throw(rock)` instead of `rock.throw()`, i.e. a
+ function in a global namespace, instead of a function belonging
+ to an object?
+ - A: i'd like to think about this some more, but honestly i think
+ its a bit of both? there's certainly some things I can think of
+ that are more like `rock.throw()`... Here are the things you
+ can do with these materials, and that is it. On the other hand,
+ I've certainly seen inventive uses of educational materials
+ that follow more of a `throw(pencil)` type of thing.
+ - The philosophy is highly observation based, so I'm thinking
+ about the difference of something like `Child::new.learn()` vs
+ `learn(some-child)`.  In this case I do feel like the "verb"
+ based methodology is more appropriate. We need to stop and
+ observe a child, to notice what is driving them, what they're
+ responding to, and where they are in their abilities. Depending
+ on our observations, we may offer different kinds of input. Its
+ certainly much less like "oh i have another Child object and I
+ need to have them do x, y, z" in order to get to point B.
+ - I hope this somewhat answers the question. I'll keep pondering
+ :)
+ - Thank you, I guess some children favour one method over
+ another, but it's not as black and white as I initially
+ thought. Thanks!
+- Q2: How old do you think childen need to be to start exploring with
+ Emacs?
+ - A: Children 0-6 are in a phase called the "absorbent mind". It
+ is this miraculous superpower that children have to absorb
+ everything around them. The ability to learn language is
+ probably the most obvious example. So, if children can interact
+ with Emacs, they can start exploring it. Of course, as a text
+ editor, basic literacy is pretty important.  I personally have
+ not tried teaching young children Emacs, but I believe with the
+ right kinds of interfaces, it could be possible.
+- Q3: How to let my kids exploring Emacs?(No need to answer this.
+ It's simillar to Q2)
+ - A: Great question! Much of the early childhood Montessori work
+ is highly tactile. Abstract concepts are embodied in physical
+ objects. One example is the "binomial cube" which is a set of
+ blocks that demonstrates (a + b)^3. Children know nothing about
+ the math behind it, but by interacting with it as a tactile
+ puzzle, something about the math concept behind it, the
+ abstraction, is available to the child and their absorbent mind.
+ - That is to say... perhaps there are ways to bring Emacs into
+ the physical world for the very young. I've been fantasizing
+ about some kind of "physical lisp" where young children can
+ interact with a sort of physical programming language. I don't
+ have a lot of concrete ideas on how to get young children
+ exploring Emacs, but I  do believe it is possible.
+ - For older, literate children, I believe simple things that give
+ instant feedback are a great way to encourage interaction. Being
+ able to do something like (set-cursor-color "orange") and see
+ it work at your finger tips is amazing. I believe that a well
+ prepared set up where M-x is easy to access and you get some
+ kind of completion to show you what you can do would go far. 
+ Even ielm could be useful. Children are not nearly as afraid of
+ a command prompt as some grown ups are. They come to it with
+ much less preconceptions on how it should be used.
+ - I would like to think more about this, as giving children the
+ opportunity to experience Emacs feels critical these days, when
+ they may be forced into using much non-free software just do do
+ their school work.
+- Q4: How big of an impact does the environment have on the children
+ that you teach?
+ - A: the environment is huge. giving children a prepared space
+ where everything is accessible to them, down at their level, the
+ correct size, etc, it can lead to amazing things. When I worked
+ with 1.5-3 year olds, I remember telling people it was like
+ managing a restaurant where my employees were toddlers. I could
+ work with a group of children to get food served into properly
+ sized dishes, beverages poured, ceramic plates and glass cups
+ set on the tables, napkins folded, and so on all finished in
+ time to get everyone down for lunch before we had major melt
+ downs.  This would not be possible in a normal grown-up
+ environment. 
+ - I'm not sure i said this in the talk, but the environment is an
+ active process on all of us, not just children. the 0-6 year
+ olds (and beyond) are absorbing so much from the environment
+ that we simply filter out. i think this is important to consider
+ for new emacs users. I tend to filter out a lot of things that a
+ new user may pick up and stumble over.
+ - To re-emphasize: the elements of education are The Learner, The
+ Guide(s), and The Environment. Montessori focuses on the
+ Prepared Environment, in order that it can be the most effective
+ for the child's ability to become an independent, self-realized
+ person.
+- Q5:Do you have a good reference for the Montessori principles
+ (actually any nice book ref)?
+ - A: I'd like to find a more modern resource, I'm sure they are
+ out there. Much of my experience was direct hands-on classroom
+ time.  I've read much of "The Absorbent Mind" which really
+ lays out a lot of the observations Maria Montessori made of the
+ young child, 0-6 years old.  The other book I've studied is
+ "The Secret of Childhood".  I would like to stress though, a
+ lot of the knowledge in Montessori is very very similar to
+ traditional knowledge. When I was learning more about Lakota
+ culture and parenting, I was finding that Montessori was
+ expressing much of the same thing. Any resource (book, human,
+ whatever) that respects children as whole human beings is worth
+ paying attention to. Another author I've enjoyed is Aletha
+ Solter, who writes about parenting.
+- Q6:How do you think Emacs could improve re: Montessori Principles
+ (if at all)?
+ - A: My main takeaway is that we should acknowledge the three
+ elements of learning: The Learner (user), The Guides
+ (contributors), and The (Prepared) Environment. Each user coming
+ to Emacs is an individual with their own mix of internal drives
+ (human tendencies) that compel them to learn and experience.
+ Everyone that is a contributor to Emacs (whether in code, on the
+ web, or in chat) acts as a Guide in the environment (whether
+ they know it or not).  The Prepared Environment could be
+ considered how the application is set up for users.  I think
+ there is room for a friendlier Prepared Environment, though I am
+ always amazed at what I can discover where the self-documenting
+ feature helps me out.  Interactive tutorials teaching one how to
+ learn how to learn Emacs would be tricky, but I think some
+ interesting work could happen there!
+ - Another principle is "control of error", meaning, when you
+ fail at something or make a mistake, it should be obvious, and
+ hopefully the correction of the error should be obvious as well.
+ This is hard to do in a huge software environment like Emacs,
+ but I think there could be some work done in this regard. I'm
+ reminded of Racket's beginning student languages, which make
+ error messages more human focused and less computery is a good
+ example.
+ - I think the community could also improve as Guides. I have
+ certainly had many pleasant interactions with Emacs users, but
+ sometimes you run into things like "RTFM" or "read the
+ source". While I don't disagree, it can come off as elitist
+ sometimes. Many new users are afraid to read source, or have
+ found a manual but still don't understand. We certainly want to
+ encourage independence, so offering techniques like "have you
+ tried M-x describe-function?"  is better than just answering
+ outright. Sometimes we need to take a moment and understand the
+ Learner we're working with. Maybe they aren't ready for "read
+ the source". I could keep writing, but I think I need to wrap
+ up. Anyone should feel free to email me to talk more! perhaps
+ i'll try doing some writing about it. 
+- Q8: What was the presentation mode you used?
+ - A: org-tree-slide - <https://github.com/takaxp/org-tree-slide> -
+ i love using this package because i can practice and edit my
+ presentation at the same time.
+
+Feedback:
+
- having studied in a school which founded by following Montessori Philosophy, I can relate <3
- Love the emphasis on creativity!
- Such a cool talk
@@ -28,6 +177,13 @@ drives present in everybody that allow us to explore and make sense of our world
- and Smalltalk as a platform shares a lot with Emacs, both are a world where a user lives and develops
- garjola: yeah...the whole thing about discovery, figuring things out for yourself, having an epiphany.
+Links and other notes:
+
+- <https://github.com/takaxp/org-tree-slide>
+- <grant@churls.world>
+- @kheya@mastodon.social
+- <http://blog.shoshin.digital/> (there's not really anything there
+ xD)
# Outline
diff --git a/2021/talks/nangulator.md b/2021/talks/nangulator.md
index 93734666..bbf7bfed 100644
--- a/2021/talks/nangulator.md
+++ b/2021/talks/nangulator.md
@@ -23,6 +23,24 @@ N-Angulator is the genesis, to wit, the "Model-T," of such a program.
IRC nick: N-Angulator
+- Q1: Can this be considered as a UI to manage hardlinks with
+ additional functionality such as listing the hardlinks of a single
+ file?
+ - A: that is part of what it could be considered.   I see it more
+ as re-imagining the Unix/Linux file system as a data cloud
+- Q2: Remark: I did a PhD on that very same topic:
+ <https://karl-voit.at/tagstore/en/papers.shtml> - Your approach does
+ seeom to have similarities to the Semantic File System (Gifford et
+ al) or SemFS (Mohan at al) or TagFS (Bloehdorn et al).
+ - A: yes, I just started checking it out.   I was not aware of any
+ of those when I wrote it.   I just had a need for a much more
+ comprehensive filing/retrieval system to support my various
+ activities (law, programming, time management, etc...).   It
+ worked amazingly well at the time but "life happened" and I
+ was never really able to keep it up with the times like porting
+ it from the orphaned XEmacs into FSF and promote it at all.
+- <https://github.com/vigilancetech-com/N-Angulator>
+
- N-Angulator: I wrote it 10 years ago and am no porting it to GNU emacs
- is this a graph-as-filesystem
- I'd much rather work with keybindings rather than clicking things. Is there support for that?
@@ -31,6 +49,9 @@ IRC nick: N-Angulator
- This is weirdware in the best sort of way.
- Are you familiar with tagstore/TagTrees (by me) or Semantic File System (Gifford et al) or SemFS (Mohan at al) or TagFS (Blöhdorn et al)? my work: https://karl-voit.at/tagstore/en/papers.shtml -> preferably the PhD document that summarizes everything
+- From [YouTube](https://www.youtube.com/watch?v=ggmfWPmse_w&feature=em-comments): Any chance you can explain what this package can actually do? I don't want to be critical. It looks interesting but I just don't know what to do with this.
+
+
[[!inline pages="internal(2021/captions/nangulator)" raw="yes"]]
[[!inline pages="internal(2021/info/nangulator-nav)" raw="yes"]]
diff --git a/2021/talks/native.md b/2021/talks/native.md
index eac47447..2916c9f5 100644
--- a/2021/talks/native.md
+++ b/2021/talks/native.md
@@ -9,7 +9,6 @@
Andrea Corallo
-
[[!inline pages="internal(2021/info/native-schedule)" raw="yes"]]
Emacs Lisp (Elisp) is the Lisp dialect used by the Emacs text editor
@@ -33,7 +32,89 @@ Format: 40 minutes
# Discussion
+Pad:
+
+- Q1: Why do you say that Elisp is *nearly* a general purpose
+ programming lang? What's missing? (and btw, huge thanks for your
+ work!)
+ - A:
+- Q2: Is this the "rudiments" that the garbage collector talk was
+ discussing yesterday? Feel free to ignore this n00b question. 
+ - A:
+- Q3:Is the idea to enventually develop Emacs itself in ELisp (c.f. 
+ Smalltalk VM developed in Smalltalk)?
+ - A:
+- Q4: How did you work on this? Did you use Org Mode to keep track of
+ your progress? Did you use pictures to keep track of your compiler
+ transformations or you made only for the presentation? Asking
+ because it seems a complex project and I am not sure how you kept
+ that all in your mind! For example, make sure to pick stuff that FSF
+ was okay with while also deciding how to implement the optimization.
+ Great job anyway!
+ - A:
+- Q5:Is this pipeline a possible source of new security
+ vulnerabilities, or a new category of vulnerabilities? Is it
+ something you are worried about or have had to deal with?
+ - A:
+- Q6: What code, if any, would still benefit significantly from being
+ written in C? Could/should some of the existing C code be converted
+ without significant performance loss?
+ - A:
+- Q7: What's the risk of (setq native-comp-speed 3)?
+ - A: Not sigificant risks.  Some side effects might include:
+ needing to recompile a whole file or compilation unit when
+ redefining a function, otherwise the old function definition
+ could be used.
+- Q8: Are there any limits introduced by native comp with respect to
+ runtime introspectability, changeability/redefinability, etc?
+ - A:
+- Q9: Is there a benefit in setting native-comp-compiler-options to 
+ "-mtune=native -march=<cpu>"?
+ - A: Not at the moment.  Maybe in the future if, e.g. libgccjit is
+ enhanced further.
+- Q10: You mentioned native-comp coming in emacs 28, will this be the
+ default at build time, or will distros have to set this themselves?
+ - A: It will not be enabled by default.  Distros would need to
+ enable it themselves.(Thanks!)
+- Q11: Could we avoid libgccjit.so? Or consider using another jit lib
+ (e.g. dynasm used by luajit) et al to gain better optimization
+ - A: libgccjit is more for AoT compilation, more in-depth
+ optimization, which JITters don't typically do, so they aren't
+ really equivalent.
+- Q12: How much of emacs C code base could be translated to
+ emacs-lisp? What is the minimum C code base necessary?  (seems
+ duplicate of Q6)
+ - A: Very hard questions to answer.  :)  Not generally
+ feasible/worth to convert most of it.
+- Q13: could we statically type elisp code (via macros?) to provide
+ more optimization hints to compiler?
+ - A: Hope to extend existing Elisp variable-type annotations to
+ arguments and use that for optimization.
+- Q14: 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? As you mentioned.
+ make parameter type annotated is a promising point.
+ - A: Not sure if Elisp is really generally slower than Python. 
+ The Elisp bytecode VM is similar in design to the Python VM. 
+ Some native-compiled Elisp may already be faster than Python,
+ e.g. for certain math code.
+- Q15: Did you try to optimize with Rust too? What are your thoughts
+ on Rust for this particular optimization and security?
+ - A: Optimize what?  There is no Rust here.  :)  Rust is
+ interesting, though.  There may be some possibilities, e.g. with
+ regard to some similarities between Rust and some CL
+ implementations.
+- Q16: Why not implement Emacs Lisp in Guile and use Guile's
+ compiler?
+ - A: (not Andrea answering) This has already been tried and done,
+ lookup Guilemacs, e.g. on EmacsWiki.
+ - A: I think they meant to implement Elisp in Guile, and not
+ to replace Elisp with Scheme
+ - Yes, that's already been done.  Guile can already run
+ some subset of Elisp.  Look it up.  :)
+
BBB:
+
- Where did funding for your work came from? Will you be able to maintain this in the foreseeable future?
- akrk: What kinds of applications do you envision native-comp enabling to work well in Emacs in the next few years, that wouldn't otherwise be possible?
- Is this the first real-world practical use of libgccjit?
@@ -78,6 +159,7 @@ BBB:
- One thing I wondered if you wanted to talk more about andrea was, to the prior point about "myths" about what emacs-devel is "like", there's also "make the culture your own". do you have advice on how to approach the community you haven't gotten to yet?
BBB feedback:
+
- Extremely impressive work, Andrea. Also, very needed for the long term sustainability of the platform. Thanks a lot for the hard work!
- Yes, if there were an Emacs Hall of Fame, Andrea would deserve a prominent place in it. :)
- we really do need an Emacs Hall of Fame so we can remember those who laid the foundations
diff --git a/2021/talks/news.md b/2021/talks/news.md
index 29603885..79cc9bb0 100644
--- a/2021/talks/news.md
+++ b/2021/talks/news.md
@@ -14,16 +14,18 @@ Quick overview of Emacs community highlights since the last conference
You can find the links and images at
<https://github.com/sachac/emacsconf-2021-emacs-news-highlights>
-# Questions, answers, and community-provided links
+# Discussion
- how do I "type" an emoji? I know how to copy them from ~/bigsrc/emacs28/admin/unidata/emoji-test.txt, but there must be better ways...
- you could use emojify-mode (there's M-x emojify-insert-emoji)
-
- Other notes:
- Oh wow, I didn't actually know about embark
- Yeah, switch to "smaller" turned out to be quite nice
- but noticed projectile greps faster than consult/counsel in a lot of cases
- Oh wow, the color picker!!!
-
+ - a huge thank you for such an understandable yet detailed summary of what's happening in the Emacs world!
+ - From [YouTube](www.youtube.com/watch?v=270ljvW6UrA&feature=em-comments): Excellent summary!! Thanks for the timestamps as well.
+
+
[[!inline pages="internal(2021/captions/news)" raw="yes"]]
[[!inline pages="internal(2021/info/news-nav)" raw="yes"]]
diff --git a/2021/talks/nongnu.md b/2021/talks/nongnu.md
index b38e7492..9bfa990a 100644
--- a/2021/talks/nongnu.md
+++ b/2021/talks/nongnu.md
@@ -23,6 +23,9 @@ ELPA is and how it works, update the participants on what has
happened since last year and what maintainers have to do if they
want their packages to be added to the repository.
+# Discussion:
+
+- It was really pleasant to listen to.
[[!inline pages="internal(2021/captions/nongnu)" raw="yes"]]
diff --git a/2021/talks/omegat.md b/2021/talks/omegat.md
index 33c46ab9..f1bb4a3b 100644
--- a/2021/talks/omegat.md
+++ b/2021/talks/omegat.md
@@ -29,6 +29,10 @@ The sources are regularly updated with a po4a based shell script.
IRC nick: brandelune
+- Q: Does this project encompass Emacs packages? Is there anything we can do, as package authors, to make translation easier?
+- Q: Could this package be used to generate translated and well-formatted MOBI or EPUB ebooks? Or better yet, an interactive multi-language Emacs Manual "Bible" App for Android?
+- Q: I love OmegaT and use it always. But I would have liked to hear about the experience of working both with Emacs and OmegaT. Can you tell us something about it?
+
- translation is nice but typing anything non latin or cyrillic is hard with keyboard
- Try out the Emacs IMF. One of the main reasons I use Emacs. Input Method Framework: https://www.gnu.org/software/emacs/manual/html_node/emacs/Input-Methods.html
- Hi, thanks for the talk. I love OmegaT and use it always. But I would have liked to here about the experience of working both with Emacs and OmegaT. Can you tell us something about it?
diff --git a/2021/talks/org-outside.md b/2021/talks/org-outside.md
index c0799e21..e13948b0 100644
--- a/2021/talks/org-outside.md
+++ b/2021/talks/org-outside.md
@@ -8,6 +8,8 @@
# The use of Org mode syntax outside of GNU/Emacs
Karl Voit
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/org-outside-schedule)" raw="yes"]]
With the rising interest in Org mode, the GNU/Emacs community gained
@@ -37,7 +39,21 @@ information.
# Discussion
+Pad:
+
+- Q1: Great talk. I have been following your work on PIM for a while
+ (incl. a sneak read of your dissertation:-). Just curious, what
+ would you personally use Orgdown for?
+ - A: Oh, this would be a very loooong answer. I think you want to
+ visit:
+ - <https://karl-voit.at/tags/emacs/> and go to other pages
+ like <https://karl-voit.at/2019/09/25/using-orgmode/>
+ - Basically, Orgdown is already part of my workflows since
+ years: <https://github.com/novoid/lazyblorg/> or
+ <https://github.com/novoid/appendorgheading/> and much more.
+
BBB:
+
- Hi Karl. I was wondering, does the specification make any restrictions with regard to indentation levels or hard vs. soft line breaks? Do you have any type of test suites that an implementation can use to be "certified" as orgdown(1)?
- Are you worried about the different levels of orgdown leading to the same confusing situation we have with Markdown?
- I think the ability to indicate that some tools are compatible with org is fantastic!
@@ -60,12 +76,14 @@ BBB:
- neorg seems to be an expanded org-mode syntax and is not compatible with orgmode
BBB feedback:
+
- I think no tags is a good idea, very implementation specific
- I think it's a fantastic idea, and the initial proposal is very good!
- i need to go, but thanks for introducing the idea, excited to see where it goes!
- Thanks for your proposal. I really hope it will work out.
IRC: (nick: publicvoit)
+
- is there a tree-sitter parser for orgdown already? :P
- it seems to me that as org evolves, either orgdown eventually becomes incompatible with org or org is prevented from changing because it would break orgdown. I guess backcompat with existing org documents constrains org-mode this way already, though
- what level would you call github's implementation is?
@@ -95,7 +113,21 @@ IRC: (nick: publicvoit)
- I don't really see a big issue with org-mode vs. org vs. orgWHATEVER though
- there are major search and discovery issues with bare "org"
- I tend to use "org syntax" at the moment, but it isn't catchy enough
-
+
+
+From [YouTube](www.youtube.com/watch?v=JLuTYkhFDQY&feature=em-comments):
+
+- Great idea! I’m not sure about the name though. To me it implies it has something syntactically to do with Markdown (which it doesn’t). In my view OrgMode markup is far more expressive than Markdown. It’s almost a new markup language in and of itself. So, how about OrgMark or Org Mode Markup Language aka OMML.
+
+Links and other notes:
+
+- The article from 2017 that started the whole discussion: "Org Mode
+ Is One of the Most Reasonable Markup Languages to Use for Text"
+ <https://karl-voit.at/2017/09/23/orgmode-as-markup-only/>
+- Orgdown homepage: <https://gitlab.com/publicvoit/orgdown>
+- Orgdown motivation article:
+ <https://karl-voit.at/2021/11/27/orgdown/>
+
# Outline
- The term Org mode stands for different things
diff --git a/2021/talks/pattern.md b/2021/talks/pattern.md
index 2000c242..9779161b 100644
--- a/2021/talks/pattern.md
+++ b/2021/talks/pattern.md
@@ -8,9 +8,9 @@
# Emacs as Design Pattern Learning
Greta Goetz
-[[!inline pages="internal(2021/info/pattern-schedule)" raw="yes"]]
+[[!taglink CategoryPhilosophy]]
-Still working on it! In the meantime, you can watch it at <https://toobnix.org/w/afvaVspSSR9YypjUqTypQz>
+[[!inline pages="internal(2021/info/pattern-schedule)" raw="yes"]]
How do we manage today? This presentation is for people interested in thinking about Emacs as a tool sophisticated enough to cater to the complex assemblage of tasks, people, activities/outcomes, tools (Markauskaite & Goodyear). Some software oversimplifies. Emacs both helps users implement design pattern learning that can cope with complexity while also modeling design pattern learning. By championing the opportunity for users to also be co-creators (cf. Beaty et al.), the free software design at the core and center of Emacs teaches us a way of "being" (Alexander, Gabriel) that can be extended to both the Emacs community and beyond, in a knowledge of how to live (Stiegler, Illich).
@@ -48,12 +48,198 @@ four years of Learning@Scale and charting the future. L@S 2018, June 26–28, 20
# Discussion
-- this paper is relevant to exploring the space of design patterns: https://www.aaai.org/Papers/Workshops/1998/WS-98-08/WS98-08-024.pdf it's old and a little crytpic, but a good paper. it's "Recommender Systems for Problem Solving Environments"
+Pad:
+
+- Q1: Any reference to a Christopher Alexander book that you liked
+ most?
+ - (peer answer A:
+ - Alexander, C. (1977). A pattern language: towns, buildings,
+ construction. New York: Oxford University Press.
+ - Alexander, C. (1979). The timeless way of building. New
+ York: Oxford University Press. (thanks!!)
+ - also check out: Gabriel, R. (1996). Patterns of software:
+ tales from the software community. New York: Oxford
+ University Press.
+ (<https://dreamsongs.com/Files/PatternsOfSoftware.pdf>)
+ - Alexander, C. (1993). *A foreshadowing of 21st century art:
+ The color and geometry of very early Turkish carpets*. New
+ York: Oxford University Press.
+ - A: The peer answer is excellent. If you are looking for an 'entryway' into Alexander, there is also his essay A City Is Not A Tree, <https://raw.githubusercontent.com/dmvaldman/library/master/essays/Alexander%20-%20A%20City%20Is%20Not%20A%20Tree.pdf>.
+- Q2: You are making a great case for the ease-of-use, humanizing, and
+ empowering aspects of Emacs, but how does this align with the
+ initial difficulty for many users in learning Emacs? What is the
+ weakness of Emacs here, in relation to these design patterns?
+ - A: If we take a Vygotskyean approach to learning, we begin step
+ by step, gradually building on to what we know. What I found
+ fascinating as a non-programmer coming to Emacs was how this
+ approach works even in Emacs. Particularly if we are taking a
+ human-based approach to Emacs, it has no weakness here, because
+ humans can only move forwards from where they are, not where
+ they want to be. So Emacs becomes a good teacher in
+ process-based learning. We need to hierarchize what we know,
+ what we are ready/motivated to learn next, and also remember the
+ time required for growth.
+- Q3: How do you suggest emacs users should go about desinging their
+ work(flow) patterns?
+ - A: Strangely, I seem to have answered this above!
+- Q4: Emacs provides a lot of extensibility as mentioned in your talk.
+ This is a good thing, but such extensibility and possiblility can
+ sometimes inhibit creativity (for me at least). How could we
+ incorporate constraints in to how we use Emacs, in order to deal
+ with the possibilities that might make it's use more complex? A
+ great answer, thank you!
+ - A: I love this question. What about thinking about Emacs as
+ one's own path of desire? What do we want to do most with it?
+ But also, because Emacs is the ultimate blank canvas, in this
+ context I would recommend reading Cameron's "Blasting through
+ blocks" chapter in The Artist's Way to get through any related
+ anxiety and find one's 'creative purpose' with Emacs. And
+ building on an answer from above, taking things one
+ project/activity/outcome at a time. Trusting that over time
+ skills and proficiency grow.
+ - I like the idea about "Emacs as one's own path of
+ desire". It's all in my init.el.
+ - Emacs is seriously the best in this respect!  :) And it is
+ so great to be part of this conference to be among like
+ minds!:)
+- Q5:In your opinion, what approaches might be tried to introduce
+ individuals to these aspects of emacs's user experience? In my
+ experience, many of my co-workers are often impressed with what I am
+ able to do with emacs, but they remain reticent to attempt it
+ because I find it difficult to produce a suitably encapsulating
+ "elevator pitch" for it.
+ - A: Not everyone wants to think about the tools that they use.
+ Haha, that is why I am trying to get one convert at a time, and
+ let them convert others in their midst :)
+- Q6: Are there ways to reach out to you after the conference to dig
+ deeper here?
+ - A: I blog at <https://gretzuni.com>; my professional site is <https://gretagoetz.com>.
+- Q7:On the mention of emacs being 'frontierless': Doesn't this
+ result in a kind of 'characterless' or 'non-definied' space? For
+ example, if I learn a musical instrument, I am bound by various
+ frontiers/horizons (12 tone system, the tamber of the particular
+ instrument, etc). Surely there are similar limits on the
+ extensibility of emacs and the possibilities it offers for 'human
+ expansion'. If so, which limits/boundaries of emacs do you see as
+ most meaningful/impactful on growth and transformation?
+ - A: That is a really interesting question. Aren't the limits
+ here our knowledge? I am really stuck on the idea of Lisp and
+ its dialects as being particularly philosophical. Any time I
+ look at what people do with Lisp it seems to be profoundly
+ related to design on a deeper level. I will leave it here for
+ now - but thank you for the question, I will be sure to mull it
+ over and possibly blog about it at some point...
+ - Hi! Thank you for the answer, that was exactly what I was
+ thinking about (elisp being something particular/defining to the
+ emacs experienc/environment). I don't know lisp/programming
+ myself, so I was just interested in your perpsective! Really
+ loved the talk a lot! But the way, the question came from a
+ hermeneutic perspective, where boundaries/horizons are essential
+ for defining/demarcating the self (of course, within a boundary
+ there can be endless play, but the limits set the 'rules' for
+ play, and therefore create meaning).Thanks again!
+ - A: Wow - a fellow hermeneuticist?! 
+ - Haha, yes. In my past life I studied it ;) also studied a lot of
+ Stiegler too, so was interested to find him in the talk!
+ - A: That is quite uncanny! The combination of the three (plus Emacs)
+ have given me a whole new perspective on life - and I wonder why
+ Stiegler didn't pursue Free Software more, though he does nod
+ to it here and there. Do you have any work to share, would you
+ like to keep in touch?
+ - sure! would be great! :) My main area was Ricoeur, so I have
+ written some things on Ricoeur and technology (there was a
+ recent volume on his work, and I wrote something on
+ postphenomenology and ricoeur) I've since left academia though,
+ because it was quite difficult to find full-time work
+ (especially since hermeneutics is so
+ underappreciated/underreppresented! so, I always get excited to
+ hear others talking about it ;)
+ - A: Yes, I know what you are talking about and actually the whole
+ future - and present - of academe is an interesting question -
+ haha that I think is related to Emacs, I mean, we do live in the
+ knowledge age so we need tools to help with this. Ricoeur has a
+ great essay on ideology and science critique, which is so limber
+ (as opposed to so much calcified academic thinking) and I am so
+ interested in exploring approaches to academe that 'continue
+ the ongoing work of the hermeneuticist' (I am paraphrasing him
+ here) that make use of technology, possibly through something
+ like Ted Nelson had in mind, where we literally trace the traces
+ among ideas... wow, that's a mouthful of a comment. Ha! I am
+ overjoyed at the opportunity for this conversation, thank you so
+ much! :) 
+ - really interesting that you are referencing Ted Nelson in
+ this context. I think org-roam, in many ways, resembles what
+ he had in mind with Xandadu; well, with the limitation that
+ org-roam only serves Personal Information Management, not
+ our civilisations' as he intended with Xanadu.
+ - A: That's an interesting point - and related to how org-roam writer Leo is now extending org-roam to collaborative work as he explains in his talk <https://emacsconf.org/2021/talks/erg/>.
+ - Yes! the feeling is mutual :) I really love Ricoeur's general
+ style and approach to questions. Unfortunately he didn't write
+ much about technology itself, which made my job quite difficult!
+ But I did meet a friend of his once that told me that, in the
+ 70s, Ricouer had asked him "are we still writing when we use
+ computers?". So, he was thinking about the question at least. I
+ only discovered emacs after I finished all that word, but since
+ then I can finally say that 'yes!' we can 'write' using
+ computers (with writing being a core activity of the self for
+ Ricoeur). Also, I just wish I had emacs instead of just writing
+ so many academic papers in microsoft word! 
+ - A: Yes, the moment of being freed from that software box and
+ having all the LaTeX options in Emacs (here, I list my fave) is
+ like stepping into technicolor out of black and white - to this
+ day, I still feel that way! So much you wrote is interesting.
+ Stiegler's concern of whether technology - like the writing pad
+ in Plato earlier - would strip us of our intellectual capacity
+ (I can see that possibly happening with automaticizing tools
+ like - maybe Excel is a good example, because one does not
+ really have to think about what one is doing). But Emacs use
+ prompts us to ask questions and design *exactly* what we are
+ looking for.
+ - wow, yes, that is so interesting. I never considered the
+ question of desire and emacs until your talk, and it was
+ definitely one of the most interesting parts!
+ In my work I was also mostly interested in Freud (the role of
+ 'technique' in psychoanalysis) and also Foucault's later
+ lectures on hermeneutics of the self/technologies of the self.
+ The angle of 'desire' in relation to personal
+ configuration/design was so interesting to me and like an
+ 'aha' moment. I'll definitely be thinking about it more!
+ Thank you so much again for the talk and all the responses!
+ - A: Thank you too, and hope we'll be in touch!
+ - Yes :) enjoy the rest of the conference!
+ - A: Likewise :)
+- Q8: What was that Crichton quote? That was neat! (From the
+ references - Crichton, M. (1983). *Electronic life*. New York:
+ Knopf.)
+ - A: Thank you - I hope that general computing will have its day!
+- Q9: Greta, you seem to be an academic researcher. Any of your
+ publications or other good references on this topic that you can
+ share/link here?
+- Here are two:
+- <https://doi.org/10.1080/00131857.2021.1962706> A song of teaching
+ with free software in the Anthropocene
+- <https://10.1007/s42438-020-00188-3> The odyssey of pedagogies of
+ technoscientific literacies
+
+**Links and other notes:**
+
+- Design Pattern: macro solution; human-centered
+- Emacs is a design pattern for learning.
+- Why do we care about design patterns?
+- Emacs as a mental map.
+- Everyone's Emacs is their own.
+- The development of the Emacs communitiy is similar to the [free]
+ core of Emacs devlopment.
+
+IRC:
+
+- this paper is relevant to exploring the space of design patterns: https://www.aaai.org/Papers/Workshops/1998/WS-98-08/WS98-08-024.pdf it's old and a little cryptic, but a good paper. it's "Recommender Systems for Problem Solving Environments"
- greta: Thanks for that link!
- if I may ask, what's the little toy figure in the background, looks nice :D
- A wooden (fake) Transformer :)
- do you think emacs could have implemented with this design pattern, but in another programming language?
-
+ - Emacs Lisp as a dialect of Lisp shares its philosophical qualities. I often think about what Norvig wrote about Lisp back in the day, e.g. <https://www.norvig.com/lisp_talk_final.htm>, and while there are some people who feel strongly that Lisp's time is passed, I think that Emacs shows that it is the opposite: that we haven't fully taken advantage of Lisp's potential. Another example would be what Rick Hickey has done with Clojure, and recommend his talk Are We There Yet, <https://github.com/matthiasn/talk-transcripts/blob/master/Hickey_Rich/AreWeThereYet.md>.
+
Feedback:
- That's a great point about the sketches, and why Emacs graphical improvements are important.
diff --git a/2021/talks/professional.md b/2021/talks/professional.md
index e0233886..5a16d2c1 100644
--- a/2021/talks/professional.md
+++ b/2021/talks/professional.md
@@ -8,6 +8,8 @@
# Using Org-Mode For Recording Continuous Professional Development
Philip Beadling
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/professional-schedule)" raw="yes"]]
I recently had the pleasure of being audited for my CPD record with one
diff --git a/2021/talks/project.md b/2021/talks/project.md
index 36fabeb2..d7f93c01 100644
--- a/2021/talks/project.md
+++ b/2021/talks/project.md
@@ -8,6 +8,8 @@
# Budgeting, Project Monitoring and Invoicing with Org Mode
Adolfo Villafiorita
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/project-schedule)" raw="yes"]]
In this talk I will present how we use Org Mode at Shair.Tech for
diff --git a/2021/talks/research.md b/2021/talks/research.md
index 770e6185..a0468c64 100644
--- a/2021/talks/research.md
+++ b/2021/talks/research.md
@@ -8,6 +8,9 @@
# Managing a research workflow (bibliographies, note-taking, and arXiv)
Ahmed Khaled
+[[!taglink CategoryOrgMode]]
+[[!taglink CategoryOrgRoam]]
+
[[!inline pages="internal(2021/info/research-schedule)" raw="yes"]]
[Configuration I use in Doom Emacs as part of my academic reading/notetaking workflow](https://gist.github.com/rka97/57779810d3664f41b0ed68a855fcab54)
diff --git a/2021/talks/structural.md b/2021/talks/structural.md
index c301fc3b..03089a2d 100644
--- a/2021/talks/structural.md
+++ b/2021/talks/structural.md
@@ -48,6 +48,33 @@ Check out the GitHub repo [here](https://github.com/ethan-leba/tree-edit)!
IRC nick: ethan
+- Q1: so tree-edit is orthogonal to the LSP features? 
+ - A: only uses tree-sitter yeah 
+- Q2:any chance you tried this with Clojure as well? 
+ - A: haven't tried it yet, i don't think tree-sitter-langs has a
+ clojure grammar AFAIK 
+- Q3: Would we be able to do things like extract statement to a
+ variable? For example, extract a a math operation happening in a
+ fucntion call argument into a separate variable an then replace the
+ funtion call arg with the variable name.
+- Q4: How do tree-edit and combobulate compare?
+ - A: a lot of similarities, tree-edit replaces traditional text
+ editing style combobulate still implements
+- Q5: Are similar packages for structural editing common to other
+ editors or they are just popular in Emacs cause of the paredit
+ tradition?
+ - A: emacs seems to be a trend-setter
+- Q6: Great talk! How difficult do you imagine adding more languages
+ to Tree-edit will be?
+ - A: Trying to add python, not super simple, C-like should be drop
+ in replacements
+- Q7: @ethan Could tree-edit be made to work with Org (orgdown!)
+ itself, or maybe rather what would be needed to get such a unified
+ tree-editing framework to work also for complex Org trees? 
+- Q8: Any plans for an Evil mode integration? evil-textobj-tree-sitter
+ seems like it has a long way to go if it's to catch up to
+ tree-edit.
+
- any chance you tried this with Clojure as well?
- ethan: haven't tried it yet, i don't think tree-sitter-langs has a clojure grammar AFAIK
- yeah I use sogaiu's (https://github.com/sogaiu/tree-sitter-clojure) but it does not have if else and the rest, only the main data types
@@ -62,6 +89,17 @@ IRC nick: ethan
- Andrew Blinn's talk on Fructure and Ethan Leba's talk on Tree-edit are really insightful.
- Agreed about the lack of formal grammar (only a proliferation of parsers) being a limiting factor. Maybe we could bridge directly to the available commands without going through a grammar though. A unified tree-editing framework across languages but definitely including Org would be awesome (ala lispy/etc).
+Links and other notes:
+
+- Github repo : <https://github.com/ethan-leba/tree-edit>
+- editing operations that map directly to the structure of the
+ language
+- inspired by paredit and lispy
+- Another similar project is <https://github.com/mickeynp/combobulate>
+ by Mickey Petersen, the writer of Mastering Emacs.
+- It's an open source project so contributers are welcome
+- Future implication for this kind of work could be voice controlled
+ code writing/editing
# Outline
diff --git a/2021/talks/teach.md b/2021/talks/teach.md
index 506cf96e..16052178 100644
--- a/2021/talks/teach.md
+++ b/2021/talks/teach.md
@@ -8,6 +8,8 @@
# Using Org-mode to teach programming
Daniel German
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/teach-schedule)" raw="yes"]]
In this presentation I will explain how to use org-mode effectively to
@@ -34,6 +36,7 @@ org-mode for this purpose.
# Discussion
IRC:
+
- how do you keep the discipline of working on your notes? that's probably my biggest problem
- I like "Try that with PowerPoint!" as a new org-babel slogan
- we just need krita and inkscape modes
@@ -41,6 +44,7 @@ IRC:
- I liked the trick with annotating the code in xournal -- what is the elisp glue for that? Do you have a package for that?
BBB:
+
- Can you talk about how the students re0act to this org-mode approach?
- What level are your students typically? what is the subject matter?
- Why GitHub? GitHub is nonfree.
@@ -49,6 +53,10 @@ BBB:
- GitLab.com is just as bad (and unlike GitHub, you can't sign in without nonfree JS), but GitLab CE is fine.
- Do you think org-mode+git could be used for students' assignments?
+From [YouTube](https://www.youtube.com/watch?v=Bmi9AAaqegY&feature=em-comments):
+
+- this is by far one of the most motivating talk about Org. I feel sorry about all my teaching colleagues that still use WYSIWYG presentation tools. my life, as a trainer, literally changed with Org, even without literate programming.
+- Great presentation. New to Emacs and starting to find many uses for it. One thing which theme you are using
# Outline
diff --git a/2021/talks/tech.md b/2021/talks/tech.md
index 6a26281c..c327181d 100644
--- a/2021/talks/tech.md
+++ b/2021/talks/tech.md
@@ -8,6 +8,8 @@
# Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide
Jan Ypma
+[[!taglink CategoryOrgMode]]
+
[[!inline pages="internal(2021/info/tech-schedule)" raw="yes"]]
The emacs org-babel package is often mentioned in conjunction with
@@ -26,7 +28,22 @@ org-treeslide to write and present technical documentation with style.
# Discussion
+Pad:
+
+- Q1: Sorry if you already answered this somewhere (but if not, can
+ someone with a reddit account copy this over? thx). Hi, I would love
+ to move my team over to using something org-based, but that'll
+ never happen because, well... (wait for it) Emacs! By the way, I'm
+ currently using heavily customized Sphinx setup, mostly internal,
+ sometimes shared with data partners; lots of schema-gen from message
+ protocols defined in code, etc. Anyhow: questions. Do you work with
+ non-Emacs users? If so, how did you get them to accept this
+ workflow? And if it's just you DJ'ing, how do they weigh in when
+ they want an update, open a formal ticket?
+- <https://github.com/jypma/emacsconf2021/blob/master/presentation.org>
+
BBB:
+
- Have you encountered any push-back from people requesting the documentation who are of the opinion that only a Word document will do?
- Jan: Not really, I tend to deliver the PDFs only. If more is needed, I expect I'd make a docker container with emacs in it, so people can export the org-file to PDF themselves.
- The main problem I have is that effectively they end up branching it in order to use Word's change tracking, and there is no reverse path.
@@ -39,6 +56,7 @@ BBB:
- Jan: Hold their hands, be kind, small baby steps :)
IRC: (nick: jan-ypma)
+
- I use restclient everyday, but never thought about using it from code blocks, duh! Very interesting talk!
- This is a good demo, I've found org-babel to be a really amazing glue language for stuff that's sort of annoying to automate otherwise.
- Thanks! :) So the fonts of the current talk are: Fixed pitch (serif): New Heterodox Mono, Variable pitch (serif): ETBembo
diff --git a/2021/talks/telega.md b/2021/talks/telega.md
index e664bf4e..54a151f4 100644
--- a/2021/talks/telega.md
+++ b/2021/talks/telega.md
@@ -22,6 +22,18 @@ highlight some of the most important features.
# Discussion
+- Q1: Do any of these main emacs telegram groups bridge to matrix?
+ - A: [Speaker] We discussed adding a bridge to matrix for the
+ main channel @emacs_en. We never got around to doing it, but I
+ can bring this up again. 
+- Q2: Could telega.el auto install TDLib like lsp-mode auto installs
+ servers?
+- A: [Speaker] Possibly. The difference is that TDLib requires a
+ number of dependencies that might not be available.  Evgeny chose
+ another route to simplify setting up telega.el: the package can now
+ be installed with a Dockerfile that also ships with also the
+ optional dependencies. This ensures that everything works as
+ intended.
- Does telega still require company for completion?
- Telegram has become a real (and desired) option to WhatsApp, thanks to telega.el
diff --git a/2021/talks/test.md b/2021/talks/test.md
index b858bd4e..9165e7b6 100644
--- a/2021/talks/test.md
+++ b/2021/talks/test.md
@@ -25,7 +25,7 @@ running 'dofile "foo.lua"'), and then has several tests for that class
and its methods; and we can put another block with tests like that
after the class Bletch, and other blocks after some functions. Eepitch
allows sending these tests line by line to the Lua interpreter by
-typing <f8\> on each line that we want to send, and this lets us create
+typing <f8> on each line that we want to send, and this lets us create
tests that are very easy to understand even without writing comments;
this gives us a very quick way to document code by executable tests,
that is super-great for experimental code that is still going to
@@ -33,10 +33,10 @@ change a lot before running the risk of being read by other people.
These multi-line comments with eepitch blocks that run an interpreter
and make it load the current file are called "test blocks". The
-command \`M-x eeit' inserts a test block at point, using the major mode
+command `M-x eeit' inserts a test block at point, using the major mode
to decide the right syntax to use for the multi-line comments and for
the "dofile". We can configure the syntax of the test blocks for the
-current major mode by running \`M-x find-eeit-links'; this can also be
+current major mode by running `M-x find-eeit-links'; this can also be
used to add support for test blocks to more languages (or, more
precisely: to more major modes).
diff --git a/2021/talks/ui.md b/2021/talks/ui.md
index 40d69b68..0fbf9322 100644
--- a/2021/talks/ui.md
+++ b/2021/talks/ui.md
@@ -32,46 +32,69 @@ by implementing some basic UI's.
# Discussion
-IRC:
-- I'm trying the run your demos of tui... it seems that (add-to-list 'load-path "~/usrc/tui.el/") is not enough, I have to either add the subdirectories by hand or to run a standard function - whose name I don't know - to add the subdirs...
-- hey, I'm trying to run your demos of tui... I had to add the subdirectories to the load-path manually to make (require 'tui-tic-tac-toe) work. my notes are here: https://0x0.st/-7dV.txt
-- tui.el is very exciting, should open up a new era of more advanced UI in Emacs
-- seems like we can get some really cool emacs ui going in combination with svg.el
-- combine with the magit approach to menus (transient etc) and something very nice is coming!
-- I think anything you can show in a buffer should work with this, so images, text, whatever.
-- tui.el is just too cool: I am going to try it for sure :D
+Pad:
+
+- Q1: A common issue I have with Magit status buffers is that focus
+ get lost easily when staging hunks since scroll gets lost during
+ re-render (Magit attempts at recovering). Are we getting magit-tui?
+ - A: It is certainly possible and compatible.
+ - I am interested in tui.el but haven't looked at it too closely
+ yet. Have been entertaining the idea of something like this for
+ a long time now. -- jonas (magit maintainer)
+- Q2:We can update images as well?! Like SVG, or the comics you shown.
+ This is awesome!
+ - A: Yes, that's possible.
+- Q3:Have you tried to display any diagram? Like UML sequence diagrams
+- Q4: So does tui implement some sort of DOM model?
+ - A: Yes.
+- Q5: How does performance compare with some other libraries, like
+ EWOC, magit-section, tabulated-list?  e.g. to render a view with
+ thousands of elements (and thank you for your work on this, it's
+ very exciting for Emacs's future)
+ - A: In general EWOC and tabulated-list should perform better, and
+ tui still needs some optimization. TUI has the potential to be
+ better, but it needs some work.
+- Q6: Are you planning to contribute tui.el to emacs core?
+ - A: Eventually, once its polished and more robust.
+- Q7: What is the memory overhead like, e.g. I guess values are hashed
+ to detect whether items need to be re-rendered?
+ - A: Haven't done any memory profiling, but memory overhead could
+ probably be an issue.
+- Q8: Awesome. Would lack of concurrency/multi-threading in Emacs be
+ an issue?
BBB:
+
- like in dogears.el readme
- So I'm really interested in potentially using tui for Ement.el
-- there are 2 or 3 ways I could imagine using it...
- 1. For the room buffers, showing events in the chat rooms. That sometimes has thousands of events, so that's why I asked about performance for that case.
- It seems like it could be very helpful for re-rendering some events when their content changes, e.g. when messages are edited, when coalescing adjacent join/leave events...
-- That sounds interesting. I don't know anything about React
- EWOC does work for that to some extent, but I've been unable to get nested EWOCs to work correctly so far, so TUI is an interesting alternative
-- yes IIRC
- yeah, EWOC uses markers too AFAIK, and it seems to perform well enough even with 2000-3000 events in a buffer
- oh yeah, your grid idea
-- that would be SO useful
- yes, sorting and filtering, temporarily hiding elements!
-- that would be SO useful
- like "show all messages from this user or mentioning that user in this room"
- and then press a key and all the others are shown again
-- ahh, I need that! :)
- expanding larger images from thumbnails, captions for files, etc
- like Element.io but in Emacs with TUI, that would be great
- that's the official Matrix Web client
-- I think it uses React
-- but I'm not sure
- Sounds great! well thanks for the presentation, I really look forward to TUI's progress! maybe someday I can help with it, in the distant future... I have too many Emacs projects already :)
- hmm, a TUI library for taxy.el... more ideas!
- TUI would be like a natural frontend for taxy.el as a backend
-- that would be fun :)
- are you on Matrix by any chance?
-- maybe someday, need to get more people "jacked in" :)
- I'm bad with email, but when I have time to check out TUI in more detail, I look forward to it!
-Feedback
+IRC:
+
+- I'm trying the run your demos of tui... it seems that (add-to-list 'load-path "~/usrc/tui.el/") is not enough, I have to either add the subdirectories by hand or to run a standard function - whose name I don't know - to add the subdirs...
+- hey, I'm trying to run your demos of tui... I had to add the subdirectories to the load-path manually to make (require 'tui-tic-tac-toe) work. my notes are here: https://0x0.st/-7dV.txt
+- tui.el is very exciting, should open up a new era of more advanced UI in Emacs
+- seems like we can get some really cool emacs ui going in combination with svg.el
+- combine with the magit approach to menus (transient etc) and something very nice is coming!
+- I think anything you can show in a buffer should work with this, so images, text, whatever.
+- tui.el is just too cool: I am going to try it for sure :D
+
+IRC feedback:
- I like the bird mascot on the repo readme :)
- FYI if you would want it to show at the side of the readme, you can see the Org markup I use to accomplish that in some of my readmes
diff --git a/2021/talks/unix.md b/2021/talks/unix.md
index 14ff82fd..c9a9263a 100644
--- a/2021/talks/unix.md
+++ b/2021/talks/unix.md
@@ -8,6 +8,8 @@
# GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer
Daniel Rose
+[[!taglink CategoryPhilosophy]]
+
[[!inline pages="internal(2021/info/unix-schedule)" raw="yes"]]
The talk targets users who are curious about computational philosophies,
@@ -25,12 +27,30 @@ to be more performant than without.
IRC nick: thecatster
+- Q: So, how do you decide when it's not "worth it" to use Emacs
+ for a certain thing?
+- Q: What's your opinion on EAF?
+- Q: What is your opinion on starter-kits and making emacs
+ accessible, practical for people who want to keep things simple?
+- Q: Do you integrate tools via Emacs or you just jump between those?
+ For example, did you need to integrate your C WM somehow with Emacs?
+ - A: mostly via keybindings. Thanks for the answer!
+- Q: Do you use Emacs for email?
+ - A: I do, and many more clients too.
+- Q: No personal website?
+ - A: <https://www.danielr.xyz>
+- Q:When will Emacs improve its GC and support truely multithreading?
+
Feedback:
- I really appreciate this talk's perspective! I'm very invested in living inside, Emacs, but this is also a great perspective!
- yes, nice perspective. Saying that I am struggeling with that is overstating it, but sometimes it does make me think. thank you Daniel!
- Nice talk, I feel like some Emacs purists could complain but let's be honest, this is a reasonable take on actually getting stuff done
+From [YouTube](www.youtube.com/watch?v=kXVjCRIqS4c&feature=em-comments):
+
+- Right on. For most of these reasons I’ve went back to Vim and just accepted it’s limitations rather than try and torture it into a Frankenstein IDE that half works. When I need to do $LANG work especially debugging, I use vs code or Xcode etc and most of the big IDEs have Vim keybinding emulation that is good enough to get to work.
+
# Outline
- How can one limit their usage of CLI tools while still maintaining