summaryrefslogtreecommitdiffstats
path: root/2021
diff options
context:
space:
mode:
Diffstat (limited to '2021')
-rw-r--r--2021/all-include.md289
-rw-r--r--2021/all.md11
-rw-r--r--2021/captions/babel.md270
-rw-r--r--2021/captions/bidi.md366
-rw-r--r--2021/captions/bindat.md621
-rw-r--r--2021/captions/borg.md155
-rw-r--r--2021/captions/clede.md419
-rw-r--r--2021/captions/cs.md261
-rw-r--r--2021/captions/dashboard.md329
-rw-r--r--2021/captions/design.md174
-rw-r--r--2021/captions/dev-update.md244
-rw-r--r--2021/captions/eaf.md188
-rw-r--r--2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt802
-rw-r--r--2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt55
-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-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt1093
-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-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt457
-rw-r--r--2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt1246
-rw-r--r--2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--chapters.vtt25
-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-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt775
-rw-r--r--2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt979
-rw-r--r--2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt514
-rw-r--r--2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt43
-rw-r--r--2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main--chapters.vtt43
-rw-r--r--2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt724
-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-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt622
-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--chapters.vtt43
-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-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.vtt1054
-rw-r--r--2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt550
-rw-r--r--2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt31
-rw-r--r--2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main--chapters.vtt31
-rw-r--r--2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt1528
-rw-r--r--2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt82
-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--chapters.vtt61
-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-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt2674
-rw-r--r--2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt1282
-rw-r--r--2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt25
-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-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt2512
-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--chapters.vtt37
-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-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.vtt1552
-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-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt820
-rw-r--r--2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt697
-rw-r--r--2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt706
-rw-r--r--2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt1780
-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.vtt730
-rw-r--r--2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt676
-rw-r--r--2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt796
-rw-r--r--2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt628
-rw-r--r--2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt46
-rw-r--r--2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main--chapters.vtt46
-rw-r--r--2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt826
-rw-r--r--2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt673
-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--chapters.vtt34
-rw-r--r--2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main--chapters.vtt34
-rw-r--r--2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt469
-rw-r--r--2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt535
-rw-r--r--2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt532
-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-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt892
-rw-r--r--2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt892
-rw-r--r--2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt892
-rw-r--r--2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt770
-rw-r--r--2021/captions/emacsconf-2021-pattern--edit--main.vtt13
-rw-r--r--2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt25
-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-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt1876
-rw-r--r--2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt871
-rw-r--r--2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt31
-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-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt565
-rw-r--r--2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt16
-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-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt520
-rw-r--r--2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt817
-rw-r--r--2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt1663
-rw-r--r--2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt829
-rw-r--r--2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt768
-rw-r--r--2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt769
-rw-r--r--2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt493
-rw-r--r--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.vtt634
-rw-r--r--2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt40
-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/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt766
-rw-r--r--2021/captions/erg.md354
-rw-r--r--2021/captions/exec.md186
-rw-r--r--2021/captions/faster.md512
-rw-r--r--2021/captions/forever.md894
-rw-r--r--2021/captions/form.md430
-rw-r--r--2021/captions/freedom.md840
-rw-r--r--2021/captions/frownies.md520
-rw-r--r--2021/captions/gregorian.md277
-rw-r--r--2021/captions/imaginary.md235
-rw-r--r--2021/captions/invoice.md236
-rw-r--r--2021/captions/janitor.md596
-rw-r--r--2021/captions/maintainers.md246
-rw-r--r--2021/captions/model.md228
-rw-r--r--2021/captions/mold.md268
-rw-r--r--2021/captions/molecular.md212
-rw-r--r--2021/captions/montessori.md277
-rw-r--r--2021/captions/nangulator.md227
-rw-r--r--2021/captions/native.md920
-rw-r--r--2021/captions/news.md159
-rw-r--r--2021/captions/nongnu.md181
-rw-r--r--2021/captions/nyxt.md180
-rw-r--r--2021/captions/omegat.md900
-rw-r--r--2021/captions/org-outside.md259
-rw-r--r--2021/captions/pattern.md627
-rw-r--r--2021/captions/professional.md293
-rw-r--r--2021/captions/project.md241
-rw-r--r--2021/captions/research.md176
-rw-r--r--2021/captions/structural.md275
-rw-r--r--2021/captions/teach.md557
-rw-r--r--2021/captions/tech.md279
-rw-r--r--2021/captions/telega.md259
-rw-r--r--2021/captions/test.md167
-rw-r--r--2021/captions/ui.md214
-rw-r--r--2021/captions/unix.md258
-rw-r--r--2021/contribute.md117
-rw-r--r--2021/emacsconf-pentabarf.xml107
-rw-r--r--2021/emacsconf.ics659
-rw-r--r--2021/info/adventure-nav.md3
-rw-r--r--2021/info/adventure-schedule.md15
-rw-r--r--2021/info/babel-nav.md4
-rw-r--r--2021/info/babel-schedule.md25
-rw-r--r--2021/info/bidi-nav.md4
-rw-r--r--2021/info/bidi-schedule.md26
-rw-r--r--2021/info/bindat-nav.md4
-rw-r--r--2021/info/bindat-schedule.md64
-rw-r--r--2021/info/borg-nav.md2
-rw-r--r--2021/info/borg-schedule.md17
-rw-r--r--2021/info/bug-nav.md4
-rw-r--r--2021/info/bug-schedule.md13
-rw-r--r--2021/info/build-nav.md2
-rw-r--r--2021/info/build-schedule.md22
-rw-r--r--2021/info/clede-nav.md4
-rw-r--r--2021/info/clede-schedule.md23
-rw-r--r--2021/info/cs-schedule.md35
-rw-r--r--2021/info/dashboard-nav.md2
-rw-r--r--2021/info/dashboard-schedule.md22
-rw-r--r--2021/info/day1-close-nav.md2
-rw-r--r--2021/info/day1-close-schedule.md11
-rw-r--r--2021/info/day1-open-schedule.md12
-rw-r--r--2021/info/day2-close-schedule.md13
-rw-r--r--2021/info/day2-open-nav.md2
-rw-r--r--2021/info/day2-open-schedule.md11
-rw-r--r--2021/info/design-nav.md4
-rw-r--r--2021/info/design-schedule.md24
-rw-r--r--2021/info/dev-update-nav.md3
-rw-r--r--2021/info/dev-update-schedule.md38
-rw-r--r--2021/info/devel-nav.md4
-rw-r--r--2021/info/devel-schedule.md12
-rw-r--r--2021/info/dsl-nav.md2
-rw-r--r--2021/info/dsl-schedule.md13
-rw-r--r--2021/info/eaf-nav.md4
-rw-r--r--2021/info/eaf-schedule.md37
-rw-r--r--2021/info/erg-nav.md2
-rw-r--r--2021/info/erg-schedule.md54
-rw-r--r--2021/info/exec-schedule.md23
-rw-r--r--2021/info/faster-schedule.md62
-rw-r--r--2021/info/forever-schedule.md76
-rw-r--r--2021/info/form-nav.md2
-rw-r--r--2021/info/form-schedule.md23
-rw-r--r--2021/info/freedom-nav.md4
-rw-r--r--2021/info/freedom-schedule.md39
-rw-r--r--2021/info/frownies-nav.md2
-rw-r--r--2021/info/frownies-schedule.md51
-rw-r--r--2021/info/gregorian-nav.md4
-rw-r--r--2021/info/gregorian-schedule.md37
-rw-r--r--2021/info/imaginary-nav.md4
-rw-r--r--2021/info/imaginary-schedule.md25
-rw-r--r--2021/info/invoice-nav.md4
-rw-r--r--2021/info/invoice-schedule.md18
-rw-r--r--2021/info/janitor-nav.md4
-rw-r--r--2021/info/janitor-schedule.md60
-rw-r--r--2021/info/maintainers-nav.md4
-rw-r--r--2021/info/maintainers-schedule.md62
-rw-r--r--2021/info/model-nav.md4
-rw-r--r--2021/info/model-schedule.md17
-rw-r--r--2021/info/mold-nav.md4
-rw-r--r--2021/info/mold-schedule.md17
-rw-r--r--2021/info/molecular-nav.md4
-rw-r--r--2021/info/molecular-schedule.md18
-rw-r--r--2021/info/montessori-nav.md4
-rw-r--r--2021/info/montessori-schedule.md55
-rw-r--r--2021/info/nangulator-nav.md4
-rw-r--r--2021/info/nangulator-schedule.md23
-rw-r--r--2021/info/native-nav.md2
-rw-r--r--2021/info/native-schedule.md69
-rw-r--r--2021/info/news-schedule.md42
-rw-r--r--2021/info/nongnu-nav.md2
-rw-r--r--2021/info/nongnu-schedule.md17
-rw-r--r--2021/info/nyxt-nav.md2
-rw-r--r--2021/info/nyxt-schedule.md17
-rw-r--r--2021/info/omegat-nav.md4
-rw-r--r--2021/info/omegat-schedule.md20
-rw-r--r--2021/info/org-outside-schedule.md22
-rw-r--r--2021/info/pattern-nav.md3
-rw-r--r--2021/info/pattern-schedule.md33
-rw-r--r--2021/info/professional-schedule.md16
-rw-r--r--2021/info/project-nav.md4
-rw-r--r--2021/info/project-schedule.md39
-rw-r--r--2021/info/research-nav.md4
-rw-r--r--2021/info/research-schedule.md36
-rw-r--r--2021/info/rust-nav.md4
-rw-r--r--2021/info/rust-schedule.md13
-rw-r--r--2021/info/structural-nav.md4
-rw-r--r--2021/info/structural-schedule.md23
-rw-r--r--2021/info/teach-nav.md2
-rw-r--r--2021/info/teach-schedule.md23
-rw-r--r--2021/info/tech-schedule.md24
-rw-r--r--2021/info/telega-nav.md4
-rw-r--r--2021/info/telega-schedule.md16
-rw-r--r--2021/info/test-nav.md4
-rw-r--r--2021/info/test-schedule.md16
-rw-r--r--2021/info/ui-nav.md4
-rw-r--r--2021/info/ui-schedule.md24
-rw-r--r--2021/info/unix-nav.md4
-rw-r--r--2021/info/unix-schedule.md53
-rw-r--r--2021/inline-alternate.md1
-rw-r--r--2021/meetings.org884
-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/poster.md58
-rw-r--r--2021/prepare.md206
-rw-r--r--2021/schedule-details.md108
-rw-r--r--2021/schedule.md9
-rw-r--r--2021/sidebar.md6
-rw-r--r--2021/speakers.md52
-rw-r--r--2021/talks.md19
-rw-r--r--2021/talks/adventure.md136
-rw-r--r--2021/talks/babel.md76
-rw-r--r--2021/talks/bidi.md191
-rw-r--r--2021/talks/binary.md30
-rw-r--r--2021/talks/bindat.md61
-rw-r--r--2021/talks/borg.md5
-rw-r--r--2021/talks/bug.md5
-rw-r--r--2021/talks/build.md45
-rw-r--r--2021/talks/clede.md14
-rw-r--r--2021/talks/cs.md62
-rw-r--r--2021/talks/dashboard.md66
-rw-r--r--2021/talks/day1-close.md39
-rw-r--r--2021/talks/day1-open.md51
-rw-r--r--2021/talks/day2-close.md54
-rw-r--r--2021/talks/day2-open.md9
-rw-r--r--2021/talks/design.md120
-rw-r--r--2021/talks/dev-update.md29
-rw-r--r--2021/talks/devel.md122
-rw-r--r--2021/talks/dsl.md5
-rw-r--r--2021/talks/eaf.md92
-rw-r--r--2021/talks/erg.md22
-rw-r--r--2021/talks/exec.md30
-rw-r--r--2021/talks/faster.md117
-rw-r--r--2021/talks/forever.md89
-rw-r--r--2021/talks/form.md125
-rw-r--r--2021/talks/freedom.md45
-rw-r--r--2021/talks/frownies.md63
-rw-r--r--2021/talks/gregorian.md8
-rw-r--r--2021/talks/imaginary.md147
-rw-r--r--2021/talks/invoice.md20
-rw-r--r--2021/talks/janitor.md133
-rw-r--r--2021/talks/maintainers.md85
-rw-r--r--2021/talks/model.md25
-rw-r--r--2021/talks/mold.md73
-rw-r--r--2021/talks/molecular.md128
-rw-r--r--2021/talks/montessori.md171
-rw-r--r--2021/talks/nangulator.md82
-rw-r--r--2021/talks/native.md161
-rw-r--r--2021/talks/news.md20
-rw-r--r--2021/talks/nongnu.md12
-rw-r--r--2021/talks/nyxt.md19
-rw-r--r--2021/talks/omegat.md59
-rw-r--r--2021/talks/org-outside.md156
-rw-r--r--2021/talks/pattern.md285
-rw-r--r--2021/talks/professional.md19
-rw-r--r--2021/talks/project.md18
-rw-r--r--2021/talks/research.md16
-rw-r--r--2021/talks/rust.md5
-rw-r--r--2021/talks/structural.md135
-rw-r--r--2021/talks/teach.md39
-rw-r--r--2021/talks/tech.md69
-rw-r--r--2021/talks/telega.md23
-rw-r--r--2021/talks/test.md25
-rw-r--r--2021/talks/ui.md85
-rw-r--r--2021/talks/unix.md44
-rw-r--r--2021/talks/world.md5
-rw-r--r--2021/watch.md24
306 files changed, 73332 insertions, 1263 deletions
diff --git a/2021/all-include.md b/2021/all-include.md
new file mode 100644
index 00000000..77408164
--- /dev/null
+++ b/2021/all-include.md
@@ -0,0 +1,289 @@
+<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
new file mode 100644
index 00000000..23886e42
--- /dev/null
+++ b/2021/all.md
@@ -0,0 +1,11 @@
+[[!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 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"]]
+</div>
+
+[[!sidebar content=""]]
+
diff --git a/2021/captions/babel.md b/2021/captions/babel.md
new file mode 100644
index 00000000..5923e3b5
--- /dev/null
+++ b/2021/captions/babel.md
@@ -0,0 +1,270 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi! My name is Asilata Bapat," start="00:00:00.799" video="mainVideo" id=subtitle]]
+[[!template text="and I'm talking about Babel for academics." start="00:00:02.560" video="mainVideo" id=subtitle]]
+[[!template text="So, I'm an academic at a university," start="00:00:04.960" video="mainVideo" id=subtitle]]
+[[!template text="and I use Emacs, Org mode, and Babel" start="00:00:06.879" video="mainVideo" id=subtitle]]
+[[!template text="for a whole bunch of work related tasks." start="00:00:09.040" video="mainVideo" id=subtitle]]
+[[!template text="And there are many other tools" start="00:00:11.280" video="mainVideo" id=subtitle]]
+[[!template text="that one could use to help with" start="00:00:12.559" video="mainVideo" id=subtitle]]
+[[!template text="this workflow." start="00:00:14.240" video="mainVideo" id=subtitle]]
+[[!template text="I won't be going through all of these," start="00:00:15.200" video="mainVideo" id=subtitle]]
+[[!template text="and the ones that I've listed are just" start="00:00:16.597" video="mainVideo" id=subtitle]]
+[[!template text="a few of the many that are available." start="00:00:18.160" video="mainVideo" id=subtitle]]
+[[!template text="Today, I'll really be talking about" start="00:00:20.240" video="mainVideo" id=subtitle]]
+[[!template text="my teaching workflow." start="00:00:22.000" video="mainVideo" id=subtitle]]
+[[!template text="Let's just dive right in to a demo." start="00:00:24.080" video="mainVideo" id=subtitle]]
+[[!template text="So, the first file that I want to" start="00:00:27.840" video="mainVideo" id=subtitle]]
+[[!template text="show you is the notes and admin file." start="00:00:29.243" video="mainVideo" id=subtitle]]
+[[!template text="From this file, I'll generate" start="00:00:31.599" video="mainVideo" id=subtitle]]
+[[!template text="a nice-looking PDF document of notes," start="00:00:33.040" video="mainVideo" id=subtitle]]
+[[!template text="and I'll also keep track of some" start="00:00:35.440" video="mainVideo" id=subtitle]]
+[[!template text="course admin." start="00:00:36.963" video="mainVideo" id=subtitle]]
+[[!template text="So, the file that I have here is this one," start="00:00:38.399" video="mainVideo" id=subtitle]]
+[[!template text="and all of the files that I'm going to" start="00:00:43.200" video="mainVideo" id=subtitle]]
+[[!template text="show you today are taken from a course" start="00:00:44.719" video="mainVideo" id=subtitle]]
+[[!template text="that I'm teaching at the moment" start="00:00:46.320" video="mainVideo" id=subtitle]]
+[[!template text="this semester." start="00:00:48.096" video="mainVideo" id=subtitle]]
+[[!template text="What I want to do is export this" start="00:00:49.680" video="mainVideo" id=subtitle]]
+[[!template text="entire document to LaTeX" start="00:00:53.147" video="mainVideo" id=subtitle]]
+[[!template text="because this is where" start="00:00:55.520" video="mainVideo" id=subtitle]]
+[[!template text="I'll be writing my course notes." start="00:00:56.320" video="mainVideo" id=subtitle]]
+[[!template text="But before I do that," start="00:00:58.800" video="mainVideo" id=subtitle]]
+[[!template text="I have some setup that I want to do," start="00:01:00.480" video="mainVideo" id=subtitle]]
+[[!template text="and you'll notice some of these headings" start="00:01:03.199" video="mainVideo" id=subtitle]]
+[[!template text="are tagged as noexport," start="00:01:05.199" video="mainVideo" id=subtitle]]
+[[!template text="and they won't be exported." start="00:01:06.509" video="mainVideo" id=subtitle]]
+[[!template text="The startup setting I'll skip," start="00:01:08.400" video="mainVideo" id=subtitle]]
+[[!template text="and then the main thing here" start="00:01:11.680" video="mainVideo" id=subtitle]]
+[[!template text="is the LaTeX setup." start="00:01:13.499" video="mainVideo" id=subtitle]]
+[[!template text="So, I'm using these #+ option lines," start="00:01:14.880" video="mainVideo" id=subtitle]]
+[[!template text="and I've told Org that" start="00:01:18.560" video="mainVideo" id=subtitle]]
+[[!template text="I want to use an unusual LaTeX class," start="00:01:21.360" video="mainVideo" id=subtitle]]
+[[!template text="I'll have to tell Org about it later," start="00:01:23.280" video="mainVideo" id=subtitle]]
+[[!template text="I'll do that in a moment," start="00:01:24.880" video="mainVideo" id=subtitle]]
+[[!template text="and I have some" start="00:01:26.240" video="mainVideo" id=subtitle]]
+[[!template text="LaTeX header lines, and so on." start="00:01:27.001" video="mainVideo" id=subtitle]]
+[[!template text="And then I have some export settings," start="00:01:29.600" video="mainVideo" id=subtitle]]
+[[!template text="the first export setting is" start="00:01:31.360" video="mainVideo" id=subtitle]]
+[[!template text="to export into a different directory," start="00:01:32.941" video="mainVideo" id=subtitle]]
+[[!template text="not just at the same level" start="00:01:35.119" video="mainVideo" id=subtitle]]
+[[!template text="because I want everything to go into" start="00:01:36.799" video="mainVideo" id=subtitle]]
+[[!template text="the artifacts directory," start="00:01:38.560" video="mainVideo" id=subtitle]]
+[[!template text="and then I can ignore that artifacts" start="00:01:39.716" video="mainVideo" id=subtitle]]
+[[!template text="directory using Git." start="00:01:41.360" video="mainVideo" id=subtitle]]
+[[!template text="This is the first" start="00:01:44.399" video="mainVideo" id=subtitle]]
+[[!template text="source code block that we see," start="00:01:45.600" video="mainVideo" id=subtitle]]
+[[!template text="which is the Babel side of things," start="00:01:47.280" video="mainVideo" id=subtitle]]
+[[!template text="and I've called it export-setup." start="00:01:49.759" video="mainVideo" id=subtitle]]
+[[!template text="The way I write it is, #+begin_src," start="00:01:52.079" video="mainVideo" id=subtitle]]
+[[!template text="the language that I want to use," start="00:01:55.759" video="mainVideo" id=subtitle]]
+[[!template text="which is emacs-lisp," start="00:01:56.965" video="mainVideo" id=subtitle]]
+[[!template text="and maybe some options," start="00:01:58.159" video="mainVideo" id=subtitle]]
+[[!template text="and this is collapsed at the moment," start="00:01:59.600" video="mainVideo" id=subtitle]]
+[[!template text="if I expand it, you'll see" start="00:02:01.119" video="mainVideo" id=subtitle]]
+[[!template text="inside here, this is really" start="00:02:03.600" video="mainVideo" id=subtitle]]
+[[!template text="just Elisp, Emacs Lisp." start="00:02:05.155" video="mainVideo" id=subtitle]]
+[[!template text="So, the first thing I've done is," start="00:02:07.600" video="mainVideo" id=subtitle]]
+[[!template text="I've added this LaTeX class" start="00:02:09.592" video="mainVideo" id=subtitle]]
+[[!template text="to the list of known LaTeX classes." start="00:02:12.440" video="mainVideo" id=subtitle]]
+[[!template text="And the second thing I've done is," start="00:02:15.360" video="mainVideo" id=subtitle]]
+[[!template text="I have locally set the value of" start="00:02:17.433" video="mainVideo" id=subtitle]]
+[[!template text="org-latex-pdf-process," start="00:02:19.599" video="mainVideo" id=subtitle]]
+[[!template text="which is the compiler, to something…," start="00:02:21.112" video="mainVideo" id=subtitle]]
+[[!template text="this command is complicated I guess," start="00:02:24.720" video="mainVideo" id=subtitle]]
+[[!template text="but what the main thing it's doing" start="00:02:27.200" video="mainVideo" id=subtitle]]
+[[!template text="is that it's moving the generated output…," start="00:02:29.440" video="mainVideo" id=subtitle]]
+[[!template text="sorry, the generated image files" start="00:02:32.160" video="mainVideo" id=subtitle]]
+[[!template text="to the output directory," start="00:02:34.160" video="mainVideo" id=subtitle]]
+[[!template text="so that everything can remain" start="00:02:35.169" video="mainVideo" id=subtitle]]
+[[!template text="inside of this artifacts directory," start="00:02:37.519" video="mainVideo" id=subtitle]]
+[[!template text="and maybe it's doing some other things." start="00:02:39.680" video="mainVideo" id=subtitle]]
+[[!template text="And then there are some other" start="00:02:41.519" video="mainVideo" id=subtitle]]
+[[!template text="setup options that I'll skip." start="00:02:43.680" video="mainVideo" id=subtitle]]
+[[!template text="So, this is a source code block," start="00:02:47.120" video="mainVideo" id=subtitle]]
+[[!template text="inside of the source code block" start="00:02:49.360" video="mainVideo" id=subtitle]]
+[[!template text="everything is basically Emacs Lisp." start="00:02:50.640" video="mainVideo" id=subtitle]]
+[[!template text="How do I evaluate this?" start="00:02:52.319" video="mainVideo" id=subtitle]]
+[[!template text="I just press Control c Control c (C-c C-c)," start="00:02:54.640" video="mainVideo" id=subtitle]]
+[[!template text="and it evaluates everything," start="00:02:56.319" video="mainVideo" id=subtitle]]
+[[!template text="but if I want to automate the evaluation," start="00:02:57.920" video="mainVideo" id=subtitle]]
+[[!template text="there's one other thing I can do." start="00:03:00.319" video="mainVideo" id=subtitle]]
+[[!template text="So, let me jump down to" start="00:03:02.080" video="mainVideo" id=subtitle]]
+[[!template text="the local variables section." start="00:03:04.658" video="mainVideo" id=subtitle]]
+[[!template text="In this local variable section" start="00:03:06.720" video="mainVideo" id=subtitle]]
+[[!template text="I have an eval block," start="00:03:09.740" video="mainVideo" id=subtitle]]
+[[!template text="so, I've added a certain hook to the" start="00:03:11.680" video="mainVideo" id=subtitle]]
+[[!template text="org-export-before-processing-hook," start="00:03:14.681" video="mainVideo" id=subtitle]]
+[[!template text="and that just resolves" start="00:03:16.879" video="mainVideo" id=subtitle]]
+[[!template text="this reference from this file." start="00:03:18.319" video="mainVideo" id=subtitle]]
+[[!template text="It looks for a code block titled" start="00:03:19.519" video="mainVideo" id=subtitle]]
+[[!template text="export-setup, and it runs it" start="00:03:23.040" video="mainVideo" id=subtitle]]
+[[!template text="right before exporting," start="00:03:24.859" video="mainVideo" id=subtitle]]
+[[!template text="and this is all local to this buffer." start="00:03:26.000" video="mainVideo" id=subtitle]]
+[[!template text="So, before I export," start="00:03:29.200" video="mainVideo" id=subtitle]]
+[[!template text="it'll then read the correct options." start="00:03:30.799" video="mainVideo" id=subtitle]]
+[[!template text="And after this setup," start="00:03:34.000" video="mainVideo" id=subtitle]]
+[[!template text="I have the course plan," start="00:03:37.519" video="mainVideo" id=subtitle]]
+[[!template text="which is just what goes into my agenda" start="00:03:39.760" video="mainVideo" id=subtitle]]
+[[!template text="as to-dos, I'll skip that." start="00:03:41.599" video="mainVideo" id=subtitle]]
+[[!template text="And after that, I have the actual notes," start="00:03:43.360" video="mainVideo" id=subtitle]]
+[[!template text="and what they actually look like…," start="00:03:45.519" video="mainVideo" id=subtitle]]
+[[!template text="so, this is what they actually look like," start="00:03:48.640" video="mainVideo" id=subtitle]]
+[[!template text="nicely LaTeXed with diagrams and so on," start="00:03:54.400" video="mainVideo" id=subtitle]]
+[[!template text="everything generated" start="00:03:57.040" video="mainVideo" id=subtitle]]
+[[!template text="from that single Org file." start="00:03:57.920" video="mainVideo" id=subtitle]]
+[[!template text="I'll say more about diagrams later." start="00:04:00.720" video="mainVideo" id=subtitle]]
+[[!template text="I also have to write assignments" start="00:04:04.480" video="mainVideo" id=subtitle]]
+[[!template text="and assignment solutions," start="00:04:06.080" video="mainVideo" id=subtitle]]
+[[!template text="so let me jump to that." start="00:04:07.260" video="mainVideo" id=subtitle]]
+[[!template text="Again, this is a very similar file," start="00:04:10.239" video="mainVideo" id=subtitle]]
+[[!template text="but I want to now export" start="00:04:11.840" video="mainVideo" id=subtitle]]
+[[!template text="different headings to different files." start="00:04:14.080" video="mainVideo" id=subtitle]]
+[[!template text="This is not going to be" start="00:04:15.760" video="mainVideo" id=subtitle]]
+[[!template text="exported all at once." start="00:04:16.639" video="mainVideo" id=subtitle]]
+[[!template text="So, again I have some setup," start="00:04:18.320" video="mainVideo" id=subtitle]]
+[[!template text="some general setup that I'll skip," start="00:04:19.759" video="mainVideo" id=subtitle]]
+[[!template text="export setup just like before," start="00:04:22.400" video="mainVideo" id=subtitle]]
+[[!template text="code setup for Python, really," start="00:04:25.120" video="mainVideo" id=subtitle]]
+[[!template text="I have a various…, a bunch of different" start="00:04:29.280" video="mainVideo" id=subtitle]]
+[[!template text="languages here, so Shell and Python," start="00:04:31.280" video="mainVideo" id=subtitle]]
+[[!template text="and some helper functions." start="00:04:33.199" video="mainVideo" id=subtitle]]
+[[!template text="So, let me jump to this one called" start="00:04:36.088" video="mainVideo" id=subtitle]]
+[[!template text="togglesolutions, this is again" start="00:04:38.160" video="mainVideo" id=subtitle]]
+[[!template text="an Emacs Lisp code block." start="00:04:39.756" video="mainVideo" id=subtitle]]
+[[!template text="What this does is," start="00:04:41.919" video="mainVideo" id=subtitle]]
+[[!template text="it tells LaTeX to either toggle the" start="00:04:43.600" video="mainVideo" id=subtitle]]
+[[!template text="display of solutions on, or off" start="00:04:48.632" video="mainVideo" id=subtitle]]
+[[!template text="based on what the tag is" start="00:04:50.336" video="mainVideo" id=subtitle]]
+[[!template text="for that particular assignment." start="00:04:53.096" video="mainVideo" id=subtitle]]
+[[!template text="So, whether if the assignment" start="00:04:54.240" video="mainVideo" id=subtitle]]
+[[!template text="is tagged as solved," start="00:04:57.520" video="mainVideo" id=subtitle]]
+[[!template text="then the solution should be displayed," start="00:04:58.800" video="mainVideo" id=subtitle]]
+[[!template text="otherwise they shouldn't be." start="00:05:00.240" video="mainVideo" id=subtitle]]
+[[!template text="And here most of the assignments" start="00:05:03.280" video="mainVideo" id=subtitle]]
+[[!template text="are tagged as solved," start="00:05:05.447" video="mainVideo" id=subtitle]]
+[[!template text="so in this case if I export this," start="00:05:07.120" video="mainVideo" id=subtitle]]
+[[!template text="the solutions will be displayed." start="00:05:08.880" video="mainVideo" id=subtitle]]
+[[!template text="Let's look at that." start="00:05:11.840" video="mainVideo" id=subtitle]]
+[[!template text="So, I see the solutions blocks," start="00:05:20.800" video="mainVideo" id=subtitle]]
+[[!template text="and this is because it's calling" start="00:05:23.919" video="mainVideo" id=subtitle]]
+[[!template text="the toggle solutions piece of code." start="00:05:27.036" video="mainVideo" id=subtitle]]
+[[!template text="And the properties," start="00:05:29.919" video="mainVideo" id=subtitle]]
+[[!template text="if I expand this properties drawer," start="00:05:32.240" video="mainVideo" id=subtitle]]
+[[!template text="you see this output file name" start="00:05:33.840" video="mainVideo" id=subtitle]]
+[[!template text="has a homework one dash solved," start="00:05:39.280" video="mainVideo" id=subtitle]]
+[[!template text="so it has a solved suffix," start="00:05:41.440" video="mainVideo" id=subtitle]]
+[[!template text="and this is related to the fact that" start="00:05:43.360" video="mainVideo" id=subtitle]]
+[[!template text="I have a solved tag up here." start="00:05:45.912" video="mainVideo" id=subtitle]]
+[[!template text="So, let's see what happens" start="00:05:47.680" video="mainVideo" id=subtitle]]
+[[!template text="if I delete the solved tag," start="00:05:48.960" video="mainVideo" id=subtitle]]
+[[!template text="so nothing's happened yet," start="00:05:51.199" video="mainVideo" id=subtitle]]
+[[!template text="but if I save the file," start="00:05:52.639" video="mainVideo" id=subtitle]]
+[[!template text="then suddenly this homework one" start="00:05:54.000" video="mainVideo" id=subtitle]]
+[[!template text="dash solved becomes homework one," start="00:05:55.919" video="mainVideo" id=subtitle]]
+[[!template text="and this is desired behavior," start="00:05:58.240" video="mainVideo" id=subtitle]]
+[[!template text="this is what I want because" start="00:06:00.080" video="mainVideo" id=subtitle]]
+[[!template text="I want to keep the solved" start="00:06:02.084" video="mainVideo" id=subtitle]]
+[[!template text="and unsolved files separate." start="00:06:03.222" video="mainVideo" id=subtitle]]
+[[!template text="So, once again, if I put in" start="00:06:04.497" video="mainVideo" id=subtitle]]
+[[!template text="the solved tag, and if I save," start="00:06:07.120" video="mainVideo" id=subtitle]]
+[[!template text="I get back the different file name." start="00:06:09.440" video="mainVideo" id=subtitle]]
+[[!template text="And how did I achieve this?" start="00:06:11.440" video="mainVideo" id=subtitle]]
+[[!template text="This is again back in the setup section," start="00:06:12.720" video="mainVideo" id=subtitle]]
+[[!template text="it's the process-export-filenames block." start="00:06:16.479" video="mainVideo" id=subtitle]]
+[[!template text="It's some big piece of Elisp" start="00:06:19.280" video="mainVideo" id=subtitle]]
+[[!template text="that I won't go through," start="00:06:21.120" video="mainVideo" id=subtitle]]
+[[!template text="but basically it's mapping over" start="00:06:22.349" video="mainVideo" id=subtitle]]
+[[!template text="Org entries, and it's either" start="00:06:24.240" video="mainVideo" id=subtitle]]
+[[!template text="adding or removing this solved suffix" start="00:06:26.720" video="mainVideo" id=subtitle]]
+[[!template text="based on what tag it sees." start="00:06:30.080" video="mainVideo" id=subtitle]]
+[[!template text="Okay, when does this" start="00:06:34.560" video="mainVideo" id=subtitle]]
+[[!template text="code block get evaluated?" start="00:06:36.781" video="mainVideo" id=subtitle]]
+[[!template text="Well, I want it to be evaluated" start="00:06:37.919" video="mainVideo" id=subtitle]]
+[[!template text="right before I save" start="00:06:39.840" video="mainVideo" id=subtitle]]
+[[!template text="because I change something," start="00:06:41.039" video="mainVideo" id=subtitle]]
+[[!template text="I save, and I want the properties" start="00:06:43.199" video="mainVideo" id=subtitle]]
+[[!template text="to be get updated accordingly." start="00:06:45.840" video="mainVideo" id=subtitle]]
+[[!template text="If I go down to the" start="00:06:49.199" video="mainVideo" id=subtitle]]
+[[!template text="local variables section again." start="00:06:51.364" video="mainVideo" id=subtitle]]
+[[!template text="Again, I have a local variables" start="00:06:52.639" video="mainVideo" id=subtitle]]
+[[!template text="section here," start="00:06:55.840" video="mainVideo" id=subtitle]]
+[[!template text="and I'm evaluating this Elisp," start="00:06:56.800" video="mainVideo" id=subtitle]]
+[[!template text="which is setting the before-save-hook" start="00:06:58.479" video="mainVideo" id=subtitle]]
+[[!template text="to resolve the process-export-filenames" start="00:07:01.199" video="mainVideo" id=subtitle]]
+[[!template text="function, and so that's what" start="00:07:04.240" video="mainVideo" id=subtitle]]
+[[!template text="gives me that functionality." start="00:07:05.716" video="mainVideo" id=subtitle]]
+[[!template text="And finally," start="00:07:09.199" video="mainVideo" id=subtitle]]
+[[!template text="I have some skeletons, which are…." start="00:07:12.720" video="mainVideo" id=subtitle]]
+[[!template text="Emacs has this skeleton language," start="00:07:16.240" video="mainVideo" id=subtitle]]
+[[!template text="which is a rudimentary templating language." start="00:07:19.360" video="mainVideo" id=subtitle]]
+[[!template text="So, I've defined some templates" start="00:07:22.240" video="mainVideo" id=subtitle]]
+[[!template text="for my assignment and worksheet" start="00:07:24.220" video="mainVideo" id=subtitle]]
+[[!template text="in this little Emacs Lisp block," start="00:07:26.319" video="mainVideo" id=subtitle]]
+[[!template text="which I think I usually just evaluate" start="00:07:29.440" video="mainVideo" id=subtitle]]
+[[!template text="manually, and then if I just call it," start="00:07:31.120" video="mainVideo" id=subtitle]]
+[[!template text="I get a nice-looking skeleton" start="00:07:33.280" video="mainVideo" id=subtitle]]
+[[!template text="that gives me this assignment." start="00:07:35.199" video="mainVideo" id=subtitle]]
+[[!template text="One thing I want to show you" start="00:07:37.360" video="mainVideo" id=subtitle]]
+[[!template text="in these assignments, or I mean," start="00:07:40.080" video="mainVideo" id=subtitle]]
+[[!template text="in this file in particular," start="00:07:43.199" video="mainVideo" id=subtitle]]
+[[!template text="are these dot source code blocks." start="00:07:44.720" video="mainVideo" id=subtitle]]
+[[!template text="So, I've had to type in or draw in" start="00:07:46.560" video="mainVideo" id=subtitle]]
+[[!template text="some graphs in this assignment," start="00:07:49.840" video="mainVideo" id=subtitle]]
+[[!template text="and I can do that right from Org." start="00:07:52.000" video="mainVideo" id=subtitle]]
+[[!template text="So, this is some piece of code" start="00:07:54.720" video="mainVideo" id=subtitle]]
+[[!template text="that's creating a file," start="00:07:56.400" video="mainVideo" id=subtitle]]
+[[!template text="which has this name," start="00:07:59.199" video="mainVideo" id=subtitle]]
+[[!template text="and if I evaluate this block," start="00:08:00.879" video="mainVideo" id=subtitle]]
+[[!template text="I see a results drawer with this file." start="00:08:05.840" video="mainVideo" id=subtitle]]
+[[!template text="And this is a PNG file," start="00:08:10.720" video="mainVideo" id=subtitle]]
+[[!template text="which now gets embedded" start="00:08:12.711" video="mainVideo" id=subtitle]]
+[[!template text="into my LaTeX document." start="00:08:13.759" video="mainVideo" id=subtitle]]
+[[!template text="So, this is nice," start="00:08:15.680" video="mainVideo" id=subtitle]]
+[[!template text="I can actually delete this from here," start="00:08:16.639" video="mainVideo" id=subtitle]]
+[[!template text="and when I export," start="00:08:18.720" video="mainVideo" id=subtitle]]
+[[!template text="the file will get attached automatically." start="00:08:20.479" video="mainVideo" id=subtitle]]
+[[!template text="And similarly," start="00:08:23.919" video="mainVideo" id=subtitle]]
+[[!template text="in some other assignments here," start="00:08:26.639" video="mainVideo" id=subtitle]]
+[[!template text="I have some Python source," start="00:08:28.800" video="mainVideo" id=subtitle]]
+[[!template text="so I've had to type in" start="00:08:30.639" video="mainVideo" id=subtitle]]
+[[!template text="some complicated matrices," start="00:08:33.284" video="mainVideo" id=subtitle]]
+[[!template text="and some complicated matrix products," start="00:08:34.527" video="mainVideo" id=subtitle]]
+[[!template text="and so on," start="00:08:36.128" video="mainVideo" id=subtitle]]
+[[!template text="which I didn't want to do by hand," start="00:08:36.640" video="mainVideo" id=subtitle]]
+[[!template text="so that I didn't introduce errors," start="00:08:38.000" video="mainVideo" id=subtitle]]
+[[!template text="so I've written some Python code." start="00:08:39.760" video="mainVideo" id=subtitle]]
+[[!template text="If I Control c Control c (C-c C-c)" start="00:08:41.599" video="mainVideo" id=subtitle]]
+[[!template text="on this block, you'll notice," start="00:08:44.240" video="mainVideo" id=subtitle]]
+[[!template text="it's in the session matrix," start="00:08:45.920" video="mainVideo" id=subtitle]]
+[[!template text="so it's using the previous," start="00:08:47.120" video="mainVideo" id=subtitle]]
+[[!template text="the same kind of session." start="00:08:49.200" video="mainVideo" id=subtitle]]
+[[!template text="And you'll see that the results," start="00:08:52.399" video="mainVideo" id=subtitle]]
+[[!template text="because of the way I chose to format them," start="00:08:55.440" video="mainVideo" id=subtitle]]
+[[!template text="look like a nice drawer with" start="00:08:57.760" video="mainVideo" id=subtitle]]
+[[!template text="nicely formatted LaTeX." start="00:08:59.920" video="mainVideo" id=subtitle]]
+[[!template text="Once again these results" start="00:09:01.600" video="mainVideo" id=subtitle]]
+[[!template text="I can cut from the file," start="00:09:03.920" video="mainVideo" id=subtitle]]
+[[!template text="and the file will get exported…," start="00:09:05.519" video="mainVideo" id=subtitle]]
+[[!template text="when the file gets exported," start="00:09:07.600" video="mainVideo" id=subtitle]]
+[[!template text="these source code blocks will get" start="00:09:09.200" video="mainVideo" id=subtitle]]
+[[!template text="evaluated, and the answer" start="00:09:10.480" video="mainVideo" id=subtitle]]
+[[!template text="will show up in the file." start="00:09:12.000" video="mainVideo" id=subtitle]]
+[[!template text="And finally," start="00:09:19.200" video="mainVideo" id=subtitle]]
+[[!template text="the last thing I want to show you" start="00:09:20.097" video="mainVideo" id=subtitle]]
+[[!template text="very briefly is the web page" start="00:09:21.363" video="mainVideo" id=subtitle]]
+[[!template text="for this course." start="00:09:23.531" video="mainVideo" id=subtitle]]
+[[!template text="The only thing I want to show you here" start="00:09:26.720" video="mainVideo" id=subtitle]]
+[[!template text="is that I have a Python source code block," start="00:09:28.399" video="mainVideo" id=subtitle]]
+[[!template text="which pulls in my handwritten course notes," start="00:09:30.399" video="mainVideo" id=subtitle]]
+[[!template text="and makes them into a nice-looking list" start="00:09:33.279" video="mainVideo" id=subtitle]]
+[[!template text="with a nice-looking order," start="00:09:36.399" video="mainVideo" id=subtitle]]
+[[!template text="and then just exports as HTML." start="00:09:38.880" video="mainVideo" id=subtitle]]
+[[!template text="So, this is what" start="00:09:41.680" video="mainVideo" id=subtitle]]
+[[!template text="the web page looks like," start="00:09:44.600" video="mainVideo" id=subtitle]]
+[[!template text="and you can see it at this URL." start="00:09:46.080" video="mainVideo" id=subtitle]]
+[[!template text="If you go click on" start="00:09:48.880" video="mainVideo" id=subtitle]]
+[[!template text="the 2021 link at this URL." start="00:09:49.892" video="mainVideo" id=subtitle]]
+[[!template text="So, that's all that I wanted to say." start="00:09:52.800" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much!" start="00:09:54.880" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/bidi.md b/2021/captions/bidi.md
new file mode 100644
index 00000000..85969b31
--- /dev/null
+++ b/2021/captions/bidi.md
@@ -0,0 +1,366 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Greetings. Salaam. This is Mohsen Banan." start="00:00:02.960" video="mainVideo" id=subtitle]]
+[[!template text="I am an Iranian software and internet engineer." start="00:00:10.240" video="mainVideo" id=subtitle]]
+[[!template text="I converted to Emacs in 1986." start="00:00:14.080" video="mainVideo" id=subtitle]]
+[[!template text="It was Emacs version 17 then." start="00:00:17.199" video="mainVideo" id=subtitle]]
+[[!template text="By around 1988, when Emacs version 18" start="00:00:20.480" video="mainVideo" id=subtitle]]
+[[!template text="was well in place," start="00:00:23.920" video="mainVideo" id=subtitle]]
+[[!template text="I started living inside of Emacs." start="00:00:25.680" video="mainVideo" id=subtitle]]
+[[!template text="My primary digital environment" start="00:00:28.960" video="mainVideo" id=subtitle]]
+[[!template text="has been Emacs ever since." start="00:00:31.119" video="mainVideo" id=subtitle]]
+[[!template text="It has been a good life." start="00:00:33.680" video="mainVideo" id=subtitle]]
+[[!template text="I'm a native Farsi speaker and writer." start="00:00:36.559" video="mainVideo" id=subtitle]]
+[[!template text="I'm not a linguist," start="00:00:40.000" video="mainVideo" id=subtitle]]
+[[!template text="and I do not specialize in" start="00:00:41.520" video="mainVideo" id=subtitle]]
+[[!template text="multilingualization, internationalization," start="00:00:43.800" video="mainVideo" id=subtitle]]
+[[!template text="and localization." start="00:00:46.719" video="mainVideo" id=subtitle]]
+[[!template text="My favorite programming language is Lisp," start="00:00:48.879" video="mainVideo" id=subtitle]]
+[[!template text="and I am a bit of an Emacs developer." start="00:00:52.239" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This presentation is about use of" start="00:00:58.320" video="mainVideo" id=subtitle]]
+[[!template text="Perso-Arabic Scripts with Emacs." start="00:01:00.719" video="mainVideo" id=subtitle]]
+[[!template text="It's an overview presentation." start="00:01:04.000" video="mainVideo" id=subtitle]]
+[[!template text="I won't be digging deep" start="00:01:06.720" video="mainVideo" id=subtitle]]
+[[!template text="in many of the mentioned topics." start="00:01:08.320" video="mainVideo" id=subtitle]]
+[[!template text="My goal is to make you aware" start="00:01:11.360" video="mainVideo" id=subtitle]]
+[[!template text="of what can be done with Emacs today," start="00:01:13.119" video="mainVideo" id=subtitle]]
+[[!template text="and the potentials that Emacs presents" start="00:01:16.159" video="mainVideo" id=subtitle]]
+[[!template text="for Perso-Arabic writers." start="00:01:19.280" video="mainVideo" id=subtitle]]
+[[!template text="The main topics that i'll cover are:" start="00:01:22.640" video="mainVideo" id=subtitle]]
+[[!template text="- a brief introduction to Perso-Arabic scripts" start="00:01:25.759" video="mainVideo" id=subtitle]]
+[[!template text="- two existing Emacs Persian input methods" start="00:01:30.320" video="mainVideo" id=subtitle]]
+[[!template text="- the challenges involved with" start="00:01:35.119" video="mainVideo" id=subtitle]]
+[[!template text="making Emacs applications bidirectional-aware" start="00:01:36.960" video="mainVideo" id=subtitle]]
+[[!template text="- the ultimate goal of creating" start="00:01:42.960" video="mainVideo" id=subtitle]]
+[[!template text="a complete digital environment" start="00:01:45.280" video="mainVideo" id=subtitle]]
+[[!template text="for Perso-Arabic writers" start="00:01:47.759" video="mainVideo" id=subtitle]]
+[[!template text="I'll also be including various pointers." start="00:01:51.200" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So first, let's make sure" start="00:01:57.680" video="mainVideo" id=subtitle]]
+[[!template text="that what I'm presenting" start="00:02:00.320" video="mainVideo" id=subtitle]]
+[[!template text="is of interest to you." start="00:02:02.079" video="mainVideo" id=subtitle]]
+[[!template text="if you are a Perso-Arabic writer" start="00:02:04.560" video="mainVideo" id=subtitle]]
+[[!template text="and if you use Emacs," start="00:02:07.040" video="mainVideo" id=subtitle]]
+[[!template text="you're definitely my intended audience." start="00:02:08.879" video="mainVideo" id=subtitle]]
+[[!template text="If you're an Emacs developer" start="00:02:12.720" video="mainVideo" id=subtitle]]
+[[!template text="who wishes to make her Emacs apps" start="00:02:15.120" video="mainVideo" id=subtitle]]
+[[!template text="multilingual and bidi-aware," start="00:02:19.120" video="mainVideo" id=subtitle]]
+[[!template text="you're also my intended audience." start="00:02:22.000" video="mainVideo" id=subtitle]]
+[[!template new="1" text="For the purposes of this presentation," start="00:02:27.360" video="mainVideo" id=subtitle]]
+[[!template text="in this slide, I'm categorizing scripts" start="00:02:30.480" video="mainVideo" id=subtitle]]
+[[!template text="based on directionality and shaping." start="00:02:34.160" video="mainVideo" id=subtitle]]
+[[!template text="Latin letters are not shaped." start="00:02:39.040" video="mainVideo" id=subtitle]]
+[[!template text="Generally speaking," start="00:02:41.280" video="mainVideo" id=subtitle]]
+[[!template text="the shape of a Latin letter" start="00:02:43.120" video="mainVideo" id=subtitle]]
+[[!template text="is independent of its position in a word." start="00:02:44.800" video="mainVideo" id=subtitle]]
+[[!template text="Perso-Arabic letters are subject to shaping." start="00:02:49.599" video="mainVideo" id=subtitle]]
+[[!template text="For example the letter mim--" start="00:02:53.280" video="mainVideo" id=subtitle]]
+[[!template text="sounding similar to M--" start="00:02:56.319" video="mainVideo" id=subtitle]]
+[[!template text="takes three shapes depending on whether" start="00:02:58.800" video="mainVideo" id=subtitle]]
+[[!template text="it is in the beginning of a word," start="00:03:01.840" video="mainVideo" id=subtitle]]
+[[!template text="in the middle of a word," start="00:03:04.720" video="mainVideo" id=subtitle]]
+[[!template text="or at the end of a word." start="00:03:06.480" video="mainVideo" id=subtitle]]
+[[!template text="I'll be showing more of how shaping works" start="00:03:09.200" video="mainVideo" id=subtitle]]
+[[!template text="in an Emacs session screencast later." start="00:03:12.159" video="mainVideo" id=subtitle]]
+[[!template text="Shaping has ramifications" start="00:03:16.400" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs application developers." start="00:03:18.159" video="mainVideo" id=subtitle]]
+[[!template text="For example, if you are combining" start="00:03:21.040" video="mainVideo" id=subtitle]]
+[[!template text="initial letters to create a label," start="00:03:23.760" video="mainVideo" id=subtitle]]
+[[!template text="those letters can be shaped together--" start="00:03:26.720" video="mainVideo" id=subtitle]]
+[[!template text="which is not what you want." start="00:03:29.680" video="mainVideo" id=subtitle]]
+[[!template text="In such cases, you would need to" start="00:03:31.760" video="mainVideo" id=subtitle]]
+[[!template text="explicitly keep them separate." start="00:03:34.000" video="mainVideo" id=subtitle]]
+[[!template text="Latin-based scripts are always" start="00:03:37.840" video="mainVideo" id=subtitle]]
+[[!template text="left-to-right." start="00:03:40.799" video="mainVideo" id=subtitle]]
+[[!template text="Perso-Arabic scripts are right-to-left" start="00:03:42.560" video="mainVideo" id=subtitle]]
+[[!template text="with letters, but numbers are left-to-right." start="00:03:46.560" video="mainVideo" id=subtitle]]
+[[!template text="So, Perso-Arabic scripts" start="00:03:51.040" video="mainVideo" id=subtitle]]
+[[!template text="are bi-directional (BIDI)." start="00:03:53.040" video="mainVideo" id=subtitle]]
+[[!template text="Hebrew is also bi-directional," start="00:03:56.319" video="mainVideo" id=subtitle]]
+[[!template text="but Hebrew is not shaped." start="00:03:58.879" video="mainVideo" id=subtitle]]
+[[!template text="More recently, it has become very common" start="00:04:02.159" video="mainVideo" id=subtitle]]
+[[!template text="to mix Perso-Arabic and Latin text." start="00:04:05.680" video="mainVideo" id=subtitle]]
+[[!template text="This can become very confusing" start="00:04:10.400" video="mainVideo" id=subtitle]]
+[[!template text="if paragraph directionality" start="00:04:12.560" video="mainVideo" id=subtitle]]
+[[!template text="is not properly observed." start="00:04:14.959" video="mainVideo" id=subtitle]]
+[[!template text="I'll be providing some examples" start="00:04:17.759" video="mainVideo" id=subtitle]]
+[[!template text="as screencasts." start="00:04:20.000" video="mainVideo" id=subtitle]]
+[[!template text="The Emacs display engine" start="00:04:23.120" video="mainVideo" id=subtitle]]
+[[!template text="now fully and well supports" start="00:04:24.880" video="mainVideo" id=subtitle]]
+[[!template text="both shaping and BIDI." start="00:04:27.280" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Since 2012, starting with Emacs version 24," start="00:04:32.080" video="mainVideo" id=subtitle]]
+[[!template text="we can say that Emacs" start="00:04:37.120" video="mainVideo" id=subtitle]]
+[[!template text="is a truly multilingual-capable environment." start="00:04:38.639" video="mainVideo" id=subtitle]]
+[[!template text="Like everything else," start="00:04:43.600" video="mainVideo" id=subtitle]]
+[[!template text="multilingual support for Emacs" start="00:04:45.040" video="mainVideo" id=subtitle]]
+[[!template text="was added gradually." start="00:04:46.880" video="mainVideo" id=subtitle]]
+[[!template text="Unicode support was added early on." start="00:04:49.280" video="mainVideo" id=subtitle]]
+[[!template text="The framework for input methods evolved" start="00:04:52.560" video="mainVideo" id=subtitle]]
+[[!template text="in the 1990s. But it was not till version 24" start="00:04:55.520" video="mainVideo" id=subtitle]]
+[[!template text="in 2012 that the display engine" start="00:05:00.320" video="mainVideo" id=subtitle]]
+[[!template text="could fully support BIDI." start="00:05:03.360" video="mainVideo" id=subtitle]]
+[[!template text="Hats off to Eli Zaretskii" start="00:05:06.240" video="mainVideo" id=subtitle]]
+[[!template text="for his work on Emacs BIDI." start="00:05:08.800" video="mainVideo" id=subtitle]]
+[[!template text="Once full BIDI support was in place" start="00:05:12.960" video="mainVideo" id=subtitle]]
+[[!template text="in 2012, I went ahead and added" start="00:05:15.600" video="mainVideo" id=subtitle]]
+[[!template text="two Persian input methods to Emacs 24." start="00:05:19.199" video="mainVideo" id=subtitle]]
+[[!template text="So now Emacs fully supports" start="00:05:24.000" video="mainVideo" id=subtitle]]
+[[!template text="Perso-Arabic scripts." start="00:05:26.400" video="mainVideo" id=subtitle]]
+[[!template new="1" text="By Perso-Arabic script, we're referring to" start="00:05:30.639" video="mainVideo" id=subtitle]]
+[[!template text="the Arabic writing system" start="00:05:34.080" video="mainVideo" id=subtitle]]
+[[!template text="with various extensions" start="00:05:36.320" video="mainVideo" id=subtitle]]
+[[!template text="used by a large number of languages." start="00:05:38.160" video="mainVideo" id=subtitle]]
+[[!template text="Perso-Arabic is the second most" start="00:05:42.240" video="mainVideo" id=subtitle]]
+[[!template text="widely used writing system in the world" start="00:05:44.479" video="mainVideo" id=subtitle]]
+[[!template text="by the number of countries." start="00:05:47.520" video="mainVideo" id=subtitle]]
+[[!template text="It is the third by the number of users" start="00:05:50.479" video="mainVideo" id=subtitle]]
+[[!template text="after the Latin and Chinese scripts." start="00:05:54.000" video="mainVideo" id=subtitle]]
+[[!template text="So, by well supporting Perso-Arabic," start="00:05:59.039" video="mainVideo" id=subtitle]]
+[[!template text="Emacs's potential user base" start="00:06:02.160" video="mainVideo" id=subtitle]]
+[[!template text="can be greatly enhanced." start="00:06:04.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Before focusing on the Persian input methods," start="00:06:09.919" video="mainVideo" id=subtitle]]
+[[!template text="let me quickly summarize" start="00:06:12.960" video="mainVideo" id=subtitle]]
+[[!template text="Emacs's input methods model." start="00:06:14.960" video="mainVideo" id=subtitle]]
+[[!template text="Input methods allow you to enter characters" start="00:06:18.319" video="mainVideo" id=subtitle]]
+[[!template text="that are not supported by your keyboard." start="00:06:21.360" video="mainVideo" id=subtitle]]
+[[!template text="With Quail maps, we can map ASCII key strings" start="00:06:25.120" video="mainVideo" id=subtitle]]
+[[!template text="to multilingual characters." start="00:06:29.280" video="mainVideo" id=subtitle]]
+[[!template text="So we can input any text" start="00:06:31.919" video="mainVideo" id=subtitle]]
+[[!template text="from an ASCII keyboard." start="00:06:34.080" video="mainVideo" id=subtitle]]
+[[!template text="You select an input method" start="00:06:36.960" video="mainVideo" id=subtitle]]
+[[!template text="with C-x RET C-\ ." start="00:06:38.960" video="mainVideo" id=subtitle]]
+[[!template text="We'll try that in a screencast shortly." start="00:06:44.400" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Since version 24, Emacs comes loaded with" start="00:06:49.919" video="mainVideo" id=subtitle]]
+[[!template text="two Persian input methods:" start="00:06:53.919" video="mainVideo" id=subtitle]]
+[[!template text="farsi-isiri-9147 is the standard" start="00:06:56.880" video="mainVideo" id=subtitle]]
+[[!template text="traditional Iranian keyboard." start="00:07:01.520" video="mainVideo" id=subtitle]]
+[[!template text="farsi-transliterate-banan is an intuitive" start="00:07:04.960" video="mainVideo" id=subtitle]]
+[[!template text="transliteration keyboard for Farsi" start="00:07:09.199" video="mainVideo" id=subtitle]]
+[[!template text="which requires near-zero training for use." start="00:07:12.319" video="mainVideo" id=subtitle]]
+[[!template text="I'll be mostly focused on" start="00:07:16.960" video="mainVideo" id=subtitle]]
+[[!template text="farsi-transliterate-banan" start="00:07:18.960" video="mainVideo" id=subtitle]]
+[[!template text="in this presentation." start="00:07:21.520" video="mainVideo" id=subtitle]]
+[[!template text="So let's try this out." start="00:07:23.919" video="mainVideo" id=subtitle]]
+[[!template new="1" text="In this gif-cast, we're going to select" start="00:07:27.840" video="mainVideo" id=subtitle]]
+[[!template text="a Persian input method" start="00:07:30.319" video="mainVideo" id=subtitle]]
+[[!template text="and write a few simple sentences." start="00:07:32.240" video="mainVideo" id=subtitle]]
+[[!template text="With no training and no documentation," start="00:07:35.280" video="mainVideo" id=subtitle]]
+[[!template text="any Farsi writer familiar with Emacs" start="00:07:38.160" video="mainVideo" id=subtitle]]
+[[!template text="can write these, as farsi-transliterate-banan" start="00:07:41.360" video="mainVideo" id=subtitle]]
+[[!template text="input method is intuitive." start="00:07:45.440" video="mainVideo" id=subtitle]]
+[[!template text="I'll be using keycast" start="00:07:48.560" video="mainVideo" id=subtitle]]
+[[!template text="to show you keys as they are used." start="00:07:50.400" video="mainVideo" id=subtitle]]
+[[!template text="Let me first describe as to what we have" start="00:07:54.160" video="mainVideo" id=subtitle]]
+[[!template text="on the screen." start="00:07:56.560" video="mainVideo" id=subtitle]]
+[[!template text="There are three windows in one frame." start="00:07:58.720" video="mainVideo" id=subtitle]]
+[[!template text="Keycast will show commands and keys" start="00:08:01.520" video="mainVideo" id=subtitle]]
+[[!template text="on the mode line." start="00:08:04.639" video="mainVideo" id=subtitle]]
+[[!template text="The leftmost window is showing" start="00:08:06.319" video="mainVideo" id=subtitle]]
+[[!template text="logs of keycast." start="00:08:08.639" video="mainVideo" id=subtitle]]
+[[!template text="Transformed individual unshaped letters" start="00:08:10.879" video="mainVideo" id=subtitle]]
+[[!template text="will appear here." start="00:08:14.639" video="mainVideo" id=subtitle]]
+[[!template text="The middle window is running a tail -f" start="00:08:17.360" video="mainVideo" id=subtitle]]
+[[!template text="on the dribble file piped to fold -w1." start="00:08:21.120" video="mainVideo" id=subtitle]]
+[[!template text="This lets you see the raw ASCII characters" start="00:08:27.440" video="mainVideo" id=subtitle]]
+[[!template text="as I type them." start="00:08:30.720" video="mainVideo" id=subtitle]]
+[[!template text="The right window is the empty buffer" start="00:08:34.479" video="mainVideo" id=subtitle]]
+[[!template text="on the ex.fa file." start="00:08:37.839" video="mainVideo" id=subtitle]]
+[[!template text="Anything that I described here" start="00:08:41.680" video="mainVideo" id=subtitle]]
+[[!template text="can be done with virgin Emacs distribution" start="00:08:44.560" video="mainVideo" id=subtitle]]
+[[!template text="with nothing added," start="00:08:49.040" video="mainVideo" id=subtitle]]
+[[!template text="but I'm using Blee" start="00:08:51.360" video="mainVideo" id=subtitle]]
+[[!template text="(By* Libre-Halaal Emacs Environment)" start="00:08:53.760" video="mainVideo" id=subtitle]]
+[[!template text="to show things. You don't need to have blee" start="00:08:57.120" video="mainVideo" id=subtitle]]
+[[!template text="for writing the equivalent of the text" start="00:09:02.720" video="mainVideo" id=subtitle]]
+[[!template text="in this gif-cast." start="00:09:07.600" video="mainVideo" id=subtitle]]
+[[!template text="First, I'm going to select" start="00:09:10.800" video="mainVideo" id=subtitle]]
+[[!template text="the farsi-transliterate-banan." start="00:09:13.440" video="mainVideo" id=subtitle]]
+[[!template text="I'm entering C-x RET C-\ ." start="00:09:16.800" video="mainVideo" id=subtitle]]
+[[!template text="Notice the mode -ine" start="00:09:22.080" video="mainVideo" id=subtitle]]
+[[!template text="and the prompt at mini-buffer." start="00:09:23.839" video="mainVideo" id=subtitle]]
+[[!template text="With completion, I'm going to select" start="00:09:27.040" video="mainVideo" id=subtitle]]
+[[!template text="farsi-transliterate-banan." start="00:09:30.399" video="mainVideo" id=subtitle]]
+[[!template text="Notice that farsi-isiri-9147" start="00:09:34.000" video="mainVideo" id=subtitle]]
+[[!template text="was also provided as a choice." start="00:09:38.560" video="mainVideo" id=subtitle]]
+[[!template text="Also notice that the letter 'b' appears" start="00:09:43.360" video="mainVideo" id=subtitle]]
+[[!template text="in the left of the mode line of ex.fa." start="00:09:47.440" video="mainVideo" id=subtitle]]
+[[!template text="This indicates which input method" start="00:09:51.760" video="mainVideo" id=subtitle]]
+[[!template text="has been selected." start="00:09:54.000" video="mainVideo" id=subtitle]]
+[[!template text="Also notice that cursor is on" start="00:09:56.320" video="mainVideo" id=subtitle]]
+[[!template text="the top left corner of ex.fa." start="00:09:58.560" video="mainVideo" id=subtitle]]
+[[!template text="Next, I'm going to enter the 's' character." start="00:10:04.399" video="mainVideo" id=subtitle]]
+[[!template text="Notice the cursor moved to the right," start="00:10:08.800" video="mainVideo" id=subtitle]]
+[[!template text="and unshaped ’seen’ appeared" start="00:10:12.000" video="mainVideo" id=subtitle]]
+[[!template text="in the ex.fa buffer, on the mode-line," start="00:10:15.120" video="mainVideo" id=subtitle]]
+[[!template text="and in the keycast log buffer." start="00:10:20.079" video="mainVideo" id=subtitle]]
+[[!template text="Next, I'm going to enter 'l'." start="00:10:23.760" video="mainVideo" id=subtitle]]
+[[!template text="Notice ل in the mode-line," start="00:10:28.000" video="mainVideo" id=subtitle]]
+[[!template text="and notice how س was subjected to shaping." start="00:10:32.800" video="mainVideo" id=subtitle]]
+[[!template text="Next I'm going to write the letter" start="00:10:39.920" video="mainVideo" id=subtitle]]
+[[!template text="to write the following:" start="00:10:42.640" video="mainVideo" id=subtitle]]
+[[!template text=" سلام –حال شما چه طوره؟ –با ایمکس همه کار میشه کرد" start="00:10:44.640" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Hello, how are you?&quot;" start="00:10:50.560" video="mainVideo" id=subtitle]]
+[[!template text="You can do everything with Emacs." start="00:10:52.480" video="mainVideo" id=subtitle]]
+[[!template text="Generally, same-sounding Latin characters" start="00:10:56.720" video="mainVideo" id=subtitle]]
+[[!template text="are used. As usual, vowels are ignored" start="00:11:00.000" video="mainVideo" id=subtitle]]
+[[!template text="unless called for." start="00:11:03.920" video="mainVideo" id=subtitle]]
+[[!template text="Notice that in order to get ح," start="00:11:06.720" video="mainVideo" id=subtitle]]
+[[!template text="i repeated 'h' twice." start="00:11:10.800" video="mainVideo" id=subtitle]]
+[[!template text="ش" start="00:11:14.560" video="mainVideo" id=subtitle]]
+[[!template text="is the obvious 'sh'." start="00:11:15.440" video="mainVideo" id=subtitle]]
+[[!template text="چ" start="00:11:18.560" video="mainVideo" id=subtitle]]
+[[!template text="is the obvious 'ch'." start="00:11:19.519" video="mainVideo" id=subtitle]]
+[[!template text="t, that's the ط is upper case T." start="00:11:22.480" video="mainVideo" id=subtitle]]
+[[!template text=" ت" start="00:11:28.640" video="mainVideo" id=subtitle]]
+[[!template text="is lowercase t." start="00:11:29.439" video="mainVideo" id=subtitle]]
+[[!template text="That's it. We managed to write in Farsi" start="00:11:31.839" video="mainVideo" id=subtitle]]
+[[!template text="with a QWERTY keyboard, intuitively." start="00:11:34.880" video="mainVideo" id=subtitle]]
+[[!template text="Next, we are going to switch back to" start="00:11:38.640" video="mainVideo" id=subtitle]]
+[[!template text="globish and write &quot;back to globish&quot;." start="00:11:40.959" video="mainVideo" id=subtitle]]
+[[!template text="Notice that the globish sentence" start="00:11:45.680" video="mainVideo" id=subtitle]]
+[[!template text="started from the left side." start="00:11:47.920" video="mainVideo" id=subtitle]]
+[[!template text="This is due to proper detection" start="00:11:50.959" video="mainVideo" id=subtitle]]
+[[!template text="of paragraph directionality by Emacs." start="00:11:53.279" video="mainVideo" id=subtitle]]
+[[!template new="1" text="For the most part, Emacs is self-documenting." start="00:12:00.160" video="mainVideo" id=subtitle]]
+[[!template text="Here we are pointing you to some" start="00:12:05.600" video="mainVideo" id=subtitle]]
+[[!template text="relevant self-contained Emacs resources." start="00:12:07.920" video="mainVideo" id=subtitle]]
+[[!template text="The BIDI documentation applies to" start="00:12:12.880" video="mainVideo" id=subtitle]]
+[[!template text="all BIDI scripts," start="00:12:15.680" video="mainVideo" id=subtitle]]
+[[!template text="not just Perso-Arabic scripts." start="00:12:18.000" video="mainVideo" id=subtitle]]
+[[!template text="Referring to the code" start="00:12:22.079" video="mainVideo" id=subtitle]]
+[[!template text="can also be useful for some." start="00:12:23.279" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Here are some pointers." start="00:12:28.000" video="mainVideo" id=subtitle]]
+[[!template text="The Quail translation code" start="00:12:30.079" video="mainVideo" id=subtitle]]
+[[!template text="for Persian input methods:" start="00:12:32.399" video="mainVideo" id=subtitle]]
+[[!template text="the persian.el file has full details" start="00:12:35.519" video="mainVideo" id=subtitle]]
+[[!template text="of the mapping and some documentation." start="00:12:39.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Next, we'll show the keyboard layouts" start="00:12:44.000" video="mainVideo" id=subtitle]]
+[[!template text="as a gif-cast. You can get" start="00:12:46.639" video="mainVideo" id=subtitle]]
+[[!template text="relevant documentation for any input method" start="00:12:51.519" video="mainVideo" id=subtitle]]
+[[!template text="with the describe-input-method command." start="00:12:55.519" video="mainVideo" id=subtitle]]
+[[!template text="So, let's try that for farsi-transliterate-banan." start="00:13:00.320" video="mainVideo" id=subtitle]]
+[[!template text="We are back in the ex.fa buffer" start="00:13:05.920" video="mainVideo" id=subtitle]]
+[[!template text="as one window." start="00:13:09.360" video="mainVideo" id=subtitle]]
+[[!template text="We don't need the keycast logging" start="00:13:11.279" video="mainVideo" id=subtitle]]
+[[!template text="and the dribble windows any more." start="00:13:13.839" video="mainVideo" id=subtitle]]
+[[!template text="With the C-\, I reactivate" start="00:13:17.040" video="mainVideo" id=subtitle]]
+[[!template text="the farsi input method." start="00:13:20.320" video="mainVideo" id=subtitle]]
+[[!template text="Notice that keycast is still active" start="00:13:23.360" video="mainVideo" id=subtitle]]
+[[!template text="on the mode line." start="00:13:26.399" video="mainVideo" id=subtitle]]
+[[!template text="Next, with the C-h C-\ ," start="00:13:29.360" video="mainVideo" id=subtitle]]
+[[!template text="I get the input methods documentation." start="00:13:34.240" video="mainVideo" id=subtitle]]
+[[!template text="I then delete other windows" start="00:13:38.560" video="mainVideo" id=subtitle]]
+[[!template text="and keep the help buffer visible." start="00:13:40.639" video="mainVideo" id=subtitle]]
+[[!template text="Notice that beh" start="00:13:45.440" video="mainVideo" id=subtitle]]
+[[!template text="in this input methods identifier." start="00:13:47.279" video="mainVideo" id=subtitle]]
+[[!template text="Here is the URL for full documentation" start="00:13:52.720" video="mainVideo" id=subtitle]]
+[[!template text="on the web. The keyboard layout itself" start="00:13:55.920" video="mainVideo" id=subtitle]]
+[[!template text="is a one-to-one mapping, but towards" start="00:14:00.639" video="mainVideo" id=subtitle]]
+[[!template text="making transliteration intuitive." start="00:14:03.760" video="mainVideo" id=subtitle]]
+[[!template text="Multiple keys are sometimes mapped to" start="00:14:07.360" video="mainVideo" id=subtitle]]
+[[!template text="the same letter." start="00:14:10.240" video="mainVideo" id=subtitle]]
+[[!template text="For example, both 'i' and 'y' produce yeh." start="00:14:12.079" video="mainVideo" id=subtitle]]
+[[!template text="The usual two letter transliterations" start="00:14:19.760" video="mainVideo" id=subtitle]]
+[[!template text="ending with 'h' -- zh, ch, sh, and kh" start="00:14:22.959" video="mainVideo" id=subtitle]]
+[[!template text="are provided. The ampersand prefix" start="00:14:29.600" video="mainVideo" id=subtitle]]
+[[!template text="is used to support often invisible" start="00:14:34.160" video="mainVideo" id=subtitle]]
+[[!template text="BIDI markings. In addition to this" start="00:14:37.440" video="mainVideo" id=subtitle]]
+[[!template text="internal documentation," start="00:14:41.600" video="mainVideo" id=subtitle]]
+[[!template text="full documentation is also available." start="00:14:43.920" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Complete documentation" start="00:14:48.959" video="mainVideo" id=subtitle]]
+[[!template text="for Persian input methods" start="00:14:50.560" video="mainVideo" id=subtitle]]
+[[!template text="is available as PLPC-120036." start="00:14:52.240" video="mainVideo" id=subtitle]]
+[[!template text="Next, we'll take a quick look at this" start="00:14:58.560" video="mainVideo" id=subtitle]]
+[[!template text="on the web." start="00:15:00.880" video="mainVideo" id=subtitle]]
+[[!template text="You can click on links" start="00:15:03.600" video="mainVideo" id=subtitle]]
+[[!template text="in the reveal web-based form" start="00:15:05.440" video="mainVideo" id=subtitle]]
+[[!template text="of this presentation." start="00:15:07.440" video="mainVideo" id=subtitle]]
+[[!template text="So let's visit PLPC-120036." start="00:15:09.839" video="mainVideo" id=subtitle]]
+[[!template text="This document fully describes" start="00:15:15.440" video="mainVideo" id=subtitle]]
+[[!template text="Persian input methods." start="00:15:17.600" video="mainVideo" id=subtitle]]
+[[!template text="In addition to HTML," start="00:15:20.560" video="mainVideo" id=subtitle]]
+[[!template text="you can also obtain it in PDF." start="00:15:22.320" video="mainVideo" id=subtitle]]
+[[!template text="Let's do that. Of particular interest" start="00:15:26.079" video="mainVideo" id=subtitle]]
+[[!template text="in this document are various tables" start="00:15:30.079" video="mainVideo" id=subtitle]]
+[[!template text="that enumerate lists of letters" start="00:15:33.120" video="mainVideo" id=subtitle]]
+[[!template text="with their association" start="00:15:35.839" video="mainVideo" id=subtitle]]
+[[!template text="to both Persian input methods." start="00:15:37.120" video="mainVideo" id=subtitle]]
+[[!template text="Let's take a look at a few of these." start="00:15:41.839" video="mainVideo" id=subtitle]]
+[[!template text="Table 3, mapping of isiri-6219" start="00:15:46.240" video="mainVideo" id=subtitle]]
+[[!template text="(the Farsi character set)" start="00:15:51.360" video="mainVideo" id=subtitle]]
+[[!template text="to Emacs version input methods" start="00:15:53.680" video="mainVideo" id=subtitle]]
+[[!template text="could be of interest to you," start="00:15:55.680" video="mainVideo" id=subtitle]]
+[[!template text="as well as table 8" start="00:15:58.720" video="mainVideo" id=subtitle]]
+[[!template text="for BIDI-related control markups," start="00:16:01.040" video="mainVideo" id=subtitle]]
+[[!template text="and table 9, for vowels and other signs." start="00:16:04.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Having covered input methods," start="00:16:17.519" video="mainVideo" id=subtitle]]
+[[!template text="let's turn our attention" start="00:16:19.759" video="mainVideo" id=subtitle]]
+[[!template text="to ramifications of BIDI and Perso-Arabic" start="00:16:21.279" video="mainVideo" id=subtitle]]
+[[!template text="on various Emacs applications." start="00:16:25.199" video="mainVideo" id=subtitle]]
+[[!template text="Since 2012, I have been using Persian text" start="00:16:28.480" video="mainVideo" id=subtitle]]
+[[!template text="in various Emacs applications." start="00:16:32.160" video="mainVideo" id=subtitle]]
+[[!template text="In short, my experience has been" start="00:16:35.839" video="mainVideo" id=subtitle]]
+[[!template text="that most Emacs apps are usable," start="00:16:38.079" video="mainVideo" id=subtitle]]
+[[!template text="but they all have glitches" start="00:16:42.399" video="mainVideo" id=subtitle]]
+[[!template text="that could at a minimum" start="00:16:44.880" video="mainVideo" id=subtitle]]
+[[!template text="annoy Perso-Arabic users." start="00:16:47.279" video="mainVideo" id=subtitle]]
+[[!template text="In this slide, I'm presenting a summary." start="00:16:51.279" video="mainVideo" id=subtitle]]
+[[!template text="The glitches with Gnus" start="00:16:54.639" video="mainVideo" id=subtitle]]
+[[!template text="are not all that significant for me." start="00:16:56.399" video="mainVideo" id=subtitle]]
+[[!template text="BBDB glitches can easily be fixed." start="00:17:00.079" video="mainVideo" id=subtitle]]
+[[!template text="For Calendar, I have customized my own setup" start="00:17:04.240" video="mainVideo" id=subtitle]]
+[[!template text="to support Persian and Islamic dates" start="00:17:07.679" video="mainVideo" id=subtitle]]
+[[!template text="in Perso-Arabic. Perhaps they should be" start="00:17:10.799" video="mainVideo" id=subtitle]]
+[[!template text="merged upstream, instead of" start="00:17:14.079" video="mainVideo" id=subtitle]]
+[[!template text="dealing with apps one at a time." start="00:17:17.039" video="mainVideo" id=subtitle]]
+[[!template text="I think it's more reasonable" start="00:17:19.679" video="mainVideo" id=subtitle]]
+[[!template text="to consider them collectively." start="00:17:21.439" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The glitches that I mentioned" start="00:17:25.280" video="mainVideo" id=subtitle]]
+[[!template text="in the previous slide" start="00:17:26.880" video="mainVideo" id=subtitle]]
+[[!template text="have two routes:" start="00:17:28.799" video="mainVideo" id=subtitle]]
+[[!template text="some are BIDI-specific" start="00:17:30.480" video="mainVideo" id=subtitle]]
+[[!template text="and some are Perso-Arabic-specific." start="00:17:32.480" video="mainVideo" id=subtitle]]
+[[!template text="In this slide," start="00:17:35.919" video="mainVideo" id=subtitle]]
+[[!template text="I have classified them as such" start="00:17:36.720" video="mainVideo" id=subtitle]]
+[[!template text="and have made some general suggestions," start="00:17:39.280" video="mainVideo" id=subtitle]]
+[[!template text="but all of these at best amount to" start="00:17:42.960" video="mainVideo" id=subtitle]]
+[[!template text="tactical approaches." start="00:17:45.679" video="mainVideo" id=subtitle]]
+[[!template text="I think a more strategic approach" start="00:17:47.679" video="mainVideo" id=subtitle]]
+[[!template text="is called for." start="00:17:50.160" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The right way to address BIDI-awareness" start="00:17:53.520" video="mainVideo" id=subtitle]]
+[[!template text="and other awarenesses" start="00:17:56.240" video="mainVideo" id=subtitle]]
+[[!template text="is to build them in frameworks" start="00:17:58.559" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs apps can then use." start="00:18:00.559" video="mainVideo" id=subtitle]]
+[[!template text="So, I'm proposing that we first create ENML," start="00:18:04.160" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs Native Markup Language," start="00:18:08.480" video="mainVideo" id=subtitle]]
+[[!template text="as a Lisp-ish (perhaps even not fully secure)" start="00:18:11.520" video="mainVideo" id=subtitle]]
+[[!template text="super-set of HTML5." start="00:18:16.880" video="mainVideo" id=subtitle]]
+[[!template text="With that in place, we can then build on" start="00:18:20.320" video="mainVideo" id=subtitle]]
+[[!template text="the two decades of experience" start="00:18:22.960" video="mainVideo" id=subtitle]]
+[[!template text="that have produced various" start="00:18:25.360" video="mainVideo" id=subtitle]]
+[[!template text="web application development frameworks" start="00:18:27.600" video="mainVideo" id=subtitle]]
+[[!template text="by mimicking one of them." start="00:18:31.039" video="mainVideo" id=subtitle]]
+[[!template text="I don't have any running code" start="00:18:33.919" video="mainVideo" id=subtitle]]
+[[!template text="for any of these, but discussing strategy" start="00:18:35.679" video="mainVideo" id=subtitle]]
+[[!template text="need not always be futile." start="00:18:39.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs has immense potentials," start="00:18:44.640" video="mainVideo" id=subtitle]]
+[[!template text="but those potentials cannot be realized" start="00:18:47.679" video="mainVideo" id=subtitle]]
+[[!template text="unless we integrate Emacs in the totality" start="00:18:51.120" video="mainVideo" id=subtitle]]
+[[!template text="of a specific complete digital ecosystem." start="00:18:54.640" video="mainVideo" id=subtitle]]
+[[!template text="Over the past two decades, I've been" start="00:18:59.840" video="mainVideo" id=subtitle]]
+[[!template text="building the contours" start="00:19:02.000" video="mainVideo" id=subtitle]]
+[[!template text="of The Libre-Halaal By* (ByStar)" start="00:19:03.440" video="mainVideo" id=subtitle]]
+[[!template text="digital ecosystem." start="00:19:06.240" video="mainVideo" id=subtitle]]
+[[!template text="Emacs can then be fully integrated into" start="00:19:10.240" video="mainVideo" id=subtitle]]
+[[!template text="ByStar. It's through such integration" start="00:19:13.039" video="mainVideo" id=subtitle]]
+[[!template text="that full conviviality of Emacs" start="00:19:16.799" video="mainVideo" id=subtitle]]
+[[!template text="can be experienced." start="00:19:19.679" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Blee, the ByStar Libre-Halaal" start="00:19:24.240" video="mainVideo" id=subtitle]]
+[[!template text="Emacs environment is Emacs" start="00:19:26.640" video="mainVideo" id=subtitle]]
+[[!template text="plus a whole lot of Emacs apps" start="00:19:30.000" video="mainVideo" id=subtitle]]
+[[!template text="integrated with Debian," start="00:19:32.720" video="mainVideo" id=subtitle]]
+[[!template text="With ByStar services and with BISOS," start="00:19:34.880" video="mainVideo" id=subtitle]]
+[[!template text="the ByStar Internet Services OS." start="00:19:38.320" video="mainVideo" id=subtitle]]
+[[!template text="Perhaps this could be" start="00:19:42.480" video="mainVideo" id=subtitle]]
+[[!template text="the topic of a presentation" start="00:19:43.600" video="mainVideo" id=subtitle]]
+[[!template text="captions by Mohsen Banan" start="00:19:46.840" video="mainVideo" id=subtitle]]
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/borg.md b/2021/captions/borg.md
new file mode 100644
index 00000000..f35d5c41
--- /dev/null
+++ b/2021/captions/borg.md
@@ -0,0 +1,155 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, my name is Dhavan," start="00:00:00.950" video="mainVideo" id=subtitle]]
+[[!template text="also known as codingquark!" start="00:00:03.225" video="mainVideo" id=subtitle]]
+[[!template text="I started out learning Emacs" start="00:00:05.500" video="mainVideo" id=subtitle]]
+[[!template text="without knowing I had to plug things in" start="00:00:08.041" video="mainVideo" id=subtitle]]
+[[!template text="to make it work." start="00:00:12.540" video="mainVideo" id=subtitle]]
+[[!template text="Eventually I had to learn to set up ELPA." start="00:00:13.629" video="mainVideo" id=subtitle]]
+[[!template text="Since then I’ve used MELPA" start="00:00:14.849" video="mainVideo" id=subtitle]]
+[[!template text="and Debian apt sources." start="00:00:16.850" video="mainVideo" id=subtitle]]
+[[!template text="Recent discussions about ELPA," start="00:00:21.030" video="mainVideo" id=subtitle]]
+[[!template text="NonGNU ELPA, MELPA, etc." start="00:00:21.054" video="mainVideo" id=subtitle]]
+[[!template text="made me reconsider" start="00:00:21.054" video="mainVideo" id=subtitle]]
+[[!template text="what I was doing" start="00:00:21.054" video="mainVideo" id=subtitle]]
+[[!template text="with my Emacs." start="00:00:21.054" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I am not the kind of person" start="00:00:28.590" video="mainVideo" id=subtitle]]
+[[!template text="to mindlessly ram things into my emacs." start="00:00:30.887" video="mainVideo" id=subtitle]]
+[[!template text="I like to ponder," start="00:00:34.290" video="mainVideo" id=subtitle]]
+[[!template text="to understand," start="00:00:36.041" video="mainVideo" id=subtitle]]
+[[!template text="to have a level of control" start="00:00:37.500" video="mainVideo" id=subtitle]]
+[[!template text="and mindfulness" start="00:00:40.128" video="mainVideo" id=subtitle]]
+[[!template text="about my Emacs." start="00:00:42.069" video="mainVideo" id=subtitle]]
+[[!template text="It is not just a matter" start="00:00:43.890" video="mainVideo" id=subtitle]]
+[[!template text="of trying things out," start="00:00:45.730" video="mainVideo" id=subtitle]]
+[[!template text="it is about living an examined life" start="00:00:47.340" video="mainVideo" id=subtitle]]
+[[!template text="as the Greeks would say;" start="00:00:50.909" video="mainVideo" id=subtitle]]
+[[!template text="or sutta as Buddhists would say." start="00:00:53.387" video="mainVideo" id=subtitle]]
+[[!template text="Such an Emacs is an Emacs worth having." start="00:00:57.040" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This pursuit of mine" start="00:00:59.860" video="mainVideo" id=subtitle]]
+[[!template text="brought me to learn about borg." start="00:01:01.414" video="mainVideo" id=subtitle]]
+[[!template text="And I am going to share with you" start="00:01:03.710" video="mainVideo" id=subtitle]]
+[[!template text="how to use it." start="00:01:05.595" video="mainVideo" id=subtitle]]
+[[!template text="I believe the approach of using borg" start="00:01:06.479" video="mainVideo" id=subtitle]]
+[[!template text="for package management" start="00:01:09.018" video="mainVideo" id=subtitle]]
+[[!template text="is not for everyone." start="00:01:10.597" video="mainVideo" id=subtitle]]
+[[!template text="It involves knowing git," start="00:01:12.710" video="mainVideo" id=subtitle]]
+[[!template text="it involves looking into source code" start="00:01:14.307" video="mainVideo" id=subtitle]]
+[[!template text="and reading makefiles." start="00:01:16.648" video="mainVideo" id=subtitle]]
+[[!template text="Sure, anyone can learn" start="00:01:18.229" video="mainVideo" id=subtitle]]
+[[!template text="should they be motivated so," start="00:01:20.170" video="mainVideo" id=subtitle]]
+[[!template text="but people have different priorities." start="00:01:22.617" video="mainVideo" id=subtitle]]
+[[!template text="This is what is working for me right now." start="00:01:25.740" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Here is what we are going to do." start="00:01:29.056" video="mainVideo" id=subtitle]]
+[[!template text="We'll set up Debian, install dependencies," start="00:01:32.826" video="mainVideo" id=subtitle]]
+[[!template text="set up borg, install a package," start="00:01:35.696" video="mainVideo" id=subtitle]]
+[[!template text="and make sure it installs all the docs." start="00:01:39.032" video="mainVideo" id=subtitle]]
+[[!template text="Let’s get started!" start="00:01:42.090" video="mainVideo" id=subtitle]]
+[[!template text="Would it not be amazing" start="00:01:47.240" video="mainVideo" id=subtitle]]
+[[!template text="if we could start out with" start="00:01:48.342" video="mainVideo" id=subtitle]]
+[[!template text="just Debian and basic tools?" start="00:01:49.560" video="mainVideo" id=subtitle]]
+[[!template text="For borg, we need git," start="00:01:52.399" video="mainVideo" id=subtitle]]
+[[!template text="build-essential," start="00:01:54.848" video="mainVideo" id=subtitle]]
+[[!template text="and something to build docs." start="00:01:55.916" video="mainVideo" id=subtitle]]
+[[!template text="Nothing more!" start="00:01:57.384" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now that we have the OS setup," start="00:02:00.499" video="mainVideo" id=subtitle]]
+[[!template text="it is time to clone" start="00:02:04.658" video="mainVideo" id=subtitle]]
+[[!template text="what is called a “seed”." start="00:02:06.226" video="mainVideo" id=subtitle]]
+[[!template text="A seed will speed our process up" start="00:02:09.429" video="mainVideo" id=subtitle]]
+[[!template text="by providing things like" start="00:02:11.431" video="mainVideo" id=subtitle]]
+[[!template text="magit, epkg, auto-compile, etc." start="00:02:13.379" video="mainVideo" id=subtitle]]
+[[!template text="We will soon be using epkg and magit." start="00:02:15.500" video="mainVideo" id=subtitle]]
+[[!template text="The docs cover how to start" start="00:02:20.430" video="mainVideo" id=subtitle]]
+[[!template text="without a seed," start="00:02:22.642" video="mainVideo" id=subtitle]]
+[[!template text="but for the purposes of a short demo," start="00:02:23.477" video="mainVideo" id=subtitle]]
+[[!template text="seeds are better." start="00:02:25.779" video="mainVideo" id=subtitle]]
+[[!template text="I started with a seed" start="00:02:27.770" video="mainVideo" id=subtitle]]
+[[!template text="for my own dot emacs." start="00:02:28.682" video="mainVideo" id=subtitle]]
+[[!template text="It is fairly slim." start="00:02:30.083" video="mainVideo" id=subtitle]]
+[[!template new="1" text="As you can see," start="00:02:32.890" video="mainVideo" id=subtitle]]
+[[!template text="borg uses git URLs" start="00:02:33.854" video="mainVideo" id=subtitle]]
+[[!template text="and /not/ HTTPS URLs." start="00:02:35.088" video="mainVideo" id=subtitle]]
+[[!template text="Make sure you have your ssh keys" start="00:02:37.290" video="mainVideo" id=subtitle]]
+[[!template text="set up on GitHub, GitLab, etc." start="00:02:38.992" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Bootstrapping is like cloning a dot emacs," start="00:02:43.989" video="mainVideo" id=subtitle]]
+[[!template text="but it only comes with a" start="00:02:45.899" video="mainVideo" id=subtitle]]
+[[!template text="useful dot git submodules file." start="00:02:47.310" video="mainVideo" id=subtitle]]
+[[!template text="We get a Makefile that has targets" start="00:02:51.400" video="mainVideo" id=subtitle]]
+[[!template text="like help and bootstrap-borg." start="00:02:54.841" video="mainVideo" id=subtitle]]
+[[!template text="There will be more targets" start="00:02:57.739" video="mainVideo" id=subtitle]]
+[[!template text="after we finish the bootstrapping process." start="00:02:59.880" video="mainVideo" id=subtitle]]
+[[!template text="Then, we need to clone all the git modules," start="00:03:30.110" video="mainVideo" id=subtitle]]
+[[!template text="which is also done by a make target." start="00:03:35.582" video="mainVideo" id=subtitle]]
+[[!template text="This time, it will not just pull" start="00:03:38.310" video="mainVideo" id=subtitle]]
+[[!template text="the git submodules," start="00:03:40.754" video="mainVideo" id=subtitle]]
+[[!template text="but will also run various things" start="00:03:42.656" video="mainVideo" id=subtitle]]
+[[!template text="like auto-compilation," start="00:03:44.658" video="mainVideo" id=subtitle]]
+[[!template text="Info doc installation, etc." start="00:03:45.826" video="mainVideo" id=subtitle]]
+[[!template text="Good thing we installed texinfo earlier!" start="00:03:48.030" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now that we have borg bootstrapped," start="00:04:08.282" video="mainVideo" id=subtitle]]
+[[!template text="let’s see how to “assimilate” a drone." start="00:04:10.884" video="mainVideo" id=subtitle]]
+[[!template text="Well, that’s just a borg way of saying" start="00:04:14.520" video="mainVideo" id=subtitle]]
+[[!template text="how to install a new package." start="00:04:17.090" video="mainVideo" id=subtitle]]
+[[!template text="We get to work from inside Emacs now." start="00:04:19.900" video="mainVideo" id=subtitle]]
+[[!template text="Borg has excellent info docs," start="00:04:22.910" video="mainVideo" id=subtitle]]
+[[!template text="should you ever be having questions." start="00:04:26.366" video="mainVideo" id=subtitle]]
+[[!template text="I earlier talked about using a seed." start="00:04:28.450" video="mainVideo" id=subtitle]]
+[[!template text="Borg docs go into details of what that means." start="00:04:32.240" video="mainVideo" id=subtitle]]
+[[!template text="I encourage you to read the docs." start="00:04:34.830" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let’s try to install lsp-mode." start="00:04:40.190" video="mainVideo" id=subtitle]]
+[[!template text="Examining lsp-mode" start="00:04:51.500" video="mainVideo" id=subtitle]]
+[[!template text="with epkg’s helper function," start="00:04:52.459" video="mainVideo" id=subtitle]]
+[[!template text="we can see details of the package," start="00:04:54.694" video="mainVideo" id=subtitle]]
+[[!template text="dependencies required, and so on." start="00:04:57.280" video="mainVideo" id=subtitle]]
+[[!template text="epkg uses sqlite database." start="00:05:00.200" video="mainVideo" id=subtitle]]
+[[!template text="Now you know why I installed sqlite" start="00:05:02.470" video="mainVideo" id=subtitle]]
+[[!template text="in the OS preparation step!" start="00:05:04.871" video="mainVideo" id=subtitle]]
+[[!template text="Well, lsp-mode has" start="00:05:20.820" video="mainVideo" id=subtitle]]
+[[!template text="way too many dependencies" start="00:05:22.622" video="mainVideo" id=subtitle]]
+[[!template text="for this demo." start="00:05:24.057" video="mainVideo" id=subtitle]]
+[[!template text="Note how one is naturally led" start="00:05:25.830" video="mainVideo" id=subtitle]]
+[[!template text="to take a peek at the innards of the packages" start="00:05:28.795" video="mainVideo" id=subtitle]]
+[[!template text="in this simple workflow." start="00:05:32.332" video="mainVideo" id=subtitle]]
+[[!template text="As I said, it is about being mindful!" start="00:05:34.780" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, instead of lsp-mode," start="00:05:37.270" video="mainVideo" id=subtitle]]
+[[!template text="let’s take a look at" start="00:05:39.573" video="mainVideo" id=subtitle]]
+[[!template text="Prot’s excellent modus-themes." start="00:05:41.308" video="mainVideo" id=subtitle]]
+[[!template text="No extra dependencies needed." start="00:05:45.400" video="mainVideo" id=subtitle]]
+[[!template text="That is perfect!" start="00:05:47.247" video="mainVideo" id=subtitle]]
+[[!template text="The themes have great docs" start="00:05:49.870" video="mainVideo" id=subtitle]]
+[[!template text="and our philosopher friend" start="00:05:52.018" video="mainVideo" id=subtitle]]
+[[!template text="is good at writing." start="00:05:53.620" video="mainVideo" id=subtitle]]
+[[!template text="Alright, first, we clone the package." start="00:05:56.000" video="mainVideo" id=subtitle]]
+[[!template text="This allows us to inspect the code," start="00:06:02.930" video="mainVideo" id=subtitle]]
+[[!template text="should we want to." start="00:06:04.664" video="mainVideo" id=subtitle]]
+[[!template text="Well, you /should/." start="00:06:06.330" video="mainVideo" id=subtitle]]
+[[!template text="Upon inspecting the code," start="00:06:23.000" video="mainVideo" id=subtitle]]
+[[!template text="we ask borg to assimilate the package." start="00:06:25.552" video="mainVideo" id=subtitle]]
+[[!template text="This will load the code in our Emacs" start="00:06:30.620" video="mainVideo" id=subtitle]]
+[[!template text="and make the package available for use." start="00:06:33.927" video="mainVideo" id=subtitle]]
+[[!template tnew="1" ext="Wait, I was praising all the docs," start="00:06:39.799" video="mainVideo" id=subtitle]]
+[[!template text="but where are they?" start="00:06:42.135" video="mainVideo" id=subtitle]]
+[[!template text="To install the docs," start="00:06:43.690" video="mainVideo" id=subtitle]]
+[[!template text="we need to instruct borg" start="00:06:44.571" video="mainVideo" id=subtitle]]
+[[!template text="about where to find them." start="00:06:46.273" video="mainVideo" id=subtitle]]
+[[!template text="To do this, we edit the gitmodules file" start="00:06:48.020" video="mainVideo" id=subtitle]]
+[[!template text="and add the details." start="00:06:51.978" video="mainVideo" id=subtitle]]
+[[!template text="There they are!" start="00:06:53.910" video="mainVideo" id=subtitle]]
+[[!template text="We have our docs!" start="00:06:58.310" video="mainVideo" id=subtitle]]
+[[!template text="Alright, we have assimilated a package." start="00:07:04.170" video="mainVideo" id=subtitle]]
+[[!template text="After sufficient testing," start="00:07:09.940" video="mainVideo" id=subtitle]]
+[[!template text="we can commit it as a part of our own dot emacs," start="00:07:11.398" video="mainVideo" id=subtitle]]
+[[!template text="which is a drone of our borg collective." start="00:07:14.234" video="mainVideo" id=subtitle]]
+[[!template text="Since all the packages are git submodules," start="00:07:19.272" video="mainVideo" id=subtitle]]
+[[!template text="we get to use magit" start="00:07:21.741" video="mainVideo" id=subtitle]]
+[[!template text="(all hail magit!)" start="00:07:23.810" video="mainVideo" id=subtitle]]
+[[!template text="and borg’s helper functions" start="00:07:25.245" video="mainVideo" id=subtitle]]
+[[!template text="to commit the code." start="00:07:27.514" video="mainVideo" id=subtitle]]
+[[!template text="Now create your own dot el file" start="00:07:29.530" video="mainVideo" id=subtitle]]
+[[!template text="and hack away!" start="00:07:31.818" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So that is it." start="00:07:38.758" video="mainVideo" id=subtitle]]
+[[!template text="I hope you enjoyed the talk" start="00:07:39.793" video="mainVideo" id=subtitle]]
+[[!template text="and I will be hanging out in IRC" start="00:07:41.661" video="mainVideo" id=subtitle]]
+[[!template text="if you have any questions." start="00:07:45.131" video="mainVideo" id=subtitle]]
+[[!template text="Thank you, and bye." start="00:07:46.666" 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/cs.md b/2021/captions/cs.md
new file mode 100644
index 00000000..08a23267
--- /dev/null
+++ b/2021/captions/cs.md
@@ -0,0 +1,261 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="My name is Greg Coladonato," start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="and this is my presentation named" start="00:00:01.520" video="mainVideo" id=subtitle]]
+[[!template text="One Effective Computer Science" start="00:00:03.199" video="mainVideo" id=subtitle]]
+[[!template text="Grad Student Workflow." start="00:00:04.560" video="mainVideo" id=subtitle]]
+[[!template text="For self-introduction," start="00:00:06.480" video="mainVideo" id=subtitle]]
+[[!template text="I've been an Emacs user since 1989" start="00:00:07.680" video="mainVideo" id=subtitle]]
+[[!template text="when I was an undergrad in computer science," start="00:00:09.599" video="mainVideo" id=subtitle]]
+[[!template text="and I'm still an Emacs user" start="00:00:11.599" video="mainVideo" id=subtitle]]
+[[!template text="now I'm getting a master's of science" start="00:00:13.040" video="mainVideo" id=subtitle]]
+[[!template text="in computer science." start="00:00:15.280" video="mainVideo" id=subtitle]]
+[[!template text="In my day job," start="00:00:16.880" video="mainVideo" id=subtitle]]
+[[!template text="I work in product management" start="00:00:17.760" video="mainVideo" id=subtitle]]
+[[!template text="in a Silicon Valley" start="00:00:19.199" video="mainVideo" id=subtitle]]
+[[!template text="computer vision startup," start="00:00:20.640" video="mainVideo" id=subtitle]]
+[[!template text="and I'm proud to say" start="00:00:21.840" video="mainVideo" id=subtitle]]
+[[!template text="I've been submitting my first PRs" start="00:00:22.880" video="mainVideo" id=subtitle]]
+[[!template text="to open source projects this year." start="00:00:25.039" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The goals of my workflow are first" start="00:00:27.039" video="mainVideo" id=subtitle]]
+[[!template text="to make my notes easily accessible" start="00:00:29.199" video="mainVideo" id=subtitle]]
+[[!template text="and searchable." start="00:00:30.800" video="mainVideo" id=subtitle]]
+[[!template text="Second goal, provide a way for me" start="00:00:33.280" video="mainVideo" id=subtitle]]
+[[!template text="to permanently remember what I learned," start="00:00:34.800" video="mainVideo" id=subtitle]]
+[[!template text="and thirdly, to enable conceptual linking" start="00:00:36.480" video="mainVideo" id=subtitle]]
+[[!template text="between related topics and entities." start="00:00:38.879" video="mainVideo" id=subtitle]]
+[[!template text="I'll give examples of each of these" start="00:00:40.480" video="mainVideo" id=subtitle]]
+[[!template text="as we go along." start="00:00:41.920" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The requirements of my workflow:" start="00:00:43.120" video="mainVideo" id=subtitle]]
+[[!template text="it needs to be tightly integrated with PDFs," start="00:00:45.120" video="mainVideo" id=subtitle]]
+[[!template text="as most of the documents I get from grad school" start="00:00:47.920" video="mainVideo" id=subtitle]]
+[[!template text="are in PDF form," start="00:00:50.399" video="mainVideo" id=subtitle]]
+[[!template text="most of my submissions of work" start="00:00:51.440" video="mainVideo" id=subtitle]]
+[[!template text="are in PDF form," start="00:00:53.760" video="mainVideo" id=subtitle]]
+[[!template text="and most research papers I have access to" start="00:00:54.719" video="mainVideo" id=subtitle]]
+[[!template text="are in PDF form as well." start="00:00:56.640" video="mainVideo" id=subtitle]]
+[[!template text="I want my workflow to be subscription-free." start="00:00:58.399" video="mainVideo" id=subtitle]]
+[[!template text="I do not want to be locked into" start="00:01:00.320" video="mainVideo" id=subtitle]]
+[[!template text="paying a subscription" start="00:01:01.840" video="mainVideo" id=subtitle]]
+[[!template text="just to read my own notes." start="00:01:03.120" video="mainVideo" id=subtitle]]
+[[!template text="It must be future proof." start="00:01:04.799" video="mainVideo" id=subtitle]]
+[[!template text="I have used note-taking systems in the past" start="00:01:06.720" video="mainVideo" id=subtitle]]
+[[!template text="that I now no longer have a way to decode," start="00:01:09.600" video="mainVideo" id=subtitle]]
+[[!template text="so they're locked into some format" start="00:01:12.960" video="mainVideo" id=subtitle]]
+[[!template text="that I can no longer use." start="00:01:14.640" video="mainVideo" id=subtitle]]
+[[!template text="I want my notes to be version-controlled," start="00:01:17.200" video="mainVideo" id=subtitle]]
+[[!template text="so that if I make a big mistake," start="00:01:19.119" video="mainVideo" id=subtitle]]
+[[!template text="I can undo and revert" start="00:01:20.479" video="mainVideo" id=subtitle]]
+[[!template text="to a prior good version," start="00:01:22.080" video="mainVideo" id=subtitle]]
+[[!template text="and I want my system to use spaced repetition," start="00:01:23.840" video="mainVideo" id=subtitle]]
+[[!template text="which is an advanced method" start="00:01:27.680" video="mainVideo" id=subtitle]]
+[[!template text="of learning things over time" start="00:01:29.520" video="mainVideo" id=subtitle]]
+[[!template text="so that you don't forget them." start="00:01:31.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The package dependencies, in brief." start="00:01:34.000" video="mainVideo" id=subtitle]]
+[[!template text="org-mode, org-roam, org-roam-bibtex," start="00:01:36.799" video="mainVideo" id=subtitle]]
+[[!template text="pdf-tools, org-noter and org-ref." start="00:01:38.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And now let's get on to some demos." start="00:01:42.720" video="mainVideo" id=subtitle]]
+[[!template text="Here in my browser window here" start="00:01:45.119" video="mainVideo" id=subtitle]]
+[[!template text="is a lecture in the course" start="00:01:47.520" video="mainVideo" id=subtitle]]
+[[!template text="I'm currently taking on deep learning." start="00:01:49.680" video="mainVideo" id=subtitle]]
+[[!template text="It's very nice that the professor" start="00:01:51.840" video="mainVideo" id=subtitle]]
+[[!template text="provides slides. So this is" start="00:01:54.240" video="mainVideo" id=subtitle]]
+[[!template text="the 54-page PDF file of the slides" start="00:01:55.759" video="mainVideo" id=subtitle]]
+[[!template text="for the lecture. The problem is," start="00:02:00.000" video="mainVideo" id=subtitle]]
+[[!template text="it's hard to take notes on them." start="00:02:02.079" video="mainVideo" id=subtitle]]
+[[!template text="It's impossible to take notes on them" start="00:02:03.200" video="mainVideo" id=subtitle]]
+[[!template text="here in this browser," start="00:02:04.560" video="mainVideo" id=subtitle]]
+[[!template text="as far as I know. So what I've done is" start="00:02:05.840" video="mainVideo" id=subtitle]]
+[[!template text="I've incorporated these slides as a PDF" start="00:02:07.840" video="mainVideo" id=subtitle]]
+[[!template text="in org-roam, which..." start="00:02:11.440" video="mainVideo" id=subtitle]]
+[[!template text="I will now visit this file" start="00:02:12.959" video="mainVideo" id=subtitle]]
+[[!template text="and you can bring it up alongside the PDF" start="00:02:16.640" video="mainVideo" id=subtitle]]
+[[!template text="I was just looking at here." start="00:02:19.120" video="mainVideo" id=subtitle]]
+[[!template text="So what i like about this system is," start="00:02:20.560" video="mainVideo" id=subtitle]]
+[[!template text="as I'm going through and reading" start="00:02:23.200" video="mainVideo" id=subtitle]]
+[[!template text="watching the video of the lecture," start="00:02:24.800" video="mainVideo" id=subtitle]]
+[[!template text="I'm following along in the PDF notes here," start="00:02:26.720" video="mainVideo" id=subtitle]]
+[[!template text="and I'm taking my notes alongside them." start="00:02:29.599" video="mainVideo" id=subtitle]]
+[[!template text="So here's the first part of that lecture." start="00:02:31.680" video="mainVideo" id=subtitle]]
+[[!template text="You can't see at the bottom right now," start="00:02:34.400" video="mainVideo" id=subtitle]]
+[[!template text="but this is one of the earlier pages." start="00:02:36.319" video="mainVideo" id=subtitle]]
+[[!template text="I go to the second section here" start="00:02:38.800" video="mainVideo" id=subtitle]]
+[[!template text="and you see that my notes" start="00:02:42.400" video="mainVideo" id=subtitle]]
+[[!template text="for this part of the lecture," start="00:02:45.040" video="mainVideo" id=subtitle]]
+[[!template text="here, my notes here..." start="00:02:46.640" video="mainVideo" id=subtitle]]
+[[!template text="I love how the notes" start="00:02:48.480" video="mainVideo" id=subtitle]]
+[[!template text="for different parts of the lecture" start="00:02:49.599" video="mainVideo" id=subtitle]]
+[[!template text="are coordinated with the different parts" start="00:02:50.959" video="mainVideo" id=subtitle]]
+[[!template text="of the PDF that go along with the lecture." start="00:02:52.560" video="mainVideo" id=subtitle]]
+[[!template text="Now let's go back to the top of this" start="00:02:55.200" video="mainVideo" id=subtitle]]
+[[!template text="and you'll see... First, you'll see my notes" start="00:02:57.519" video="mainVideo" id=subtitle]]
+[[!template text="down here. I'll go into these" start="00:03:01.840" video="mainVideo" id=subtitle]]
+[[!template text="a little bit more shortly," start="00:03:03.920" video="mainVideo" id=subtitle]]
+[[!template text="but one of the things" start="00:03:06.319" video="mainVideo" id=subtitle]]
+[[!template text="that goes along with a lecture" start="00:03:07.200" video="mainVideo" id=subtitle]]
+[[!template text="in a grad school class is these days" start="00:03:08.959" video="mainVideo" id=subtitle]]
+[[!template text="in computer science citations" start="00:03:11.519" video="mainVideo" id=subtitle]]
+[[!template text="for research papers" start="00:03:13.680" video="mainVideo" id=subtitle]]
+[[!template text="that were expected to read." start="00:03:14.640" video="mainVideo" id=subtitle]]
+[[!template text="So here's one entitled MixMatch." start="00:03:16.480" video="mainVideo" id=subtitle]]
+[[!template text="I haven't downloaded this paper yet," start="00:03:20.080" video="mainVideo" id=subtitle]]
+[[!template text="so let's go. Take a look at that." start="00:03:22.319" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So I use a keystroke to select" start="00:03:24.239" video="mainVideo" id=subtitle]]
+[[!template text="the title of the paper" start="00:03:26.319" video="mainVideo" id=subtitle]]
+[[!template text="and another keybinding" start="00:03:28.480" video="mainVideo" id=subtitle]]
+[[!template text="to search for that paper" start="00:03:30.239" video="mainVideo" id=subtitle]]
+[[!template text="on a website called arXiv." start="00:03:31.440" video="mainVideo" id=subtitle]]
+[[!template text="arXiv, if you're not familiar--" start="00:03:33.519" video="mainVideo" id=subtitle]]
+[[!template text="and here's a match--" start="00:03:35.280" video="mainVideo" id=subtitle]]
+[[!template text="arXiv, if you're not familiar," start="00:03:36.400" video="mainVideo" id=subtitle]]
+[[!template text="is an open research server" start="00:03:37.680" video="mainVideo" id=subtitle]]
+[[!template text="where researchers publish papers" start="00:03:42.000" video="mainVideo" id=subtitle]]
+[[!template text="before they're published in journals" start="00:03:43.760" video="mainVideo" id=subtitle]]
+[[!template text="or conferences, and they are copyright-free" start="00:03:45.040" video="mainVideo" id=subtitle]]
+[[!template text="and open to anyone to read." start="00:03:47.920" video="mainVideo" id=subtitle]]
+[[!template text="So here is the paper I was looking for." start="00:03:50.159" video="mainVideo" id=subtitle]]
+[[!template text="I copy this link into an Org mode link," start="00:03:52.799" video="mainVideo" id=subtitle]]
+[[!template text="and I come back to Emacs," start="00:03:58.560" video="mainVideo" id=subtitle]]
+[[!template text="and now another keystroke" start="00:03:59.840" video="mainVideo" id=subtitle]]
+[[!template text="will revisit that website," start="00:04:02.400" video="mainVideo" id=subtitle]]
+[[!template text="pull down the PDF, and pull down" start="00:04:04.879" video="mainVideo" id=subtitle]]
+[[!template text="all the information in the bibliography" start="00:04:06.400" video="mainVideo" id=subtitle]]
+[[!template text="and put it into a bibliography here," start="00:04:08.400" video="mainVideo" id=subtitle]]
+[[!template text="inside my local bibliography." start="00:04:11.040" video="mainVideo" id=subtitle]]
+[[!template text="So here's the paper I was just looking at." start="00:04:13.599" video="mainVideo" id=subtitle]]
+[[!template text="Another great thing about a lot of PDFs" start="00:04:15.840" video="mainVideo" id=subtitle]]
+[[!template text="is that they have an embedded outline" start="00:04:17.840" video="mainVideo" id=subtitle]]
+[[!template text="that you can extract via the pdf-tools package." start="00:04:20.320" video="mainVideo" id=subtitle]]
+[[!template text="So now you see on the right here:" start="00:04:24.160" video="mainVideo" id=subtitle]]
+[[!template text="introduction, related work, MixMatch," start="00:04:25.680" video="mainVideo" id=subtitle]]
+[[!template text="experiments. I can go right to that section," start="00:04:27.360" video="mainVideo" id=subtitle]]
+[[!template text="and this outline knows exactly" start="00:04:30.479" video="mainVideo" id=subtitle]]
+[[!template text="which part of the PDF" start="00:04:32.639" video="mainVideo" id=subtitle]]
+[[!template text="corresponds to each of the parts" start="00:04:33.759" video="mainVideo" id=subtitle]]
+[[!template text="of this outline in the paper." start="00:04:35.919" video="mainVideo" id=subtitle]]
+[[!template text="So then, when I go take notes in here," start="00:04:37.680" video="mainVideo" id=subtitle]]
+[[!template text="just like in my other notes," start="00:04:40.240" video="mainVideo" id=subtitle]]
+[[!template text="it'll be coordinated with the PDF" start="00:04:41.280" video="mainVideo" id=subtitle]]
+[[!template text="that goes along with it." start="00:04:43.040" video="mainVideo" id=subtitle]]
+[[!template text="So let's quit out of here." start="00:04:44.639" video="mainVideo" id=subtitle]]
+[[!template text="So now that I've captured that..." start="00:04:48.080" video="mainVideo" id=subtitle]]
+[[!template text="Uh oh, this is the same paper." start="00:04:50.160" video="mainVideo" id=subtitle]]
+[[!template text="So now here I am back in my notes." start="00:04:53.199" video="mainVideo" id=subtitle]]
+[[!template text="now that I've captured this paper." start="00:04:56.000" video="mainVideo" id=subtitle]]
+[[!template text="What I'm going to do is make it a link," start="00:04:58.000" video="mainVideo" id=subtitle]]
+[[!template text="so the org-roam node that I just took" start="00:05:02.400" video="mainVideo" id=subtitle]]
+[[!template text="will be here at the top. MixMatch." start="00:05:07.520" video="mainVideo" id=subtitle]]
+[[!template text="There's a little difference." start="00:05:09.600" video="mainVideo" id=subtitle]]
+[[!template text="You'll see here, this m is a different case" start="00:05:10.639" video="mainVideo" id=subtitle]]
+[[!template text="than this m, and that's one of my to-do list." start="00:05:13.120" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to make it so that this search" start="00:05:16.240" video="mainVideo" id=subtitle]]
+[[!template text="is a little less case-sensitive." start="00:05:18.720" video="mainVideo" id=subtitle]]
+[[!template text="So now I've linked this link to this paper" start="00:05:20.320" video="mainVideo" id=subtitle]]
+[[!template text="into these notes, and now these are..." start="00:05:23.520" video="mainVideo" id=subtitle]]
+[[!template text="you'll see a little bit later" start="00:05:25.680" video="mainVideo" id=subtitle]]
+[[!template text="how these links can be graphed and followed" start="00:05:26.639" video="mainVideo" id=subtitle]]
+[[!template text="and so forth. While I'm in this document," start="00:05:29.360" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to show you" start="00:05:32.960" video="mainVideo" id=subtitle]]
+[[!template text="that when I'm learning something" start="00:05:33.680" video="mainVideo" id=subtitle]]
+[[!template text="and I learn a new fact," start="00:05:36.639" video="mainVideo" id=subtitle]]
+[[!template text="I write down what I learned" start="00:05:38.400" video="mainVideo" id=subtitle]]
+[[!template text="in the form of a question and an answer." start="00:05:40.320" video="mainVideo" id=subtitle]]
+[[!template text="So you can see here, there's a question" start="00:05:42.400" video="mainVideo" id=subtitle]]
+[[!template text="that begins with who, what, where." start="00:05:45.039" video="mainVideo" id=subtitle]]
+[[!template text="It begins with a w word, or how," start="00:05:46.800" video="mainVideo" id=subtitle]]
+[[!template text="or if or is, and it ends in a question mark," start="00:05:49.360" video="mainVideo" id=subtitle]]
+[[!template text="and then following that is another string" start="00:05:53.039" video="mainVideo" id=subtitle]]
+[[!template text="that ends in a period." start="00:05:54.960" video="mainVideo" id=subtitle]]
+[[!template text="So I have a... I'd like to do this" start="00:05:56.560" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs as well, but I haven't" start="00:05:58.240" video="mainVideo" id=subtitle]]
+[[!template text="worked that out yet." start="00:05:59.280" video="mainVideo" id=subtitle]]
+[[!template text="I have a script that will..." start="00:06:00.319" video="mainVideo" id=subtitle]]
+[[!template text="Let's find a-n-k-i-f." start="00:06:04.639" video="mainVideo" id=subtitle]]
+[[!template text="Okay, I have a script that will go through" start="00:06:07.680" video="mainVideo" id=subtitle]]
+[[!template text="all the notes in my org-roam directory" start="00:06:09.680" video="mainVideo" id=subtitle]]
+[[!template text="and find all the questions." start="00:06:13.680" video="mainVideo" id=subtitle]]
+[[!template text="Now let's pull up the most..." start="00:06:16.880" video="mainVideo" id=subtitle]]
+[[!template text="No, don't edit the buffer." start="00:06:20.720" video="mainVideo" id=subtitle]]
+[[!template text="Save that. Come back to here." start="00:06:24.319" video="mainVideo" id=subtitle]]
+[[!template text="So now you can see that all the questions" start="00:06:29.039" video="mainVideo" id=subtitle]]
+[[!template text="that I've written in my notes" start="00:06:31.680" video="mainVideo" id=subtitle]]
+[[!template text="have now been ANKIFIED." start="00:06:32.560" video="mainVideo" id=subtitle]]
+[[!template text="Now what's that mean?" start="00:06:33.759" video="mainVideo" id=subtitle]]
+[[!template text="Anki is this program here" start="00:06:34.880" video="mainVideo" id=subtitle]]
+[[!template text="which is a flashcard system" start="00:06:40.960" video="mainVideo" id=subtitle]]
+[[!template text="based on the idea..." start="00:06:43.199" video="mainVideo" id=subtitle]]
+[[!template text="No, let's not download that right now." start="00:06:44.560" video="mainVideo" id=subtitle]]
+[[!template text="This is a system that enables" start="00:06:48.000" video="mainVideo" id=subtitle]]
+[[!template text="the easy creation of flash cards" start="00:06:50.720" video="mainVideo" id=subtitle]]
+[[!template text="that show you the front," start="00:06:53.120" video="mainVideo" id=subtitle]]
+[[!template text="show you the back," start="00:06:54.479" video="mainVideo" id=subtitle]]
+[[!template text="and then you decide" start="00:06:55.360" video="mainVideo" id=subtitle]]
+[[!template text="if you knew that question or not." start="00:06:56.160" video="mainVideo" id=subtitle]]
+[[!template text="So I don't want to spend much time on this," start="00:07:00.000" video="mainVideo" id=subtitle]]
+[[!template text="but everything I'm learning in a class," start="00:07:02.639" video="mainVideo" id=subtitle]]
+[[!template text="I write into my notes as a question" start="00:07:04.639" video="mainVideo" id=subtitle]]
+[[!template text="that I load into this flashcard system" start="00:07:06.800" video="mainVideo" id=subtitle]]
+[[!template text="that then I can review on a walk," start="00:07:08.800" video="mainVideo" id=subtitle]]
+[[!template text="or on a bus ride, or whatever," start="00:07:10.880" video="mainVideo" id=subtitle]]
+[[!template text="and stay on top of indefinitely." start="00:07:13.680" video="mainVideo" id=subtitle]]
+[[!template text="As long as I can continue" start="00:07:16.400" video="mainVideo" id=subtitle]]
+[[!template text="to keep reviewing that," start="00:07:17.440" video="mainVideo" id=subtitle]]
+[[!template text="I will keep that information" start="00:07:18.400" video="mainVideo" id=subtitle]]
+[[!template text="fresh in my mind." start="00:07:20.639" video="mainVideo" id=subtitle]]
+[[!template text="So now let's come out of these files" start="00:07:22.319" video="mainVideo" id=subtitle]]
+[[!template text="back to here." start="00:07:24.479" video="mainVideo" id=subtitle]]
+[[!template text="So I've demoed class note PDFs," start="00:07:25.039" video="mainVideo" id=subtitle]]
+[[!template text="grabbing papers from arXiv," start="00:07:27.440" video="mainVideo" id=subtitle]]
+[[!template text="autogenerating the skeletons" start="00:07:29.440" video="mainVideo" id=subtitle]]
+[[!template text="and the flashcards," start="00:07:31.199" video="mainVideo" id=subtitle]]
+[[!template text="and now let's see what it looks like." start="00:07:32.720" video="mainVideo" id=subtitle]]
+[[!template text="Let's visualize the connections" start="00:07:35.280" video="mainVideo" id=subtitle]]
+[[!template text="between these nodes." start="00:07:40.160" video="mainVideo" id=subtitle]]
+[[!template text="So here is a graph for the file" start="00:07:42.000" video="mainVideo" id=subtitle]]
+[[!template text="I'm reading right now:" start="00:07:45.199" video="mainVideo" id=subtitle]]
+[[!template text="One Effective Grad Student Workflow." start="00:07:46.319" video="mainVideo" id=subtitle]]
+[[!template text="Here is the node I have a link to" start="00:07:49.520" video="mainVideo" id=subtitle]]
+[[!template text="in my Org mode document" start="00:07:53.599" video="mainVideo" id=subtitle]]
+[[!template text="on spaced repetition. We can open that" start="00:07:54.639" video="mainVideo" id=subtitle]]
+[[!template text="and come right back to Emacs," start="00:07:57.199" video="mainVideo" id=subtitle]]
+[[!template text="and I just love that." start="00:07:59.280" video="mainVideo" id=subtitle]]
+[[!template text="For the more complicated topics," start="00:08:01.680" video="mainVideo" id=subtitle]]
+[[!template text="you can see connections between things" start="00:08:03.919" video="mainVideo" id=subtitle]]
+[[!template text="that you maybe didn't realize you had," start="00:08:05.520" video="mainVideo" id=subtitle]]
+[[!template text="and some of the notes you've taken." start="00:08:07.520" video="mainVideo" id=subtitle]]
+[[!template text="And so I'm getting near the end." start="00:08:10.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I just want to show some small customizations." start="00:08:12.639" video="mainVideo" id=subtitle]]
+[[!template text="I save my org mode files" start="00:08:15.120" video="mainVideo" id=subtitle]]
+[[!template text="that are in org-roam" start="00:08:17.120" video="mainVideo" id=subtitle]]
+[[!template text="with a year year month month date prefix," start="00:08:18.479" video="mainVideo" id=subtitle]]
+[[!template text="so that I can tell when the node was created" start="00:08:21.520" video="mainVideo" id=subtitle]]
+[[!template text="I also truncate them at 30 characters," start="00:08:24.639" video="mainVideo" id=subtitle]]
+[[!template text="so that when I do an ls," start="00:08:26.560" video="mainVideo" id=subtitle]]
+[[!template text="they don't word wrap." start="00:08:27.919" video="mainVideo" id=subtitle]]
+[[!template text="Maybe that's OCD." start="00:08:29.280" video="mainVideo" id=subtitle]]
+[[!template text="I also use an ID format that is year month" start="00:08:32.800" video="mainVideo" id=subtitle]]
+[[!template text="day hour month hour minute second" start="00:08:38.159" video="mainVideo" id=subtitle]]
+[[!template text="rather than the full UUID format" start="00:08:40.479" video="mainVideo" id=subtitle]]
+[[!template text="because that number up there," start="00:08:43.279" video="mainVideo" id=subtitle]]
+[[!template text="that ID makes sense to me" start="00:08:44.720" video="mainVideo" id=subtitle]]
+[[!template text="and it gives me an idea of when that node--" start="00:08:46.160" video="mainVideo" id=subtitle]]
+[[!template text="which you can, by the way," start="00:08:50.160" video="mainVideo" id=subtitle]]
+[[!template text="you can have--even one of these subheadings" start="00:08:51.040" video="mainVideo" id=subtitle]]
+[[!template text="can be a node in org-roam." start="00:08:55.040" video="mainVideo" id=subtitle]]
+[[!template text="So now that you can see" start="00:08:56.240" video="mainVideo" id=subtitle]]
+[[!template text="that was created right now." start="00:08:57.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Some of the TODOs I still have" start="00:08:59.440" video="mainVideo" id=subtitle]]
+[[!template text="in this system... We don't have to go" start="00:09:00.640" video="mainVideo" id=subtitle]]
+[[!template text="too much into them, but I mentioned" start="00:09:02.720" video="mainVideo" id=subtitle]]
+[[!template text="case insensitivity, and I'd like" start="00:09:04.000" video="mainVideo" id=subtitle]]
+[[!template text="to make some improvements to org-noter." start="00:09:07.600" video="mainVideo" id=subtitle]]
+[[!template text="At this point, I'd just like to..." start="00:09:10.080" video="mainVideo" id=subtitle]]
+[[!template text="I have a list of people I'd like to thank." start="00:09:12.240" video="mainVideo" id=subtitle]]
+[[!template text="I'm not gonna read the whole list out," start="00:09:14.959" video="mainVideo" id=subtitle]]
+[[!template text="but they're a bunch of software engineers" start="00:09:16.240" video="mainVideo" id=subtitle]]
+[[!template text="that created great free software" start="00:09:17.680" video="mainVideo" id=subtitle]]
+[[!template text="that's very useful to me" start="00:09:20.399" video="mainVideo" id=subtitle]]
+[[!template text="and I use every day, so thank you to them," start="00:09:21.519" video="mainVideo" id=subtitle]]
+[[!template text="and thank you all for listening to my talk." start="00:09:23.839" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:09:27.080" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/dashboard.md b/2021/captions/dashboard.md
new file mode 100644
index 00000000..71d332f3
--- /dev/null
+++ b/2021/captions/dashboard.md
@@ -0,0 +1,329 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi everyone! I'm Mehmet Tekman," start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="and I'm here to talk to you" start="00:00:01.567" video="mainVideo" id=subtitle]]
+[[!template text="about using Amazon Kindles" start="00:00:02.483" video="mainVideo" id=subtitle]]
+[[!template text="as a productivity dashboard for" start="00:00:03.700" video="mainVideo" id=subtitle]]
+[[!template text="your various projects." start="00:00:05.040" video="mainVideo" id=subtitle]]
+[[!template text="In a nutshell, you describe your machines," start="00:00:07.359" video="mainVideo" id=subtitle]]
+[[!template text="your commands, and your schedules" start="00:00:09.519" video="mainVideo" id=subtitle]]
+[[!template text="in an Org-Mode file," start="00:00:11.317" video="mainVideo" id=subtitle]]
+[[!template text="and then you just initialize" start="00:00:13.120" video="mainVideo" id=subtitle]]
+[[!template text="your Kindle devices." start="00:00:14.933" video="mainVideo" id=subtitle]]
+[[!template text="These devices are asleep" start="00:00:16.960" video="mainVideo" id=subtitle]]
+[[!template text="most of the time," start="00:00:18.367" video="mainVideo" id=subtitle]]
+[[!template text="but they wake up at scheduled times" start="00:00:19.117" video="mainVideo" id=subtitle]]
+[[!template text="to retrieve content" start="00:00:20.720" video="mainVideo" id=subtitle]]
+[[!template text="from the centralized server." start="00:00:22.033" video="mainVideo" id=subtitle]]
+[[!template text="Content can be Org mode and Emacs-based," start="00:00:24.800" video="mainVideo" id=subtitle]]
+[[!template text="or it can be from Web content," start="00:00:27.599" video="mainVideo" id=subtitle]]
+[[!template text="or it can just be static images and WAV." start="00:00:29.500" video="mainVideo" id=subtitle]]
+[[!template text="If you, like me, struggle to" start="00:00:42.840" video="mainVideo" id=subtitle]]
+[[!template text="keep your life under tabs," start="00:00:45.600" video="mainVideo" id=subtitle]]
+[[!template text="or find it very hard to separate" start="00:00:46.833" video="mainVideo" id=subtitle]]
+[[!template text="your work life from your home life," start="00:00:48.300" video="mainVideo" id=subtitle]]
+[[!template text="then you, like me, likely need" start="00:00:49.417" video="mainVideo" id=subtitle]]
+[[!template text="some kind of passive background service" start="00:00:51.283" video="mainVideo" id=subtitle]]
+[[!template text="that reminds you of where you are" start="00:00:52.917" video="mainVideo" id=subtitle]]
+[[!template text="and what you are supposed to be doing." start="00:00:54.083" video="mainVideo" id=subtitle]]
+[[!template text="Even if it's just a sign saying," start="00:00:55.267" video="mainVideo" id=subtitle]]
+[[!template text="&quot;You're at home! Relax!&quot;" start="00:00:56.960" video="mainVideo" id=subtitle]]
+[[!template text="An Amazon Kindle is perfect for this." start="00:00:58.640" video="mainVideo" id=subtitle]]
+[[!template text="In a nutshell, it's a cheap" start="00:01:00.400" video="mainVideo" id=subtitle]]
+[[!template text="black and white e-ink device" start="00:01:01.717" video="mainVideo" id=subtitle]]
+[[!template text="that can go for weeks" start="00:01:03.117" video="mainVideo" id=subtitle]]
+[[!template text="without needing a single charge." start="00:01:03.800" video="mainVideo" id=subtitle]]
+[[!template text="Every year, Amazon brings out" start="00:01:05.033" video="mainVideo" id=subtitle]]
+[[!template text="an incrementally better model," start="00:01:06.767" video="mainVideo" id=subtitle]]
+[[!template text="which makes the old devices obsolete," start="00:01:07.983" video="mainVideo" id=subtitle]]
+[[!template text="and you can find these older models" start="00:01:09.333" video="mainVideo" id=subtitle]]
+[[!template text="for 5 euros on second-hand websites." start="00:01:11.067" video="mainVideo" id=subtitle]]
+[[!template text="Plus it runs Linux, has WiFi networking," start="00:01:13.360" video="mainVideo" id=subtitle]]
+[[!template text="and has a dedicated forum of hackers" start="00:01:15.360" video="mainVideo" id=subtitle]]
+[[!template text="for getting the most out of the device." start="00:01:16.987" video="mainVideo" id=subtitle]]
+[[!template text="Some drawbacks of this is that" start="00:01:19.200" video="mainVideo" id=subtitle]]
+[[!template text="the device often comes with unwanted bloat:" start="00:01:20.366" video="mainVideo" id=subtitle]]
+[[!template text="over-the-air updates," start="00:01:22.799" video="mainVideo" id=subtitle]]
+[[!template text="it phones home to Amazon regularly," start="00:01:24.050" video="mainVideo" id=subtitle]]
+[[!template text="it has a secret microphone" start="00:01:25.833" video="mainVideo" id=subtitle]]
+[[!template text="embedded in the device," start="00:01:27.033" video="mainVideo" id=subtitle]]
+[[!template text="and it has a bunch of creepy" start="00:01:27.983" video="mainVideo" id=subtitle]]
+[[!template text="seemingly interdependent" start="00:01:29.433" video="mainVideo" id=subtitle]]
+[[!template text="background processes," start="00:01:30.633" video="mainVideo" id=subtitle]]
+[[!template text="where killing one kind of kills the others" start="00:01:31.439" video="mainVideo" id=subtitle]]
+[[!template text="risking that you will break the device." start="00:01:34.083" video="mainVideo" id=subtitle]]
+[[!template text="But this is where the community" start="00:01:36.560" video="mainVideo" id=subtitle]]
+[[!template text="really shines through," start="00:01:37.799" video="mainVideo" id=subtitle]]
+[[!template text="since the friendly (and not-so-friendly)" start="00:01:38.883" video="mainVideo" id=subtitle]]
+[[!template text="users (and developers)" start="00:01:40.483" video="mainVideo" id=subtitle]]
+[[!template text="from the MobileRead forums have pretty much" start="00:01:41.583" video="mainVideo" id=subtitle]]
+[[!template text="scraped out a good portion of the" start="00:01:43.200" video="mainVideo" id=subtitle]]
+[[!template text="harmful Amazon scripts from the device." start="00:01:44.560" video="mainVideo" id=subtitle]]
+[[!template text="Some of the devices even use" start="00:01:46.960" video="mainVideo" id=subtitle]]
+[[!template text="Awesome Window Manager," start="00:01:48.550" video="mainVideo" id=subtitle]]
+[[!template text="meaning you can really play around" start="00:01:49.483" video="mainVideo" id=subtitle]]
+[[!template text="with the existing system" start="00:01:50.800" video="mainVideo" id=subtitle]]
+[[!template text="without having to create" start="00:01:51.620" video="mainVideo" id=subtitle]]
+[[!template text="your own X11 server." start="00:01:52.633" video="mainVideo" id=subtitle]]
+[[!template text="This then empowers users" start="00:01:54.233" video="mainVideo" id=subtitle]]
+[[!template text="to display whatever they want on the device." start="00:01:55.377" video="mainVideo" id=subtitle]]
+[[!template text="One project that really got this going" start="00:01:57.600" video="mainVideo" id=subtitle]]
+[[!template text="was the Kindle-Dash dashboard from" start="00:01:59.040" video="mainVideo" id=subtitle]]
+[[!template text="Pascal Widdershoven, who really refined a" start="00:02:00.560" video="mainVideo" id=subtitle]]
+[[!template text="lot of the internal scripts" start="00:02:02.320" video="mainVideo" id=subtitle]]
+[[!template text="to stabilize the device." start="00:02:03.483" video="mainVideo" id=subtitle]]
+[[!template text="However, the project then" start="00:02:05.439" video="mainVideo" id=subtitle]]
+[[!template text="puts the onus on the device" start="00:02:06.600" video="mainVideo" id=subtitle]]
+[[!template text="to retrieve the data from" start="00:02:07.650" video="mainVideo" id=subtitle]]
+[[!template text="somewhere else over the internet," start="00:02:08.560" video="mainVideo" id=subtitle]]
+[[!template text="and so you still need to" start="00:02:09.950" video="mainVideo" id=subtitle]]
+[[!template text="generate the content" start="00:02:10.753" video="mainVideo" id=subtitle]]
+[[!template text="and place it on the web somewhere." start="00:02:11.440" video="mainVideo" id=subtitle]]
+[[!template text="Plus you need to do this and manage it" start="00:02:13.200" video="mainVideo" id=subtitle]]
+[[!template text="for every Kindle device that you have." start="00:02:14.640" video="mainVideo" id=subtitle]]
+[[!template text="Kindle-Sync, however," start="00:02:17.360" video="mainVideo" id=subtitle]]
+[[!template text="is an entirely different beast," start="00:02:18.500" video="mainVideo" id=subtitle]]
+[[!template text="albeit one that builds off of the works" start="00:02:19.867" video="mainVideo" id=subtitle]]
+[[!template text="of the aforementioned projects." start="00:02:21.800" video="mainVideo" id=subtitle]]
+[[!template text="It assumes that instead of just having" start="00:02:23.440" video="mainVideo" id=subtitle]]
+[[!template text="one Kindle device around" start="00:02:24.800" video="mainVideo" id=subtitle]]
+[[!template text="that you wish to re-purpose" start="00:02:26.050" video="mainVideo" id=subtitle]]
+[[!template text="for productivity purposes," start="00:02:27.133" video="mainVideo" id=subtitle]]
+[[!template text="that you actually have" start="00:02:28.080" video="mainVideo" id=subtitle]]
+[[!template text="multiple Kindle devices" start="00:02:28.983" video="mainVideo" id=subtitle]]
+[[!template text="that you want to manage" start="00:02:30.117" video="mainVideo" id=subtitle]]
+[[!template text="and configure in tandem." start="00:02:30.794" video="mainVideo" id=subtitle]]
+[[!template text="Everything is managed" start="00:02:32.720" video="mainVideo" id=subtitle]]
+[[!template text="from a dedicated server (or a raspberry pi)" start="00:02:33.633" video="mainVideo" id=subtitle]]
+[[!template text="which distributes jobs to multiple Kindles," start="00:02:35.667" video="mainVideo" id=subtitle]]
+[[!template text="running on different update timers." start="00:02:37.440" video="mainVideo" id=subtitle]]
+[[!template text="These timers are all managed" start="00:02:39.519" video="mainVideo" id=subtitle]]
+[[!template text="from the server," start="00:02:40.786" video="mainVideo" id=subtitle]]
+[[!template text="and all the Kindle device has to do is:" start="00:02:41.486" video="mainVideo" id=subtitle]]
+[[!template text="to wake up, power on the WiFi," start="00:02:43.017" video="mainVideo" id=subtitle]]
+[[!template text="receive some media, display the media, and" start="00:02:45.200" video="mainVideo" id=subtitle]]
+[[!template text="receive a barebones RTC sleep request." start="00:02:47.280" video="mainVideo" id=subtitle]]
+[[!template text="Then it sleeps for the requested time," start="00:02:49.680" video="mainVideo" id=subtitle]]
+[[!template text="consuming no power, whilst displaying the" start="00:02:51.040" video="mainVideo" id=subtitle]]
+[[!template text="desired media. That is maybe 10 seconds" start="00:02:52.800" video="mainVideo" id=subtitle]]
+[[!template text="of awake time between each request." start="00:02:55.200" video="mainVideo" id=subtitle]]
+[[!template text="Cron does not actually run" start="00:02:57.599" video="mainVideo" id=subtitle]]
+[[!template text="on the Kindle device itself," start="00:02:58.933" video="mainVideo" id=subtitle]]
+[[!template text="simply because it does not reliably work." start="00:02:59.933" video="mainVideo" id=subtitle]]
+[[!template text="All of this is handled by the server." start="00:03:01.600" video="mainVideo" id=subtitle]]
+[[!template text="With the server-client model," start="00:03:04.050" video="mainVideo" id=subtitle]]
+[[!template text="it also tries to restrict Amazon access." start="00:03:05.599" video="mainVideo" id=subtitle]]
+[[!template text="SSH keys are shared" start="00:03:08.000" video="mainVideo" id=subtitle]]
+[[!template text="only from the client to the server," start="00:03:09.517" video="mainVideo" id=subtitle]]
+[[!template text="but not from the server to the client," start="00:03:11.217" video="mainVideo" id=subtitle]]
+[[!template text="so the Kindle cannot connect" start="00:03:12.517" video="mainVideo" id=subtitle]]
+[[!template text="to the Raspberry Pi without a password." start="00:03:13.920" video="mainVideo" id=subtitle]]
+[[!template text="IPtables rules are also set" start="00:03:16.319" video="mainVideo" id=subtitle]]
+[[!template text="so that the Kindle cannot phone home" start="00:03:18.033" video="mainVideo" id=subtitle]]
+[[!template text="to Amazon, and the connections" start="00:03:19.483" video="mainVideo" id=subtitle]]
+[[!template text="are restricted to just the LAN." start="00:03:20.667" video="mainVideo" id=subtitle]]
+[[!template text="So I got very curious at one point" start="00:03:23.200" video="mainVideo" id=subtitle]]
+[[!template text="and decided to see how long" start="00:03:24.820" video="mainVideo" id=subtitle]]
+[[!template text="a Kindle could last on a single charge" start="00:03:26.133" video="mainVideo" id=subtitle]]
+[[!template text="in such an arrangement," start="00:03:27.599" video="mainVideo" id=subtitle]]
+[[!template text="so that every 15 minutes for 18 hours," start="00:03:28.560" video="mainVideo" id=subtitle]]
+[[!template text="I tested the device" start="00:03:30.640" video="mainVideo" id=subtitle]]
+[[!template text="by sending a media item" start="00:03:31.599" video="mainVideo" id=subtitle]]
+[[!template text="and recording the battery level." start="00:03:32.959" video="mainVideo" id=subtitle]]
+[[!template text="The Kindle doesn't seem to" start="00:03:35.200" video="mainVideo" id=subtitle]]
+[[!template text="report the battery level" start="00:03:36.159" video="mainVideo" id=subtitle]]
+[[!template text="very continuously," start="00:03:36.959" video="mainVideo" id=subtitle]]
+[[!template text="but at discrete percentages," start="00:03:37.760" video="mainVideo" id=subtitle]]
+[[!template text="so that you could end up with" start="00:03:39.040" video="mainVideo" id=subtitle]]
+[[!template text="a graph that looks like this." start="00:03:39.840" video="mainVideo" id=subtitle]]
+[[!template text="Assuming you have half the charge," start="00:03:42.159" video="mainVideo" id=subtitle]]
+[[!template text="and use it once every hour -" start="00:03:43.617" video="mainVideo" id=subtitle]]
+[[!template text="it will drop by 10% battery in 76 hours," start="00:03:45.200" video="mainVideo" id=subtitle]]
+[[!template text="which is roughly three days." start="00:03:48.319" video="mainVideo" id=subtitle]]
+[[!template text="It's hard to extrapolate" start="00:03:49.760" video="mainVideo" id=subtitle]]
+[[!template text="with only three good summarized data points," start="00:03:50.640" video="mainVideo" id=subtitle]]
+[[!template text="of which the number of requests" start="00:03:52.400" video="mainVideo" id=subtitle]]
+[[!template text="per battery level appear to diminish" start="00:03:53.519" video="mainVideo" id=subtitle]]
+[[!template text="as shown in the table below," start="00:03:54.879" video="mainVideo" id=subtitle]]
+[[!template text="but the final result yields 76 requests" start="00:03:56.640" video="mainVideo" id=subtitle]]
+[[!template text="with an average loss of 0.5% battery life" start="00:03:58.560" video="mainVideo" id=subtitle]]
+[[!template text="per request. Which is not bad!" start="00:04:00.799" video="mainVideo" id=subtitle]]
+[[!template text="Assuming you do a request every 2 hours" start="00:04:02.273" video="mainVideo" id=subtitle]]
+[[!template text="from 8am to 8pm," start="00:04:04.400" video="mainVideo" id=subtitle]]
+[[!template text="and let it sleep at night," start="00:04:06.000" video="mainVideo" id=subtitle]]
+[[!template text="then that's approximately 6 requests a day," start="00:04:07.040" video="mainVideo" id=subtitle]]
+[[!template text="which could easily last a device" start="00:04:09.040" video="mainVideo" id=subtitle]]
+[[!template text="for a month." start="00:04:10.400" video="mainVideo" id=subtitle]]
+[[!template text="The ksync script does" start="00:04:11.280" video="mainVideo" id=subtitle]]
+[[!template text="essentially everything:" start="00:04:12.586" video="mainVideo" id=subtitle]]
+[[!template text="from generating and fetching the media," start="00:04:13.200" video="mainVideo" id=subtitle]]
+[[!template text="to initializing all Kindle devices," start="00:04:14.799" video="mainVideo" id=subtitle]]
+[[!template text="generating the server cronjobs," start="00:04:16.720" video="mainVideo" id=subtitle]]
+[[!template text="log report summaries," start="00:04:18.160" video="mainVideo" id=subtitle]]
+[[!template text="editing the config tables," start="00:04:19.199" video="mainVideo" id=subtitle]]
+[[!template text="and much more." start="00:04:20.400" video="mainVideo" id=subtitle]]
+[[!template text="The media operations are comparatively" start="00:04:21.199" video="mainVideo" id=subtitle]]
+[[!template text="much more complex" start="00:04:22.880" video="mainVideo" id=subtitle]]
+[[!template text="and encompass a few media use cases" start="00:04:23.680" video="mainVideo" id=subtitle]]
+[[!template text="such as fetching the weather" start="00:04:25.280" video="mainVideo" id=subtitle]]
+[[!template text="(though only from Open Weather Maps)" start="00:04:26.400" video="mainVideo" id=subtitle]]
+[[!template text="and retrieving Google Calendar views" start="00:04:28.560" video="mainVideo" id=subtitle]]
+[[!template text="by week, month, agenda, and four day view." start="00:04:30.000" video="mainVideo" id=subtitle]]
+[[!template text="You can retrieve Org-Mode data" start="00:04:32.000" video="mainVideo" id=subtitle]]
+[[!template text="from an Emacs instance on the server," start="00:04:33.199" video="mainVideo" id=subtitle]]
+[[!template text="which in my case" start="00:04:34.639" video="mainVideo" id=subtitle]]
+[[!template text="I produce views for an agenda" start="00:04:35.360" video="mainVideo" id=subtitle]]
+[[!template text="or a sparse tree of my main projects file." start="00:04:36.720" video="mainVideo" id=subtitle]]
+[[!template text="Finally we have gallery and wavfile," start="00:04:39.360" video="mainVideo" id=subtitle]]
+[[!template text="which are static resources" start="00:04:41.120" video="mainVideo" id=subtitle]]
+[[!template text="which will never change once generated." start="00:04:42.240" video="mainVideo" id=subtitle]]
+[[!template text="The idea is that you feed it" start="00:04:44.000" video="mainVideo" id=subtitle]]
+[[!template text="text and an image location," start="00:04:45.199" video="mainVideo" id=subtitle]]
+[[!template text="and it generates" start="00:04:46.400" video="mainVideo" id=subtitle]]
+[[!template text="a Kindle-compatible image" start="00:04:47.040" video="mainVideo" id=subtitle]]
+[[!template text="using imagemagick as a backend for it." start="00:04:48.720" video="mainVideo" id=subtitle]]
+[[!template text="In the case of the wavfile," start="00:04:51.280" video="mainVideo" id=subtitle]]
+[[!template text="it uses espeak on the backend." start="00:04:52.240" video="mainVideo" id=subtitle]]
+[[!template text="The below is summarized" start="00:04:54.160" video="mainVideo" id=subtitle]]
+[[!template text="from the help-me text" start="00:04:55.280" video="mainVideo" id=subtitle]]
+[[!template text="in the main ksync file," start="00:04:56.317" video="mainVideo" id=subtitle]]
+[[!template text="but essentially, you need to" start="00:04:57.199" video="mainVideo" id=subtitle]]
+[[!template text="define your config in the CSV files," start="00:04:58.160" video="mainVideo" id=subtitle]]
+[[!template text="which we talk about in the next section;" start="00:04:59.919" video="mainVideo" id=subtitle]]
+[[!template text="initialize all your Kindle devices," start="00:05:01.440" video="mainVideo" id=subtitle]]
+[[!template text="i.e. copy over SSH keys," start="00:05:03.120" video="mainVideo" id=subtitle]]
+[[!template text="kill all the unnecessary services," start="00:05:04.720" video="mainVideo" id=subtitle]]
+[[!template text="and prime them for media collection;" start="00:05:06.160" video="mainVideo" id=subtitle]]
+[[!template text="and ensure that you have" start="00:05:07.840" video="mainVideo" id=subtitle]]
+[[!template text="all your static media generated" start="00:05:08.720" video="mainVideo" id=subtitle]]
+[[!template text="and fetchable; and finally" start="00:05:10.080" video="mainVideo" id=subtitle]]
+[[!template text="you then refresh the scheduling" start="00:05:11.440" video="mainVideo" id=subtitle]]
+[[!template text="on the server." start="00:05:12.720" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so this is all good and well," start="00:05:14.240" video="mainVideo" id=subtitle]]
+[[!template text="and we now know what the server does" start="00:05:15.759" video="mainVideo" id=subtitle]]
+[[!template text="and how to probe and inspect it -" start="00:05:17.039" video="mainVideo" id=subtitle]]
+[[!template text="but how does the server generate" start="00:05:18.400" video="mainVideo" id=subtitle]]
+[[!template text="much of the content?" start="00:05:19.759" video="mainVideo" id=subtitle]]
+[[!template text="So a lot of the content" start="00:05:21.120" video="mainVideo" id=subtitle]]
+[[!template text="will be dynamically generated," start="00:05:22.080" video="mainVideo" id=subtitle]]
+[[!template text="meaning it cannot be cached" start="00:05:23.360" video="mainVideo" id=subtitle]]
+[[!template text="and is likely to change from hour to hour." start="00:05:24.639" video="mainVideo" id=subtitle]]
+[[!template text="The media content that is generated here" start="00:05:26.720" video="mainVideo" id=subtitle]]
+[[!template text="are mostly PNG images" start="00:05:28.400" video="mainVideo" id=subtitle]]
+[[!template text="and have a timestamp" start="00:05:29.759" video="mainVideo" id=subtitle]]
+[[!template text="embedded in their filenames." start="00:05:30.567" video="mainVideo" id=subtitle]]
+[[!template text="The Emacs-specific content" start="00:05:32.320" video="mainVideo" id=subtitle]]
+[[!template text="consists of a few views," start="00:05:33.520" video="mainVideo" id=subtitle]]
+[[!template text="namely the org-gcal views," start="00:05:34.560" video="mainVideo" id=subtitle]]
+[[!template text="org-agenda, and org-calories --" start="00:05:36.000" video="mainVideo" id=subtitle]]
+[[!template text="essentially anything that Emacs can display" start="00:05:37.600" video="mainVideo" id=subtitle]]
+[[!template text="and that you want to capture into an image." start="00:05:39.520" video="mainVideo" id=subtitle]]
+[[!template text="Emacs can't (as far as I know)" start="00:05:42.000" video="mainVideo" id=subtitle]]
+[[!template text="render graphics in a headless way," start="00:05:43.360" video="mainVideo" id=subtitle]]
+[[!template text="so what we do instead" start="00:05:44.639" video="mainVideo" id=subtitle]]
+[[!template text="is run Emacs in a dummy minimal X11 session" start="00:05:45.600" video="mainVideo" id=subtitle]]
+[[!template text="via &quot;xvrb-run.&quot;" start="00:05:48.240" video="mainVideo" id=subtitle]]
+[[!template text="From inside, you can take screenshots" start="00:05:50.080" video="mainVideo" id=subtitle]]
+[[!template text="as you would in" start="00:05:51.680" video="mainVideo" id=subtitle]]
+[[!template text="a normal desktop environment," start="00:05:52.233" video="mainVideo" id=subtitle]]
+[[!template text="but with the benefit that" start="00:05:53.440" video="mainVideo" id=subtitle]]
+[[!template text="you don't actually need to invoke a desktop" start="00:05:54.400" video="mainVideo" id=subtitle]]
+[[!template text="or interfere with an existing one." start="00:05:56.479" video="mainVideo" id=subtitle]]
+[[!template text="The minimal elisp shown here" start="00:05:58.560" video="mainVideo" id=subtitle]]
+[[!template text="is all that is required" start="00:05:59.840" video="mainVideo" id=subtitle]]
+[[!template text="to output your desired image from Emacs" start="00:06:00.720" video="mainVideo" id=subtitle]]
+[[!template text="and configure it for the Kindle environment." start="00:06:02.400" video="mainVideo" id=subtitle]]
+[[!template text="On the web side of things," start="00:06:04.479" video="mainVideo" id=subtitle]]
+[[!template text="we don't really need to invoke" start="00:06:05.360" video="mainVideo" id=subtitle]]
+[[!template text="a dummy X11 session" start="00:06:06.400" video="mainVideo" id=subtitle]]
+[[!template text="because Chromium can run headless" start="00:06:07.520" video="mainVideo" id=subtitle]]
+[[!template text="and can be controlled" start="00:06:09.120" video="mainVideo" id=subtitle]]
+[[!template text="by the node library &quot;puppeteer&quot;" start="00:06:09.919" video="mainVideo" id=subtitle]]
+[[!template text="to render dynamic content," start="00:06:11.600" video="mainVideo" id=subtitle]]
+[[!template text="focus on regions of the webpage," start="00:06:13.039" video="mainVideo" id=subtitle]]
+[[!template text="and take snapshots." start="00:06:14.560" video="mainVideo" id=subtitle]]
+[[!template text="The static content comprises" start="00:06:16.080" video="mainVideo" id=subtitle]]
+[[!template text="of two types: images and audio." start="00:06:17.600" video="mainVideo" id=subtitle]]
+[[!template text="The content is accessed by a key," start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="in this case Batman," start="00:06:21.520" video="mainVideo" id=subtitle]]
+[[!template text="and the content information" start="00:06:22.560" video="mainVideo" id=subtitle]]
+[[!template text="is given by the &quot;--extra&quot; parameter" start="00:06:23.600" video="mainVideo" id=subtitle]]
+[[!template text="which describes either or both" start="00:06:25.199" video="mainVideo" id=subtitle]]
+[[!template text="an image and text." start="00:06:26.960" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so now we have content," start="00:06:30.880" video="mainVideo" id=subtitle]]
+[[!template text="how do we schedule this content" start="00:06:32.248" video="mainVideo" id=subtitle]]
+[[!template text="to appear on our desired machines" start="00:06:33.600" video="mainVideo" id=subtitle]]
+[[!template text="at desired times?" start="00:06:34.960" video="mainVideo" id=subtitle]]
+[[!template text="Everything is run via cron." start="00:06:36.400" video="mainVideo" id=subtitle]]
+[[!template text="So previously we saw that" start="00:06:37.759" video="mainVideo" id=subtitle]]
+[[!template text="we only needed the tables MACHINES.csv," start="00:06:38.720" video="mainVideo" id=subtitle]]
+[[!template text="COMMANDS.csv, and multiple TIME_*.csv tables" start="00:06:40.880" video="mainVideo" id=subtitle]]
+[[!template text="for the shell script to work." start="00:06:43.440" video="mainVideo" id=subtitle]]
+[[!template text="But Org-Mode does this far easier," start="00:06:44.880" video="mainVideo" id=subtitle]]
+[[!template text="since you can just have everything" start="00:06:46.479" video="mainVideo" id=subtitle]]
+[[!template text="in the same file," start="00:06:47.919" video="mainVideo" id=subtitle]]
+[[!template text="and with the helper minor-mode," start="00:06:49.039" video="mainVideo" id=subtitle]]
+[[!template text="manage everything" start="00:06:50.720" video="mainVideo" id=subtitle]]
+[[!template text="from a single Org-Mode document." start="00:06:51.360" video="mainVideo" id=subtitle]]
+[[!template text="Here I have 4 kindles and their shortnames." start="00:06:53.120" video="mainVideo" id=subtitle]]
+[[!template text="Yes, I even have a Kindle" start="00:06:55.120" video="mainVideo" id=subtitle]]
+[[!template text="hanging outside my door." start="00:06:56.160" video="mainVideo" id=subtitle]]
+[[!template text="I have 11 defined commands" start="00:06:57.520" video="mainVideo" id=subtitle]]
+[[!template text="which represent the views I want to see," start="00:06:58.960" video="mainVideo" id=subtitle]]
+[[!template text="and there are 4 timetables I use," start="00:07:00.800" video="mainVideo" id=subtitle]]
+[[!template text="but you can have" start="00:07:02.319" video="mainVideo" id=subtitle]]
+[[!template text="everything on one, if you like." start="00:07:02.800" video="mainVideo" id=subtitle]]
+[[!template text="Rows are machine names," start="00:07:04.319" video="mainVideo" id=subtitle]]
+[[!template text="and columns are corresponding hours" start="00:07:05.360" video="mainVideo" id=subtitle]]
+[[!template text="at which they run." start="00:07:06.800" video="mainVideo" id=subtitle]]
+[[!template text="Trust me, it's easier to configure" start="00:07:07.840" video="mainVideo" id=subtitle]]
+[[!template text="repeating tasks just by repeating them" start="00:07:09.440" video="mainVideo" id=subtitle]]
+[[!template text="multiple times, because at least this way," start="00:07:10.960" video="mainVideo" id=subtitle]]
+[[!template text="it's human readable," start="00:07:12.720" video="mainVideo" id=subtitle]]
+[[!template text="and the script which converts these" start="00:07:13.680" video="mainVideo" id=subtitle]]
+[[!template text="to a cronjob" start="00:07:14.880" video="mainVideo" id=subtitle]]
+[[!template text="collapses the repeating tasks by itself." start="00:07:15.759" video="mainVideo" id=subtitle]]
+[[!template text="The ksync script can be called" start="00:07:18.800" video="mainVideo" id=subtitle]]
+[[!template text="from within the config.org file" start="00:07:20.560" video="mainVideo" id=subtitle]]
+[[!template text="using this convenient" start="00:07:23.120" video="mainVideo" id=subtitle]]
+[[!template text="use-package declaration." start="00:07:24.683" video="mainVideo" id=subtitle]]
+[[!template text="All that one needs to do" start="00:07:26.960" video="mainVideo" id=subtitle]]
+[[!template text="is to configure the ENVIRONMENT_VARIABLES" start="00:07:28.319" video="mainVideo" id=subtitle]]
+[[!template text="by setting them in this table" start="00:07:30.560" video="mainVideo" id=subtitle]]
+[[!template text="where you set the repo name," start="00:07:32.880" video="mainVideo" id=subtitle]]
+[[!template text="the config directory," start="00:07:34.479" video="mainVideo" id=subtitle]]
+[[!template text="where the media shall go," start="00:07:36.160" video="mainVideo" id=subtitle]]
+[[!template text="and the server IP," start="00:07:37.599" video="mainVideo" id=subtitle]]
+[[!template text="although this can be" start="00:07:38.960" video="mainVideo" id=subtitle]]
+[[!template text="automatically detected." start="00:07:39.919" video="mainVideo" id=subtitle]]
+[[!template text="The package allows you" start="00:07:41.360" video="mainVideo" id=subtitle]]
+[[!template text="to export your tables" start="00:07:42.240" video="mainVideo" id=subtitle]]
+[[!template text="by running C-c C-c on them," start="00:07:43.440" video="mainVideo" id=subtitle]]
+[[!template text="and allows you to update all the jobs" start="00:07:46.720" video="mainVideo" id=subtitle]]
+[[!template text="related to each of your clients." start="00:07:49.199" video="mainVideo" id=subtitle]]
+[[!template text="You can also initialize clients" start="00:07:52.319" video="mainVideo" id=subtitle]]
+[[!template text="using this package --" start="00:07:53.759" video="mainVideo" id=subtitle]]
+[[!template text="for either all of them" start="00:07:55.120" video="mainVideo" id=subtitle]]
+[[!template text="or individual clients --" start="00:07:56.479" video="mainVideo" id=subtitle]]
+[[!template text="and the package comes with" start="00:07:58.479" video="mainVideo" id=subtitle]]
+[[!template text="some convenience functions" start="00:07:59.599" video="mainVideo" id=subtitle]]
+[[!template text="to do this automatically" start="00:08:01.120" video="mainVideo" id=subtitle]]
+[[!template text="for all tables in the buffer." start="00:08:02.720" video="mainVideo" id=subtitle]]
+[[!template text="With this, I want to say a big thank you" start="00:08:06.720" video="mainVideo" id=subtitle]]
+[[!template text="to Takaaki Ishikawa" start="00:08:08.319" video="mainVideo" id=subtitle]]
+[[!template text="for his fantastic &quot;org-tree-slide&quot;" start="00:08:09.840" video="mainVideo" id=subtitle]]
+[[!template text="presentation package." start="00:08:11.520" video="mainVideo" id=subtitle]]
+[[!template text="To Pascal Widdershoven" start="00:08:12.879" video="mainVideo" id=subtitle]]
+[[!template text="and David Hamp-Gonsalves," start="00:08:14.136" video="mainVideo" id=subtitle]]
+[[!template text="for their fantastic" start="00:08:15.803" video="mainVideo" id=subtitle]]
+[[!template text="kindle-dash repositories," start="00:08:16.633" video="mainVideo" id=subtitle]]
+[[!template text="for which some of my internal Kindle scripts" start="00:08:17.840" video="mainVideo" id=subtitle]]
+[[!template text="are derived from." start="00:08:19.903" video="mainVideo" id=subtitle]]
+[[!template text="Also a big thanks to the friendly" start="00:08:20.720" video="mainVideo" id=subtitle]]
+[[!template text="and not-so-friendly users and hackers" start="00:08:22.160" video="mainVideo" id=subtitle]]
+[[!template text="in the MobileRead forums." start="00:08:23.520" video="mainVideo" id=subtitle]]
+[[!template text="And finally, a big thanks" start="00:08:24.960" video="mainVideo" id=subtitle]]
+[[!template text="to the Emacs community" start="00:08:25.919" video="mainVideo" id=subtitle]]
+[[!template text="and the conference organizers." start="00:08:26.960" video="mainVideo" id=subtitle]]
+[[!template text="Thank you! captions by Mehmet" start="00:08:28.270" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/design.md b/2021/captions/design.md
new file mode 100644
index 00000000..10345adc
--- /dev/null
+++ b/2021/captions/design.md
@@ -0,0 +1,174 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Good afternoon. I'm Nicolas Rougier," start="00:00:00.880" video="mainVideo" id=subtitle]]
+[[!template text="and today I would like to present some of" start="00:00:02.386" video="mainVideo" id=subtitle]]
+[[!template text="the experiments I've made with Emacs." start="00:00:04.080" video="mainVideo" id=subtitle]]
+[[!template text="My initial motivation was an" start="00:00:06.560" video="mainVideo" id=subtitle]]
+[[!template text="inner feeling that something was" start="00:00:08.400" video="mainVideo" id=subtitle]]
+[[!template text="wrong with most modern editors," start="00:00:09.920" video="mainVideo" id=subtitle]]
+[[!template text="and before I show you my experiment," start="00:00:12.559" video="mainVideo" id=subtitle]]
+[[!template text="I will try to demonstrate" start="00:00:14.559" video="mainVideo" id=subtitle]]
+[[!template text="what I think is wrong." start="00:00:16.004" video="mainVideo" id=subtitle]]
+[[!template text="Note that this is mostly my" start="00:00:17.440" video="mainVideo" id=subtitle]]
+[[!template text="personal feelings and I did not commit" start="00:00:18.720" video="mainVideo" id=subtitle]]
+[[!template text="any experiment to test is this or" start="00:00:20.640" video="mainVideo" id=subtitle]]
+[[!template text="that choice would be better." start="00:00:23.279" video="mainVideo" id=subtitle]]
+[[!template text="Of course, some of you might" start="00:00:25.279" video="mainVideo" id=subtitle]]
+[[!template text="legitimately disagree with me." start="00:00:26.781" video="mainVideo" id=subtitle]]
+[[!template text="Let's start with a short review of a" start="00:00:30.480" video="mainVideo" id=subtitle]]
+[[!template text="modern text editor. I chose Nova editor" start="00:00:32.399" video="mainVideo" id=subtitle]]
+[[!template text="that is only available on OS X," start="00:00:35.160" video="mainVideo" id=subtitle]]
+[[!template text="but there are actually many other very" start="00:00:37.680" video="mainVideo" id=subtitle]]
+[[!template text="similar editors, such as, for example," start="00:00:39.920" video="mainVideo" id=subtitle]]
+[[!template text="Atom, Sublime Text, or Visual Studio." start="00:00:42.960" video="mainVideo" id=subtitle]]
+[[!template text="Now it's quite interesting because I think" start="00:00:45.680" video="mainVideo" id=subtitle]]
+[[!template text="it manages to gather everything what is" start="00:00:47.760" video="mainVideo" id=subtitle]]
+[[!template text="wrong in this single screenshot that is" start="00:00:50.239" video="mainVideo" id=subtitle]]
+[[!template text="also the teaser image on their website." start="00:00:53.120" video="mainVideo" id=subtitle]]
+[[!template text="So let me now review it according to my" start="00:00:55.920" video="mainVideo" id=subtitle]]
+[[!template text="personal biases and for further analysis" start="00:00:58.160" video="mainVideo" id=subtitle]]
+[[!template text="I can only recommend to attend" start="00:01:01.039" video="mainVideo" id=subtitle]]
+[[!template text="David Wilson's talks tomorrow." start="00:01:02.667" video="mainVideo" id=subtitle]]
+[[!template text="The most (inaudible) thing that really" start="00:01:05.680" video="mainVideo" id=subtitle]]
+[[!template text="bothers me is the actual area dedicated" start="00:01:07.360" video="mainVideo" id=subtitle]]
+[[!template text="to the editing. When you measure" start="00:01:11.583" video="mainVideo" id=subtitle]]
+[[!template text="this editing area as I did on the" start="00:01:13.504" video="mainVideo" id=subtitle]]
+[[!template text="screenshot, you'll find an impressive 35%," start="00:01:15.553" video="mainVideo" id=subtitle]]
+[[!template text="which is ridiculously small" start="00:01:19.112" video="mainVideo" id=subtitle]]
+[[!template text="compared to the side of the window." start="00:01:22.316" video="mainVideo" id=subtitle]]
+[[!template text="This means that two-thirds of the window" start="00:01:24.240" video="mainVideo" id=subtitle]]
+[[!template text="area is dedicated to peripheral information" start="00:01:26.320" video="mainVideo" id=subtitle]]
+[[!template text="that you don't look so often" start="00:01:30.079" video="mainVideo" id=subtitle]]
+[[!template text="when writing code or prose." start="00:01:32.079" video="mainVideo" id=subtitle]]
+[[!template text="This results in the main editing area to" start="00:01:34.159" video="mainVideo" id=subtitle]]
+[[!template text="be reduced to one third even if we tend" start="00:01:36.560" video="mainVideo" id=subtitle]]
+[[!template text="to have larger and larger monitors, I think" start="00:01:39.119" video="mainVideo" id=subtitle]]
+[[!template text="this is wrong to lost so much of space." start="00:01:42.040" video="mainVideo" id=subtitle]]
+[[!template text="If we now look closer at this peripheral" start="00:01:45.600" video="mainVideo" id=subtitle]]
+[[!template text="information, we can immediately see that" start="00:01:47.759" video="mainVideo" id=subtitle]]
+[[!template text="there is a lot of redundancy." start="00:01:49.920" video="mainVideo" id=subtitle]]
+[[!template text="For example, on the screenshot," start="00:01:52.079" video="mainVideo" id=subtitle]]
+[[!template text="I highlighted the information related" start="00:01:53.617" video="mainVideo" id=subtitle]]
+[[!template text="to the file name being edited." start="00:01:55.709" video="mainVideo" id=subtitle]]
+[[!template text="Unless I missed, some this file name" start="00:01:57.759" video="mainVideo" id=subtitle]]
+[[!template text="is displayed four times." start="00:02:00.640" video="mainVideo" id=subtitle]]
+[[!template text="This is way too much even if it" start="00:02:02.320" video="mainVideo" id=subtitle]]
+[[!template text="displayed for different reasons" start="00:02:04.399" video="mainVideo" id=subtitle]]
+[[!template text="in different contexts, but still I think" start="00:02:06.320" video="mainVideo" id=subtitle]]
+[[!template text="you have a design problem if you need to" start="00:02:08.959" video="mainVideo" id=subtitle]]
+[[!template text="repeat an information up to four times." start="00:02:10.720" video="mainVideo" id=subtitle]]
+[[!template text="If we now look at colors," start="00:02:14.560" video="mainVideo" id=subtitle]]
+[[!template text="you can count 15 different colors," start="00:02:15.947" video="mainVideo" id=subtitle]]
+[[!template text="such that it is impossible to guess" start="00:02:18.160" video="mainVideo" id=subtitle]]
+[[!template text="which color indicates what." start="00:02:20.560" video="mainVideo" id=subtitle]]
+[[!template text="Such colorization based on syntax is" start="00:02:22.959" video="mainVideo" id=subtitle]]
+[[!template text="actually quite widespread in code editors" start="00:02:25.440" video="mainVideo" id=subtitle]]
+[[!template text="including Emacs, unfortunately." start="00:02:28.720" video="mainVideo" id=subtitle]]
+[[!template text="The problem is that we still don't know" start="00:02:30.959" video="mainVideo" id=subtitle]]
+[[!template text="whether it helps or not." start="00:02:32.640" video="mainVideo" id=subtitle]]
+[[!template text="Some studies say yes, some others say no," start="00:02:34.319" video="mainVideo" id=subtitle]]
+[[!template text="and in the end the conclusion" start="00:02:36.780" video="mainVideo" id=subtitle]]
+[[!template text="is not yet settled." start="00:02:38.239" video="mainVideo" id=subtitle]]
+[[!template text="Furthermore, there is another problem" start="00:02:40.080" video="mainVideo" id=subtitle]]
+[[!template text="because there is no scientific method" start="00:02:41.840" video="mainVideo" id=subtitle]]
+[[!template text="on how to enforce colorization." start="00:02:43.663" video="mainVideo" id=subtitle]]
+[[!template text="Should it be based on syntax, or semantic," start="00:02:46.080" video="mainVideo" id=subtitle]]
+[[!template text="or context, or something else?" start="00:02:48.800" video="mainVideo" id=subtitle]]
+[[!template text="Developers are actually pretty free to do" start="00:02:51.519" video="mainVideo" id=subtitle]]
+[[!template text="whatever they want, a lot of them will" start="00:02:53.599" video="mainVideo" id=subtitle]]
+[[!template text="use syntax based colorization because it" start="00:02:56.400" video="mainVideo" id=subtitle]]
+[[!template text="is the most simple to write." start="00:02:58.879" video="mainVideo" id=subtitle]]
+[[!template text="In the end, most of them achieve a" start="00:03:01.280" video="mainVideo" id=subtitle]]
+[[!template text="Christmas tree effect." start="00:03:03.280" video="mainVideo" id=subtitle]]
+[[!template text="We know however, how to use colors" start="00:03:06.080" video="mainVideo" id=subtitle]]
+[[!template text="to drag attention to a specific position" start="00:03:08.189" video="mainVideo" id=subtitle]]
+[[!template text="as it is shown on the screenshot." start="00:03:10.560" video="mainVideo" id=subtitle]]
+[[!template text="This is called the pop-out effect," start="00:03:13.920" video="mainVideo" id=subtitle]]
+[[!template text="which is quite well known in neuroscience." start="00:03:15.760" video="mainVideo" id=subtitle]]
+[[!template text="Here, the media keyword has been" start="00:03:18.080" video="mainVideo" id=subtitle]]
+[[!template text="made very salient just by setting" start="00:03:20.000" video="mainVideo" id=subtitle]]
+[[!template text="the color in red while all other" start="00:03:23.120" video="mainVideo" id=subtitle]]
+[[!template text="elements are desaturated." start="00:03:25.760" video="mainVideo" id=subtitle]]
+[[!template text="It literally pops out from the screen" start="00:03:28.080" video="mainVideo" id=subtitle]]
+[[!template text="and point attention toward it." start="00:03:30.480" video="mainVideo" id=subtitle]]
+[[!template text="Finally, if we look at the overall" start="00:03:33.680" video="mainVideo" id=subtitle]]
+[[!template text="structure of the Nova editor," start="00:03:35.360" video="mainVideo" id=subtitle]]
+[[!template text="we can characterize structural elements" start="00:03:36.879" video="mainVideo" id=subtitle]]
+[[!template text="that are also present in a large number" start="00:03:39.353" video="mainVideo" id=subtitle]]
+[[!template text="of modern editors namely," start="00:03:41.840" video="mainVideo" id=subtitle]]
+[[!template text="a file browser, a gutter, a mini map," start="00:03:44.029" video="mainVideo" id=subtitle]]
+[[!template text="a tab bar, a toolbar," start="00:03:46.400" video="mainVideo" id=subtitle]]
+[[!template text="and some versioning tools." start="00:03:47.844" video="mainVideo" id=subtitle]]
+[[!template text="I think this is too much information," start="00:03:49.920" video="mainVideo" id=subtitle]]
+[[!template text="and can lead to cognitive overload" start="00:03:52.477" video="mainVideo" id=subtitle]]
+[[!template text="such that you end up to not pay attention" start="00:03:54.879" video="mainVideo" id=subtitle]]
+[[!template text="to important information." start="00:03:57.725" video="mainVideo" id=subtitle]]
+[[!template text="So definitely more is not always better," start="00:03:59.599" video="mainVideo" id=subtitle]]
+[[!template text="and to paraphrase Edward Tufte in his book" start="00:04:02.720" video="mainVideo" id=subtitle]]
+[[!template text="The Visual Display of" start="00:04:05.280" video="mainVideo" id=subtitle]]
+[[!template text="Quantitative Information," start="00:04:06.780" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Above all else show the data.&quot;" start="00:04:08.720" video="mainVideo" id=subtitle]]
+[[!template text="This is a reason that led me to" start="00:04:12.560" video="mainVideo" id=subtitle]]
+[[!template text="experiment alternative design," start="00:04:14.640" video="mainVideo" id=subtitle]]
+[[!template text="and of course, to do that with" start="00:04:16.720" video="mainVideo" id=subtitle]]
+[[!template text="the total freedom I didn't have" start="00:04:18.079" video="mainVideo" id=subtitle]]
+[[!template text="much choice but to use and hack Emacs." start="00:04:19.840" video="mainVideo" id=subtitle]]
+[[!template text="My first iteration was called Elegant Emacs," start="00:04:24.080" video="mainVideo" id=subtitle]]
+[[!template text="and I try to enforce a few principles" start="00:04:27.001" video="mainVideo" id=subtitle]]
+[[!template text="that I will detail into the next slide." start="00:04:29.271" video="mainVideo" id=subtitle]]
+[[!template text="But roughly, my idea was to" start="00:04:31.759" video="mainVideo" id=subtitle]]
+[[!template text="enforce a radically different design" start="00:04:33.919" video="mainVideo" id=subtitle]]
+[[!template text="by simply removing as much" start="00:04:35.857" video="mainVideo" id=subtitle]]
+[[!template text="information as I could." start="00:04:38.320" video="mainVideo" id=subtitle]]
+[[!template text="Even so, vanilla Emacs is" start="00:04:40.080" video="mainVideo" id=subtitle]]
+[[!template text="already quite simple." start="00:04:42.240" video="mainVideo" id=subtitle]]
+[[!template text="You can see the result on the screen," start="00:04:44.000" video="mainVideo" id=subtitle]]
+[[!template text="and I'm practically happy with the third" start="00:04:45.759" video="mainVideo" id=subtitle]]
+[[!template text="screenshot that mimics the PDF layout of" start="00:04:47.759" video="mainVideo" id=subtitle]]
+[[!template text="a scientific article by Stefan Monnier" start="00:04:50.240" video="mainVideo" id=subtitle]]
+[[!template text="and Michael Sperber but rather" start="00:04:53.120" video="mainVideo" id=subtitle]]
+[[!template text="fully inside Emacs." start="00:04:55.360" video="mainVideo" id=subtitle]]
+[[!template text="The second iteration is called NANO Emacs," start="00:04:58.160" video="mainVideo" id=subtitle]]
+[[!template text="and it is a version I try to maintain" start="00:05:01.080" video="mainVideo" id=subtitle]]
+[[!template text="with a set of standalone packages" start="00:05:03.680" video="mainVideo" id=subtitle]]
+[[!template text="that you can test individually." start="00:05:05.592" video="mainVideo" id=subtitle]]
+[[!template text="It is based on a set of" start="00:05:07.759" video="mainVideo" id=subtitle]]
+[[!template text="a few principles, namely" start="00:05:09.271" video="mainVideo" id=subtitle]]
+[[!template text="large margins, reduced number of faces," start="00:05:11.919" video="mainVideo" id=subtitle]]
+[[!template text="a simplified and contextual header line," start="00:05:14.677" video="mainVideo" id=subtitle]]
+[[!template text="and a default aspect ratio that" start="00:05:17.360" video="mainVideo" id=subtitle]]
+[[!template text="mimics the A4 ISO format." start="00:05:19.280" video="mainVideo" id=subtitle]]
+[[!template text="I've been using this layout for a" start="00:05:21.759" video="mainVideo" id=subtitle]]
+[[!template text="year and so far I'm quite happy with it." start="00:05:24.240" video="mainVideo" id=subtitle]]
+[[!template text="I know this is quite an opinionated" start="00:05:26.720" video="mainVideo" id=subtitle]]
+[[!template text="design and some of you may totally" start="00:05:29.440" video="mainVideo" id=subtitle]]
+[[!template text="disagree with me." start="00:05:31.680" video="mainVideo" id=subtitle]]
+[[!template text="Lately I've been experimenting" start="00:05:34.240" video="mainVideo" id=subtitle]]
+[[!template text="with some special modes where" start="00:05:36.630" video="mainVideo" id=subtitle]]
+[[!template text="the header line is made even simpler," start="00:05:38.682" video="mainVideo" id=subtitle]]
+[[!template text="this is the case for org-agenda," start="00:05:41.919" video="mainVideo" id=subtitle]]
+[[!template text="mu4e, deft, and elfeed." start="00:05:44.080" video="mainVideo" id=subtitle]]
+[[!template text="This worked reasonably well" start="00:05:46.720" video="mainVideo" id=subtitle]]
+[[!template text="because these modes are search based," start="00:05:48.560" video="mainVideo" id=subtitle]]
+[[!template text="and it was easy to unify their design." start="00:05:50.952" video="mainVideo" id=subtitle]]
+[[!template text="I've also integrated some dynamic tags" start="00:05:54.720" video="mainVideo" id=subtitle]]
+[[!template text="and icon in my agenda using svg-lib," start="00:05:56.960" video="mainVideo" id=subtitle]]
+[[!template text="which is available on ELPA." start="00:06:00.484" video="mainVideo" id=subtitle]]
+[[!template text="And for example, you can see the" start="00:06:02.400" video="mainVideo" id=subtitle]]
+[[!template text="pie progress that help to show" start="00:06:04.960" video="mainVideo" id=subtitle]]
+[[!template text="some incoming deadlines." start="00:06:08.560" video="mainVideo" id=subtitle]]
+[[!template text="There are still ongoing development" start="00:06:11.440" video="mainVideo" id=subtitle]]
+[[!template text="to develop new packages to give" start="00:06:13.261" video="mainVideo" id=subtitle]]
+[[!template text="a unified look and feel." start="00:06:15.120" video="mainVideo" id=subtitle]]
+[[!template text="I got a lot of feedback from" start="00:06:17.280" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs community," start="00:06:18.792" video="mainVideo" id=subtitle]]
+[[!template text="mostly in Reddit and GitHub," start="00:06:20.768" video="mainVideo" id=subtitle]]
+[[!template text="and I would like to thank them here" start="00:06:22.288" video="mainVideo" id=subtitle]]
+[[!template text="because this is incredibly useful." start="00:06:24.319" video="mainVideo" id=subtitle]]
+[[!template text="If you want to follow or support my work," start="00:06:26.880" video="mainVideo" id=subtitle]]
+[[!template text="best place is probably GitHub." start="00:06:29.039" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for your attention." start="00:06:31.600" video="mainVideo" id=subtitle]]
+[[!template text="I will be happy to answer" start="00:06:33.099" video="mainVideo" id=subtitle]]
+[[!template text="any questions you may have." start="00:06:34.479" video="mainVideo" id=subtitle]]
+[[!template text="captions by bhavin192 (Bhavin Gandhi)" start="00:06:36.874" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/dev-update.md b/2021/captions/dev-update.md
new file mode 100644
index 00000000..f2283b76
--- /dev/null
+++ b/2021/captions/dev-update.md
@@ -0,0 +1,244 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, my name is John Wiegley." start="00:00:00.320" video="mainVideo" id=subtitle]]
+[[!template text="I'm a past co-maintainer of Emacs." start="00:00:02.200" video="mainVideo" id=subtitle]]
+[[!template text="Nowadays, all of the work" start="00:00:05.040" video="mainVideo" id=subtitle]]
+[[!template text="and mailing list traffic" start="00:00:06.799" video="mainVideo" id=subtitle]]
+[[!template text="is handled by Eli Zaretskii" start="00:00:08.160" video="mainVideo" id=subtitle]]
+[[!template text="and Lars Ingebrigtsen." start="00:00:09.599" video="mainVideo" id=subtitle]]
+[[!template text="I just wanted to give you an update" start="00:00:12.559" video="mainVideo" id=subtitle]]
+[[!template text="of what has been happening" start="00:00:14.320" video="mainVideo" id=subtitle]]
+[[!template text="and what is soon to come" start="00:00:15.360" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs development." start="00:00:16.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So I spoke to Eli" start="00:00:18.560" video="mainVideo" id=subtitle]]
+[[!template text="and he gave me the lowdown" start="00:00:19.760" video="mainVideo" id=subtitle]]
+[[!template text="on Emacs 28, which is the next" start="00:00:20.880" video="mainVideo" id=subtitle]]
+[[!template text="big release to come up yet." start="00:00:23.359" video="mainVideo" id=subtitle]]
+[[!template text="He says that we hope to" start="00:00:25.840" video="mainVideo" id=subtitle]]
+[[!template text="release this soon." start="00:00:27.039" video="mainVideo" id=subtitle]]
+[[!template text="Pre-testing has not yet started," start="00:00:28.160" video="mainVideo" id=subtitle]]
+[[!template text="but maybe looking at" start="00:00:30.080" video="mainVideo" id=subtitle]]
+[[!template text="the first quarter of next year." start="00:00:31.519" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The biggest feature coming in Emacs 28" start="00:00:33.600" video="mainVideo" id=subtitle]]
+[[!template text="is going to be native compilation," start="00:00:35.840" video="mainVideo" id=subtitle]]
+[[!template text="and this will make some Emacs code" start="00:00:39.040" video="mainVideo" id=subtitle]]
+[[!template text="two to four times as fast," start="00:00:41.280" video="mainVideo" id=subtitle]]
+[[!template text="depending on what kind of Lisp" start="00:00:43.120" video="mainVideo" id=subtitle]]
+[[!template text="you're running" start="00:00:44.640" video="mainVideo" id=subtitle]]
+[[!template text="and how much of your Lisp code" start="00:00:45.360" video="mainVideo" id=subtitle]]
+[[!template text="is just Lisp," start="00:00:47.840" video="mainVideo" id=subtitle]]
+[[!template text="or makes calls to primitive functions." start="00:00:48.800" video="mainVideo" id=subtitle]]
+[[!template text="There were previous JIT attempts." start="00:00:50.879" video="mainVideo" id=subtitle]]
+[[!template text="Some of them still live on" start="00:00:53.680" video="mainVideo" id=subtitle]]
+[[!template text="in development branches," start="00:00:54.879" video="mainVideo" id=subtitle]]
+[[!template text="but they were found" start="00:00:56.559" video="mainVideo" id=subtitle]]
+[[!template text="to not speed things up too much." start="00:00:57.280" video="mainVideo" id=subtitle]]
+[[!template text="The version coming in Emacs 28" start="00:01:00.960" video="mainVideo" id=subtitle]]
+[[!template text="has much better results" start="00:01:03.280" video="mainVideo" id=subtitle]]
+[[!template text="than these past attempts," start="00:01:04.479" video="mainVideo" id=subtitle]]
+[[!template text="but it should be noted" start="00:01:05.760" video="mainVideo" id=subtitle]]
+[[!template text="that it has some side effects." start="00:01:06.960" video="mainVideo" id=subtitle]]
+[[!template text="One is that natively-compiled files" start="00:01:09.439" video="mainVideo" id=subtitle]]
+[[!template text="are going to be system-dependent," start="00:01:11.439" video="mainVideo" id=subtitle]]
+[[!template text="so they can't be included" start="00:01:13.680" video="mainVideo" id=subtitle]]
+[[!template text="in any distributions" start="00:01:14.960" video="mainVideo" id=subtitle]]
+[[!template text="the way we do now with .elc files," start="00:01:16.000" video="mainVideo" id=subtitle]]
+[[!template text="since those run on any platform." start="00:01:18.080" video="mainVideo" id=subtitle]]
+[[!template text="This means that you will need to" start="00:01:20.479" video="mainVideo" id=subtitle]]
+[[!template text="compile those files" start="00:01:22.240" video="mainVideo" id=subtitle]]
+[[!template text="for your own machine, sometimes," start="00:01:23.600" video="mainVideo" id=subtitle]]
+[[!template text="depending on how" start="00:01:26.479" video="mainVideo" id=subtitle]]
+[[!template text="the compilation process goes." start="00:01:27.360" video="mainVideo" id=subtitle]]
+[[!template text="It could vary by processor." start="00:01:28.799" video="mainVideo" id=subtitle]]
+[[!template text="And it requires you also" start="00:01:31.520" video="mainVideo" id=subtitle]]
+[[!template text="to have the right" start="00:01:32.720" video="mainVideo" id=subtitle]]
+[[!template text="compilation environment." start="00:01:33.520" video="mainVideo" id=subtitle]]
+[[!template text="This means that you may need tools" start="00:01:35.600" video="mainVideo" id=subtitle]]
+[[!template text="from the gcc tool chain" start="00:01:37.200" video="mainVideo" id=subtitle]]
+[[!template text="that aren't installed" start="00:01:38.560" video="mainVideo" id=subtitle]]
+[[!template text="as part of the default," start="00:01:39.520" video="mainVideo" id=subtitle]]
+[[!template text="so you will maybe have to do some work" start="00:01:40.799" video="mainVideo" id=subtitle]]
+[[!template text="to set up the right" start="00:01:42.640" video="mainVideo" id=subtitle]]
+[[!template text="compilation environment" start="00:01:43.680" video="mainVideo" id=subtitle]]
+[[!template text="for your platform." start="00:01:44.720" video="mainVideo" id=subtitle]]
+[[!template text="Natively-compiled files" start="00:01:46.560" video="mainVideo" id=subtitle]]
+[[!template text="are also kept in a separate directory." start="00:01:47.680" video="mainVideo" id=subtitle]]
+[[!template text="There are some issues" start="00:01:50.799" video="mainVideo" id=subtitle]]
+[[!template text="having to do with recompilation too," start="00:01:52.079" video="mainVideo" id=subtitle]]
+[[!template text="so there are certain changes which," start="00:01:54.159" video="mainVideo" id=subtitle]]
+[[!template text="if made to the Emacs source code" start="00:01:55.920" video="mainVideo" id=subtitle]]
+[[!template text="between releases," start="00:01:57.360" video="mainVideo" id=subtitle]]
+[[!template text="may require you to recompile" start="00:01:58.560" video="mainVideo" id=subtitle]]
+[[!template text="all of the natively-compiled files" start="00:02:00.159" video="mainVideo" id=subtitle]]
+[[!template text="that you had compiled previously." start="00:02:02.000" video="mainVideo" id=subtitle]]
+[[!template text="Also, the file names of compiled files" start="00:02:04.479" video="mainVideo" id=subtitle]]
+[[!template text="that get installed" start="00:02:06.880" video="mainVideo" id=subtitle]]
+[[!template text="have hashes on them" start="00:02:07.680" video="mainVideo" id=subtitle]]
+[[!template text="depending on the Emacs" start="00:02:08.800" video="mainVideo" id=subtitle]]
+[[!template text="that they were built against," start="00:02:10.319" video="mainVideo" id=subtitle]]
+[[!template text="so Emacs should be able to detect" start="00:02:11.920" video="mainVideo" id=subtitle]]
+[[!template text="when recompilation is necessary," start="00:02:14.000" video="mainVideo" id=subtitle]]
+[[!template text="but it may be difficult" start="00:02:16.239" video="mainVideo" id=subtitle]]
+[[!template text="for distributions who want to know" start="00:02:17.840" video="mainVideo" id=subtitle]]
+[[!template text="what all of the build files" start="00:02:19.599" video="mainVideo" id=subtitle]]
+[[!template text="are going to be in advance" start="00:02:20.800" video="mainVideo" id=subtitle]]
+[[!template text="in order to prepare" start="00:02:22.160" video="mainVideo" id=subtitle]]
+[[!template text="a binary distribution" start="00:02:23.840" video="mainVideo" id=subtitle]]
+[[!template text="for that for that platform." start="00:02:25.360" video="mainVideo" id=subtitle]]
+[[!template text="So these are all little wrinkles" start="00:02:27.280" video="mainVideo" id=subtitle]]
+[[!template text="that we're going to discover" start="00:02:28.800" video="mainVideo" id=subtitle]]
+[[!template text="and have to work out" start="00:02:29.840" video="mainVideo" id=subtitle]]
+[[!template text="as this functionality comes out" start="00:02:30.800" video="mainVideo" id=subtitle]]
+[[!template text="and starts getting used" start="00:02:32.560" video="mainVideo" id=subtitle]]
+[[!template text="in lots of different distributions." start="00:02:33.599" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Another feature is that Cairo is" start="00:02:36.400" video="mainVideo" id=subtitle]]
+[[!template text="now being built with by default," start="00:02:38.560" video="mainVideo" id=subtitle]]
+[[!template text="and this is one step further toward" start="00:02:40.319" video="mainVideo" id=subtitle]]
+[[!template text="better support for emojis." start="00:02:42.560" video="mainVideo" id=subtitle]]
+[[!template text="If you build with Cairo," start="00:02:44.319" video="mainVideo" id=subtitle]]
+[[!template text="you will get all of the emoji sequences" start="00:02:45.519" video="mainVideo" id=subtitle]]
+[[!template text="defined by the latest Unicode," start="00:02:47.599" video="mainVideo" id=subtitle]]
+[[!template text="and in full color," start="00:02:49.360" video="mainVideo" id=subtitle]]
+[[!template text="the exact same as on your smartphone ," start="00:02:50.400" video="mainVideo" id=subtitle]]
+[[!template text="and it works on macOS as well." start="00:02:52.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There's a new mode," start="00:02:55.760" video="mainVideo" id=subtitle]]
+[[!template text="but it is off by default," start="00:02:56.640" video="mainVideo" id=subtitle]]
+[[!template text="called context-menus mode," start="00:02:58.400" video="mainVideo" id=subtitle]]
+[[!template text="and this gives menus that appear" start="00:03:00.480" video="mainVideo" id=subtitle]]
+[[!template text="when you right-click" start="00:03:02.800" video="mainVideo" id=subtitle]]
+[[!template text="somewhere in a buffer," start="00:03:03.599" video="mainVideo" id=subtitle]]
+[[!template text="but now will make it easier" start="00:03:04.959" video="mainVideo" id=subtitle]]
+[[!template text="for other modes to define" start="00:03:06.480" video="mainVideo" id=subtitle]]
+[[!template text="what those context menus" start="00:03:08.080" video="mainVideo" id=subtitle]]
+[[!template text="should look like," start="00:03:09.440" video="mainVideo" id=subtitle]]
+[[!template text="so that's sort of making that support..." start="00:03:10.080" video="mainVideo" id=subtitle]]
+[[!template text="having it less custom" start="00:03:13.840" video="mainVideo" id=subtitle]]
+[[!template text="in each module that implements" start="00:03:16.080" video="mainVideo" id=subtitle]]
+[[!template text="that type of behavior." start="00:03:17.920" video="mainVideo" id=subtitle]]
+[[!template text="They can now do it through this context" start="00:03:19.360" video="mainVideo" id=subtitle]]
+[[!template text="and then use the facility." start="00:03:20.879" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Tab-bar and tab-line have received" start="00:03:22.959" video="mainVideo" id=subtitle]]
+[[!template text="many enhancements." start="00:03:25.120" video="mainVideo" id=subtitle]]
+[[!template text="So there's new commands, new variables," start="00:03:26.799" video="mainVideo" id=subtitle]]
+[[!template text="there's quite a large number of changes," start="00:03:28.560" video="mainVideo" id=subtitle]]
+[[!template text="so if you like those modes," start="00:03:30.080" video="mainVideo" id=subtitle]]
+[[!template text="if you use them," start="00:03:31.440" video="mainVideo" id=subtitle]]
+[[!template text="then you should be happy" start="00:03:32.560" video="mainVideo" id=subtitle]]
+[[!template text="with what's coming." start="00:03:33.440" video="mainVideo" id=subtitle]]
+[[!template text="There is a command..." start="00:03:35.040" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now, a command can be marked" start="00:03:37.840" video="mainVideo" id=subtitle]]
+[[!template text="as being specific to a mode," start="00:03:40.720" video="mainVideo" id=subtitle]]
+[[!template text="so that if you're not in that mode," start="00:03:42.799" video="mainVideo" id=subtitle]]
+[[!template text="then, when you press M-x," start="00:03:44.560" video="mainVideo" id=subtitle]]
+[[!template text="it won't appear" start="00:03:46.000" video="mainVideo" id=subtitle]]
+[[!template text="in the tab completion list." start="00:03:46.959" video="mainVideo" id=subtitle]]
+[[!template text="Right now, M-x is a full population" start="00:03:48.319" video="mainVideo" id=subtitle]]
+[[!template text="of every interactive command" start="00:03:50.799" video="mainVideo" id=subtitle]]
+[[!template text="known to Emacs," start="00:03:52.560" video="mainVideo" id=subtitle]]
+[[!template text="but in many cases," start="00:03:53.920" video="mainVideo" id=subtitle]]
+[[!template text="unless you're in a text-mode buffer" start="00:03:55.120" video="mainVideo" id=subtitle]]
+[[!template text="or a latex-mode buffer," start="00:03:57.360" video="mainVideo" id=subtitle]]
+[[!template text="or some programming language mode buffer," start="00:03:58.560" video="mainVideo" id=subtitle]]
+[[!template text="a lot of the commands" start="00:04:00.799" video="mainVideo" id=subtitle]]
+[[!template text="that might be presented to you today" start="00:04:01.840" video="mainVideo" id=subtitle]]
+[[!template text="are irrelevant to that buffer" start="00:04:04.480" video="mainVideo" id=subtitle]]
+[[!template text="that you're in. So commands can now" start="00:04:06.239" video="mainVideo" id=subtitle]]
+[[!template text="specify in their interactive declaration" start="00:04:08.400" video="mainVideo" id=subtitle]]
+[[!template text="which mode they're specific to," start="00:04:11.120" video="mainVideo" id=subtitle]]
+[[!template text="and in that case, they will only appear" start="00:04:12.640" video="mainVideo" id=subtitle]]
+[[!template text="in the completion list for that mode." start="00:04:14.319" video="mainVideo" id=subtitle]]
+[[!template text="In fact, only be available" start="00:04:16.079" video="mainVideo" id=subtitle]]
+[[!template text="in that mode to execute." start="00:04:17.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There are going to be" start="00:04:20.320" video="mainVideo" id=subtitle]]
+[[!template text="transient input methods," start="00:04:21.680" video="mainVideo" id=subtitle]]
+[[!template text="and what this means is that right now," start="00:04:23.759" video="mainVideo" id=subtitle]]
+[[!template text="with Emacs, you can hit a key sequence" start="00:04:25.440" video="mainVideo" id=subtitle]]
+[[!template text="to change your input method" start="00:04:27.520" video="mainVideo" id=subtitle]]
+[[!template text="to, say, latin1 or to Arabic or Hebrew" start="00:04:29.520" video="mainVideo" id=subtitle]]
+[[!template text="or some other language," start="00:04:32.240" video="mainVideo" id=subtitle]]
+[[!template text="so that you can start entering text" start="00:04:33.040" video="mainVideo" id=subtitle]]
+[[!template text="using that input mode," start="00:04:35.199" video="mainVideo" id=subtitle]]
+[[!template text="but transient input methods" start="00:04:38.080" video="mainVideo" id=subtitle]]
+[[!template text="will allow you" start="00:04:39.759" video="mainVideo" id=subtitle]]
+[[!template text="to switch to an input mode temporarily." start="00:04:40.400" video="mainVideo" id=subtitle]]
+[[!template text="So if you're mostly writing" start="00:04:42.960" video="mainVideo" id=subtitle]]
+[[!template text="in English text, but you want to insert" start="00:04:44.720" video="mainVideo" id=subtitle]]
+[[!template text="one Greek letter, you don't have to" start="00:04:46.720" video="mainVideo" id=subtitle]]
+[[!template text="switch to an input mode" start="00:04:48.720" video="mainVideo" id=subtitle]]
+[[!template text="that has Latin and Greek letters." start="00:04:49.840" video="mainVideo" id=subtitle]]
+[[!template text="You can just switch over" start="00:04:52.080" video="mainVideo" id=subtitle]]
+[[!template text="to a Greek input mode," start="00:04:53.280" video="mainVideo" id=subtitle]]
+[[!template text="momentarily enter in the Greek letter," start="00:04:54.560" video="mainVideo" id=subtitle]]
+[[!template text="and then come back" start="00:04:56.639" video="mainVideo" id=subtitle]]
+[[!template text="to your default input method." start="00:04:57.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="show-paren-mode will be enabled" start="00:05:00.880" video="mainVideo" id=subtitle]]
+[[!template text="by default in Emacs 28," start="00:05:02.880" video="mainVideo" id=subtitle]]
+[[!template text="so that's the highlighting of parens" start="00:05:04.880" video="mainVideo" id=subtitle]]
+[[!template text="whenever your cursor is on or near" start="00:05:06.720" video="mainVideo" id=subtitle]]
+[[!template text="a closing paren or an opening paren," start="00:05:11.039" video="mainVideo" id=subtitle]]
+[[!template text="for example." start="00:05:12.800" video="mainVideo" id=subtitle]]
+[[!template new="1" text="We're also going to have a NonGNU ELPA," start="00:05:14.560" video="mainVideo" id=subtitle]]
+[[!template text="so there will be a ELPA repository" start="00:05:18.080" video="mainVideo" id=subtitle]]
+[[!template text="just like the ELPA we have today," start="00:05:20.639" video="mainVideo" id=subtitle]]
+[[!template text="except it will have packages in it" start="00:05:22.160" video="mainVideo" id=subtitle]]
+[[!template text="that have not gone through" start="00:05:24.400" video="mainVideo" id=subtitle]]
+[[!template text="the same level of" start="00:05:25.840" video="mainVideo" id=subtitle]]
+[[!template text="copyright assignment requirements" start="00:05:26.880" video="mainVideo" id=subtitle]]
+[[!template text="as the GNU ELPA." start="00:05:28.560" video="mainVideo" id=subtitle]]
+[[!template text="So NonGNU ELPA will make it easier" start="00:05:29.919" video="mainVideo" id=subtitle]]
+[[!template text="for packages to get into a repository" start="00:05:31.919" video="mainVideo" id=subtitle]]
+[[!template text="that is managed by the package.el" start="00:05:34.560" video="mainVideo" id=subtitle]]
+[[!template text="that ships with Emacs." start="00:05:37.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There's going to be a repeat-mode" start="00:05:39.520" video="mainVideo" id=subtitle]]
+[[!template text="added to Emacs 28, repeat-mode.el." start="00:05:42.160" video="mainVideo" id=subtitle]]
+[[!template text="What this does is when you turn it on," start="00:05:45.039" video="mainVideo" id=subtitle]]
+[[!template text="when you enable repeat-mode," start="00:05:46.880" video="mainVideo" id=subtitle]]
+[[!template text="then certain commands" start="00:05:48.720" video="mainVideo" id=subtitle]]
+[[!template text="which are executed by keybindings" start="00:05:50.800" video="mainVideo" id=subtitle]]
+[[!template text="like C-x u for undo" start="00:05:53.120" video="mainVideo" id=subtitle]]
+[[!template text="will allow you to just" start="00:05:55.120" video="mainVideo" id=subtitle]]
+[[!template text="keep hitting that u, that final letter" start="00:05:56.160" video="mainVideo" id=subtitle]]
+[[!template text="you used for the command" start="00:05:58.240" video="mainVideo" id=subtitle]]
+[[!template text="to keep repeating that function." start="00:05:59.680" video="mainVideo" id=subtitle]]
+[[!template text="This works today already" start="00:06:01.600" video="mainVideo" id=subtitle]]
+[[!template text="for things like macro repetition, C-x e," start="00:06:03.440" video="mainVideo" id=subtitle]]
+[[!template text="where you can just keep hitting e" start="00:06:06.720" video="mainVideo" id=subtitle]]
+[[!template text="to repeat the macro" start="00:06:08.080" video="mainVideo" id=subtitle]]
+[[!template text="as many times as you like," start="00:06:08.960" video="mainVideo" id=subtitle]]
+[[!template text="but that was a custom feature" start="00:06:10.000" video="mainVideo" id=subtitle]]
+[[!template text="just for macros." start="00:06:11.360" video="mainVideo" id=subtitle]]
+[[!template text="This makes repeat mode accessible to" start="00:06:12.560" video="mainVideo" id=subtitle]]
+[[!template text="most commands." start="00:06:16.319" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The project.el package" start="00:06:18.400" video="mainVideo" id=subtitle]]
+[[!template text="has dozens of new commands," start="00:06:20.080" video="mainVideo" id=subtitle]]
+[[!template text="so check the documentation there" start="00:06:22.000" video="mainVideo" id=subtitle]]
+[[!template text="to find out what's going to be new" start="00:06:23.759" video="mainVideo" id=subtitle]]
+[[!template text="in project.el." start="00:06:25.039" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And there will be shorthands" start="00:06:26.720" video="mainVideo" id=subtitle]]
+[[!template text="for Lisp symbols" start="00:06:28.560" video="mainVideo" id=subtitle]]
+[[!template text="supported in the Lisp symbol reader." start="00:06:30.000" video="mainVideo" id=subtitle]]
+[[!template text="This means that for packages" start="00:06:32.400" video="mainVideo" id=subtitle]]
+[[!template text="like s and f that have a whole bunch" start="00:06:34.240" video="mainVideo" id=subtitle]]
+[[!template text="of really short named functions" start="00:06:36.800" video="mainVideo" id=subtitle]]
+[[!template text="that might pollute the namespace," start="00:06:38.479" video="mainVideo" id=subtitle]]
+[[!template text="those functions now can be" start="00:06:40.560" video="mainVideo" id=subtitle]]
+[[!template text="implemented behind a prefix" start="00:06:43.199" video="mainVideo" id=subtitle]]
+[[!template text="where the symbol reader can be taught" start="00:06:45.039" video="mainVideo" id=subtitle]]
+[[!template text="that there is a shorthand" start="00:06:47.520" video="mainVideo" id=subtitle]]
+[[!template text="for that prefix," start="00:06:48.639" video="mainVideo" id=subtitle]]
+[[!template text="and that way, it'll only apply" start="00:06:50.319" video="mainVideo" id=subtitle]]
+[[!template text="for the use of that package." start="00:06:51.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And then finally, work on Emacs 29" start="00:06:54.960" video="mainVideo" id=subtitle]]
+[[!template text="has just started." start="00:06:57.840" video="mainVideo" id=subtitle]]
+[[!template text="I don't have any details" start="00:06:59.280" video="mainVideo" id=subtitle]]
+[[!template text="to report to you there," start="00:07:00.400" video="mainVideo" id=subtitle]]
+[[!template text="just to say that now" start="00:07:01.440" video="mainVideo" id=subtitle]]
+[[!template text="the ship is moving on" start="00:07:02.880" video="mainVideo" id=subtitle]]
+[[!template text="to the next release after," start="00:07:04.000" video="mainVideo" id=subtitle]]
+[[!template text="and Emacs 28 has a release branch" start="00:07:05.360" video="mainVideo" id=subtitle]]
+[[!template text="and is getting cleaned up" start="00:07:07.599" video="mainVideo" id=subtitle]]
+[[!template text="and ready for release." start="00:07:08.720" video="mainVideo" id=subtitle]]
+[[!template text="And that is the technical summary" start="00:07:10.400" video="mainVideo" id=subtitle]]
+[[!template text="of what's new in Emacs." start="00:07:12.720" video="mainVideo" id=subtitle]]
+[[!template text="Thank you." start="00:07:14.000" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/eaf.md b/2021/captions/eaf.md
new file mode 100644
index 00000000..2e9a618c
--- /dev/null
+++ b/2021/captions/eaf.md
@@ -0,0 +1,188 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hi, my name is Matthew Zeng," start="00:00:03.040" video="mainVideo" id=subtitle]]
+[[!template text="aka MT or Mingde." start="00:00:05.206" video="mainVideo" id=subtitle]]
+[[!template text="I am one of the maintainers" start="00:00:14.286" video="mainVideo" id=subtitle]]
+[[!template text="I was also here last year during EmacsConf2020" start="00:00:18.566" video="mainVideo" id=subtitle]]
+[[!template text="and did a 20 minute presentation" start="00:00:22.606" video="mainVideo" id=subtitle]]
+[[!template text="as well as a small demo." start="00:00:26.606" video="mainVideo" id=subtitle]]
+[[!template text="A lot of things had changed since 2020," start="00:00:28.486" video="mainVideo" id=subtitle]]
+[[!template text="and that's why today I'm here to present:" start="00:00:31.966" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Application Framework, A 2021 Update." start="00:00:34.406" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So we all know Emacs," start="00:00:38.046" video="mainVideo" id=subtitle]]
+[[!template text="and we definitely know that" start="00:00:41.086" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is not just a text editor," start="00:00:42.326" video="mainVideo" id=subtitle]]
+[[!template text="but a text-centric work environment," start="00:00:44.486" video="mainVideo" id=subtitle]]
+[[!template text="We all want that, right?" start="00:00:53.126" video="mainVideo" id=subtitle]]
+[[!template text="Therefore the EAF project wants to" start="00:00:55.361" video="mainVideo" id=subtitle]]
+[[!template text="solve this problem while also" start="00:00:58.366" video="mainVideo" id=subtitle]]
+[[!template text="retaining the rich Emacs ecosystem" start="00:01:00.286" video="mainVideo" id=subtitle]]
+[[!template text="and its customizability and extensibility." start="00:01:02.806" video="mainVideo" id=subtitle]]
+[[!template text="The solution is to outsource the hard part" start="00:01:06.046" video="mainVideo" id=subtitle]]
+[[!template text="to Python and NodeJS" start="00:01:10.726" video="mainVideo" id=subtitle]]
+[[!template text="by bridging Elisp with them" start="00:01:12.486" video="mainVideo" id=subtitle]]
+[[!template text="so that Python and JavaScript" start="00:01:14.366" video="mainVideo" id=subtitle]]
+[[!template text="can do the hard work" start="00:01:16.126" video="mainVideo" id=subtitle]]
+[[!template text="and minimize the Elisp workload," start="00:01:17.926" video="mainVideo" id=subtitle]]
+[[!template text="Do note that Python and JavaScript" start="00:01:24.446" video="mainVideo" id=subtitle]]
+[[!template text="already have a very mature ecosystem" start="00:01:27.646" video="mainVideo" id=subtitle]]
+[[!template text="that provides a foundation" start="00:01:30.406" video="mainVideo" id=subtitle]]
+[[!template text="to Python and JavaScript ecosystems," start="00:01:38.006" video="mainVideo" id=subtitle]]
+[[!template text="modern multimedia apps too." start="00:01:42.286" video="mainVideo" id=subtitle]]
+[[!template text="As we're on a tight schedule today," start="00:01:44.366" video="mainVideo" id=subtitle]]
+[[!template text="I can't go into every detail" start="00:01:47.606" video="mainVideo" id=subtitle]]
+[[!template text="about how EAF achieves this." start="00:01:49.726" video="mainVideo" id=subtitle]]
+[[!template text="I did go through a lot of things" start="00:01:51.486" video="mainVideo" id=subtitle]]
+[[!template text="during last year's presentation," start="00:01:53.606" video="mainVideo" id=subtitle]]
+[[!template text="to check out that presentation," start="00:01:57.326" video="mainVideo" id=subtitle]]
+[[!template text="Today we're focusing on *what changed*." start="00:02:01.686" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now the first change" start="00:02:05.726" video="mainVideo" id=subtitle]]
+[[!template text="that you'll definitely notice" start="00:02:09.606" video="mainVideo" id=subtitle]]
+[[!template text="This logo uses gearwheels" start="00:02:12.686" video="mainVideo" id=subtitle]]
+[[!template text="to web and multimedia applications" start="00:02:18.486" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Since last year, EAF has replaced" start="00:02:23.286" video="mainVideo" id=subtitle]]
+[[!template text="the DBus communication technology" start="00:02:28.726" video="mainVideo" id=subtitle]]
+[[!template text="with the cross-platform EPC," start="00:02:30.886" video="mainVideo" id=subtitle]]
+[[!template text="This and some other changes" start="00:02:42.160" video="mainVideo" id=subtitle]]
+[[!template text="enable EAF to support Windows," start="00:02:43.760" video="mainVideo" id=subtitle]]
+[[!template text="Windows 10 and Windows Subsystem for Linux," start="00:02:46.080" video="mainVideo" id=subtitle]]
+[[!template text="as well as all distros that support" start="00:02:49.519" video="mainVideo" id=subtitle]]
+[[!template text="pacman, apt, dnf, pkg," start="00:02:51.840" video="mainVideo" id=subtitle]]
+[[!template text="zypper package installer commands," start="00:02:54.319" video="mainVideo" id=subtitle]]
+[[!template text="which includes Arch-based, Debian," start="00:02:56.959" video="mainVideo" id=subtitle]]
+[[!template text="or Ubuntu-based, Fedora, etc." start="00:02:59.840" video="mainVideo" id=subtitle]]
+[[!template text="However, do note that the maOS support" start="00:03:04.720" video="mainVideo" id=subtitle]]
+[[!template text="works with some known issues." start="00:03:08.239" video="mainVideo" id=subtitle]]
+[[!template text="Have a look if you want to try out." start="00:03:10.319" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Previously, EAF was able to make Elisp" start="00:03:15.360" video="mainVideo" id=subtitle]]
+[[!template text="communicate with Python, as well as" start="00:03:18.400" video="mainVideo" id=subtitle]]
+[[!template text="Python to communicate with JavaScript," start="00:03:20.720" video="mainVideo" id=subtitle]]
+[[!template text="meaning that Elisp can call" start="00:03:23.280" video="mainVideo" id=subtitle]]
+[[!template text="Python functions and vice versa," start="00:03:24.959" video="mainVideo" id=subtitle]]
+[[!template text="and Python can call JavaScript functions" start="00:03:27.280" video="mainVideo" id=subtitle]]
+[[!template text="and vice versa, but if you want Elisp" start="00:03:29.680" video="mainVideo" id=subtitle]]
+[[!template text="to communicate with JavaScript," start="00:03:32.560" video="mainVideo" id=subtitle]]
+[[!template text="you have to go through Python," start="00:03:34.720" video="mainVideo" id=subtitle]]
+[[!template text="which is rather troublesome." start="00:03:36.239" video="mainVideo" id=subtitle]]
+[[!template text="Now, thanks to the EPC," start="00:03:38.879" video="mainVideo" id=subtitle]]
+[[!template text="Elisp can communicate" start="00:03:41.120" video="mainVideo" id=subtitle]]
+[[!template text="with JavaScript directly" start="00:03:42.400" video="mainVideo" id=subtitle]]
+[[!template text="using =eval_js= function" start="00:03:43.840" video="mainVideo" id=subtitle]]
+[[!template text="and =eval_emacs_function=" start="00:03:45.519" video="mainVideo" id=subtitle]]
+[[!template text="in Elisp and Python respectively." start="00:03:47.040" video="mainVideo" id=subtitle]]
+[[!template text="This greatly simplifies the code" start="00:03:49.840" video="mainVideo" id=subtitle]]
+[[!template text="that will be needed" start="00:03:51.840" video="mainVideo" id=subtitle]]
+[[!template text="to write a web app in EAF." start="00:03:52.640" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Speaking of web applications," start="00:03:56.959" video="mainVideo" id=subtitle]]
+[[!template text="VueJS is a web framework" start="00:03:59.120" video="mainVideo" id=subtitle]]
+[[!template text="that's been gaining a lot of popularity" start="00:04:01.200" video="mainVideo" id=subtitle]]
+[[!template text="in recent years" start="00:04:03.840" video="mainVideo" id=subtitle]]
+[[!template text="for its simplicity and functionality." start="00:04:04.720" video="mainVideo" id=subtitle]]
+[[!template text="In the past, you were only able to write" start="00:04:08.959" video="mainVideo" id=subtitle]]
+[[!template text="simple JavaScript and HTML web apps" start="00:04:11.840" video="mainVideo" id=subtitle]]
+[[!template text="for EAF. It was quite some work" start="00:04:14.319" video="mainVideo" id=subtitle]]
+[[!template text="to create a full-featured web application." start="00:04:17.280" video="mainVideo" id=subtitle]]
+[[!template text="Now you can write new apps using EAF" start="00:04:20.880" video="mainVideo" id=subtitle]]
+[[!template text="that work seamlessly with Emacs and Elisp." start="00:04:23.360" video="mainVideo" id=subtitle]]
+[[!template text="There are a few existing EAF apps" start="00:04:27.919" video="mainVideo" id=subtitle]]
+[[!template text="written with Vue already" start="00:04:30.880" video="mainVideo" id=subtitle]]
+[[!template text="to demonstrate the possibilities" start="00:04:32.800" video="mainVideo" id=subtitle]]
+[[!template text="of Vue-based extensions in Emacs." start="00:04:34.639" video="mainVideo" id=subtitle]]
+[[!template text="The first one is the EAF File Manager," start="00:04:38.720" video="mainVideo" id=subtitle]]
+[[!template text="written by ManateeLazycat himself," start="00:04:41.520" video="mainVideo" id=subtitle]]
+[[!template text="as an alternative option to dired," start="00:04:44.160" video="mainVideo" id=subtitle]]
+[[!template text="as he found dired's performance" start="00:04:46.400" video="mainVideo" id=subtitle]]
+[[!template text="to lag considerably" start="00:04:47.919" video="mainVideo" id=subtitle]]
+[[!template text="when there are way too many files." start="00:04:49.280" video="mainVideo" id=subtitle]]
+[[!template text="It supports wdired and fd functionality," start="00:04:52.240" video="mainVideo" id=subtitle]]
+[[!template text="and let me demonstrate that to you." start="00:04:56.080" video="mainVideo" id=subtitle]]
+[[!template text="See? And this is the app." start="00:05:01.600" video="mainVideo" id=subtitle]]
+[[!template text="Go back here." start="00:05:06.160" video="mainVideo" id=subtitle]]
+[[!template text="Another one is the EAF RSS Reader," start="00:05:08.639" video="mainVideo" id=subtitle]]
+[[!template text="written by our Summer of Code 2021 student" start="00:05:12.240" video="mainVideo" id=subtitle]]
+[[!template text="ShaoChenHeng. It is a fast RSS reader" start="00:05:15.039" video="mainVideo" id=subtitle]]
+[[!template text="that uses the EAF browser for previews," start="00:05:18.240" video="mainVideo" id=subtitle]]
+[[!template text="and let me demo that to you as well." start="00:05:21.600" video="mainVideo" id=subtitle]]
+[[!template text="Pragmatic Emacs." start="00:05:32.479" video="mainVideo" id=subtitle]]
+[[!template text="And you can view every site" start="00:05:35.039" video="mainVideo" id=subtitle]]
+[[!template text="in the EAF Browser." start="00:05:37.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="To ease the process" start="00:05:45.360" video="mainVideo" id=subtitle]]
+[[!template text="of creating a new EAF application," start="00:05:46.880" video="mainVideo" id=subtitle]]
+[[!template text="we've separated the EAF core and its apps," start="00:05:49.840" video="mainVideo" id=subtitle]]
+[[!template text="so that EAF apps now have" start="00:05:52.880" video="mainVideo" id=subtitle]]
+[[!template text="their individual repositories." start="00:05:54.479" video="mainVideo" id=subtitle]]
+[[!template text="You can find them under" start="00:05:56.800" video="mainVideo" id=subtitle]]
+[[!template text="the emacs-eaf GitHub organization." start="00:05:58.000" video="mainVideo" id=subtitle]]
+[[!template text="Because of the number of EAF apps" start="00:06:02.000" video="mainVideo" id=subtitle]]
+[[!template text="and their dependencies" start="00:06:04.560" video="mainVideo" id=subtitle]]
+[[!template text="that vary from system to system," start="00:06:05.840" video="mainVideo" id=subtitle]]
+[[!template text="we've also introduced a new" start="00:06:08.319" video="mainVideo" id=subtitle]]
+[[!template text="=M-x eaf-install-and-update= command" start="00:06:10.080" video="mainVideo" id=subtitle]]
+[[!template text="which is a wrapper around the new" start="00:06:12.639" video="mainVideo" id=subtitle]]
+[[!template text="install-eaf python script" start="00:06:14.560" video="mainVideo" id=subtitle]]
+[[!template text="dedicated to installing, updating," start="00:06:17.039" video="mainVideo" id=subtitle]]
+[[!template text="and maintaining EAF apps" start="00:06:19.280" video="mainVideo" id=subtitle]]
+[[!template text="and their dependencies" start="00:06:20.720" video="mainVideo" id=subtitle]]
+[[!template text="for the end user." start="00:06:21.680" video="mainVideo" id=subtitle]]
+[[!template text="Now it is very easy" start="00:06:24.160" video="mainVideo" id=subtitle]]
+[[!template text="to create a new EAF app." start="00:06:25.600" video="mainVideo" id=subtitle]]
+[[!template text="You just need to do it." start="00:06:27.440" video="mainVideo" id=subtitle]]
+[[!template text="You can just do it in your own repository," start="00:06:29.039" video="mainVideo" id=subtitle]]
+[[!template text="such as in GitHub, GitLab, or wherever." start="00:06:31.120" video="mainVideo" id=subtitle]]
+[[!template text="The first thing to do is" start="00:06:34.720" video="mainVideo" id=subtitle]]
+[[!template text="to fork the eaf-demo or the eaf-vue-demo" start="00:06:36.160" video="mainVideo" id=subtitle]]
+[[!template text="as a starting template," start="00:06:39.520" video="mainVideo" id=subtitle]]
+[[!template text="then update the dependencies.json file" start="00:06:41.280" video="mainVideo" id=subtitle]]
+[[!template text="to list the new dependencies you introduced" start="00:06:43.520" video="mainVideo" id=subtitle]]
+[[!template text="on various systems." start="00:06:46.400" video="mainVideo" id=subtitle]]
+[[!template text="Afterwards, once your app is finished," start="00:06:48.560" video="mainVideo" id=subtitle]]
+[[!template text="you simply need to submit a PR" start="00:06:51.199" video="mainVideo" id=subtitle]]
+[[!template text="to the EAF core" start="00:06:53.039" video="mainVideo" id=subtitle]]
+[[!template text="that modifies the applications.json list" start="00:06:54.000" video="mainVideo" id=subtitle]]
+[[!template text="to include your new app. And that's it." start="00:06:56.720" video="mainVideo" id=subtitle]]
+[[!template text="Come try it out and write your own" start="00:07:03.039" video="mainVideo" id=subtitle]]
+[[!template text="EAF extensions today!" start="00:07:04.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There are many other new updates." start="00:07:09.599" video="mainVideo" id=subtitle]]
+[[!template text="To list a few: we reached" start="00:07:11.840" video="mainVideo" id=subtitle]]
+[[!template text="more than 60 contributors, hooray!" start="00:07:13.919" video="mainVideo" id=subtitle]]
+[[!template text="And also, you can now use the familiar" start="00:07:17.199" video="mainVideo" id=subtitle]]
+[[!template text="Control s and Control r isearch" start="00:07:19.759" video="mainVideo" id=subtitle]]
+[[!template text="for real-time search," start="00:07:22.160" video="mainVideo" id=subtitle]]
+[[!template text="functioning very similar" start="00:07:23.280" video="mainVideo" id=subtitle]]
+[[!template text="to the Emacs isearch," start="00:07:24.560" video="mainVideo" id=subtitle]]
+[[!template text="in the EAF Browser, PDF Viewer," start="00:07:27.039" video="mainVideo" id=subtitle]]
+[[!template text="and many other applications." start="00:07:29.759" video="mainVideo" id=subtitle]]
+[[!template text="Additionally, you can also create" start="00:07:32.080" video="mainVideo" id=subtitle]]
+[[!template text="EAF PDF annotations" start="00:07:34.000" video="mainVideo" id=subtitle]]
+[[!template text="either inline or as a pop-up, etc. etc. etc." start="00:07:35.680" video="mainVideo" id=subtitle]]
+[[!template text="Finally, let's talk about Popweb." start="00:07:44.319" video="mainVideo" id=subtitle]]
+[[!template text="Popweb is a very, very new project" start="00:07:47.680" video="mainVideo" id=subtitle]]
+[[!template text="that started like exactly two weeks ago," start="00:07:50.080" video="mainVideo" id=subtitle]]
+[[!template text="that focuses particularly on the" start="00:07:52.639" video="mainVideo" id=subtitle]]
+[[!template text="multimedia pop-up functionality in Emacs." start="00:07:55.199" video="mainVideo" id=subtitle]]
+[[!template text="Pop is considered to be a sister project" start="00:07:55.919" video="mainVideo" id=subtitle]]
+[[!template text="and lightweight version of EAF." start="00:08:02.080" video="mainVideo" id=subtitle]]
+[[!template text="They both share a very similar design" start="00:08:04.879" video="mainVideo" id=subtitle]]
+[[!template text="and some code, and they are maintained" start="00:08:07.039" video="mainVideo" id=subtitle]]
+[[!template text="by the same people," start="00:08:09.039" video="mainVideo" id=subtitle]]
+[[!template text="which is me and ManateeLazycat." start="00:08:10.080" video="mainVideo" id=subtitle]]
+[[!template text="Here's a quick demo to see the" start="00:08:13.680" video="mainVideo" id=subtitle]]
+[[!template text="responsiveness of its preview." start="00:08:15.599" video="mainVideo" id=subtitle]]
+[[!template text="Here we go. On the right, see..." start="00:08:23.840" video="mainVideo" id=subtitle]]
+[[!template text="Oh, here we go. Yes." start="00:08:27.919" video="mainVideo" id=subtitle]]
+[[!template text="And these are the LaTeX preview." start="00:08:30.720" video="mainVideo" id=subtitle]]
+[[!template text="I can quickly show the next one." start="00:08:32.560" video="mainVideo" id=subtitle]]
+[[!template text="So this is the end of my presentation." start="00:08:44.800" video="mainVideo" id=subtitle]]
+[[!template text="Feel free to post questions" start="00:08:48.160" video="mainVideo" id=subtitle]]
+[[!template text="on the collaborative pad, IRC," start="00:08:50.000" video="mainVideo" id=subtitle]]
+[[!template text="or directly send me an email." start="00:08:52.160" video="mainVideo" id=subtitle]]
+[[!template text="I'll be around all this," start="00:08:53.519" video="mainVideo" id=subtitle]]
+[[!template text="at all these places," start="00:08:55.680" video="mainVideo" id=subtitle]]
+[[!template text="and if you found any issue," start="00:08:57.839" video="mainVideo" id=subtitle]]
+[[!template text="please submit an issue" start="00:08:59.519" video="mainVideo" id=subtitle]]
+[[!template text="to the EAF official issues," start="00:09:01.200" video="mainVideo" id=subtitle]]
+[[!template text="and don't forget to check out the wiki." start="00:09:04.160" video="mainVideo" id=subtitle]]
+[[!template text="Thank you and enjoy" start="00:09:08.880" video="mainVideo" id=subtitle]]
+[[!template text="the rest of EmacsConf 2021." start="00:09:10.160" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:09:13.680" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt b/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt
new file mode 100644
index 00000000..5b4a23c5
--- /dev/null
+++ b/2021/captions/emacsconf-2021-babel--babel-for-academics--asilata-bapat--main.vtt
@@ -0,0 +1,802 @@
+WEBVTT
+
+00:00.799 --> 00:02.560
+Hi! My name is Asilata Bapat,
+
+00:02.560 --> 00:04.960
+and I'm talking about Babel for academics.
+
+00:04.960 --> 00:06.879
+So, I'm an academic at a university,
+
+00:06.879 --> 00:09.040
+and I use Emacs, Org mode, and Babel
+
+00:09.040 --> 00:11.280
+for a whole bunch of work related tasks.
+
+00:11.280 --> 00:12.559
+And there are many other tools
+
+00:12.559 --> 00:14.240
+that one could use to help with
+
+00:14.240 --> 00:15.200
+this workflow.
+
+00:15.200 --> 00:16.597
+I won't be going through all of these,
+
+00:16.597 --> 00:18.160
+and the ones that I've listed are just
+
+00:18.160 --> 00:20.240
+a few of the many that are available.
+
+00:20.240 --> 00:22.000
+Today, I'll really be talking about
+
+00:22.000 --> 00:24.080
+my teaching workflow.
+
+00:24.080 --> 00:27.840
+Let's just dive right in to a demo.
+
+00:27.840 --> 00:29.243
+So, the first file that I want to
+
+00:29.243 --> 00:31.599
+show you is the notes and admin file.
+
+00:31.599 --> 00:33.040
+From this file, I'll generate
+
+00:33.040 --> 00:35.440
+a nice-looking PDF document of notes,
+
+00:35.440 --> 00:36.963
+and I'll also keep track of some
+
+00:36.963 --> 00:38.399
+course admin.
+
+00:38.399 --> 00:43.200
+So, the file that I have here is this one,
+
+00:43.200 --> 00:44.719
+and all of the files that I'm going to
+
+00:44.719 --> 00:46.320
+show you today are taken from a course
+
+00:46.320 --> 00:48.096
+that I'm teaching at the moment
+
+00:48.096 --> 00:49.680
+this semester.
+
+00:49.680 --> 00:53.147
+What I want to do is export this
+
+00:53.147 --> 00:55.520
+entire document to LaTeX
+
+00:55.520 --> 00:56.320
+because this is where
+
+00:56.320 --> 00:58.800
+I'll be writing my course notes.
+
+00:58.800 --> 01:00.480
+But before I do that,
+
+01:00.480 --> 01:03.199
+I have some setup that I want to do,
+
+01:03.199 --> 01:05.199
+and you'll notice some of these headings
+
+01:05.199 --> 01:06.509
+are tagged as noexport,
+
+01:06.509 --> 01:08.400
+and they won't be exported.
+
+01:08.400 --> 01:11.680
+The startup setting I'll skip,
+
+01:11.680 --> 01:13.499
+and then the main thing here
+
+01:13.499 --> 01:14.880
+is the LaTeX setup.
+
+01:14.880 --> 01:18.560
+So, I'm using these #+ option lines,
+
+01:18.560 --> 01:21.360
+and I've told Org that
+
+01:21.360 --> 01:23.280
+I want to use an unusual LaTeX class,
+
+01:23.280 --> 01:24.880
+I'll have to tell Org about it later,
+
+01:24.880 --> 01:26.240
+I'll do that in a moment,
+
+01:26.240 --> 01:27.001
+and I have some
+
+01:27.001 --> 01:29.600
+LaTeX header lines, and so on.
+
+01:29.600 --> 01:31.360
+And then I have some export settings,
+
+01:31.360 --> 01:32.941
+the first export setting is
+
+01:32.941 --> 01:35.119
+to export into a different directory,
+
+01:35.119 --> 01:36.799
+not just at the same level
+
+01:36.799 --> 01:38.560
+because I want everything to go into
+
+01:38.560 --> 01:39.716
+the artifacts directory,
+
+01:39.716 --> 01:41.360
+and then I can ignore that artifacts
+
+01:41.360 --> 01:44.399
+directory using Git.
+
+01:44.399 --> 01:45.600
+This is the first
+
+01:45.600 --> 01:47.280
+source code block that we see,
+
+01:47.280 --> 01:49.759
+which is the Babel side of things,
+
+01:49.759 --> 01:52.079
+and I've called it export-setup.
+
+01:52.079 --> 01:55.759
+The way I write it is, #+begin_src,
+
+01:55.759 --> 01:56.965
+the language that I want to use,
+
+01:56.965 --> 01:58.159
+which is emacs-lisp,
+
+01:58.159 --> 01:59.600
+and maybe some options,
+
+01:59.600 --> 02:01.119
+and this is collapsed at the moment,
+
+02:01.119 --> 02:03.600
+if I expand it, you'll see
+
+02:03.600 --> 02:05.155
+inside here, this is really
+
+02:05.155 --> 02:07.600
+just Elisp, Emacs Lisp.
+
+02:07.600 --> 02:09.592
+So, the first thing I've done is,
+
+02:09.592 --> 02:12.440
+I've added this LaTeX class
+
+02:12.440 --> 02:15.360
+to the list of known LaTeX classes.
+
+02:15.360 --> 02:17.433
+And the second thing I've done is,
+
+02:17.433 --> 02:19.599
+I have locally set the value of
+
+02:19.599 --> 02:21.112
+org-latex-pdf-process,
+
+02:21.112 --> 02:24.720
+which is the compiler, to something…,
+
+02:24.720 --> 02:27.200
+this command is complicated I guess,
+
+02:27.200 --> 02:29.440
+but what the main thing it's doing
+
+02:29.440 --> 02:32.160
+is that it's moving the generated output…,
+
+02:32.160 --> 02:34.160
+sorry, the generated image files
+
+02:34.160 --> 02:35.169
+to the output directory,
+
+02:35.169 --> 02:37.519
+so that everything can remain
+
+02:37.519 --> 02:39.680
+inside of this artifacts directory,
+
+02:39.680 --> 02:41.519
+and maybe it's doing some other things.
+
+02:41.519 --> 02:43.680
+And then there are some other
+
+02:43.680 --> 02:47.120
+setup options that I'll skip.
+
+02:47.120 --> 02:49.360
+So, this is a source code block,
+
+02:49.360 --> 02:50.640
+inside of the source code block
+
+02:50.640 --> 02:52.319
+everything is basically Emacs Lisp.
+
+02:52.319 --> 02:54.640
+How do I evaluate this?
+
+02:54.640 --> 02:56.319
+I just press Control c Control c (C-c C-c),
+
+02:56.319 --> 02:57.920
+and it evaluates everything,
+
+02:57.920 --> 03:00.319
+but if I want to automate the evaluation,
+
+03:00.319 --> 03:02.080
+there's one other thing I can do.
+
+03:02.080 --> 03:04.658
+So, let me jump down to
+
+03:04.658 --> 03:06.720
+the local variables section.
+
+03:06.720 --> 03:09.740
+In this local variable section
+
+03:09.740 --> 03:11.680
+I have an eval block,
+
+03:11.680 --> 03:14.681
+so, I've added a certain hook to the
+
+03:14.681 --> 03:16.879
+org-export-before-processing-hook,
+
+03:16.879 --> 03:18.319
+and that just resolves
+
+03:18.319 --> 03:19.519
+this reference from this file.
+
+03:19.519 --> 03:23.040
+It looks for a code block titled
+
+03:23.040 --> 03:24.859
+export-setup, and it runs it
+
+03:24.859 --> 03:26.000
+right before exporting,
+
+03:26.000 --> 03:29.200
+and this is all local to this buffer.
+
+03:29.200 --> 03:30.799
+So, before I export,
+
+03:30.799 --> 03:34.000
+it'll then read the correct options.
+
+03:34.000 --> 03:37.519
+And after this setup,
+
+03:37.519 --> 03:39.760
+I have the course plan,
+
+03:39.760 --> 03:41.599
+which is just what goes into my agenda
+
+03:41.599 --> 03:43.360
+as to-dos, I'll skip that.
+
+03:43.360 --> 03:45.519
+And after that, I have the actual notes,
+
+03:45.519 --> 03:48.640
+and what they actually look like…,
+
+03:48.640 --> 03:54.400
+so, this is what they actually look like,
+
+03:54.400 --> 03:57.040
+nicely LaTeXed with diagrams and so on,
+
+03:57.040 --> 03:57.920
+everything generated
+
+03:57.920 --> 04:00.720
+from that single Org file.
+
+04:00.720 --> 04:04.480
+I'll say more about diagrams later.
+
+04:04.480 --> 04:06.080
+I also have to write assignments
+
+04:06.080 --> 04:07.260
+and assignment solutions,
+
+04:07.260 --> 04:10.239
+so let me jump to that.
+
+04:10.239 --> 04:11.840
+Again, this is a very similar file,
+
+04:11.840 --> 04:14.080
+but I want to now export
+
+04:14.080 --> 04:15.760
+different headings to different files.
+
+04:15.760 --> 04:16.639
+This is not going to be
+
+04:16.639 --> 04:18.320
+exported all at once.
+
+04:18.320 --> 04:19.759
+So, again I have some setup,
+
+04:19.759 --> 04:22.400
+some general setup that I'll skip,
+
+04:22.400 --> 04:25.120
+export setup just like before,
+
+04:25.120 --> 04:29.280
+code setup for Python, really,
+
+04:29.280 --> 04:31.280
+I have a various…, a bunch of different
+
+04:31.280 --> 04:33.199
+languages here, so Shell and Python,
+
+04:33.199 --> 04:35.967
+and some helper functions.
+
+04:36.088 --> 04:38.160
+So, let me jump to this one called
+
+04:38.160 --> 04:39.756
+togglesolutions, this is again
+
+04:39.756 --> 04:41.919
+an Emacs Lisp code block.
+
+04:41.919 --> 04:43.600
+What this does is,
+
+04:43.600 --> 04:48.632
+it tells LaTeX to either toggle the
+
+04:48.632 --> 04:50.336
+display of solutions on, or off
+
+04:50.336 --> 04:53.096
+based on what the tag is
+
+04:53.096 --> 04:54.240
+for that particular assignment.
+
+04:54.240 --> 04:57.520
+So, whether if the assignment
+
+04:57.520 --> 04:58.800
+is tagged as solved,
+
+04:58.800 --> 05:00.240
+then the solution should be displayed,
+
+05:00.240 --> 05:03.280
+otherwise they shouldn't be.
+
+05:03.280 --> 05:05.447
+And here most of the assignments
+
+05:05.447 --> 05:07.120
+are tagged as solved,
+
+05:07.120 --> 05:08.880
+so in this case if I export this,
+
+05:08.880 --> 05:11.840
+the solutions will be displayed.
+
+05:11.840 --> 05:20.800
+Let's look at that.
+
+05:20.800 --> 05:23.919
+So, I see the solutions blocks,
+
+05:23.919 --> 05:27.036
+and this is because it's calling
+
+05:27.036 --> 05:29.919
+the toggle solutions piece of code.
+
+05:29.919 --> 05:32.240
+And the properties,
+
+05:32.240 --> 05:33.840
+if I expand this properties drawer,
+
+05:33.840 --> 05:39.280
+you see this output file name
+
+05:39.280 --> 05:41.440
+has a homework one dash solved,
+
+05:41.440 --> 05:43.360
+so it has a solved suffix,
+
+05:43.360 --> 05:45.912
+and this is related to the fact that
+
+05:45.912 --> 05:47.680
+I have a solved tag up here.
+
+05:47.680 --> 05:48.960
+So, let's see what happens
+
+05:48.960 --> 05:51.199
+if I delete the solved tag,
+
+05:51.199 --> 05:52.639
+so nothing's happened yet,
+
+05:52.639 --> 05:54.000
+but if I save the file,
+
+05:54.000 --> 05:55.919
+then suddenly this homework one
+
+05:55.919 --> 05:58.240
+dash solved becomes homework one,
+
+05:58.240 --> 06:00.080
+and this is desired behavior,
+
+06:00.080 --> 06:02.084
+this is what I want because
+
+06:02.084 --> 06:03.222
+I want to keep the solved
+
+06:03.222 --> 06:04.497
+and unsolved files separate.
+
+06:04.497 --> 06:07.120
+So, once again, if I put in
+
+06:07.120 --> 06:09.440
+the solved tag, and if I save,
+
+06:09.440 --> 06:11.440
+I get back the different file name.
+
+06:11.440 --> 06:12.720
+And how did I achieve this?
+
+06:12.720 --> 06:16.479
+This is again back in the setup section,
+
+06:16.479 --> 06:19.280
+it's the process-export-filenames block.
+
+06:19.280 --> 06:21.120
+It's some big piece of Elisp
+
+06:21.120 --> 06:22.349
+that I won't go through,
+
+06:22.349 --> 06:24.240
+but basically it's mapping over
+
+06:24.240 --> 06:26.720
+Org entries, and it's either
+
+06:26.720 --> 06:30.080
+adding or removing this solved suffix
+
+06:30.080 --> 06:34.560
+based on what tag it sees.
+
+06:34.560 --> 06:36.781
+Okay, when does this
+
+06:36.781 --> 06:37.919
+code block get evaluated?
+
+06:37.919 --> 06:39.840
+Well, I want it to be evaluated
+
+06:39.840 --> 06:41.039
+right before I save
+
+06:41.039 --> 06:43.199
+because I change something,
+
+06:43.199 --> 06:45.840
+I save, and I want the properties
+
+06:45.840 --> 06:49.199
+to be get updated accordingly.
+
+06:49.199 --> 06:51.364
+If I go down to the
+
+06:51.364 --> 06:52.639
+local variables section again.
+
+06:52.639 --> 06:55.840
+Again, I have a local variables
+
+06:55.840 --> 06:56.800
+section here,
+
+06:56.800 --> 06:58.479
+and I'm evaluating this Elisp,
+
+06:58.479 --> 07:01.199
+which is setting the before-save-hook
+
+07:01.199 --> 07:04.240
+to resolve the process-export-filenames
+
+07:04.240 --> 07:05.716
+function, and so that's what
+
+07:05.716 --> 07:09.199
+gives me that functionality.
+
+07:09.199 --> 07:12.720
+And finally,
+
+07:12.720 --> 07:16.240
+I have some skeletons, which are….
+
+07:16.240 --> 07:19.360
+Emacs has this skeleton language,
+
+07:19.360 --> 07:22.240
+which is a rudimentary templating language.
+
+07:22.240 --> 07:24.220
+So, I've defined some templates
+
+07:24.220 --> 07:26.319
+for my assignment and worksheet
+
+07:26.319 --> 07:29.440
+in this little Emacs Lisp block,
+
+07:29.440 --> 07:31.120
+which I think I usually just evaluate
+
+07:31.120 --> 07:33.280
+manually, and then if I just call it,
+
+07:33.280 --> 07:35.199
+I get a nice-looking skeleton
+
+07:35.199 --> 07:37.360
+that gives me this assignment.
+
+07:37.360 --> 07:40.080
+One thing I want to show you
+
+07:40.080 --> 07:43.199
+in these assignments, or I mean,
+
+07:43.199 --> 07:44.720
+in this file in particular,
+
+07:44.720 --> 07:46.560
+are these dot source code blocks.
+
+07:46.560 --> 07:49.840
+So, I've had to type in or draw in
+
+07:49.840 --> 07:52.000
+some graphs in this assignment,
+
+07:52.000 --> 07:54.720
+and I can do that right from Org.
+
+07:54.720 --> 07:56.400
+So, this is some piece of code
+
+07:56.400 --> 07:59.199
+that's creating a file,
+
+07:59.199 --> 08:00.879
+which has this name,
+
+08:00.879 --> 08:05.840
+and if I evaluate this block,
+
+08:05.840 --> 08:10.720
+I see a results drawer with this file.
+
+08:10.720 --> 08:12.711
+And this is a PNG file,
+
+08:12.711 --> 08:13.759
+which now gets embedded
+
+08:13.759 --> 08:15.680
+into my LaTeX document.
+
+08:15.680 --> 08:16.639
+So, this is nice,
+
+08:16.639 --> 08:18.720
+I can actually delete this from here,
+
+08:18.720 --> 08:20.479
+and when I export,
+
+08:20.479 --> 08:23.919
+the file will get attached automatically.
+
+08:23.919 --> 08:26.639
+And similarly,
+
+08:26.639 --> 08:28.800
+in some other assignments here,
+
+08:28.800 --> 08:30.639
+I have some Python source,
+
+08:30.639 --> 08:33.284
+so I've had to type in
+
+08:33.284 --> 08:34.527
+some complicated matrices,
+
+08:34.527 --> 08:36.128
+and some complicated matrix products,
+
+08:36.128 --> 08:36.640
+and so on,
+
+08:36.640 --> 08:38.000
+which I didn't want to do by hand,
+
+08:38.000 --> 08:39.760
+so that I didn't introduce errors,
+
+08:39.760 --> 08:41.599
+so I've written some Python code.
+
+08:41.599 --> 08:44.240
+If I Control c Control c (C-c C-c)
+
+08:44.240 --> 08:45.920
+on this block, you'll notice,
+
+08:45.920 --> 08:47.120
+it's in the session matrix,
+
+08:47.120 --> 08:49.200
+so it's using the previous,
+
+08:49.200 --> 08:52.399
+the same kind of session.
+
+08:52.399 --> 08:55.440
+And you'll see that the results,
+
+08:55.440 --> 08:57.760
+because of the way I chose to format them,
+
+08:57.760 --> 08:59.920
+look like a nice drawer with
+
+08:59.920 --> 09:01.600
+nicely formatted LaTeX.
+
+09:01.600 --> 09:03.920
+Once again these results
+
+09:03.920 --> 09:05.519
+I can cut from the file,
+
+09:05.519 --> 09:07.600
+and the file will get exported…,
+
+09:07.600 --> 09:09.200
+when the file gets exported,
+
+09:09.200 --> 09:10.480
+these source code blocks will get
+
+09:10.480 --> 09:12.000
+evaluated, and the answer
+
+09:12.000 --> 09:19.200
+will show up in the file.
+
+09:19.200 --> 09:20.097
+And finally,
+
+09:20.097 --> 09:21.363
+the last thing I want to show you
+
+09:21.363 --> 09:23.531
+very briefly is the web page
+
+09:23.531 --> 09:26.720
+for this course.
+
+09:26.720 --> 09:28.399
+The only thing I want to show you here
+
+09:28.399 --> 09:30.399
+is that I have a Python source code block,
+
+09:30.399 --> 09:33.279
+which pulls in my handwritten course notes,
+
+09:33.279 --> 09:36.399
+and makes them into a nice-looking list
+
+09:36.399 --> 09:38.880
+with a nice-looking order,
+
+09:38.880 --> 09:41.680
+and then just exports as HTML.
+
+09:41.680 --> 09:44.600
+So, this is what
+
+09:44.600 --> 09:46.080
+the web page looks like,
+
+09:46.080 --> 09:48.880
+and you can see it at this URL.
+
+09:48.880 --> 09:49.892
+If you go click on
+
+09:49.892 --> 09:52.800
+the 2021 link at this URL.
+
+09:52.800 --> 09:54.880
+So, that's all that I wanted to say.
+
+09:54.880 --> 09:58.360
+Thank you very much!
diff --git a/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--chapters.vtt b/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--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--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-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-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt b/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt
new file mode 100644
index 00000000..ca9a69bf
--- /dev/null
+++ b/2021/captions/emacsconf-2021-bidi--perso-arabic-input-methods-and-making-more-emacs-apps-bidi-aware--mohsen-banan--main.vtt
@@ -0,0 +1,1093 @@
+WEBVTT
+
+00:02.960 --> 00:00:10.240
+Greetings. Salaam. This is Mohsen Banan.
+
+00:00:10.240 --> 00:00:14.080
+I am an Iranian software and internet engineer.
+
+00:14.080 --> 00:17.199
+I converted to Emacs in 1986.
+
+00:17.199 --> 00:20.480
+It was Emacs version 17 then.
+
+00:20.480 --> 00:00:23.920
+By around 1988, when Emacs version 18
+
+00:00:23.920 --> 00:00:25.680
+was well in place,
+
+00:00:25.680 --> 00:00:28.960
+I started living inside of Emacs.
+
+00:00:28.960 --> 00:00:31.119
+My primary digital environment
+
+00:00:31.119 --> 00:00:33.680
+has been Emacs ever since.
+
+00:33.680 --> 00:36.559
+It has been a good life.
+
+00:36.559 --> 00:40.000
+I'm a native Farsi speaker and writer.
+
+00:40.000 --> 00:00:41.520
+I'm not a linguist,
+
+00:00:41.520 --> 00:00:43.800
+and I do not specialize in
+
+00:43.800 --> 00:46.719
+multilingualization, internationalization,
+
+00:46.719 --> 00:48.879
+and localization.
+
+00:48.879 --> 00:52.239
+My favorite programming language is Lisp,
+
+00:52.239 --> 00:00:58.319
+and I am a bit of an Emacs developer.
+
+00:58.320 --> 01:00.719
+This presentation is about use of
+
+01:00.719 --> 01:04.000
+Perso-Arabic Scripts with Emacs.
+
+01:04.000 --> 01:06.720
+It's an overview presentation.
+
+01:06.720 --> 00:01:08.320
+I won't be digging deep
+
+00:01:08.320 --> 00:01:11.360
+in many of the mentioned topics.
+
+01:11.360 --> 00:01:13.119
+My goal is to make you aware
+
+00:01:13.119 --> 00:01:16.159
+of what can be done with Emacs today,
+
+01:16.159 --> 01:19.280
+and the potentials that Emacs presents
+
+01:19.280 --> 01:22.640
+for Perso-Arabic writers.
+
+01:22.640 --> 01:25.759
+The main topics that i'll cover are:
+
+01:25.759 --> 00:01:30.320
+- a brief introduction to Perso-Arabic scripts
+
+01:30.320 --> 01:35.119
+- two existing Emacs Persian input methods
+
+01:35.119 --> 00:01:36.960
+- the challenges involved with
+
+00:01:36.960 --> 00:01:42.960
+making Emacs applications bidirectional-aware
+
+01:42.960 --> 00:01:45.280
+- the ultimate goal of creating
+
+00:01:45.280 --> 00:01:47.759
+a complete digital environment
+
+00:01:47.759 --> 00:01:51.200
+for Perso-Arabic writers
+
+01:51.200 --> 00:01:57.679
+I'll also be including various pointers.
+
+01:57.680 --> 00:02:00.320
+So first, let's make sure
+
+00:02:00.320 --> 00:02:02.079
+that what I'm presenting
+
+00:02:02.079 --> 00:02:04.560
+is of interest to you.
+
+02:04.560 --> 00:02:07.040
+if you are a Perso-Arabic writer
+
+00:02:07.040 --> 00:02:08.879
+and if you use Emacs,
+
+00:02:08.879 --> 00:02:12.720
+you're definitely my intended audience.
+
+02:12.720 --> 00:02:15.120
+If you're an Emacs developer
+
+00:02:15.120 --> 00:02:19.120
+who wishes to make her Emacs apps
+
+02:19.120 --> 00:02:22.000
+multilingual and bidi-aware,
+
+00:02:22.000 --> 00:02:27.359
+you're also my intended audience.
+
+02:27.360 --> 00:02:30.480
+For the purposes of this presentation,
+
+00:02:30.480 --> 00:02:34.160
+in this slide, I'm categorizing scripts
+
+02:34.160 --> 02:39.040
+based on directionality and shaping.
+
+02:39.040 --> 00:02:41.280
+Latin letters are not shaped.
+
+00:02:41.280 --> 00:02:43.120
+Generally speaking,
+
+00:02:43.120 --> 00:02:44.800
+the shape of a Latin letter
+
+00:02:44.800 --> 00:02:49.599
+is independent of its position in a word.
+
+02:49.599 --> 00:02:53.280
+Perso-Arabic letters are subject to shaping.
+
+02:53.280 --> 02:56.319
+For example the letter mim--
+
+02:56.319 --> 02:58.800
+sounding similar to M--
+
+02:58.800 --> 03:01.840
+takes three shapes depending on whether
+
+03:01.840 --> 03:04.720
+it is in the beginning of a word,
+
+03:04.720 --> 00:03:06.480
+in the middle of a word,
+
+00:03:06.480 --> 00:03:09.200
+or at the end of a word.
+
+03:09.200 --> 00:03:12.159
+I'll be showing more of how shaping works
+
+00:03:12.159 --> 00:03:16.400
+in an Emacs session screencast later.
+
+03:16.400 --> 00:03:18.159
+Shaping has ramifications
+
+00:03:18.159 --> 00:03:21.040
+for Emacs application developers.
+
+03:21.040 --> 00:03:23.760
+For example, if you are combining
+
+00:03:23.760 --> 00:03:26.720
+initial letters to create a label,
+
+03:26.720 --> 03:29.680
+those letters can be shaped together--
+
+03:29.680 --> 03:31.760
+which is not what you want.
+
+03:31.760 --> 03:34.000
+In such cases, you would need to
+
+03:34.000 --> 03:37.840
+explicitly keep them separate.
+
+03:37.840 --> 00:03:40.799
+Latin-based scripts are always
+
+00:03:40.799 --> 00:03:42.560
+left-to-right.
+
+03:42.560 --> 00:03:46.560
+Perso-Arabic scripts are right-to-left
+
+03:46.560 --> 00:03:51.040
+with letters, but numbers are left-to-right.
+
+03:51.040 --> 00:03:53.040
+So, Perso-Arabic scripts
+
+00:03:53.040 --> 00:03:56.319
+are bi-directional (BIDI).
+
+03:56.319 --> 00:03:58.879
+Hebrew is also bi-directional,
+
+00:03:58.879 --> 00:04:02.159
+but Hebrew is not shaped.
+
+04:02.159 --> 00:04:05.680
+More recently, it has become very common
+
+00:04:05.680 --> 00:04:10.400
+to mix Perso-Arabic and Latin text.
+
+04:10.400 --> 00:04:12.560
+This can become very confusing
+
+00:04:12.560 --> 00:04:14.959
+if paragraph directionality
+
+00:04:14.959 --> 00:04:17.759
+is not properly observed.
+
+04:17.759 --> 00:04:20.000
+I'll be providing some examples
+
+00:04:20.000 --> 00:04:23.120
+as screencasts.
+
+04:23.120 --> 00:04:24.880
+The Emacs display engine
+
+00:04:24.880 --> 00:04:27.280
+now fully and well supports
+
+00:04:27.280 --> 00:04:32.079
+both shaping and BIDI.
+
+04:32.080 --> 00:04:37.120
+Since 2012, starting with Emacs version 24,
+
+04:37.120 --> 00:04:38.639
+we can say that Emacs
+
+00:04:38.639 --> 00:04:43.600
+is a truly multilingual-capable environment.
+
+04:43.600 --> 00:04:45.040
+Like everything else,
+
+00:04:45.040 --> 00:04:46.880
+multilingual support for Emacs
+
+00:04:46.880 --> 00:04:49.280
+was added gradually.
+
+04:49.280 --> 04:52.560
+Unicode support was added early on.
+
+04:52.560 --> 04:55.520
+The framework for input methods evolved
+
+04:55.520 --> 00:05:00.320
+in the 1990s. But it was not till version 24
+
+00:05:00.320 --> 00:05:03.360
+in 2012 that the display engine
+
+00:05:03.360 --> 00:05:06.240
+could fully support BIDI.
+
+05:06.240 --> 00:05:08.800
+Hats off to Eli Zaretskii
+
+00:05:08.800 --> 00:05:12.960
+for his work on Emacs BIDI.
+
+05:12.960 --> 00:05:15.600
+Once full BIDI support was in place
+
+00:05:15.600 --> 00:05:19.199
+in 2012, I went ahead and added
+
+00:05:19.199 --> 00:05:24.000
+two Persian input methods to Emacs 24.
+
+05:24.000 --> 00:05:26.400
+So now Emacs fully supports
+
+00:05:26.400 --> 00:05:30.638
+Perso-Arabic scripts.
+
+05:30.639 --> 00:05:34.080
+By Perso-Arabic script, we're referring to
+
+00:05:34.080 --> 00:05:36.320
+the Arabic writing system
+
+05:36.320 --> 00:05:38.160
+with various extensions
+
+00:05:38.160 --> 00:05:42.240
+used by a large number of languages.
+
+05:42.240 --> 00:05:44.479
+Perso-Arabic is the second most
+
+00:05:44.479 --> 00:05:47.520
+widely used writing system in the world
+
+05:47.520 --> 05:50.479
+by the number of countries.
+
+05:50.479 --> 05:54.000
+It is the third by the number of users
+
+05:54.000 --> 05:59.039
+after the Latin and Chinese scripts.
+
+05:59.039 --> 06:02.160
+So, by well supporting Perso-Arabic,
+
+06:02.160 --> 00:06:04.720
+Emacs's potential user base
+
+00:06:04.720 --> 00:06:09.918
+can be greatly enhanced.
+
+06:09.919 --> 00:06:12.960
+Before focusing on the Persian input methods,
+
+00:06:12.960 --> 00:06:14.960
+let me quickly summarize
+
+00:06:14.960 --> 00:06:18.319
+Emacs's input methods model.
+
+06:18.319 --> 00:06:21.360
+Input methods allow you to enter characters
+
+00:06:21.360 --> 00:06:25.120
+that are not supported by your keyboard.
+
+06:25.120 --> 00:06:29.280
+With Quail maps, we can map ASCII key strings
+
+00:06:29.280 --> 00:06:31.919
+to multilingual characters.
+
+06:31.919 --> 00:06:34.080
+So we can input any text
+
+00:06:34.080 --> 00:06:36.960
+from an ASCII keyboard.
+
+06:36.960 --> 00:06:38.960
+You select an input method
+
+00:06:38.960 --> 00:06:44.400
+with C-x RET C-\ .
+
+06:44.400 --> 00:06:49.918
+We'll try that in a screencast shortly.
+
+06:49.919 --> 00:06:53.919
+Since version 24, Emacs comes loaded with
+
+00:06:53.919 --> 00:06:56.880
+two Persian input methods:
+
+06:56.880 --> 00:07:01.520
+farsi-isiri-9147 is the standard
+
+00:07:01.520 --> 00:07:04.960
+traditional Iranian keyboard.
+
+07:04.960 --> 00:07:09.199
+farsi-transliterate-banan is an intuitive
+
+00:07:09.199 --> 00:07:12.319
+transliteration keyboard for Farsi
+
+00:07:12.319 --> 00:07:16.960
+which requires near-zero training for use.
+
+07:16.960 --> 00:07:18.960
+I'll be mostly focused on
+
+00:07:18.960 --> 00:07:21.520
+farsi-transliterate-banan
+
+00:07:21.520 --> 00:07:23.919
+in this presentation.
+
+07:23.919 --> 00:07:27.839
+So let's try this out.
+
+07:27.840 --> 07:30.319
+In this gif-cast, we're going to select
+
+07:30.319 --> 00:07:32.240
+a Persian input method
+
+00:07:32.240 --> 00:07:35.280
+and write a few simple sentences.
+
+07:35.280 --> 07:38.160
+With no training and no documentation,
+
+07:38.160 --> 00:07:41.360
+any Farsi writer familiar with Emacs
+
+00:07:41.360 --> 00:07:45.440
+can write these, as farsi-transliterate-banan
+
+00:07:45.440 --> 00:07:48.560
+input method is intuitive.
+
+07:48.560 --> 00:07:50.400
+I'll be using keycast
+
+00:07:50.400 --> 00:07:54.160
+to show you keys as they are used.
+
+07:54.160 --> 07:56.560
+Let me first describe as to what we have
+
+07:56.560 --> 07:58.720
+on the screen.
+
+07:58.720 --> 08:01.520
+There are three windows in one frame.
+
+08:01.520 --> 00:08:04.639
+Keycast will show commands and keys
+
+00:08:04.639 --> 00:08:06.319
+on the mode line.
+
+08:06.319 --> 00:08:08.639
+The leftmost window is showing
+
+00:08:08.639 --> 00:08:10.879
+logs of keycast.
+
+08:10.879 --> 08:14.639
+Transformed individual unshaped letters
+
+08:14.639 --> 08:17.360
+will appear here.
+
+08:17.360 --> 00:08:21.120
+The middle window is running a tail -f
+
+00:08:21.120 --> 00:08:27.440
+on the dribble file piped to fold -w1.
+
+08:27.440 --> 00:08:30.720
+This lets you see the raw ASCII characters
+
+00:08:30.720 --> 00:08:34.479
+as I type them.
+
+08:34.479 --> 00:08:37.839
+The right window is the empty buffer
+
+00:08:37.839 --> 00:08:41.680
+on the ex.fa file.
+
+08:41.680 --> 00:08:44.560
+Anything that I described here
+
+00:08:44.560 --> 00:08:49.040
+can be done with virgin Emacs distribution
+
+08:49.040 --> 08:51.360
+with nothing added,
+
+08:51.360 --> 08:53.760
+but I'm using Blee
+
+08:53.760 --> 08:57.120
+(By* Libre-Halaal Emacs Environment)
+
+08:57.120 --> 00:09:02.720
+to show things. You don't need to have blee
+
+00:09:02.720 --> 00:09:07.600
+for writing the equivalent of the text
+
+00:09:07.600 --> 00:09:10.800
+in this gif-cast.
+
+09:10.800 --> 00:09:13.440
+First, I'm going to select
+
+00:09:13.440 --> 00:09:16.800
+the farsi-transliterate-banan.
+
+09:16.800 --> 00:09:22.080
+I'm entering C-x RET C-\ .
+
+09:22.080 --> 00:09:23.839
+Notice the mode -ine
+
+00:09:23.839 --> 00:09:27.040
+and the prompt at mini-buffer.
+
+09:27.040 --> 09:30.399
+With completion, I'm going to select
+
+09:30.399 --> 09:34.000
+farsi-transliterate-banan.
+
+09:34.000 --> 00:09:38.560
+Notice that farsi-isiri-9147
+
+09:38.560 --> 09:43.360
+was also provided as a choice.
+
+09:43.360 --> 00:09:47.440
+Also notice that the letter 'b' appears
+
+00:09:47.440 --> 00:09:51.760
+in the left of the mode line of ex.fa.
+
+09:51.760 --> 00:09:54.000
+This indicates which input method
+
+00:09:54.000 --> 00:09:56.320
+has been selected.
+
+09:56.320 --> 00:09:58.560
+Also notice that cursor is on
+
+00:09:58.560 --> 00:10:04.399
+the top left corner of ex.fa.
+
+10:04.399 --> 10:08.800
+Next, I'm going to enter the 's' character.
+
+10:08.800 --> 10:12.000
+Notice the cursor moved to the right,
+
+10:12.000 --> 00:10:15.120
+and unshaped ’seen’ appeared
+
+00:10:15.120 --> 00:10:20.079
+in the ex.fa buffer, on the mode-line,
+
+10:20.079 --> 10:23.760
+and in the keycast log buffer.
+
+10:23.760 --> 00:10:28.000
+Next, I'm going to enter 'l'.
+
+10:28.000 --> 00:10:32.800
+Notice ل in the mode-line,
+
+10:32.800 --> 00:10:39.920
+and notice how س was subjected to shaping.
+
+10:39.920 --> 10:42.640
+Next I'm going to write the letter
+
+10:42.640 --> 10:44.640
+to write the following:
+
+10:44.640 --> 10:50.560
+ سلام –حال شما چه طوره؟ –با ایمکس همه کار میشه کرد
+
+10:50.560 --> 10:52.480
+"Hello, how are you?"
+
+10:52.480 --> 00:10:56.720
+You can do everything with Emacs.
+
+10:56.720 --> 11:00.000
+Generally, same-sounding Latin characters
+
+11:00.000 --> 00:11:03.920
+are used. As usual, vowels are ignored
+
+00:11:03.920 --> 00:11:06.720
+unless called for.
+
+11:06.720 --> 11:10.800
+Notice that in order to get ح,
+
+11:10.800 --> 11:14.560
+i repeated 'h' twice.
+
+11:14.560 --> 11:15.440
+
+11:15.440 --> 11:18.560
+is the obvious 'sh'.
+
+11:18.560 --> 11:19.519
+
+11:19.519 --> 11:22.480
+is the obvious 'ch'.
+
+11:22.480 --> 00:11:28.640
+t, that's the ط is upper case T.
+
+11:28.640 --> 00:11:29.439
+ ت
+
+00:11:29.439 --> 00:11:31.839
+is lowercase t.
+
+11:31.839 --> 11:34.880
+That's it. We managed to write in Farsi
+
+11:34.880 --> 11:38.640
+with a QWERTY keyboard, intuitively.
+
+11:38.640 --> 11:40.959
+Next, we are going to switch back to
+
+11:40.959 --> 00:11:45.680
+globish and write "back to globish".
+
+11:45.680 --> 00:11:47.920
+Notice that the globish sentence
+
+00:11:47.920 --> 00:11:50.959
+started from the left side.
+
+11:50.959 --> 00:11:53.279
+This is due to proper detection
+
+00:11:53.279 --> 00:12:00.159
+of paragraph directionality by Emacs.
+
+12:00.160 --> 00:12:05.600
+For the most part, Emacs is self-documenting.
+
+12:05.600 --> 12:07.920
+Here we are pointing you to some
+
+12:07.920 --> 12:12.880
+relevant self-contained Emacs resources.
+
+12:12.880 --> 00:12:15.680
+The BIDI documentation applies to
+
+00:12:15.680 --> 00:12:18.000
+all BIDI scripts,
+
+12:18.000 --> 12:22.079
+not just Perso-Arabic scripts.
+
+12:22.079 --> 00:12:23.279
+Referring to the code
+
+00:12:23.279 --> 00:12:27.999
+can also be useful for some.
+
+12:28.000 --> 12:30.079
+Here are some pointers.
+
+12:30.079 --> 00:12:32.399
+The Quail translation code
+
+00:12:32.399 --> 00:12:35.519
+for Persian input methods:
+
+00:12:35.519 --> 00:12:39.120
+the persian.el file has full details
+
+00:12:39.120 --> 00:12:43.999
+of the mapping and some documentation.
+
+12:44.000 --> 00:12:46.639
+Next, we'll show the keyboard layouts
+
+00:12:46.639 --> 00:12:51.519
+as a gif-cast. You can get
+
+00:12:51.519 --> 00:12:55.519
+relevant documentation for any input method
+
+12:55.519 --> 00:13:00.320
+with the describe-input-method command.
+
+13:00.320 --> 00:13:05.920
+So, let's try that for farsi-transliterate-banan.
+
+00:13:05.920 --> 00:13:09.360
+We are back in the ex.fa buffer
+
+00:13:09.360 --> 00:13:11.279
+as one window.
+
+13:11.279 --> 13:13.839
+We don't need the keycast logging
+
+13:13.839 --> 13:17.040
+and the dribble windows any more.
+
+13:17.040 --> 13:20.320
+With the C-\, I reactivate
+
+13:20.320 --> 13:23.360
+the farsi input method.
+
+13:23.360 --> 00:13:26.399
+Notice that keycast is still active
+
+00:13:26.399 --> 00:13:29.360
+on the mode line.
+
+13:29.360 --> 00:13:34.240
+Next, with the C-h C-\ ,
+
+00:13:34.240 --> 00:13:38.560
+I get the input methods documentation.
+
+13:38.560 --> 00:13:40.639
+I then delete other windows
+
+00:13:40.639 --> 00:13:45.440
+and keep the help buffer visible.
+
+13:45.440 --> 00:13:47.279
+Notice that beh
+
+00:13:47.279 --> 00:13:52.720
+in this input methods identifier.
+
+13:52.720 --> 13:55.920
+Here is the URL for full documentation
+
+13:55.920 --> 00:14:00.639
+on the web. The keyboard layout itself
+
+00:14:00.639 --> 00:14:03.760
+is a one-to-one mapping, but towards
+
+00:14:03.760 --> 00:14:07.360
+making transliteration intuitive.
+
+14:07.360 --> 14:10.240
+Multiple keys are sometimes mapped to
+
+14:10.240 --> 14:12.079
+the same letter.
+
+14:12.079 --> 00:14:19.760
+For example, both 'i' and 'y' produce yeh.
+
+14:19.760 --> 14:22.959
+The usual two letter transliterations
+
+14:22.959 --> 00:14:29.600
+ending with 'h' -- zh, ch, sh, and kh
+
+00:14:29.600 --> 00:14:34.160
+are provided. The ampersand prefix
+
+00:14:34.160 --> 00:14:37.440
+is used to support often invisible
+
+14:37.440 --> 00:14:41.600
+BIDI markings. In addition to this
+
+00:14:41.600 --> 00:14:43.920
+internal documentation,
+
+00:14:43.920 --> 00:14:48.958
+full documentation is also available.
+
+14:48.959 --> 00:14:50.560
+Complete documentation
+
+00:14:50.560 --> 00:14:52.240
+for Persian input methods
+
+00:14:52.240 --> 00:14:58.560
+is available as PLPC-120036.
+
+14:58.560 --> 00:15:00.880
+Next, we'll take a quick look at this
+
+00:15:00.880 --> 00:15:03.600
+on the web.
+
+15:03.600 --> 00:15:05.440
+You can click on links
+
+00:15:05.440 --> 00:15:07.440
+in the reveal web-based form
+
+00:15:07.440 --> 00:15:09.839
+of this presentation.
+
+15:09.839 --> 15:15.440
+So let's visit PLPC-120036.
+
+15:15.440 --> 00:15:17.600
+This document fully describes
+
+00:15:17.600 --> 00:15:20.560
+Persian input methods.
+
+15:20.560 --> 00:15:22.320
+In addition to HTML,
+
+00:15:22.320 --> 00:15:26.079
+you can also obtain it in PDF.
+
+00:15:26.079 --> 00:15:30.079
+Let's do that. Of particular interest
+
+00:15:30.079 --> 00:15:33.120
+in this document are various tables
+
+15:33.120 --> 00:15:35.839
+that enumerate lists of letters
+
+00:15:35.839 --> 00:15:37.120
+with their association
+
+00:15:37.120 --> 00:15:41.839
+to both Persian input methods.
+
+15:41.839 --> 15:46.240
+Let's take a look at a few of these.
+
+15:46.240 --> 00:15:51.360
+Table 3, mapping of isiri-6219
+
+15:51.360 --> 15:53.680
+(the Farsi character set)
+
+15:53.680 --> 00:15:55.680
+to Emacs version input methods
+
+00:15:55.680 --> 00:15:58.720
+could be of interest to you,
+
+15:58.720 --> 16:01.040
+as well as table 8
+
+16:01.040 --> 16:04.720
+for BIDI-related control markups,
+
+16:04.720 --> 00:16:17.518
+and table 9, for vowels and other signs.
+
+16:17.519 --> 00:16:19.759
+Having covered input methods,
+
+00:16:19.759 --> 00:16:21.279
+let's turn our attention
+
+00:16:21.279 --> 00:16:25.199
+to ramifications of BIDI and Perso-Arabic
+
+00:16:25.199 --> 00:16:28.480
+on various Emacs applications.
+
+16:28.480 --> 00:16:32.160
+Since 2012, I have been using Persian text
+
+00:16:32.160 --> 00:16:35.839
+in various Emacs applications.
+
+16:35.839 --> 00:16:38.079
+In short, my experience has been
+
+00:16:38.079 --> 00:16:42.399
+that most Emacs apps are usable,
+
+16:42.399 --> 16:44.880
+but they all have glitches
+
+16:44.880 --> 00:16:47.279
+that could at a minimum
+
+00:16:47.279 --> 00:16:51.279
+annoy Perso-Arabic users.
+
+16:51.279 --> 16:54.639
+In this slide, I'm presenting a summary.
+
+16:54.639 --> 00:16:56.399
+The glitches with Gnus
+
+00:16:56.399 --> 00:17:00.079
+are not all that significant for me.
+
+17:00.079 --> 17:04.240
+BBDB glitches can easily be fixed.
+
+17:04.240 --> 00:17:07.679
+For Calendar, I have customized my own setup
+
+00:17:07.679 --> 00:17:10.799
+to support Persian and Islamic dates
+
+00:17:10.799 --> 00:17:14.079
+in Perso-Arabic. Perhaps they should be
+
+00:17:14.079 --> 00:17:17.039
+merged upstream, instead of
+
+00:17:17.039 --> 00:17:19.679
+dealing with apps one at a time.
+
+00:17:19.679 --> 00:17:21.439
+I think it's more reasonable
+
+00:17:21.439 --> 00:17:25.279
+to consider them collectively.
+
+17:25.280 --> 00:17:26.880
+The glitches that I mentioned
+
+00:17:26.880 --> 00:17:28.799
+in the previous slide
+
+17:28.799 --> 17:30.480
+have two routes:
+
+17:30.480 --> 17:32.480
+some are BIDI-specific
+
+17:32.480 --> 17:35.919
+and some are Perso-Arabic-specific.
+
+17:35.919 --> 00:17:36.720
+In this slide,
+
+00:17:36.720 --> 00:17:39.280
+I have classified them as such
+
+17:39.280 --> 17:42.960
+and have made some general suggestions,
+
+17:42.960 --> 00:17:45.679
+but all of these at best amount to
+
+00:17:45.679 --> 00:17:47.679
+tactical approaches.
+
+17:47.679 --> 00:17:50.160
+I think a more strategic approach
+
+00:17:50.160 --> 00:17:53.519
+is called for.
+
+17:53.520 --> 17:56.240
+The right way to address BIDI-awareness
+
+17:56.240 --> 17:58.559
+and other awarenesses
+
+17:58.559 --> 00:18:00.559
+is to build them in frameworks
+
+00:18:00.559 --> 00:18:04.160
+that Emacs apps can then use.
+
+18:04.160 --> 00:18:08.480
+So, I'm proposing that we first create ENML,
+
+00:18:08.480 --> 00:18:11.520
+the Emacs Native Markup Language,
+
+00:18:11.520 --> 00:18:16.880
+as a Lisp-ish (perhaps even not fully secure)
+
+18:16.880 --> 18:20.320
+super-set of HTML5.
+
+18:20.320 --> 18:22.960
+With that in place, we can then build on
+
+18:22.960 --> 00:18:25.360
+the two decades of experience
+
+00:18:25.360 --> 00:18:27.600
+that have produced various
+
+00:18:27.600 --> 00:18:31.039
+web application development frameworks
+
+18:31.039 --> 18:33.919
+by mimicking one of them.
+
+18:33.919 --> 00:18:35.679
+I don't have any running code
+
+00:18:35.679 --> 00:18:39.440
+for any of these, but discussing strategy
+
+00:18:39.440 --> 00:18:44.639
+need not always be futile.
+
+18:44.640 --> 18:47.679
+Emacs has immense potentials,
+
+18:47.679 --> 18:51.120
+but those potentials cannot be realized
+
+18:51.120 --> 00:18:54.640
+unless we integrate Emacs in the totality
+
+00:18:54.640 --> 00:18:59.840
+of a specific complete digital ecosystem.
+
+18:59.840 --> 19:02.000
+Over the past two decades, I've been
+
+19:02.000 --> 00:19:03.440
+building the contours
+
+00:19:03.440 --> 00:19:06.240
+of The Libre-Halaal By* (ByStar)
+
+00:19:06.240 --> 00:19:10.240
+digital ecosystem.
+
+19:10.240 --> 19:13.039
+Emacs can then be fully integrated into
+
+19:13.039 --> 00:19:16.799
+ByStar. It's through such integration
+
+00:19:16.799 --> 00:19:19.679
+that full conviviality of Emacs
+
+00:19:19.679 --> 00:19:24.239
+can be experienced.
+
+19:24.240 --> 00:19:26.640
+Blee, the ByStar Libre-Halaal
+
+00:19:26.640 --> 00:19:30.000
+Emacs environment is Emacs
+
+00:19:30.000 --> 00:19:32.720
+plus a whole lot of Emacs apps
+
+00:19:32.720 --> 00:19:34.880
+integrated with Debian,
+
+00:19:34.880 --> 00:19:38.320
+With ByStar services and with BISOS,
+
+00:19:38.320 --> 00:19:42.480
+the ByStar Internet Services OS.
+
+19:42.480 --> 00:19:43.600
+Perhaps this could be
+
+00:19:43.600 --> 00:19:45.840
+the topic of a presentation
+
+00:19:45.840 --> 00:19:46.840
+for the 2022 Emacs Conference.
+
+00:19:46.840 --> 00:19:51.559
+[captions by Mohsen Banan]
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-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt b/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt
new file mode 100644
index 00000000..1da2506d
--- /dev/null
+++ b/2021/captions/emacsconf-2021-borg--manual-package-management-in-the-era-of-repositories-why-and-how--codingquark--main.vtt
@@ -0,0 +1,457 @@
+WEBVTT
+
+00:00.950 --> 00:03.225
+Hello, my name is Dhavan,
+
+00:03.225 --> 00:05.500
+also known as codingquark!
+
+00:05.500 --> 00:08.041
+I started out learning Emacs
+
+00:08.041 --> 00:12.540
+without knowing I had to plug things in
+
+00:12.540 --> 00:13.629
+to make it work.
+
+00:13.629 --> 00:14.849
+Eventually I had to learn to set up ELPA.
+
+00:14.849 --> 00:16.850
+Since then I’ve used MELPA
+
+00:16.850 --> 00:21.030
+and Debian apt sources.
+
+00:21.030 --> 00:21.054
+Recent discussions about ELPA,
+
+00:21.054 --> 00:21.054
+NonGNU ELPA, MELPA, etc.
+
+00:21.054 --> 00:21.054
+made me reconsider
+
+00:21.054 --> 00:21.054
+what I was doing
+
+00:21.054 --> 00:28.590
+with my Emacs.
+
+00:28.590 --> 00:30.887
+I am not the kind of person
+
+00:30.887 --> 00:34.290
+to mindlessly ram things into my emacs.
+
+00:34.290 --> 00:36.041
+I like to ponder,
+
+00:36.041 --> 00:37.500
+to understand,
+
+00:37.500 --> 00:40.128
+to have a level of control
+
+00:40.128 --> 00:42.069
+and mindfulness
+
+00:42.069 --> 00:43.890
+about my Emacs.
+
+00:43.890 --> 00:45.730
+It is not just a matter
+
+00:45.730 --> 00:47.340
+of trying things out,
+
+00:47.340 --> 00:50.909
+it is about living an examined life
+
+00:50.909 --> 00:53.387
+as the Greeks would say;
+
+00:53.387 --> 00:57.040
+or sutta as Buddhists would say.
+
+00:57.040 --> 00:59.860
+Such an Emacs is an Emacs worth having.
+
+00:59.860 --> 01:01.414
+This pursuit of mine
+
+01:01.414 --> 01:03.710
+brought me to learn about borg.
+
+01:03.710 --> 01:05.595
+And I am going to share with you
+
+01:05.595 --> 01:06.479
+how to use it.
+
+01:06.479 --> 01:09.018
+I believe the approach of using borg
+
+01:09.018 --> 01:10.597
+for package management
+
+01:10.597 --> 01:12.710
+is not for everyone.
+
+01:12.710 --> 01:14.307
+It involves knowing git,
+
+01:14.307 --> 01:16.648
+it involves looking into source code
+
+01:16.648 --> 01:18.229
+and reading makefiles.
+
+01:18.229 --> 01:20.170
+Sure, anyone can learn
+
+01:20.170 --> 01:22.617
+should they be motivated so,
+
+01:22.617 --> 01:25.740
+but people have different priorities.
+
+01:25.740 --> 01:29.056
+This is what is working for me right now.
+
+01:29.056 --> 01:32.826
+Here is what we are going to do.
+
+01:32.826 --> 01:35.696
+We'll set up Debian, install dependencies,
+
+01:35.696 --> 01:39.032
+set up borg, install a package,
+
+01:39.032 --> 01:42.090
+and make sure it installs all the docs.
+
+01:42.090 --> 01:47.240
+Let’s get started!
+
+01:47.240 --> 01:48.342
+Would it not be amazing
+
+01:48.342 --> 01:49.560
+if we could start out with
+
+01:49.560 --> 01:52.399
+just Debian and basic tools?
+
+01:52.399 --> 01:54.848
+For borg, we need git,
+
+01:54.848 --> 01:55.916
+build-essential,
+
+01:55.916 --> 01:57.384
+and something to build docs.
+
+01:57.384 --> 02:00.499
+Nothing more!
+
+02:00.499 --> 02:04.658
+Now that we have the OS setup,
+
+02:04.658 --> 02:06.226
+it is time to clone
+
+02:06.226 --> 02:09.429
+what is called a “seed”.
+
+02:09.429 --> 02:11.431
+A seed will speed our process up
+
+02:11.431 --> 02:13.379
+by providing things like
+
+02:13.379 --> 02:15.500
+magit, epkg, auto-compile, etc.
+
+02:15.500 --> 02:20.430
+We will soon be using epkg and magit.
+
+02:20.430 --> 02:22.642
+The docs cover how to start
+
+02:22.642 --> 02:23.477
+without a seed,
+
+02:23.477 --> 02:25.779
+but for the purposes of a short demo,
+
+02:25.779 --> 02:27.770
+seeds are better.
+
+02:27.770 --> 02:28.682
+I started with a seed
+
+02:28.682 --> 02:30.083
+for my own dot emacs.
+
+02:30.083 --> 02:32.890
+It is fairly slim.
+
+02:32.890 --> 02:33.854
+As you can see,
+
+02:33.854 --> 02:35.088
+borg uses git URLs
+
+02:35.088 --> 02:37.290
+and /not/ HTTPS URLs.
+
+02:37.290 --> 02:38.992
+Make sure you have your ssh keys
+
+02:38.992 --> 02:43.989
+set up on GitHub, GitLab, etc.
+
+02:43.989 --> 02:45.899
+Bootstrapping is like cloning a dot emacs,
+
+02:45.899 --> 02:47.310
+but it only comes with a
+
+02:47.310 --> 02:51.400
+useful dot git submodules file.
+
+02:51.400 --> 02:54.841
+We get a Makefile that has targets
+
+02:54.841 --> 02:57.739
+like help and bootstrap-borg.
+
+02:57.739 --> 02:59.880
+There will be more targets
+
+02:59.880 --> 03:02.115
+after we finish the bootstrapping process.
+
+03:30.110 --> 03:35.582
+Then, we need to clone all the git modules,
+
+03:35.582 --> 03:38.310
+which is also done by a make target.
+
+03:38.310 --> 03:40.754
+This time, it will not just pull
+
+03:40.754 --> 03:42.656
+the git submodules,
+
+03:42.656 --> 03:44.658
+but will also run various things
+
+03:44.658 --> 03:45.826
+like auto-compilation,
+
+03:45.826 --> 03:48.030
+Info doc installation, etc.
+
+03:48.030 --> 04:08.680
+Good thing we installed texinfo earlier!
+
+04:08.282 --> 04:10.884
+Now that we have borg bootstrapped,
+
+04:10.884 --> 04:14.520
+let’s see how to “assimilate” a drone.
+
+04:14.520 --> 04:17.090
+Well, that’s just a borg way of saying
+
+04:17.090 --> 04:19.900
+how to install a new package.
+
+04:19.900 --> 04:22.910
+We get to work from inside Emacs now.
+
+04:22.910 --> 04:26.366
+Borg has excellent info docs,
+
+04:26.366 --> 04:28.450
+should you ever be having questions.
+
+04:28.450 --> 04:32.240
+I earlier talked about using a seed.
+
+04:32.240 --> 04:34.830
+Borg docs go into details of what that means.
+
+04:34.830 --> 04:40.190
+I encourage you to read the docs.
+
+04:40.190 --> 04:51.500
+Let’s try to install lsp-mode.
+
+04:51.500 --> 04:52.459
+Examining lsp-mode
+
+04:52.459 --> 04:54.694
+with epkg’s helper function,
+
+04:54.694 --> 04:57.280
+we can see details of the package,
+
+04:57.280 --> 05:00.200
+dependencies required, and so on.
+
+05:00.200 --> 05:02.470
+epkg uses sqlite database.
+
+05:02.470 --> 05:04.871
+Now you know why I installed sqlite
+
+05:04.871 --> 05:12.350
+in the OS preparation step!
+
+05:20.820 --> 05:22.622
+Well, lsp-mode has
+
+05:22.622 --> 05:24.057
+way too many dependencies
+
+05:24.057 --> 05:25.830
+for this demo.
+
+05:25.830 --> 05:28.795
+Note how one is naturally led
+
+05:28.795 --> 05:32.332
+to take a peek at the innards of the packages
+
+05:32.332 --> 05:34.780
+in this simple workflow.
+
+05:34.780 --> 05:37.270
+As I said, it is about being mindful!
+
+05:37.270 --> 05:39.573
+Okay, instead of lsp-mode,
+
+05:39.573 --> 05:41.308
+let’s take a look at
+
+05:41.308 --> 05:45.400
+Prot’s excellent modus-themes.
+
+05:45.400 --> 05:47.247
+No extra dependencies needed.
+
+05:47.247 --> 05:49.870
+That is perfect!
+
+05:49.870 --> 05:52.018
+The themes have great docs
+
+05:52.018 --> 05:53.620
+and our philosopher friend
+
+05:53.620 --> 05:56.000
+is good at writing.
+
+05:56.000 --> 06:02.930
+Alright, first, we clone the package.
+
+06:02.930 --> 06:04.664
+This allows us to inspect the code,
+
+06:04.664 --> 06:06.330
+should we want to.
+
+06:06.330 --> 06:23.000
+Well, you /should/.
+
+06:23.000 --> 06:25.552
+Upon inspecting the code,
+
+06:25.552 --> 06:30.620
+we ask borg to assimilate the package.
+
+06:30.620 --> 06:33.927
+This will load the code in our Emacs
+
+06:33.927 --> 06:37.270
+and make the package available for use.
+
+06:39.799 --> 06:42.135
+Wait, I was praising all the docs,
+
+06:42.135 --> 06:43.690
+but where are they?
+
+06:43.690 --> 06:44.571
+To install the docs,
+
+06:44.571 --> 06:46.273
+we need to instruct borg
+
+06:46.273 --> 06:48.020
+about where to find them.
+
+06:48.020 --> 06:51.978
+To do this, we edit the gitmodules file
+
+06:51.978 --> 06:53.910
+and add the details.
+
+06:53.910 --> 06:58.310
+There they are!
+
+06:58.310 --> 07:04.170
+We have our docs!
+
+07:04.170 --> 07:09.940
+Alright, we have assimilated a package.
+
+07:09.940 --> 07:11.398
+After sufficient testing,
+
+07:11.398 --> 07:14.234
+we can commit it as a part of our own dot emacs,
+
+07:14.234 --> 07:19.272
+which is a drone of our borg collective.
+
+07:19.272 --> 07:21.741
+Since all the packages are git submodules,
+
+07:21.741 --> 07:23.810
+we get to use magit
+
+07:23.810 --> 07:25.245
+(all hail magit!)
+
+07:25.245 --> 07:27.514
+and borg’s helper functions
+
+07:27.514 --> 07:29.530
+to commit the code.
+
+07:29.530 --> 07:31.818
+Now create your own dot el file
+
+07:31.818 --> 07:38.758
+and hack away!
+
+07:38.758 --> 07:39.793
+So that is it.
+
+00:07:39.793 --> 00:07:41.661
+I hope you enjoyed the talk
+
+07:41.661 --> 07:45.131
+and I will be hanging out in IRC
+
+07:45.131 --> 07:46.666
+if you have any questions.
+
+07:46.666 --> 07:48.330
+Thank you, and bye.
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
new file mode 100644
index 00000000..07556c0c
--- /dev/null
+++ b/2021/captions/emacsconf-2021-clede--clede-the-common-lisp-emacs-development-environment--fermin-mf--main.vtt
@@ -0,0 +1,1246 @@
+WEBVTT
+
+00:00:01.040 --> 00:00:04.367
+Welcome, everyone, to this Emacs Conf 2021.
+
+00:00:04.467 --> 00:00:07.617
+My name is Fermin. I work as
+
+00:00:07.617 --> 00:00:09.717
+a Common Lisp engineer at RavenPack,
+
+00:00:09.817 --> 00:00:11.733
+and today I'm going to talk about
+
+00:00:11.833 --> 00:00:15.783
+CLEDE: the Common Lisp Emacs Development Environment.
+
+00:00:15.883 --> 00:00:19.400
+So what is CLEDE?
+
+00:00:19.500 --> 00:00:20.500
+So CLEDE is a project
+
+00:00:20.500 --> 00:00:22.017
+I've been working on this year
+
+00:00:22.117 --> 00:00:24.650
+for better... well, yeah...
+
+00:00:24.750 --> 00:00:27.117
+a better Common Lisp integration
+
+00:00:27.217 --> 00:00:30.317
+for static tools and
+
+00:00:30.417 --> 00:00:33.250
+for static and integrated Emacs tools.
+
+00:00:33.350 --> 00:00:35.367
+And to understand better what
+
+00:00:35.467 --> 00:00:37.650
+CLEDE is, one first has to understand
+
+00:00:37.750 --> 00:00:40.133
+the base that I use...
+
+00:00:40.233 --> 00:00:43.767
+so the foundation that I use for CLEDE.
+
+00:00:43.867 --> 00:00:46.050
+Um, so it is CEDET--
+
+00:00:46.150 --> 00:00:47.417
+and specifically Semantic--
+
+00:00:47.517 --> 00:00:49.733
+so we first have to talk about and
+
+00:00:49.833 --> 00:00:50.417
+understand what it is.
+
+00:00:50.517 --> 00:00:53.817
+So CEDET is a collection
+
+00:00:53.917 --> 00:00:55.183
+of Emacs development environment tools.
+
+00:00:55.283 --> 00:00:57.233
+It was created by Eric Ludlam
+
+00:00:57.333 --> 00:01:00.767
+(I hope to say that name right)
+
+00:01:00.867 --> 00:01:02.333
+in the late 90s, and
+
+00:01:02.433 --> 00:01:04.833
+the idea was to create entire IDE for Emacs.
+
+00:01:04.933 --> 00:01:10.433
+CEDET is still integrated into Emacs,
+
+00:01:10.533 --> 00:01:11.717
+and it has a lot of interesting things
+
+00:01:11.817 --> 00:01:14.033
+that are not used for too many people,
+
+00:01:14.133 --> 00:01:16.167
+so I'm going to explain some of those.
+
+00:01:16.267 --> 00:01:18.417
+First, let's go with the good ones that
+
+00:01:18.517 --> 00:01:21.233
+one that I use for CLEDE and that can
+
+00:01:21.333 --> 00:01:23.167
+be used for other projects as well.
+
+00:01:23.267 --> 00:01:28.450
+Some of the features that
+
+00:01:28.550 --> 00:01:32.450
+CEDET has is parse generators
+
+00:01:32.550 --> 00:01:35.217
+so we have Wisent and Bovine.
+
+00:01:35.317 --> 00:01:38.350
+Wisent is basically a Bison clone
+
+00:01:38.450 --> 00:01:40.200
+that was written in Emacs Lisp
+
+00:01:40.300 --> 00:01:43.117
+that you can also specify grammars.
+
+00:01:43.217 --> 00:01:45.617
+It's a really big and rather complex
+
+00:01:45.717 --> 00:01:47.350
+tool to work with,
+
+00:01:47.450 --> 00:01:49.183
+and it's secretly used for, as far as
+
+00:01:49.283 --> 00:01:51.667
+I know, two languages.
+
+00:01:51.767 --> 00:01:53.317
+They're not also well supported,
+
+00:01:53.417 --> 00:01:55.317
+but we'll get into that later.
+
+00:01:55.417 --> 00:01:58.133
+Also Bovine, which is a way more
+
+00:01:58.233 --> 00:01:59.867
+simple tool, like you can...
+
+00:01:59.967 --> 00:02:01.733
+you don't need grammar files,
+
+00:02:01.833 --> 00:02:07.350
+you can write just in plain Emacs Lisp.
+
+00:02:07.450 --> 00:02:10.917
+And you also have utilities to work with
+
+00:02:11.017 --> 00:02:16.550
+those generated tag trees, so to say.
+
+00:02:16.650 --> 00:02:23.533
+These are not AST parsers like real Bison;
+
+00:02:23.633 --> 00:02:25.617
+they are tag-based so they basically get
+
+00:02:25.717 --> 00:02:27.533
+tags and extract information from them,
+
+00:02:27.633 --> 00:02:30.083
+and I can use that information
+
+00:02:30.183 --> 00:02:31.000
+with Emacs Lisp
+
+00:02:31.000 --> 00:02:33.567
+to contextually understand better
+
+00:02:33.667 --> 00:02:36.267
+the language that you're parsing,
+
+00:02:36.367 --> 00:02:37.083
+but in general,
+
+00:02:37.183 --> 00:02:40.083
+this decision was made (as far as I know)
+
+00:02:40.183 --> 00:02:43.217
+because of the Emacs Lisp
+
+00:02:43.317 --> 00:02:44.217
+limitation of the time.
+
+00:02:44.317 --> 00:02:50.233
+So Emacs was a rather
+
+00:02:50.333 --> 00:02:52.167
+slower Lisp-- slow Lisp--
+
+00:02:52.267 --> 00:02:55.850
+so they decide to just use
+
+00:02:55.950 --> 00:02:58.750
+tag-based thing instead of a parse--
+
+00:02:58.850 --> 00:03:02.333
+I mean-- an AST-based one.
+
+00:03:02.433 --> 00:03:05.167
+And Semantic give you some utility with
+
+00:03:05.267 --> 00:03:06.250
+that as Senator, for example, give you
+
+00:03:06.350 --> 00:03:07.667
+some semantic navigation.
+
+00:03:07.767 --> 00:03:09.750
+So CEDET is way more than this,
+
+00:03:09.850 --> 00:03:12.433
+but this is not a CEDET talk.
+
+00:03:12.533 --> 00:03:13.983
+So if you want to get more information,
+
+00:03:14.083 --> 00:03:16.350
+you can go to the official webpage.
+
+00:03:16.450 --> 00:03:19.933
+I have to say that it is outdated, and
+
+00:03:20.033 --> 00:03:22.933
+Emacs changed some things over the years
+
+00:03:23.033 --> 00:03:24.067
+because CEDET was merged into Emacs
+
+00:03:24.167 --> 00:03:27.767
+in 2011, as far as I know.
+
+00:03:27.867 --> 00:03:30.417
+You can also go to the official Emacs
+
+00:03:30.517 --> 00:03:32.883
+documentation (the manual), which will get
+
+00:03:32.983 --> 00:03:35.317
+more information about every tool,
+
+00:03:35.417 --> 00:03:38.317
+but it's a really interesting thing, and
+
+00:03:38.417 --> 00:03:40.883
+I'm really sad that it is forgotten.
+
+00:03:40.983 --> 00:03:43.233
+So let's go with the bad things:
+
+00:03:43.333 --> 00:03:46.483
+that CEDET is an abandoned project.
+
+00:03:46.583 --> 00:03:48.217
+This has some benefits like it's not
+
+00:03:48.317 --> 00:03:50.550
+going to change that much,
+
+00:03:50.650 --> 00:03:52.367
+but it's, of course, not ideal.
+
+00:03:52.467 --> 00:03:56.833
+Most of the tooling that CEDET
+
+00:03:56.933 --> 00:03:58.100
+have right now are surpassed
+
+00:03:58.200 --> 00:03:59.633
+by other packages.
+
+00:03:59.733 --> 00:04:02.650
+And at first, I know Eric was working
+
+00:04:02.750 --> 00:04:07.467
+with C at the time so he totally has
+
+00:04:07.567 --> 00:04:10.533
+"real support" so you can use CEDET
+
+00:04:10.633 --> 00:04:13.033
+for other languages, but
+
+00:04:13.133 --> 00:04:15.383
+to work really like an IDE, more or less,
+
+00:04:15.483 --> 00:04:17.017
+it's all the...
+
+00:04:17.117 --> 00:04:19.517
+C is the only language supported,
+
+00:04:19.617 --> 00:04:21.667
+and maybe some simple C++, but that's it.
+
+00:04:21.767 --> 00:04:24.017
+It needs more documentation.
+
+00:04:24.117 --> 00:04:25.683
+People really don't know how to use it
+
+00:04:25.783 --> 00:04:28.583
+because, I have to say, rather complex
+
+00:04:28.683 --> 00:04:30.067
+to get a project working with it,
+
+00:04:30.167 --> 00:04:33.717
+and then make use of Semantic
+
+00:04:33.817 --> 00:04:36.667
+because [it] needs some maintenance and
+
+00:04:36.767 --> 00:04:38.567
+to update the code.
+
+00:04:38.667 --> 00:04:41.083
+But I will argue that even with these
+
+00:04:41.183 --> 00:04:44.383
+deficiencies, it's usable, and
+
+00:04:44.483 --> 00:04:47.517
+I use the foundation of base for
+
+00:04:47.617 --> 00:04:49.533
+parse infrastructure for other languages.
+
+00:04:49.633 --> 00:04:52.367
+I will say that with Common Lisp was
+
+00:04:52.467 --> 00:04:53.983
+rather easy because
+
+00:04:54.083 --> 00:04:56.033
+CEDET already have Emacs Lisp parser
+
+00:04:56.133 --> 00:04:57.900
+even though it's not great.
+
+00:04:58.000 --> 00:05:00.483
+It's easy to adapt and to use.
+
+00:05:00.583 --> 00:05:04.000
+It's not used in an Emacs
+
+00:05:04.100 --> 00:05:05.433
+right now because, well,
+
+00:05:05.533 --> 00:05:08.883
+Emacs know very well itself,
+
+00:05:08.983 --> 00:05:11.600
+but it's there.
+
+00:05:11.700 --> 00:05:17.583
+So these, of course, are static parsers
+
+00:05:17.683 --> 00:05:19.517
+so you don't need to run any
+
+00:05:19.617 --> 00:05:21.883
+other language-specific tools, which is
+
+00:05:21.983 --> 00:05:24.400
+an advantage for some things.
+
+00:05:24.500 --> 00:05:27.133
+And this was basically CEDET is,
+
+00:05:27.233 --> 00:05:30.283
+and I use the parse infrastructure
+
+00:05:30.383 --> 00:05:31.333
+and some tools
+
+00:05:31.433 --> 00:05:34.333
+to create a parser for Common Lisp.
+
+00:05:34.433 --> 00:05:36.700
+Well, more or less. *laughs*
+
+00:05:36.800 --> 00:05:37.900
+Let's go to details.
+
+00:05:38.000 --> 00:05:39.850
+So I will say that it's not a parser
+
+00:05:39.950 --> 00:05:42.433
+by itself because, as we all know,
+
+00:05:42.533 --> 00:05:44.500
+to parse a macro-based language
+
+00:05:44.600 --> 00:05:46.833
+is really hard.
+
+00:05:46.933 --> 00:05:48.450
+Mostly if you cannot have contextual
+
+00:05:48.550 --> 00:05:52.800
+information because if you create code
+
+00:05:52.900 --> 00:05:56.033
+at compile time or runtime is really hard
+
+00:05:56.133 --> 00:05:59.233
+if you don't have run time, right?
+
+00:05:59.333 --> 00:06:00.950
+Basically, CLEDE can be described
+
+00:06:01.050 --> 00:06:02.600
+as a Semantic extension.
+
+00:06:02.700 --> 00:06:03.867
+So basically it's like,
+
+00:06:03.967 --> 00:06:07.133
+you can have Semantic
+
+00:06:07.233 --> 00:06:09.817
+and use it with Common Lisp code
+
+00:06:09.917 --> 00:06:11.600
+and some Common Lisp Emacs tools.
+
+00:06:11.700 --> 00:06:17.350
+So Bison (which is not Bison) is
+
+00:06:17.450 --> 00:06:21.650
+Bovine, and Semantic and Senator
+
+00:06:21.750 --> 00:06:24.750
+for navigating tags,
+
+00:06:24.850 --> 00:06:26.367
+and then communication with SLIME, SLY,
+
+00:06:26.467 --> 00:06:28.733
+and inferior Lisp.
+
+00:06:28.833 --> 00:06:30.450
+That means... I will show that later, but
+
+00:06:30.550 --> 00:06:32.800
+basically, you can parse the buffer,
+
+00:06:32.900 --> 00:06:34.167
+get some tags,
+
+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--chapters.vtt b/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--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--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-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-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt b/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt
new file mode 100644
index 00000000..f6f39af7
--- /dev/null
+++ b/2021/captions/emacsconf-2021-cs--one-effective-cs-grad-student-workflow--greg-coladonato--main.vtt
@@ -0,0 +1,775 @@
+WEBVTT
+
+00:00.000 --> 00:00:01.520
+My name is Greg Coladonato,
+
+00:00:01.520 --> 00:00:03.199
+and this is my presentation named
+
+00:00:03.199 --> 00:00:04.560
+One Effective Computer Science
+
+00:00:04.560 --> 00:00:06.480
+Grad Student Workflow.
+
+00:06.480 --> 00:00:07.680
+For self-introduction,
+
+00:00:07.680 --> 00:00:09.599
+I've been an Emacs user since 1989
+
+00:00:09.599 --> 00:00:11.599
+when I was an undergrad in computer science,
+
+00:00:11.599 --> 00:00:13.040
+and I'm still an Emacs user
+
+00:00:13.040 --> 00:00:15.280
+now I'm getting a master's of science
+
+00:00:15.280 --> 00:00:16.880
+in computer science.
+
+00:16.880 --> 00:00:17.760
+In my day job,
+
+00:00:17.760 --> 00:00:19.199
+I work in product management
+
+00:00:19.199 --> 00:00:20.640
+in a Silicon Valley
+
+00:00:20.640 --> 00:00:21.840
+computer vision startup,
+
+00:00:21.840 --> 00:00:22.880
+and I'm proud to say
+
+00:00:22.880 --> 00:00:25.039
+I've been submitting my first PRs
+
+00:00:25.039 --> 00:00:27.038
+to open source projects this year.
+
+00:27.039 --> 00:00:29.199
+The goals of my workflow are first
+
+00:00:29.199 --> 00:00:30.800
+to make my notes easily accessible
+
+00:00:30.800 --> 00:00:33.280
+and searchable.
+
+00:33.280 --> 00:00:34.800
+Second goal, provide a way for me
+
+00:00:34.800 --> 00:00:36.480
+to permanently remember what I learned,
+
+00:00:36.480 --> 00:00:38.879
+and thirdly, to enable conceptual linking
+
+00:38.879 --> 00:00:40.480
+between related topics and entities.
+
+00:00:40.480 --> 00:00:41.920
+I'll give examples of each of these
+
+00:00:41.920 --> 00:00:43.119
+as we go along.
+
+00:00:43.120 --> 00:00:45.120
+The requirements of my workflow:
+
+00:45.120 --> 00:00:47.920
+it needs to be tightly integrated with PDFs,
+
+00:00:47.920 --> 00:00:50.399
+as most of the documents I get from grad school
+
+00:00:50.399 --> 00:00:51.440
+are in PDF form,
+
+00:00:51.440 --> 00:00:53.760
+most of my submissions of work
+
+00:00:53.760 --> 00:00:54.719
+are in PDF form,
+
+00:00:54.719 --> 00:00:56.640
+and most research papers I have access to
+
+00:00:56.640 --> 00:00:58.399
+are in PDF form as well.
+
+00:58.399 --> 00:01:00.320
+I want my workflow to be subscription-free.
+
+00:01:00.320 --> 00:01:01.840
+I do not want to be locked into
+
+01:01.840 --> 00:01:03.120
+paying a subscription
+
+00:01:03.120 --> 00:01:04.799
+just to read my own notes.
+
+00:01:04.799 --> 00:01:06.720
+It must be future proof.
+
+00:01:06.720 --> 00:01:09.600
+I have used note-taking systems in the past
+
+01:09.600 --> 00:01:12.960
+that I now no longer have a way to decode,
+
+00:01:12.960 --> 00:01:14.640
+so they're locked into some format
+
+00:01:14.640 --> 00:01:17.200
+that I can no longer use.
+
+01:17.200 --> 00:01:19.119
+I want my notes to be version-controlled,
+
+01:19.119 --> 00:01:20.479
+so that if I make a big mistake,
+
+00:01:20.479 --> 00:01:22.080
+I can undo and revert
+
+00:01:22.080 --> 00:01:23.840
+to a prior good version,
+
+01:23.840 --> 00:01:27.680
+and I want my system to use spaced repetition,
+
+00:01:27.680 --> 00:01:29.520
+which is an advanced method
+
+00:01:29.520 --> 00:01:31.840
+of learning things over time
+
+00:01:31.840 --> 00:01:33.999
+so that you don't forget them.
+
+01:34.000 --> 00:01:36.799
+The package dependencies, in brief.
+
+00:01:36.799 --> 00:01:38.960
+org-mode, org-roam, org-roam-bibtex,
+
+00:01:38.960 --> 00:01:42.719
+pdf-tools, org-noter and org-ref.
+
+01:42.720 --> 00:01:45.119
+And now let's get on to some demos.
+
+01:45.119 --> 00:01:47.520
+Here in my browser window here
+
+00:01:47.520 --> 00:01:49.680
+is a lecture in the course
+
+00:01:49.680 --> 00:01:51.840
+I'm currently taking on deep learning.
+
+01:51.840 --> 00:01:54.240
+It's very nice that the professor
+
+01:54.240 --> 00:01:55.759
+provides slides. So this is
+
+00:01:55.759 --> 00:02:00.000
+the 54-page PDF file of the slides
+
+00:02:00.000 --> 00:02:02.079
+for the lecture. The problem is,
+
+00:02:02.079 --> 00:02:03.200
+it's hard to take notes on them.
+
+00:02:03.200 --> 00:02:04.560
+It's impossible to take notes on them
+
+00:02:04.560 --> 00:02:05.840
+here in this browser,
+
+00:02:05.840 --> 00:02:07.840
+as far as I know. So what I've done is
+
+00:02:07.840 --> 00:02:11.440
+I've incorporated these slides as a PDF
+
+02:11.440 --> 00:02:12.959
+in org-roam, which...
+
+00:02:12.959 --> 00:02:16.640
+I will now visit this file
+
+00:02:16.640 --> 00:02:19.120
+and you can bring it up alongside the PDF
+
+00:02:19.120 --> 00:02:20.560
+I was just looking at here.
+
+00:02:20.560 --> 00:02:23.200
+So what i like about this system is,
+
+02:23.200 --> 00:02:24.800
+as I'm going through and reading
+
+02:24.800 --> 00:02:26.720
+watching the video of the lecture,
+
+00:02:26.720 --> 00:02:29.599
+I'm following along in the PDF notes here,
+
+02:29.599 --> 00:02:31.680
+and I'm taking my notes alongside them.
+
+02:31.680 --> 00:02:34.400
+So here's the first part of that lecture.
+
+02:34.400 --> 00:02:36.319
+You can't see at the bottom right now,
+
+00:02:36.319 --> 00:02:38.800
+but this is one of the earlier pages.
+
+00:02:38.800 --> 00:02:42.400
+I go to the second section here
+
+00:02:42.400 --> 00:02:45.040
+and you see that my notes
+
+00:02:45.040 --> 00:02:46.640
+for this part of the lecture,
+
+02:46.640 --> 00:02:48.480
+here, my notes here...
+
+00:02:48.480 --> 00:02:49.599
+I love how the notes
+
+00:02:49.599 --> 00:02:50.959
+for different parts of the lecture
+
+00:02:50.959 --> 00:02:52.560
+are coordinated with the different parts
+
+02:52.560 --> 00:02:55.200
+of the PDF that go along with the lecture.
+
+02:55.200 --> 00:02:57.519
+Now let's go back to the top of this
+
+02:57.519 --> 00:03:01.840
+and you'll see... First, you'll see my notes
+
+03:01.840 --> 00:03:03.920
+down here. I'll go into these
+
+00:03:03.920 --> 00:03:06.319
+a little bit more shortly,
+
+00:03:06.319 --> 00:03:07.200
+but one of the things
+
+00:03:07.200 --> 00:03:08.959
+that goes along with a lecture
+
+00:03:08.959 --> 00:03:11.519
+in a grad school class is these days
+
+00:03:11.519 --> 00:03:13.680
+in computer science citations
+
+00:03:13.680 --> 00:03:14.640
+for research papers
+
+00:03:14.640 --> 00:03:16.480
+that were expected to read.
+
+03:16.480 --> 00:03:20.080
+So here's one entitled MixMatch.
+
+03:20.080 --> 00:03:22.319
+I haven't downloaded this paper yet,
+
+03:22.319 --> 00:03:24.238
+so let's go. Take a look at that.
+
+00:03:24.239 --> 00:03:26.319
+So I use a keystroke to select
+
+00:03:26.319 --> 00:03:28.480
+the title of the paper
+
+00:03:28.480 --> 00:03:30.239
+and another keybinding
+
+00:03:30.239 --> 00:03:31.440
+to search for that paper
+
+00:03:31.440 --> 00:03:33.519
+on a website called arXiv.
+
+03:33.519 --> 00:03:35.280
+arXiv, if you're not familiar--
+
+00:03:35.280 --> 00:03:36.400
+and here's a match--
+
+00:03:36.400 --> 00:03:37.680
+arXiv, if you're not familiar,
+
+00:03:37.680 --> 00:03:42.000
+is an open research server
+
+03:42.000 --> 00:03:43.760
+where researchers publish papers
+
+00:03:43.760 --> 00:03:45.040
+before they're published in journals
+
+00:03:45.040 --> 00:03:47.920
+or conferences, and they are copyright-free
+
+03:47.920 --> 00:03:50.159
+and open to anyone to read.
+
+00:03:50.159 --> 00:03:52.799
+So here is the paper I was looking for.
+
+03:52.799 --> 00:03:58.560
+I copy this link into an Org mode link,
+
+00:03:58.560 --> 00:03:59.840
+and I come back to Emacs,
+
+00:03:59.840 --> 00:04:02.400
+and now another keystroke
+
+04:02.400 --> 00:04:04.879
+will revisit that website,
+
+00:04:04.879 --> 00:04:06.400
+pull down the PDF, and pull down
+
+00:04:06.400 --> 00:04:08.400
+all the information in the bibliography
+
+00:04:08.400 --> 00:04:11.040
+and put it into a bibliography here,
+
+04:11.040 --> 00:04:13.599
+inside my local bibliography.
+
+00:04:13.599 --> 00:04:15.840
+So here's the paper I was just looking at.
+
+04:15.840 --> 00:04:17.840
+Another great thing about a lot of PDFs
+
+04:17.840 --> 00:04:20.320
+is that they have an embedded outline
+
+00:04:20.320 --> 00:04:24.160
+that you can extract via the pdf-tools package.
+
+04:24.160 --> 00:04:25.680
+So now you see on the right here:
+
+04:25.680 --> 00:04:27.360
+introduction, related work, MixMatch,
+
+04:27.360 --> 00:04:30.479
+experiments. I can go right to that section,
+
+04:30.479 --> 00:04:32.639
+and this outline knows exactly
+
+00:04:32.639 --> 00:04:33.759
+which part of the PDF
+
+00:04:33.759 --> 00:04:35.919
+corresponds to each of the parts
+
+00:04:35.919 --> 00:04:37.680
+of this outline in the paper.
+
+04:37.680 --> 00:04:40.240
+So then, when I go take notes in here,
+
+04:40.240 --> 00:04:41.280
+just like in my other notes,
+
+00:04:41.280 --> 00:04:43.040
+it'll be coordinated with the PDF
+
+00:04:43.040 --> 00:04:44.639
+that goes along with it.
+
+04:44.639 --> 00:04:48.080
+So let's quit out of here.
+
+00:04:48.080 --> 00:04:50.160
+So now that I've captured that...
+
+00:04:50.160 --> 00:04:53.199
+Uh oh, this is the same paper.
+
+04:53.199 --> 00:04:56.000
+So now here I am back in my notes.
+
+00:04:56.000 --> 00:04:58.000
+now that I've captured this paper.
+
+04:58.000 --> 00:05:02.400
+What I'm going to do is make it a link,
+
+05:02.400 --> 00:05:07.520
+so the org-roam node that I just took
+
+00:05:07.520 --> 00:05:09.600
+will be here at the top. MixMatch.
+
+05:09.600 --> 00:05:10.639
+There's a little difference.
+
+00:05:10.639 --> 00:05:13.120
+You'll see here, this m is a different case
+
+00:05:13.120 --> 00:05:16.240
+than this m, and that's one of my to-do list.
+
+00:05:16.240 --> 00:05:18.720
+I'd like to make it so that this search
+
+00:05:18.720 --> 00:05:20.320
+is a little less case-sensitive.
+
+00:05:20.320 --> 00:05:23.520
+So now I've linked this link to this paper
+
+00:05:23.520 --> 00:05:25.680
+into these notes, and now these are...
+
+00:05:25.680 --> 00:05:26.639
+you'll see a little bit later
+
+00:05:26.639 --> 00:05:29.360
+how these links can be graphed and followed
+
+00:05:29.360 --> 00:05:32.960
+and so forth. While I'm in this document,
+
+00:05:32.960 --> 00:05:33.680
+I'd like to show you
+
+00:05:33.680 --> 00:05:36.639
+that when I'm learning something
+
+05:36.639 --> 00:05:38.400
+and I learn a new fact,
+
+05:38.400 --> 00:05:40.320
+I write down what I learned
+
+00:05:40.320 --> 00:05:42.400
+in the form of a question and an answer.
+
+00:05:42.400 --> 00:05:45.039
+So you can see here, there's a question
+
+00:05:45.039 --> 00:05:46.800
+that begins with who, what, where.
+
+00:05:46.800 --> 00:05:49.360
+It begins with a w word, or how,
+
+05:49.360 --> 00:05:53.039
+or if or is, and it ends in a question mark,
+
+00:05:53.039 --> 00:05:54.960
+and then following that is another string
+
+00:05:54.960 --> 00:05:56.560
+that ends in a period.
+
+05:56.560 --> 00:05:58.240
+So I have a... I'd like to do this
+
+00:05:58.240 --> 00:05:59.280
+in Emacs as well, but I haven't
+
+00:05:59.280 --> 00:06:00.319
+worked that out yet.
+
+00:06:00.319 --> 00:06:04.639
+I have a script that will...
+
+06:04.639 --> 00:06:07.680
+Let's find a-n-k-i-f.
+
+06:07.680 --> 00:06:09.680
+Okay, I have a script that will go through
+
+00:06:09.680 --> 00:06:13.680
+all the notes in my org-roam directory
+
+06:13.680 --> 00:06:16.880
+and find all the questions.
+
+00:06:16.880 --> 00:06:20.720
+Now let's pull up the most...
+
+00:06:20.720 --> 00:06:24.319
+No, don't edit the buffer.
+
+06:24.319 --> 00:06:29.039
+Save that. Come back to here.
+
+06:29.039 --> 00:06:31.680
+So now you can see that all the questions
+
+00:06:31.680 --> 00:06:32.560
+that I've written in my notes
+
+06:32.560 --> 00:06:33.759
+have now been ANKIFIED.
+
+00:06:33.759 --> 00:06:34.880
+Now what's that mean?
+
+00:06:34.880 --> 00:06:40.960
+Anki is this program here
+
+06:40.960 --> 00:06:43.199
+which is a flashcard system
+
+00:06:43.199 --> 00:06:44.560
+based on the idea...
+
+00:06:44.560 --> 00:06:48.000
+No, let's not download that right now.
+
+00:06:48.000 --> 00:06:50.720
+This is a system that enables
+
+00:06:50.720 --> 00:06:53.120
+the easy creation of flash cards
+
+06:53.120 --> 00:06:54.479
+that show you the front,
+
+00:06:54.479 --> 00:06:55.360
+show you the back,
+
+00:06:55.360 --> 00:06:56.160
+and then you decide
+
+00:06:56.160 --> 00:07:00.000
+if you knew that question or not.
+
+07:00.000 --> 00:07:02.639
+So I don't want to spend much time on this,
+
+00:07:02.639 --> 00:07:04.639
+but everything I'm learning in a class,
+
+00:07:04.639 --> 00:07:06.800
+I write into my notes as a question
+
+00:07:06.800 --> 00:07:08.800
+that I load into this flashcard system
+
+00:07:08.800 --> 00:07:10.880
+that then I can review on a walk,
+
+00:07:10.880 --> 00:07:13.680
+or on a bus ride, or whatever,
+
+07:13.680 --> 00:07:16.400
+and stay on top of indefinitely.
+
+00:07:16.400 --> 00:07:17.440
+As long as I can continue
+
+07:17.440 --> 00:07:18.400
+to keep reviewing that,
+
+00:07:18.400 --> 00:07:20.639
+I will keep that information
+
+00:07:20.639 --> 00:07:22.319
+fresh in my mind.
+
+07:22.319 --> 00:07:24.479
+So now let's come out of these files
+
+07:24.479 --> 00:07:25.039
+back to here.
+
+00:07:25.039 --> 00:07:27.440
+So I've demoed class note PDFs,
+
+00:07:27.440 --> 00:07:29.440
+grabbing papers from arXiv,
+
+07:29.440 --> 00:07:31.199
+autogenerating the skeletons
+
+00:07:31.199 --> 00:07:32.720
+and the flashcards,
+
+00:07:32.720 --> 00:07:35.280
+and now let's see what it looks like.
+
+07:35.280 --> 00:07:40.160
+Let's visualize the connections
+
+07:40.160 --> 00:07:42.000
+between these nodes.
+
+07:42.000 --> 00:07:45.199
+So here is a graph for the file
+
+00:07:45.199 --> 00:07:46.319
+I'm reading right now:
+
+00:07:46.319 --> 00:07:49.520
+One Effective Grad Student Workflow.
+
+07:49.520 --> 00:07:53.599
+Here is the node I have a link to
+
+00:07:53.599 --> 00:07:54.639
+in my Org mode document
+
+07:54.639 --> 00:07:57.199
+on spaced repetition. We can open that
+
+00:07:57.199 --> 00:07:59.280
+and come right back to Emacs,
+
+07:59.280 --> 00:08:01.680
+and I just love that.
+
+08:01.680 --> 00:08:03.919
+For the more complicated topics,
+
+00:08:03.919 --> 00:08:05.520
+you can see connections between things
+
+00:08:05.520 --> 00:08:07.520
+that you maybe didn't realize you had,
+
+00:08:07.520 --> 00:08:10.240
+and some of the notes you've taken.
+
+00:08:10.240 --> 00:08:12.638
+And so I'm getting near the end.
+
+00:08:12.639 --> 00:08:15.120
+I just want to show some small customizations.
+
+08:15.120 --> 00:08:17.120
+I save my org mode files
+
+00:08:17.120 --> 00:08:18.479
+that are in org-roam
+
+00:08:18.479 --> 00:08:21.520
+with a year year month month date prefix,
+
+00:08:21.520 --> 00:08:24.639
+so that I can tell when the node was created
+
+00:08:24.639 --> 00:08:26.560
+I also truncate them at 30 characters,
+
+00:08:26.560 --> 00:08:27.919
+so that when I do an ls,
+
+00:08:27.919 --> 00:08:29.280
+they don't word wrap.
+
+00:08:29.280 --> 00:08:32.800
+Maybe that's OCD.
+
+08:32.800 --> 00:08:38.159
+I also use an ID format that is year month
+
+00:08:38.159 --> 00:08:40.479
+day hour month hour minute second
+
+08:40.479 --> 00:08:43.279
+rather than the full UUID format
+
+00:08:43.279 --> 00:08:44.720
+because that number up there,
+
+00:08:44.720 --> 00:08:46.160
+that ID makes sense to me
+
+00:08:46.160 --> 00:08:50.160
+and it gives me an idea of when that node--
+
+08:50.160 --> 00:08:51.040
+which you can, by the way,
+
+00:08:51.040 --> 00:08:55.040
+you can have--even one of these subheadings
+
+00:08:55.040 --> 00:08:56.240
+can be a node in org-roam.
+
+00:08:56.240 --> 00:08:57.120
+So now that you can see
+
+08:57.120 --> 00:08:59.439
+that was created right now.
+
+08:59.440 --> 00:09:00.640
+Some of the TODOs I still have
+
+00:09:00.640 --> 00:09:02.720
+in this system... We don't have to go
+
+00:09:02.720 --> 00:09:04.000
+too much into them, but I mentioned
+
+00:09:04.000 --> 00:09:07.600
+case insensitivity, and I'd like
+
+00:09:07.600 --> 00:09:10.080
+to make some improvements to org-noter.
+
+00:09:10.080 --> 00:09:12.240
+At this point, I'd just like to...
+
+09:12.240 --> 00:09:14.959
+I have a list of people I'd like to thank.
+
+00:09:14.959 --> 00:09:16.240
+I'm not gonna read the whole list out,
+
+00:09:16.240 --> 00:09:17.680
+but they're a bunch of software engineers
+
+00:09:17.680 --> 00:09:20.399
+that created great free software
+
+00:09:20.399 --> 00:09:21.519
+that's very useful to me
+
+00:09:21.519 --> 00:09:23.839
+and I use every day, so thank you to them,
+
+00:09:23.839 --> 00:09:27.080
+and thank you all for listening to my talk.
+
+00:09:27.080 --> 00:09:28.080
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt b/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt
new file mode 100644
index 00000000..4f0147b2
--- /dev/null
+++ b/2021/captions/emacsconf-2021-dashboard--productivity-dashboards-with-emacs-and-kindle--mehmet-tekman--main.vtt
@@ -0,0 +1,979 @@
+WEBVTT
+
+00:00.000 --> 00:01.567
+Hi everyone! I'm Mehmet Tekman,
+
+00:01.567 --> 00:02.483
+and I'm here to talk to you
+
+00:02.483 --> 00:03.700
+about using Amazon Kindles
+
+00:03.700 --> 00:05.040
+as a productivity dashboard for
+
+00:05.040 --> 00:07.359
+your various projects.
+
+00:07.359 --> 00:09.519
+In a nutshell, you describe your machines,
+
+00:09.519 --> 00:11.317
+your commands, and your schedules
+
+00:11.317 --> 00:13.120
+in an Org-Mode file,
+
+00:13.120 --> 00:14.933
+and then you just initialize
+
+00:14.933 --> 00:16.960
+your Kindle devices.
+
+00:16.960 --> 00:18.367
+These devices are asleep
+
+00:18.367 --> 00:19.117
+most of the time,
+
+00:19.117 --> 00:20.720
+but they wake up at scheduled times
+
+00:20.720 --> 00:22.033
+to retrieve content
+
+00:22.033 --> 00:24.800
+from the centralized server.
+
+00:24.800 --> 00:27.599
+Content can be Org mode and Emacs-based,
+
+00:27.599 --> 00:29.500
+or it can be from Web content,
+
+00:29.500 --> 00:42.840
+or it can just be static images and WAV.
+
+00:42.840 --> 00:45.600
+If you, like me, struggle to
+
+00:45.600 --> 00:46.833
+keep your life under tabs,
+
+00:46.833 --> 00:48.300
+or find it very hard to separate
+
+00:48.300 --> 00:49.417
+your work life from your home life,
+
+00:49.417 --> 00:51.283
+then you, like me, likely need
+
+00:51.283 --> 00:52.917
+some kind of passive background service
+
+00:52.917 --> 00:54.083
+that reminds you of where you are
+
+00:54.083 --> 00:55.267
+and what you are supposed to be doing.
+
+00:55.267 --> 00:56.960
+Even if it's just a sign saying,
+
+00:56.960 --> 00:58.640
+"You're at home! Relax!"
+
+00:58.640 --> 01:00.400
+An Amazon Kindle is perfect for this.
+
+01:00.400 --> 01:01.717
+In a nutshell, it's a cheap
+
+01:01.717 --> 01:03.117
+black and white e-ink device
+
+01:03.117 --> 01:03.800
+that can go for weeks
+
+01:03.800 --> 01:05.033
+without needing a single charge.
+
+01:05.033 --> 01:06.767
+Every year, Amazon brings out
+
+01:06.767 --> 01:07.983
+an incrementally better model,
+
+01:07.983 --> 01:09.333
+which makes the old devices obsolete,
+
+01:09.333 --> 01:11.067
+and you can find these older models
+
+01:11.067 --> 01:13.360
+for 5 euros on second-hand websites.
+
+01:13.360 --> 01:15.360
+Plus it runs Linux, has WiFi networking,
+
+01:15.360 --> 01:16.987
+and has a dedicated forum of hackers
+
+01:16.987 --> 01:19.200
+for getting the most out of the device.
+
+01:19.200 --> 01:20.366
+Some drawbacks of this is that
+
+01:20.366 --> 01:22.799
+the device often comes with unwanted bloat:
+
+01:22.799 --> 01:24.050
+over-the-air updates,
+
+01:24.050 --> 01:25.833
+it phones home to Amazon regularly,
+
+01:25.833 --> 01:27.033
+it has a secret microphone
+
+01:27.033 --> 01:27.983
+embedded in the device,
+
+01:27.983 --> 01:29.433
+and it has a bunch of creepy
+
+01:29.433 --> 01:30.633
+seemingly interdependent
+
+01:30.633 --> 01:31.439
+background processes,
+
+01:31.439 --> 01:34.083
+where killing one kind of kills the others
+
+01:34.083 --> 01:36.560
+risking that you will break the device.
+
+01:36.560 --> 01:37.799
+But this is where the community
+
+01:37.799 --> 01:38.883
+really shines through,
+
+01:38.883 --> 01:40.483
+since the friendly (and not-so-friendly)
+
+01:40.483 --> 01:41.583
+users (and developers)
+
+01:41.583 --> 01:43.200
+from the MobileRead forums have pretty much
+
+01:43.200 --> 01:44.560
+scraped out a good portion of the
+
+01:44.560 --> 01:46.960
+harmful Amazon scripts from the device.
+
+01:46.960 --> 01:48.550
+Some of the devices even use
+
+01:48.550 --> 01:49.483
+Awesome Window Manager,
+
+01:49.483 --> 01:50.800
+meaning you can really play around
+
+01:50.800 --> 01:51.620
+with the existing system
+
+01:51.620 --> 01:52.633
+without having to create
+
+01:52.633 --> 01:54.233
+your own X11 server.
+
+01:54.233 --> 01:55.377
+This then empowers users
+
+01:55.377 --> 01:57.600
+to display whatever they want on the device.
+
+01:57.600 --> 01:59.040
+One project that really got this going
+
+01:59.040 --> 02:00.560
+was the Kindle-Dash dashboard from
+
+02:00.560 --> 02:02.320
+Pascal Widdershoven, who really refined a
+
+02:02.320 --> 02:03.483
+lot of the internal scripts
+
+02:03.483 --> 02:05.439
+to stabilize the device.
+
+02:05.439 --> 02:06.600
+However, the project then
+
+02:06.600 --> 02:07.650
+puts the onus on the device
+
+02:07.650 --> 02:08.560
+to retrieve the data from
+
+02:08.560 --> 02:09.950
+somewhere else over the internet,
+
+02:09.950 --> 02:10.753
+and so you still need to
+
+02:10.753 --> 02:11.440
+generate the content
+
+02:11.440 --> 02:13.200
+and place it on the web somewhere.
+
+02:13.200 --> 02:14.640
+Plus you need to do this and manage it
+
+02:14.640 --> 02:17.360
+for every Kindle device that you have.
+
+02:17.360 --> 02:18.500
+Kindle-Sync, however,
+
+02:18.500 --> 02:19.867
+is an entirely different beast,
+
+02:19.867 --> 02:21.800
+albeit one that builds off of the works
+
+02:21.800 --> 02:23.440
+of the aforementioned projects.
+
+02:23.440 --> 02:24.800
+It assumes that instead of just having
+
+02:24.800 --> 02:26.050
+one Kindle device around
+
+02:26.050 --> 02:27.133
+that you wish to re-purpose
+
+02:27.133 --> 02:28.080
+for productivity purposes,
+
+02:28.080 --> 02:28.983
+that you actually have
+
+02:28.983 --> 02:30.117
+multiple Kindle devices
+
+02:30.117 --> 02:30.794
+that you want to manage
+
+02:30.794 --> 02:32.720
+and configure in tandem.
+
+02:32.720 --> 02:33.633
+Everything is managed
+
+02:33.633 --> 02:35.667
+from a dedicated server (or a raspberry pi)
+
+02:35.667 --> 02:37.440
+which distributes jobs to multiple Kindles,
+
+02:37.440 --> 02:39.519
+running on different update timers.
+
+02:39.519 --> 02:40.786
+These timers are all managed
+
+02:40.786 --> 02:41.486
+from the server,
+
+02:41.486 --> 02:43.017
+and all the Kindle device has to do is:
+
+02:43.017 --> 02:45.200
+to wake up, power on the WiFi,
+
+02:45.200 --> 02:47.280
+receive some media, display the media, and
+
+02:47.280 --> 02:49.680
+receive a barebones RTC sleep request.
+
+02:49.680 --> 02:51.040
+Then it sleeps for the requested time,
+
+02:51.040 --> 02:52.800
+consuming no power, whilst displaying the
+
+02:52.800 --> 02:55.200
+desired media. That is maybe 10 seconds
+
+02:55.200 --> 02:57.599
+of awake time between each request.
+
+02:57.599 --> 02:58.933
+Cron does not actually run
+
+02:58.933 --> 02:59.933
+on the Kindle device itself,
+
+02:59.933 --> 03:01.600
+simply because it does not reliably work.
+
+03:01.600 --> 03:04.050
+All of this is handled by the server.
+
+03:04.050 --> 03:05.599
+With the server-client model,
+
+03:05.599 --> 03:08.000
+it also tries to restrict Amazon access.
+
+03:08.000 --> 03:09.517
+SSH keys are shared
+
+03:09.517 --> 03:11.217
+only from the client to the server,
+
+03:11.217 --> 03:12.517
+but not from the server to the client,
+
+03:12.517 --> 03:13.920
+so the Kindle cannot connect
+
+03:13.920 --> 03:16.319
+to the Raspberry Pi without a password.
+
+03:16.319 --> 03:18.033
+IPtables rules are also set
+
+03:18.033 --> 03:19.483
+so that the Kindle cannot phone home
+
+03:19.483 --> 03:20.667
+to Amazon, and the connections
+
+03:20.667 --> 03:23.200
+are restricted to just the LAN.
+
+03:23.200 --> 03:24.820
+So I got very curious at one point
+
+03:24.820 --> 03:26.133
+and decided to see how long
+
+03:26.133 --> 03:27.599
+a Kindle could last on a single charge
+
+03:27.599 --> 03:28.560
+in such an arrangement,
+
+03:28.560 --> 03:30.640
+so that every 15 minutes for 18 hours,
+
+03:30.640 --> 03:31.599
+I tested the device
+
+03:31.599 --> 03:32.959
+by sending a media item
+
+03:32.959 --> 03:35.200
+and recording the battery level.
+
+03:35.200 --> 03:36.159
+The Kindle doesn't seem to
+
+03:36.159 --> 03:36.959
+report the battery level
+
+03:36.959 --> 03:37.760
+very continuously,
+
+03:37.760 --> 03:39.040
+but at discrete percentages,
+
+03:39.040 --> 03:39.840
+so that you could end up with
+
+03:39.840 --> 03:42.159
+a graph that looks like this.
+
+03:42.159 --> 03:43.617
+Assuming you have half the charge,
+
+03:43.617 --> 03:45.200
+and use it once every hour -
+
+03:45.200 --> 03:48.319
+it will drop by 10% battery in 76 hours,
+
+03:48.319 --> 03:49.760
+which is roughly three days.
+
+03:49.760 --> 03:50.640
+It's hard to extrapolate
+
+03:50.640 --> 03:52.400
+with only three good summarized data points,
+
+03:52.400 --> 03:53.519
+of which the number of requests
+
+03:53.519 --> 03:54.879
+per battery level appear to diminish
+
+03:54.879 --> 03:56.640
+as shown in the table below,
+
+03:56.640 --> 03:58.560
+but the final result yields 76 requests
+
+03:58.560 --> 04:00.799
+with an average loss of 0.5% battery life
+
+04:00.799 --> 04:02.273
+per request. Which is not bad!
+
+04:02.273 --> 04:04.400
+Assuming you do a request every 2 hours
+
+04:04.400 --> 04:06.000
+from 8am to 8pm,
+
+04:06.000 --> 04:07.040
+and let it sleep at night,
+
+04:07.040 --> 04:09.040
+then that's approximately 6 requests a day,
+
+04:09.040 --> 04:10.400
+which could easily last a device
+
+04:10.400 --> 04:11.280
+for a month.
+
+04:11.280 --> 04:12.586
+The ksync script does
+
+04:12.586 --> 04:13.200
+essentially everything:
+
+04:13.200 --> 04:14.799
+from generating and fetching the media,
+
+04:14.799 --> 04:16.720
+to initializing all Kindle devices,
+
+04:16.720 --> 04:18.160
+generating the server cronjobs,
+
+04:18.160 --> 04:19.199
+log report summaries,
+
+04:19.199 --> 04:20.400
+editing the config tables,
+
+04:20.400 --> 04:21.199
+and much more.
+
+04:21.199 --> 04:22.880
+The media operations are comparatively
+
+04:22.880 --> 04:23.680
+much more complex
+
+04:23.680 --> 04:25.280
+and encompass a few media use cases
+
+04:25.280 --> 04:26.400
+such as fetching the weather
+
+04:26.400 --> 04:28.560
+(though only from Open Weather Maps)
+
+04:28.560 --> 04:30.000
+and retrieving Google Calendar views
+
+04:30.000 --> 04:32.000
+by week, month, agenda, and four day view.
+
+04:32.000 --> 04:33.199
+You can retrieve Org-Mode data
+
+04:33.199 --> 04:34.639
+from an Emacs instance on the server,
+
+04:34.639 --> 04:35.360
+which in my case
+
+04:35.360 --> 04:36.720
+I produce views for an agenda
+
+04:36.720 --> 04:39.360
+or a sparse tree of my main projects file.
+
+04:39.360 --> 04:41.120
+Finally we have gallery and wavfile,
+
+04:41.120 --> 04:42.240
+which are static resources
+
+04:42.240 --> 04:44.000
+which will never change once generated.
+
+04:44.000 --> 04:45.199
+The idea is that you feed it
+
+04:45.199 --> 04:46.400
+text and an image location,
+
+04:46.400 --> 04:47.040
+and it generates
+
+04:47.040 --> 04:48.720
+a Kindle-compatible image
+
+04:48.720 --> 04:51.280
+using imagemagick as a backend for it.
+
+04:51.280 --> 04:52.240
+In the case of the wavfile,
+
+04:52.240 --> 04:54.160
+it uses espeak on the backend.
+
+04:54.160 --> 04:55.280
+The below is summarized
+
+04:55.280 --> 04:56.317
+from the help-me text
+
+04:56.317 --> 04:57.199
+in the main ksync file,
+
+04:57.199 --> 04:58.160
+but essentially, you need to
+
+04:58.160 --> 04:59.919
+define your config in the CSV files,
+
+04:59.919 --> 05:01.440
+which we talk about in the next section;
+
+05:01.440 --> 05:03.120
+initialize all your Kindle devices,
+
+05:03.120 --> 05:04.720
+i.e. copy over SSH keys,
+
+05:04.720 --> 05:06.160
+kill all the unnecessary services,
+
+05:06.160 --> 05:07.840
+and prime them for media collection;
+
+05:07.840 --> 05:08.720
+and ensure that you have
+
+05:08.720 --> 05:10.080
+all your static media generated
+
+05:10.080 --> 05:11.440
+and fetchable; and finally
+
+05:11.440 --> 05:12.720
+you then refresh the scheduling
+
+05:12.720 --> 05:14.240
+on the server.
+
+05:14.240 --> 05:15.759
+Okay, so this is all good and well,
+
+05:15.759 --> 05:17.039
+and we now know what the server does
+
+05:17.039 --> 05:18.400
+and how to probe and inspect it -
+
+05:18.400 --> 05:19.759
+but how does the server generate
+
+05:19.759 --> 05:21.120
+much of the content?
+
+05:21.120 --> 05:22.080
+So a lot of the content
+
+05:22.080 --> 05:23.360
+will be dynamically generated,
+
+05:23.360 --> 05:24.639
+meaning it cannot be cached
+
+05:24.639 --> 05:26.720
+and is likely to change from hour to hour.
+
+05:26.720 --> 05:28.400
+The media content that is generated here
+
+05:28.400 --> 05:29.759
+are mostly PNG images
+
+05:29.759 --> 05:30.567
+and have a timestamp
+
+05:30.567 --> 05:32.320
+embedded in their filenames.
+
+05:32.320 --> 05:33.520
+The Emacs-specific content
+
+05:33.520 --> 05:34.560
+consists of a few views,
+
+05:34.560 --> 05:36.000
+namely the org-gcal views,
+
+05:36.000 --> 05:37.600
+org-agenda, and org-calories --
+
+05:37.600 --> 05:39.520
+essentially anything that Emacs can display
+
+05:39.520 --> 05:42.000
+and that you want to capture into an image.
+
+05:42.000 --> 05:43.360
+Emacs can't (as far as I know)
+
+05:43.360 --> 05:44.639
+render graphics in a headless way,
+
+05:44.639 --> 05:45.600
+so what we do instead
+
+05:45.600 --> 05:48.240
+is run Emacs in a dummy minimal X11 session
+
+05:48.240 --> 05:50.080
+via "xvrb-run."
+
+05:50.080 --> 05:51.680
+From inside, you can take screenshots
+
+05:51.680 --> 05:52.233
+as you would in
+
+05:52.233 --> 05:53.440
+a normal desktop environment,
+
+05:53.440 --> 05:54.400
+but with the benefit that
+
+05:54.400 --> 05:56.479
+you don't actually need to invoke a desktop
+
+05:56.479 --> 05:58.560
+or interfere with an existing one.
+
+05:58.560 --> 05:59.840
+The minimal elisp shown here
+
+05:59.840 --> 06:00.720
+is all that is required
+
+06:00.720 --> 06:02.400
+to output your desired image from Emacs
+
+06:02.400 --> 06:04.479
+and configure it for the Kindle environment.
+
+06:04.479 --> 06:05.360
+On the web side of things,
+
+06:05.360 --> 06:06.400
+we don't really need to invoke
+
+06:06.400 --> 06:07.520
+a dummy X11 session
+
+06:07.520 --> 06:09.120
+because Chromium can run headless
+
+06:09.120 --> 06:09.919
+and can be controlled
+
+06:09.919 --> 06:11.600
+by the node library "puppeteer"
+
+06:11.600 --> 06:13.039
+to render dynamic content,
+
+06:13.039 --> 06:14.560
+focus on regions of the webpage,
+
+06:14.560 --> 06:16.080
+and take snapshots.
+
+06:16.080 --> 06:17.600
+The static content comprises
+
+06:17.600 --> 06:19.600
+of two types: images and audio.
+
+06:19.600 --> 06:21.520
+The content is accessed by a key,
+
+06:21.520 --> 06:22.560
+in this case Batman,
+
+06:22.560 --> 06:23.600
+and the content information
+
+06:23.600 --> 06:25.199
+is given by the "--extra" parameter
+
+06:25.199 --> 06:26.960
+which describes either or both
+
+06:26.960 --> 06:30.880
+an image and text.
+
+06:30.880 --> 06:32.248
+Okay, so now we have content,
+
+06:32.248 --> 06:33.600
+how do we schedule this content
+
+06:33.600 --> 06:34.960
+to appear on our desired machines
+
+06:34.960 --> 06:36.400
+at desired times?
+
+06:36.400 --> 06:37.759
+Everything is run via cron.
+
+06:37.759 --> 06:38.720
+So previously we saw that
+
+06:38.720 --> 06:40.880
+we only needed the tables MACHINES.csv,
+
+06:40.880 --> 06:43.440
+COMMANDS.csv, and multiple TIME_*.csv tables
+
+06:43.440 --> 06:44.880
+for the shell script to work.
+
+06:44.880 --> 06:46.479
+But Org-Mode does this far easier,
+
+06:46.479 --> 06:47.919
+since you can just have everything
+
+06:47.919 --> 06:49.039
+in the same file,
+
+06:49.039 --> 06:50.720
+and with the helper minor-mode,
+
+06:50.720 --> 06:51.360
+manage everything
+
+06:51.360 --> 06:53.120
+from a single Org-Mode document.
+
+06:53.120 --> 06:55.120
+Here I have 4 kindles and their shortnames.
+
+06:55.120 --> 06:56.160
+Yes, I even have a Kindle
+
+06:56.160 --> 06:57.520
+hanging outside my door.
+
+06:57.520 --> 06:58.960
+I have 11 defined commands
+
+06:58.960 --> 07:00.800
+which represent the views I want to see,
+
+07:00.800 --> 07:02.319
+and there are 4 timetables I use,
+
+07:02.319 --> 07:02.800
+but you can have
+
+07:02.800 --> 07:04.319
+everything on one, if you like.
+
+07:04.319 --> 07:05.360
+Rows are machine names,
+
+07:05.360 --> 07:06.800
+and columns are corresponding hours
+
+07:06.800 --> 07:07.840
+at which they run.
+
+07:07.840 --> 07:09.440
+Trust me, it's easier to configure
+
+07:09.440 --> 07:10.960
+repeating tasks just by repeating them
+
+07:10.960 --> 07:12.720
+multiple times, because at least this way,
+
+07:12.720 --> 07:13.680
+it's human readable,
+
+07:13.680 --> 07:14.880
+and the script which converts these
+
+07:14.880 --> 07:15.759
+to a cronjob
+
+07:15.759 --> 07:18.800
+collapses the repeating tasks by itself.
+
+07:18.800 --> 07:20.560
+The ksync script can be called
+
+07:20.560 --> 07:23.120
+from within the config.org file
+
+07:23.120 --> 07:24.683
+using this convenient
+
+07:24.683 --> 07:26.960
+use-package declaration.
+
+07:26.960 --> 07:28.319
+All that one needs to do
+
+07:28.319 --> 07:30.560
+is to configure the ENVIRONMENT_VARIABLES
+
+07:30.560 --> 07:32.880
+by setting them in this table
+
+07:32.880 --> 07:34.479
+where you set the repo name,
+
+07:34.479 --> 07:36.160
+the config directory,
+
+07:36.160 --> 07:37.599
+where the media shall go,
+
+07:37.599 --> 07:38.960
+and the server IP,
+
+07:38.960 --> 07:39.919
+although this can be
+
+07:39.919 --> 07:41.360
+automatically detected.
+
+07:41.360 --> 07:42.240
+The package allows you
+
+07:42.240 --> 07:43.440
+to export your tables
+
+07:43.440 --> 07:46.720
+by running C-c C-c on them,
+
+07:46.720 --> 07:49.199
+and allows you to update all the jobs
+
+07:49.199 --> 07:52.319
+related to each of your clients.
+
+07:52.319 --> 07:53.759
+You can also initialize clients
+
+07:53.759 --> 07:55.120
+using this package --
+
+07:55.120 --> 07:56.479
+for either all of them
+
+07:56.479 --> 07:58.479
+or individual clients --
+
+07:58.479 --> 07:59.599
+and the package comes with
+
+07:59.599 --> 08:01.120
+some convenience functions
+
+08:01.120 --> 08:02.720
+to do this automatically
+
+08:02.720 --> 08:06.720
+for all tables in the buffer.
+
+08:06.720 --> 08:08.319
+With this, I want to say a big thank you
+
+08:08.319 --> 08:09.840
+to Takaaki Ishikawa
+
+08:09.840 --> 08:11.520
+for his fantastic "org-tree-slide"
+
+08:11.520 --> 08:12.879
+presentation package.
+
+08:12.879 --> 08:14.136
+To Pascal Widdershoven
+
+08:14.136 --> 08:15.803
+and David Hamp-Gonsalves,
+
+08:15.803 --> 08:16.633
+for their fantastic
+
+08:16.633 --> 08:17.840
+kindle-dash repositories,
+
+08:17.840 --> 08:19.903
+for which some of my internal Kindle scripts
+
+08:19.903 --> 08:20.720
+are derived from.
+
+08:20.720 --> 08:22.160
+Also a big thanks to the friendly
+
+08:22.160 --> 08:23.520
+and not-so-friendly users and hackers
+
+08:23.520 --> 08:24.960
+in the MobileRead forums.
+
+08:24.960 --> 08:25.919
+And finally, a big thanks
+
+08:25.919 --> 08:26.960
+to the Emacs community
+
+08:26.960 --> 08:28.270
+and the conference organizers.
+
+08:28.270 --> 08:31.120
+Thank you! [captions by Mehmet]
diff --git a/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt b/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt
new file mode 100644
index 00000000..a894741c
--- /dev/null
+++ b/2021/captions/emacsconf-2021-design--on-the-design-of-text-editors--nicolas-p-rougier--main.vtt
@@ -0,0 +1,514 @@
+WEBVTT
+
+00:00.880 --> 00:02.386
+Good afternoon. I'm Nicolas Rougier,
+
+00:02.386 --> 00:04.080
+and today I would like to present some of
+
+00:04.080 --> 00:06.560
+the experiments I've made with Emacs.
+
+00:06.560 --> 00:08.400
+My initial motivation was an
+
+00:08.400 --> 00:09.920
+inner feeling that something was
+
+00:09.920 --> 00:12.559
+wrong with most modern editors,
+
+00:12.559 --> 00:14.559
+and before I show you my experiment,
+
+00:14.559 --> 00:16.004
+I will try to demonstrate
+
+00:16.004 --> 00:17.440
+what I think is wrong.
+
+00:17.440 --> 00:18.720
+Note that this is mostly my
+
+00:18.720 --> 00:20.640
+personal feelings and I did not commit
+
+00:20.640 --> 00:23.279
+any experiment to test is this or
+
+00:23.279 --> 00:25.279
+that choice would be better.
+
+00:25.279 --> 00:26.781
+Of course, some of you might
+
+00:26.781 --> 00:30.480
+legitimately disagree with me.
+
+00:30.480 --> 00:32.399
+Let's start with a short review of a
+
+00:32.399 --> 00:35.160
+modern text editor. I chose Nova editor
+
+00:35.160 --> 00:37.680
+that is only available on OS X,
+
+00:37.680 --> 00:39.920
+but there are actually many other very
+
+00:39.920 --> 00:42.960
+similar editors, such as, for example,
+
+00:42.960 --> 00:45.680
+Atom, Sublime Text, or Visual Studio.
+
+00:45.680 --> 00:47.760
+Now it's quite interesting because I think
+
+00:47.760 --> 00:50.239
+it manages to gather everything what is
+
+00:50.239 --> 00:53.120
+wrong in this single screenshot that is
+
+00:53.120 --> 00:55.920
+also the teaser image on their website.
+
+00:55.920 --> 00:58.160
+So let me now review it according to my
+
+00:58.160 --> 01:01.039
+personal biases and for further analysis
+
+01:01.039 --> 01:02.667
+I can only recommend to attend
+
+01:02.667 --> 01:05.680
+David Wilson's talks tomorrow.
+
+01:05.680 --> 01:07.360
+The most (inaudible) thing that really
+
+01:07.360 --> 01:11.583
+bothers me is the actual area dedicated
+
+01:11.583 --> 01:13.504
+to the editing. When you measure
+
+01:13.504 --> 01:15.553
+this editing area as I did on the
+
+01:15.553 --> 01:19.112
+screenshot, you'll find an impressive 35%,
+
+01:19.112 --> 01:22.316
+which is ridiculously small
+
+01:22.316 --> 01:24.240
+compared to the side of the window.
+
+01:24.240 --> 01:26.320
+This means that two-thirds of the window
+
+01:26.320 --> 01:30.079
+area is dedicated to peripheral information
+
+01:30.079 --> 01:32.079
+that you don't look so often
+
+01:32.079 --> 01:34.159
+when writing code or prose.
+
+01:34.159 --> 01:36.560
+This results in the main editing area to
+
+01:36.560 --> 01:39.119
+be reduced to one third even if we tend
+
+01:39.119 --> 01:42.040
+to have larger and larger monitors, I think
+
+01:42.040 --> 01:45.600
+this is wrong to lost so much of space.
+
+01:45.600 --> 01:47.759
+If we now look closer at this peripheral
+
+01:47.759 --> 01:49.920
+information, we can immediately see that
+
+01:49.920 --> 01:52.079
+there is a lot of redundancy.
+
+01:52.079 --> 01:53.617
+For example, on the screenshot,
+
+01:53.617 --> 01:55.709
+I highlighted the information related
+
+01:55.709 --> 01:57.759
+to the file name being edited.
+
+01:57.759 --> 02:00.640
+Unless I missed, some this file name
+
+02:00.640 --> 02:02.320
+is displayed four times.
+
+02:02.320 --> 02:04.399
+This is way too much even if it
+
+02:04.399 --> 02:06.320
+displayed for different reasons
+
+02:06.320 --> 02:08.959
+in different contexts, but still I think
+
+02:08.959 --> 02:10.720
+you have a design problem if you need to
+
+02:10.720 --> 02:14.560
+repeat an information up to four times.
+
+02:14.560 --> 02:15.947
+If we now look at colors,
+
+02:15.947 --> 02:18.160
+you can count 15 different colors,
+
+02:18.160 --> 02:20.560
+such that it is impossible to guess
+
+02:20.560 --> 02:22.959
+which color indicates what.
+
+02:22.959 --> 02:25.440
+Such colorization based on syntax is
+
+02:25.440 --> 02:28.720
+actually quite widespread in code editors
+
+02:28.720 --> 02:30.959
+including Emacs, unfortunately.
+
+02:30.959 --> 02:32.640
+The problem is that we still don't know
+
+02:32.640 --> 02:34.319
+whether it helps or not.
+
+02:34.319 --> 02:36.780
+Some studies say yes, some others say no,
+
+02:36.780 --> 02:38.239
+and in the end the conclusion
+
+02:38.239 --> 02:40.080
+is not yet settled.
+
+02:40.080 --> 02:41.840
+Furthermore, there is another problem
+
+02:41.840 --> 02:43.663
+because there is no scientific method
+
+02:43.663 --> 02:46.080
+on how to enforce colonization.
+
+02:46.080 --> 02:48.800
+Should it be based on syntax, or semantic,
+
+02:48.800 --> 02:51.519
+or context, or something else?
+
+02:51.519 --> 02:53.599
+Developers are actually pretty free to do
+
+02:53.599 --> 02:56.400
+whatever they want, a lot of them will
+
+02:56.400 --> 02:58.879
+use syntax based colorization because it
+
+02:58.879 --> 03:01.280
+is the most simple to write.
+
+03:01.280 --> 03:03.280
+In the end, most of them achieve a
+
+03:03.280 --> 03:06.080
+Christmas tree effect.
+
+03:06.080 --> 03:08.189
+We know however, how to use colors
+
+03:08.189 --> 03:10.560
+to drag attention to a specific position
+
+03:10.560 --> 03:13.920
+as it is shown on the screenshot.
+
+03:13.920 --> 03:15.760
+This is called the pop-out effect,
+
+03:15.760 --> 03:18.080
+which is quite well known in neuroscience.
+
+03:18.080 --> 03:20.000
+Here, the media keyword has been
+
+03:20.000 --> 03:23.120
+made very silent just by setting
+
+03:23.120 --> 03:25.760
+the color in red while all other
+
+03:25.760 --> 03:28.080
+elements are desaturated.
+
+03:28.080 --> 03:30.480
+It literally pops out from the screen
+
+03:30.480 --> 03:33.680
+and point attention toward it.
+
+03:33.680 --> 03:35.360
+Finally, if we look at the overall
+
+03:35.360 --> 03:36.879
+structure of the Nova editor,
+
+03:36.879 --> 03:39.353
+we can characterize structural elements
+
+03:39.353 --> 03:41.840
+that are also present in a large number
+
+03:41.840 --> 03:44.029
+of modern editors namely,
+
+03:44.029 --> 03:46.400
+a file browser, a gutter, a mini map,
+
+03:46.400 --> 03:47.844
+a tab bar, a toolbar,
+
+03:47.844 --> 03:49.920
+and some versioning tools.
+
+03:49.920 --> 03:52.477
+I think this is too much information,
+
+03:52.477 --> 03:54.879
+and can lead to cognitive overload
+
+03:54.879 --> 03:57.725
+such that you end up to not pay attention
+
+03:57.725 --> 03:59.599
+to important information.
+
+03:59.599 --> 04:02.720
+So definitely more is not always better,
+
+04:02.720 --> 04:05.280
+and to paraphrase Edward Tufte in his book
+
+04:05.280 --> 04:06.780
+The Visual Display of
+
+04:06.780 --> 04:08.720
+Quantitative Information,
+
+04:08.720 --> 04:12.560
+"Above all else show the data."
+
+04:12.560 --> 04:14.640
+This is a reason that led me to
+
+04:14.640 --> 04:16.720
+experiment alternative design,
+
+04:16.720 --> 04:18.079
+and of course, to do that with
+
+04:18.079 --> 04:19.840
+the total freedom I didn't have
+
+04:19.840 --> 04:24.080
+much choice but to use and hack Emacs.
+
+04:24.080 --> 04:27.001
+My first iteration was called Elegant Emacs,
+
+04:27.001 --> 04:29.271
+and I try to enforce a few principles
+
+04:29.271 --> 04:31.759
+that I will detail into the next slide.
+
+04:31.759 --> 04:33.919
+But roughly, my idea was to
+
+04:33.919 --> 04:35.857
+enforce a radically different design
+
+04:35.857 --> 04:38.320
+by simply removing as much
+
+04:38.320 --> 04:40.080
+information as I could.
+
+04:40.080 --> 04:42.240
+Even so, vanilla Emacs is
+
+04:42.240 --> 04:44.000
+already quite simple.
+
+04:44.000 --> 04:45.759
+You can see the result on the screen,
+
+04:45.759 --> 04:47.759
+and I'm practically happy with the third
+
+04:47.759 --> 04:50.240
+screenshot that mimics the PDF layout of
+
+04:50.240 --> 04:53.120
+a scientific article by Stefan Monnier
+
+04:53.120 --> 04:55.360
+and Michael Sperber but rather
+
+04:55.360 --> 04:58.160
+fully inside Emacs.
+
+04:58.160 --> 05:01.080
+The second iteration is called NANO Emacs,
+
+05:01.080 --> 05:03.680
+and it is a version I try to maintain
+
+05:03.680 --> 05:05.592
+with a set of standalone packages
+
+05:05.592 --> 05:07.759
+that you can test individually.
+
+05:07.759 --> 05:09.271
+It is based on a set of
+
+05:09.271 --> 05:11.919
+a few principles, namely
+
+05:11.919 --> 05:14.677
+large margins, reduced number of faces,
+
+05:14.677 --> 05:17.360
+a simplified and contextual header line,
+
+05:17.360 --> 05:19.280
+and a default aspect ratio that
+
+05:19.280 --> 05:21.759
+mimics the A4 ISO format.
+
+05:21.759 --> 05:24.240
+I've been using this layout for a
+
+05:24.240 --> 05:26.720
+year and so far I'm quite happy with it.
+
+05:26.720 --> 05:29.440
+I know this is quite an opinionated
+
+05:29.440 --> 05:31.680
+design and some of you may totally
+
+05:31.680 --> 05:34.240
+disagree with me.
+
+05:34.240 --> 05:36.630
+Lately I've been experimenting
+
+05:36.630 --> 05:38.682
+with some special modes where
+
+05:38.682 --> 05:41.919
+the header line is made even simpler,
+
+05:41.919 --> 05:44.080
+this is the case for org-agenda,
+
+05:44.080 --> 05:46.720
+mu4e, deft, and elfeed.
+
+05:46.720 --> 05:48.560
+This worked reasonably well
+
+05:48.560 --> 05:50.952
+because these modes are search based,
+
+05:50.952 --> 05:54.720
+and it was easy to unify their design.
+
+05:54.720 --> 05:56.960
+I've also integrated some dynamic tags
+
+05:56.960 --> 06:00.484
+and icon in my agenda using svg-lib,
+
+06:00.484 --> 06:02.400
+which is available on ELPA.
+
+06:02.400 --> 06:04.960
+And for example, you can see the
+
+06:04.960 --> 06:08.560
+pie progress that help to show
+
+06:08.560 --> 06:11.440
+some incoming deadlines.
+
+06:11.440 --> 06:13.261
+There are still ongoing development
+
+06:13.261 --> 06:15.120
+to develop new packages to give
+
+06:15.120 --> 06:17.280
+a unified look and feel.
+
+06:17.280 --> 06:18.792
+I got a lot of feedback from
+
+06:18.792 --> 06:20.768
+the Emacs community,
+
+06:20.768 --> 06:22.288
+mostly in Reddit and GitHub,
+
+06:22.288 --> 06:24.319
+and I would like to thank them here
+
+06:24.319 --> 06:26.880
+because this is incredibly useful.
+
+06:26.880 --> 06:29.039
+If you want to follow or support my work,
+
+06:29.039 --> 06:31.600
+best place is probably GitHub.
+
+06:31.600 --> 06:33.099
+Thank you for your attention.
+
+06:33.099 --> 06:34.479
+I will be happy to answer
+
+06:34.479 --> 06:36.874
+any questions you may have.
+
+06:36.874 --> 06:38.520
+[captions by bhavin192 (Bhavin Gandhi)]
diff --git a/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt b/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--chapters.vtt
new file mode 100644
index 00000000..194156b0
--- /dev/null
+++ b/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--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-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-dev-update--emacs-development-updates--john-wiegley--main.vtt b/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt
new file mode 100644
index 00000000..8532206f
--- /dev/null
+++ b/2021/captions/emacsconf-2021-dev-update--emacs-development-updates--john-wiegley--main.vtt
@@ -0,0 +1,724 @@
+WEBVTT
+
+00:00.320 --> 00:02.200
+Hello, my name is John Wiegley.
+
+00:02.200 --> 00:05.040
+I'm a past co-maintainer of Emacs.
+
+00:05.040 --> 00:06.799
+Nowadays, all of the work
+
+00:06.799 --> 00:08.160
+and mailing list traffic
+
+00:08.160 --> 00:09.599
+is handled by Eli Zaretskii
+
+00:09.599 --> 00:12.559
+and Lars Ingebrigtsen.
+
+00:12.559 --> 00:14.320
+I just wanted to give you an update
+
+00:14.320 --> 00:15.360
+of what has been happening
+
+00:15.360 --> 00:16.560
+and what is soon to come
+
+00:16.560 --> 00:00:18.559
+in Emacs development.
+
+00:18.560 --> 00:19.760
+So I spoke to Eli
+
+00:19.760 --> 00:20.880
+and he gave me the lowdown
+
+00:20.880 --> 00:23.359
+on Emacs 28, which is the next
+
+00:23.359 --> 00:25.840
+big release to come up yet.
+
+00:25.840 --> 00:27.039
+He says that we hope to
+
+00:27.039 --> 00:28.160
+release this soon.
+
+00:28.160 --> 00:30.080
+Pre-testing has not yet started,
+
+00:30.080 --> 00:31.519
+but maybe looking at
+
+00:31.519 --> 00:00:33.599
+the first quarter of next year.
+
+00:33.600 --> 00:35.840
+The biggest feature coming in Emacs 28
+
+00:35.840 --> 00:39.040
+is going to be native compilation,
+
+00:39.040 --> 00:41.280
+and this will make some Emacs code
+
+00:41.280 --> 00:43.120
+two to four times as fast,
+
+00:43.120 --> 00:44.640
+depending on what kind of Lisp
+
+00:44.640 --> 00:45.360
+you're running
+
+00:45.360 --> 00:47.840
+and how much of your Lisp code
+
+00:47.840 --> 00:48.800
+is just Lisp,
+
+00:48.800 --> 00:50.879
+or makes calls to primitive functions.
+
+00:50.879 --> 00:53.680
+There were previous JIT attempts.
+
+00:53.680 --> 00:54.879
+Some of them still live on
+
+00:54.879 --> 00:56.559
+in development branches,
+
+00:56.559 --> 00:57.280
+but they were found
+
+00:57.280 --> 01:00.960
+to not speed things up too much.
+
+01:00.960 --> 01:03.280
+The version coming in Emacs 28
+
+01:03.280 --> 01:04.479
+has much better results
+
+01:04.479 --> 01:05.760
+than these past attempts,
+
+01:05.760 --> 01:06.960
+but it should be noted
+
+01:06.960 --> 01:09.439
+that it has some side effects.
+
+01:09.439 --> 01:11.439
+One is that natively-compiled files
+
+01:11.439 --> 01:13.680
+are going to be system-dependent,
+
+01:13.680 --> 01:14.960
+so they can't be included
+
+01:14.960 --> 01:16.000
+in any distributions
+
+01:16.000 --> 01:18.080
+the way we do now with .elc files,
+
+01:18.080 --> 01:20.479
+since those run on any platform.
+
+01:20.479 --> 01:22.240
+This means that you will need to
+
+01:22.240 --> 01:23.600
+compile those files
+
+01:23.600 --> 01:26.479
+for your own machine, sometimes,
+
+01:26.479 --> 01:27.360
+depending on how
+
+01:27.360 --> 01:28.799
+the compilation process goes.
+
+01:28.799 --> 01:31.520
+It could vary by processor.
+
+01:31.520 --> 01:32.720
+And it requires you also
+
+01:32.720 --> 01:33.520
+to have the right
+
+01:33.520 --> 01:35.600
+compilation environment.
+
+01:35.600 --> 01:37.200
+This means that you may need tools
+
+01:37.200 --> 01:38.560
+from the gcc tool chain
+
+01:38.560 --> 01:39.520
+that aren't installed
+
+01:39.520 --> 01:40.799
+as part of the default,
+
+01:40.799 --> 01:42.640
+so you will maybe have to do some work
+
+01:42.640 --> 01:43.680
+to set up the right
+
+01:43.680 --> 01:44.720
+compilation environment
+
+01:44.720 --> 01:46.560
+for your platform.
+
+01:46.560 --> 01:47.680
+Natively-compiled files
+
+01:47.680 --> 01:50.799
+are also kept in a separate directory.
+
+01:50.799 --> 01:52.079
+There are some issues
+
+01:52.079 --> 01:54.159
+having to do with recompilation too,
+
+01:54.159 --> 01:55.920
+so there are certain changes which,
+
+01:55.920 --> 01:57.360
+if made to the Emacs source code
+
+01:57.360 --> 01:58.560
+between releases,
+
+01:58.560 --> 02:00.159
+may require you to recompile
+
+02:00.159 --> 02:02.000
+all of the natively-compiled files
+
+02:02.000 --> 02:04.479
+that you had compiled previously.
+
+02:04.479 --> 02:06.880
+Also, the file names of compiled files
+
+02:06.880 --> 02:07.680
+that get installed
+
+02:07.680 --> 02:08.800
+have hashes on them
+
+02:08.800 --> 02:10.319
+depending on the Emacs
+
+02:10.319 --> 02:11.920
+that they were built against,
+
+02:11.920 --> 02:14.000
+so Emacs should be able to detect
+
+02:14.000 --> 02:16.239
+when recompilation is necessary,
+
+02:16.239 --> 02:17.840
+but it may be difficult
+
+02:17.840 --> 02:19.599
+for distributions who want to know
+
+02:19.599 --> 02:20.800
+what all of the build files
+
+02:20.800 --> 02:22.160
+are going to be in advance
+
+02:22.160 --> 02:23.840
+in order to prepare
+
+02:23.840 --> 02:25.360
+a binary distribution
+
+02:25.360 --> 02:27.280
+for that for that platform.
+
+02:27.280 --> 02:28.800
+So these are all little wrinkles
+
+02:28.800 --> 02:29.840
+that we're going to discover
+
+02:29.840 --> 02:30.800
+and have to work out
+
+02:30.800 --> 02:32.560
+as this functionality comes out
+
+02:32.560 --> 02:33.599
+and starts getting used
+
+02:33.599 --> 00:02:36.399
+in lots of different distributions.
+
+02:36.400 --> 02:38.560
+Another feature is that Cairo is
+
+02:38.560 --> 02:40.319
+now being built with by default,
+
+02:40.319 --> 02:42.560
+and this is one step further toward
+
+02:42.560 --> 02:44.319
+better support for emojis.
+
+02:44.319 --> 02:45.519
+If you build with Cairo,
+
+02:45.519 --> 02:47.599
+you will get all of the emoji sequences
+
+02:47.599 --> 02:49.360
+defined by the latest Unicode,
+
+02:49.360 --> 02:50.400
+and in full color,
+
+02:50.400 --> 02:52.560
+the exact same as on your smartphone ,
+
+02:52.560 --> 00:02:55.759
+and it works on macOS as well.
+
+02:55.760 --> 02:56.640
+There's a new mode,
+
+02:56.640 --> 02:58.400
+but it is off by default,
+
+02:58.400 --> 03:00.480
+called context-menus mode,
+
+03:00.480 --> 03:02.800
+and this gives menus that appear
+
+03:02.800 --> 03:03.599
+when you right-click
+
+03:03.599 --> 03:04.959
+somewhere in a buffer,
+
+03:04.959 --> 03:06.480
+but now will make it easier
+
+03:06.480 --> 03:08.080
+for other modes to define
+
+03:08.080 --> 03:09.440
+what those context menus
+
+03:09.440 --> 03:10.080
+should look like,
+
+03:10.080 --> 03:13.840
+so that's sort of making that support...
+
+03:13.840 --> 03:16.080
+having it less custom
+
+03:16.080 --> 03:17.920
+in each module that implements
+
+03:17.920 --> 03:19.360
+that type of behavior.
+
+03:19.360 --> 03:20.879
+They can now do it through this context
+
+03:20.879 --> 00:03:22.958
+and then use the facility.
+
+03:22.959 --> 03:25.120
+Tab-bar and tab-line have received
+
+03:25.120 --> 03:26.799
+many enhancements.
+
+03:26.799 --> 03:28.560
+So there's new commands, new variables,
+
+03:28.560 --> 03:30.080
+there's quite a large number of changes,
+
+03:30.080 --> 03:31.440
+so if you like those modes,
+
+03:31.440 --> 03:32.560
+if you use them,
+
+03:32.560 --> 03:33.440
+then you should be happy
+
+03:33.440 --> 03:35.040
+with what's coming.
+
+03:35.040 --> 00:03:37.839
+There is a command...
+
+03:37.840 --> 03:40.720
+Now, a command can be marked
+
+03:40.720 --> 03:42.799
+as being specific to a mode,
+
+03:42.799 --> 03:44.560
+so that if you're not in that mode,
+
+03:44.560 --> 03:46.000
+then, when you press M-x,
+
+03:46.000 --> 03:46.959
+it won't appear
+
+03:46.959 --> 03:48.319
+in the tab completion list.
+
+03:48.319 --> 03:50.799
+Right now, M-x is a full population
+
+03:50.799 --> 03:52.560
+of every interactive command
+
+03:52.560 --> 03:53.920
+known to Emacs,
+
+03:53.920 --> 03:55.120
+but in many cases,
+
+03:55.120 --> 03:57.360
+unless you're in a text-mode buffer
+
+03:57.360 --> 03:58.560
+or a latex-mode buffer,
+
+03:58.560 --> 04:00.799
+or some programming language mode buffer,
+
+04:00.799 --> 04:01.840
+a lot of the commands
+
+04:01.840 --> 04:04.480
+that might be presented to you today
+
+04:04.480 --> 04:06.239
+are irrelevant to that buffer
+
+04:06.239 --> 04:08.400
+that you're in. So commands can now
+
+04:08.400 --> 04:11.120
+specify in their interactive declaration
+
+04:11.120 --> 04:12.640
+which mode they're specific to,
+
+04:12.640 --> 04:14.319
+and in that case, they will only appear
+
+04:14.319 --> 04:16.079
+in the completion list for that mode.
+
+04:16.079 --> 04:17.840
+In fact, only be available
+
+04:17.840 --> 00:04:20.319
+in that mode to execute.
+
+04:20.320 --> 04:21.680
+There are going to be
+
+04:21.680 --> 04:23.759
+transient input methods,
+
+04:23.759 --> 04:25.440
+and what this means is that right now,
+
+04:25.440 --> 04:27.520
+with Emacs, you can hit a key sequence
+
+04:27.520 --> 04:29.520
+to change your input method
+
+04:29.520 --> 04:32.240
+to, say, latin1 or to Arabic or Hebrew
+
+04:32.240 --> 04:33.040
+or some other language,
+
+04:33.040 --> 04:35.199
+so that you can start entering text
+
+04:35.199 --> 04:38.080
+using that input mode,
+
+04:38.080 --> 04:39.759
+but transient input methods
+
+04:39.759 --> 04:40.400
+will allow you
+
+04:40.400 --> 04:42.960
+to switch to an input mode temporarily.
+
+04:42.960 --> 04:44.720
+So if you're mostly writing
+
+04:44.720 --> 04:46.720
+in English text, but you want to insert
+
+04:46.720 --> 04:48.720
+one Greek letter, you don't have to
+
+04:48.720 --> 04:49.840
+switch to an input mode
+
+04:49.840 --> 04:52.080
+that has Latin and Greek letters.
+
+04:52.080 --> 04:53.280
+You can just switch over
+
+04:53.280 --> 04:54.560
+to a Greek input mode,
+
+04:54.560 --> 04:56.639
+momentarily enter in the Greek letter,
+
+04:56.639 --> 04:57.600
+and then come back
+
+04:57.600 --> 00:05:00.879
+to your default input method.
+
+05:00.880 --> 05:02.880
+show-paren-mode will be enabled
+
+05:02.880 --> 05:04.880
+by default in Emacs 28,
+
+05:04.880 --> 05:06.720
+so that's the highlighting of parens
+
+05:06.720 --> 05:11.039
+whenever your cursor is on or near
+
+05:11.039 --> 05:12.800
+a closing paren or an opening paren,
+
+05:12.800 --> 00:05:14.559
+for example.
+
+05:14.560 --> 05:18.080
+We're also going to have a NonGNU ELPA,
+
+05:18.080 --> 05:20.639
+so there will be a ELPA repository
+
+05:20.639 --> 05:22.160
+just like the ELPA we have today,
+
+05:22.160 --> 05:24.400
+except it will have packages in it
+
+05:24.400 --> 05:25.840
+that have not gone through
+
+05:25.840 --> 05:26.880
+the same level of
+
+05:26.880 --> 05:28.560
+copyright assignment requirements
+
+05:28.560 --> 05:29.919
+as the GNU ELPA.
+
+05:29.919 --> 05:31.919
+So NonGNU ELPA will make it easier
+
+05:31.919 --> 05:34.560
+for packages to get into a repository
+
+05:34.560 --> 05:37.120
+that is managed by the package.el
+
+05:37.120 --> 00:05:39.519
+that ships with Emacs.
+
+05:39.520 --> 05:42.160
+There's going to be a repeat-mode
+
+05:42.160 --> 05:45.039
+added to Emacs 28, repeat-mode.el.
+
+05:45.039 --> 05:46.880
+What this does is when you turn it on,
+
+05:46.880 --> 05:48.720
+when you enable repeat-mode,
+
+05:48.720 --> 05:50.800
+then certain commands
+
+05:50.800 --> 05:53.120
+which are executed by keybindings
+
+05:53.120 --> 05:55.120
+like C-x u for undo
+
+05:55.120 --> 05:56.160
+will allow you to just
+
+05:56.160 --> 05:58.240
+keep hitting that u, that final letter
+
+05:58.240 --> 05:59.680
+you used for the command
+
+05:59.680 --> 06:01.600
+to keep repeating that function.
+
+06:01.600 --> 06:03.440
+This works today already
+
+06:03.440 --> 06:06.720
+for things like macro repetition, C-x e,
+
+06:06.720 --> 06:08.080
+where you can just keep hitting e
+
+06:08.080 --> 06:08.960
+to repeat the macro
+
+06:08.960 --> 06:10.000
+as many times as you like,
+
+06:10.000 --> 06:11.360
+but that was a custom feature
+
+06:11.360 --> 06:12.560
+just for macros.
+
+06:12.560 --> 06:16.319
+This makes repeat mode accessible to
+
+06:16.319 --> 00:06:18.399
+most commands.
+
+06:18.400 --> 06:20.080
+The project.el package
+
+06:20.080 --> 06:22.000
+has dozens of new commands,
+
+06:22.000 --> 06:23.759
+so check the documentation there
+
+06:23.759 --> 06:25.039
+to find out what's going to be new
+
+06:25.039 --> 00:06:26.719
+in project.el.
+
+06:26.720 --> 06:28.560
+And there will be shorthands
+
+06:28.560 --> 06:30.000
+for Lisp symbols
+
+06:30.000 --> 06:32.400
+supported in the Lisp symbol reader.
+
+06:32.400 --> 06:34.240
+This means that for packages
+
+06:34.240 --> 06:36.800
+like s and f that have a whole bunch
+
+06:36.800 --> 06:38.479
+of really short named functions
+
+06:38.479 --> 06:40.560
+that might pollute the namespace,
+
+06:40.560 --> 06:43.199
+those functions now can be
+
+06:43.199 --> 06:45.039
+implemented behind a prefix
+
+06:45.039 --> 06:47.520
+where the symbol reader can be taught
+
+06:47.520 --> 06:48.639
+that there is a shorthand
+
+06:48.639 --> 06:50.319
+for that prefix,
+
+06:50.319 --> 06:51.680
+and that way, it'll only apply
+
+06:51.680 --> 00:06:54.959
+for the use of that package.
+
+06:54.960 --> 06:57.840
+And then finally, work on Emacs 29
+
+06:57.840 --> 06:59.280
+has just started.
+
+06:59.280 --> 07:00.400
+I don't have any details
+
+07:00.400 --> 07:01.440
+to report to you there,
+
+07:01.440 --> 07:02.880
+just to say that now
+
+07:02.880 --> 07:04.000
+the ship is moving on
+
+07:04.000 --> 07:05.360
+to the next release after,
+
+07:05.360 --> 07:07.599
+and Emacs 28 has a release branch
+
+07:07.599 --> 07:08.720
+and is getting cleaned up
+
+07:08.720 --> 07:10.400
+and ready for release.
+
+07:10.400 --> 07:12.720
+And that is the technical summary
+
+07:12.720 --> 07:14.000
+of what's new in Emacs.
+
+07:14.000 --> 07:17.120
+Thank you.
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-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt b/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt
new file mode 100644
index 00000000..a31b712b
--- /dev/null
+++ b/2021/captions/emacsconf-2021-eaf--emacs-application-framework-a-2021-update--matthew-zeng--main.vtt
@@ -0,0 +1,622 @@
+WEBVTT
+
+00:03.040 -->00:00:05.206
+Hi, my name is Matthew Zeng,
+
+00:00:05.206 --> 00:00:07.526
+aka MT or Mingde.
+
+00:00:07.526 --> 00:00:10.766
+Welcome to EmacsConf2021.
+
+00:00:10.766 --> 00:00:12.846
+I hope everyone is enjoying
+
+00:00:12.846 --> 00:00:14.286
+the conference so far.
+
+00:00:14.286 --> 00:00:16.766
+I am one of the maintainers
+
+00:00:16.766 --> 00:00:18.566
+of the Emacs Application Framework.
+
+00:00:18.566 --> 00:00:22.606
+I was also here last year during EmacsConf2020
+
+00:00:22.606 --> 00:00:24.366
+and did a 20 minute presentation
+
+00:00:24.366 --> 00:00:26.606
+on the overall architecture of EAF
+
+00:00:26.606 --> 00:00:28.486
+as well as a small demo.
+
+00:00:28.486 --> 00:00:31.966
+A lot of things had changed since 2020,
+
+00:00:31.966 --> 00:00:34.406
+and that's why today I'm here to present:
+
+00:00:34.406 --> 00:00:38.045
+Emacs Application Framework, A 2021 Update.
+
+00:00:38.046 --> 00:00:41.086
+So we all know Emacs,
+
+00:00:41.086 --> 00:00:42.326
+and we definitely know that
+
+00:00:42.326 --> 00:00:44.486
+Emacs is not just a text editor,
+
+00:00:44.486 --> 00:00:46.926
+but a text-centric work environment,
+
+00:00:46.926 --> 00:00:48.606
+and it lacks *efficient*
+
+00:00:48.606 --> 00:00:50.686
+multimedia rendering capabilities
+
+00:00:50.686 --> 00:00:53.126
+such as website, PDF, and video rendering.
+
+00:00:53.126 --> 00:00:55.361
+We all want that, right?
+
+00:00:55.361 --> 00:00:58.366
+Therefore the EAF project wants to
+
+00:00:58.366 --> 00:01:00.286
+solve this problem while also
+
+00:01:00.286 --> 00:01:02.806
+retaining the rich Emacs ecosystem
+
+00:01:02.806 --> 00:01:06.046
+and its customizability and extensibility.
+
+00:01:06.046 --> 00:01:10.726
+The solution is to outsource the hard part
+
+00:01:10.726 --> 00:01:12.486
+to Python and NodeJS
+
+00:01:12.486 --> 00:01:14.366
+by bridging Elisp with them
+
+00:01:14.366 --> 00:01:16.126
+so that Python and JavaScript
+
+00:01:16.126 --> 00:01:17.926
+can do the hard work
+
+00:01:17.926 --> 00:01:20.126
+and minimize the Elisp workload,
+
+00:01:20.126 --> 00:01:21.926
+which ultimately speeds up
+
+00:01:21.926 --> 00:01:24.446
+our end-user experience using Emacs.
+
+00:01:24.446 --> 00:01:27.646
+Do note that Python and JavaScript
+
+00:01:27.646 --> 00:01:30.406
+already have a very mature ecosystem
+
+00:01:30.406 --> 00:01:32.206
+that provides a foundation
+
+00:01:32.206 --> 00:01:34.366
+to modern multimedia applications,
+
+00:01:34.366 --> 00:01:38.006
+so basically, EAF enables Emacs to extend
+
+00:01:38.006 --> 00:01:40.406
+to Python and JavaScript ecosystems,
+
+00:01:40.406 --> 00:01:42.286
+therefore extending to
+
+00:01:42.286 --> 00:01:44.366
+modern multimedia apps too.
+
+00:01:44.366 --> 00:01:47.606
+As we're on a tight schedule today,
+
+00:01:47.606 --> 00:01:49.726
+I can't go into every detail
+
+00:01:49.726 --> 00:01:51.486
+about how EAF achieves this.
+
+00:01:51.486 --> 00:01:53.606
+I did go through a lot of things
+
+00:01:53.606 --> 00:01:54.886
+during last year's presentation,
+
+00:01:54.886 --> 00:01:57.326
+so I highly recommend anyone interested
+
+00:01:57.326 --> 00:01:59.206
+to check out that presentation,
+
+00:01:59.206 --> 00:02:01.686
+and the project repository itself.
+
+00:02:01.686 --> 00:02:05.725
+Today we're focusing on *what changed*.
+
+00:02:05.726 --> 00:02:09.606
+Now the first change
+
+00:02:09.606 --> 00:02:10.926
+that you'll definitely notice
+
+00:02:10.926 --> 00:02:12.686
+is that we have a new logo!
+
+00:02:12.686 --> 00:02:15.926
+This logo uses gearwheels
+
+00:02:15.926 --> 00:02:18.486
+to symbolize how EAF extends Emacs
+
+00:02:18.486 --> 00:02:20.886
+to web and multimedia applications
+
+00:02:20.886 --> 00:02:23.286
+that bring new possibilities to Emacs.
+
+00:02:23.286 --> 00:02:28.726
+Since last year, EAF has replaced
+
+00:02:28.726 --> 00:02:30.886
+the DBus communication technology
+
+00:02:30.886 --> 00:02:33.446
+with the cross-platform EPC,
+
+00:02:33.446 --> 00:02:35.286
+the Emacs RPC stack,
+
+00:02:35.286 --> 00:02:37.526
+which has an Elisp implementation
+
+00:02:37.526 --> 00:02:39.246
+and a Python implementation,
+
+00:02:39.246 --> 00:02:41.006
+exactly what we need.
+
+02:42.160 --> 00:02:43.760
+This and some other changes
+
+00:02:43.760 --> 00:02:46.080
+enable EAF to support Windows,
+
+00:02:46.080 --> 00:02:49.519
+Windows 10 and Windows Subsystem for Linux,
+
+00:02:49.519 --> 00:02:51.840
+as well as all distros that support
+
+00:02:51.840 --> 00:02:54.319
+pacman, apt, dnf, pkg,
+
+00:02:54.319 --> 00:02:56.959
+zypper package installer commands,
+
+02:56.959 --> 00:02:59.840
+which includes Arch-based, Debian,
+
+00:02:59.840 --> 00:03:04.720
+or Ubuntu-based, Fedora, etc.
+
+03:04.720 --> 00:03:08.239
+However, do note that the maOS support
+
+03:08.239 --> 00:03:10.319
+works with some known issues.
+
+00:03:10.319 --> 00:03:15.359
+Have a look if you want to try out.
+
+03:15.360 --> 00:03:18.400
+Previously, EAF was able to make Elisp
+
+03:18.400 --> 00:03:20.720
+communicate with Python, as well as
+
+00:03:20.720 --> 00:03:23.280
+Python to communicate with JavaScript,
+
+03:23.280 --> 00:03:24.959
+meaning that Elisp can call
+
+00:03:24.959 --> 00:03:27.280
+Python functions and vice versa,
+
+00:03:27.280 --> 00:03:29.680
+and Python can call JavaScript functions
+
+00:03:29.680 --> 00:03:32.560
+and vice versa, but if you want Elisp
+
+00:03:32.560 --> 00:03:34.720
+to communicate with JavaScript,
+
+00:03:34.720 --> 00:03:36.239
+you have to go through Python,
+
+00:03:36.239 --> 00:03:38.879
+which is rather troublesome.
+
+03:38.879 --> 00:03:41.120
+Now, thanks to the EPC,
+
+00:03:41.120 --> 00:03:42.400
+Elisp can communicate
+
+00:03:42.400 --> 00:03:43.840
+with JavaScript directly
+
+03:43.840 --> 00:03:45.519
+using =eval_js= function
+
+00:03:45.519 --> 00:03:47.040
+and =eval_emacs_function=
+
+00:03:47.040 --> 00:03:49.840
+in Elisp and Python respectively.
+
+03:49.840 --> 00:03:51.840
+This greatly simplifies the code
+
+00:03:51.840 --> 00:03:52.640
+that will be needed
+
+00:03:52.640 --> 00:03:56.958
+to write a web app in EAF.
+
+03:56.959 --> 00:03:59.120
+Speaking of web applications,
+
+00:03:59.120 --> 00:04:01.200
+VueJS is a web framework
+
+00:04:01.200 --> 00:04:03.840
+that's been gaining a lot of popularity
+
+00:04:03.840 --> 00:04:04.720
+in recent years
+
+00:04:04.720 --> 00:04:08.959
+for its simplicity and functionality.
+
+04:08.959 --> 00:04:11.840
+In the past, you were only able to write
+
+04:11.840 --> 00:04:14.319
+simple JavaScript and HTML web apps
+
+00:04:14.319 --> 00:04:17.280
+for EAF. It was quite some work
+
+04:17.280 --> 00:04:20.880
+to create a full-featured web application.
+
+04:20.880 --> 00:04:23.360
+Now you can write new apps using EAF
+
+04:23.360 --> 00:04:27.919
+that work seamlessly with Emacs and Elisp.
+
+00:04:27.919 --> 00:04:30.880
+There are a few existing EAF apps
+
+04:30.880 --> 00:04:32.800
+written with Vue already
+
+04:32.800 --> 00:04:34.639
+to demonstrate the possibilities
+
+00:04:34.639 --> 00:04:38.720
+of Vue-based extensions in Emacs.
+
+04:38.720 --> 00:04:41.520
+The first one is the EAF File Manager,
+
+04:41.520 --> 00:04:44.160
+written by ManateeLazycat himself,
+
+00:04:44.160 --> 00:04:46.400
+as an alternative option to dired,
+
+00:04:46.400 --> 00:04:47.919
+as he found dired's performance
+
+00:04:47.919 --> 00:04:49.280
+to lag considerably
+
+04:49.280 --> 00:04:52.240
+when there are way too many files.
+
+04:52.240 --> 00:04:56.080
+It supports wdired and fd functionality,
+
+00:04:56.080 --> 00:05:01.600
+and let me demonstrate that to you.
+
+05:01.600 --> 00:05:06.160
+See? And this is the app.
+
+05:06.160 --> 00:05:08.639
+Go back here.
+
+05:08.639 --> 00:05:12.240
+Another one is the EAF RSS Reader,
+
+05:12.240 --> 00:05:15.039
+written by our Summer of Code 2021 student
+
+00:05:15.039 --> 00:05:18.240
+ShaoChenHeng. It is a fast RSS reader
+
+00:05:18.240 --> 00:05:21.600
+that uses the EAF browser for previews,
+
+05:21.600 --> 00:05:32.479
+and let me demo that to you as well.
+
+05:32.479 --> 00:05:35.039
+Pragmatic Emacs.
+
+05:35.039 --> 00:05:37.199
+And you can view every site
+
+00:05:37.199 --> 00:05:45.359
+in the EAF Browser.
+
+05:45.360 --> 00:05:46.880
+To ease the process
+
+00:05:46.880 --> 00:05:49.840
+of creating a new EAF application,
+
+00:05:49.840 --> 00:05:52.880
+we've separated the EAF core and its apps,
+
+00:05:52.880 --> 00:05:54.479
+so that EAF apps now have
+
+00:05:54.479 --> 00:05:56.800
+their individual repositories.
+
+00:05:56.800 --> 00:05:58.000
+You can find them under
+
+00:05:58.000 --> 00:06:02.000
+the emacs-eaf GitHub organization.
+
+06:02.000 --> 00:06:04.560
+Because of the number of EAF apps
+
+00:06:04.560 --> 00:06:05.840
+and their dependencies
+
+00:06:05.840 --> 00:06:08.319
+that vary from system to system,
+
+06:08.319 --> 00:06:10.080
+we've also introduced a new
+
+00:06:10.080 --> 00:06:12.639
+=M-x eaf-install-and-update= command
+
+00:06:12.639 --> 00:06:14.560
+which is a wrapper around the new
+
+00:06:14.560 --> 00:06:17.039
+install-eaf python script
+
+00:06:17.039 --> 00:06:19.280
+dedicated to installing, updating,
+
+00:06:19.280 --> 00:06:20.720
+and maintaining EAF apps
+
+00:06:20.720 --> 00:06:21.680
+and their dependencies
+
+00:06:21.680 --> 00:06:24.160
+for the end user.
+
+06:24.160 --> 00:06:25.600
+Now it is very easy
+
+00:06:25.600 --> 00:06:27.440
+to create a new EAF app.
+
+00:06:27.440 --> 00:06:29.039
+You just need to do it.
+
+00:06:29.039 --> 00:06:31.120
+You can just do it in your own repository,
+
+00:06:31.120 --> 00:06:34.720
+such as in GitHub, GitLab, or wherever.
+
+06:34.720 --> 00:06:36.160
+The first thing to do is
+
+00:06:36.160 --> 00:06:39.520
+to fork the eaf-demo or the eaf-vue-demo
+
+00:06:39.520 --> 00:06:41.280
+as a starting template,
+
+00:06:41.280 --> 00:06:43.520
+then update the dependencies.json file
+
+00:06:43.520 --> 00:06:46.400
+to list the new dependencies you introduced
+
+06:46.400 --> 00:06:48.560
+on various systems.
+
+06:48.560 --> 00:06:51.199
+Afterwards, once your app is finished,
+
+00:06:51.199 --> 00:06:53.039
+you simply need to submit a PR
+
+00:06:53.039 --> 00:06:54.000
+to the EAF core
+
+06:54.000 --> 00:06:56.720
+that modifies the applications.json list
+
+06:56.720 --> 00:07:03.039
+to include your new app. And that's it.
+
+07:03.039 --> 00:07:04.720
+Come try it out and write your own
+
+00:07:04.720 --> 00:07:09.598
+EAF extensions today!
+
+07:09.599 --> 00:07:11.840
+There are many other new updates.
+
+00:07:11.840 --> 00:07:13.919
+To list a few: we reached
+
+00:07:13.919 --> 00:07:17.199
+more than 60 contributors, hooray!
+
+07:17.199 --> 00:07:19.759
+And also, you can now use the familiar
+
+07:19.759 --> 00:07:22.160
+Control s and Control r isearch
+
+00:07:22.160 --> 00:07:23.280
+for real-time search,
+
+00:07:23.280 --> 00:07:24.560
+functioning very similar
+
+00:07:24.560 --> 00:07:27.039
+to the Emacs isearch,
+
+07:27.039 --> 00:07:29.759
+in the EAF Browser, PDF Viewer,
+
+00:07:29.759 --> 00:07:32.080
+and many other applications.
+
+07:32.080 --> 00:07:34.000
+Additionally, you can also create
+
+00:07:34.000 --> 00:07:35.680
+EAF PDF annotations
+
+00:07:35.680 --> 00:07:44.318
+either inline or as a pop-up, etc. etc. etc.
+
+07:44.319 --> 00:07:47.680
+Finally, let's talk about Popweb.
+
+07:47.680 --> 00:07:50.080
+Popweb is a very, very new project
+
+00:07:50.080 --> 00:07:52.639
+that started like exactly two weeks ago,
+
+00:07:52.639 --> 00:07:55.199
+that focuses particularly on the
+
+00:07:55.199 --> 00:07:55.919
+multimedia pop-up functionality in Emacs.
+
+00:07:55.919 --> 00:08:02.080
+Pop is considered to be a sister project
+
+00:08:02.080 --> 00:08:04.879
+and lightweight version of EAF.
+
+08:04.879 --> 00:08:07.039
+They both share a very similar design
+
+08:07.039 --> 00:08:09.039
+and some code, and they are maintained
+
+00:08:09.039 --> 00:08:10.080
+by the same people,
+
+00:08:10.080 --> 00:08:13.680
+which is me and ManateeLazycat.
+
+08:13.680 --> 00:08:15.599
+Here's a quick demo to see the
+
+08:15.599 --> 00:08:23.840
+responsiveness of its preview.
+
+08:23.840 --> 00:08:27.919
+Here we go. On the right, see...
+
+00:08:27.919 --> 00:08:30.720
+Oh, here we go. Yes.
+
+08:30.720 --> 00:08:32.560
+And these are the LaTeX preview.
+
+00:08:32.560 --> 00:08:44.800
+I can quickly show the next one.
+
+08:44.800 --> 00:08:48.160
+So this is the end of my presentation.
+
+08:48.160 --> 00:08:50.000
+Feel free to post questions
+
+00:08:50.000 --> 00:08:52.160
+on the collaborative pad, IRC,
+
+00:08:52.160 --> 00:08:53.519
+or directly send me an email.
+
+00:08:53.519 --> 00:08:55.680
+I'll be around all this,
+
+00:08:55.680 --> 00:08:57.839
+at all these places,
+
+08:57.839 --> 00:08:59.519
+and if you found any issue,
+
+00:08:59.519 --> 00:09:01.200
+please submit an issue
+
+00:09:01.200 --> 00:09:04.160
+to the EAF official issues,
+
+00:09:04.160 --> 00:09:08.880
+and don't forget to check out the wiki.
+
+09:08.880 --> 00:09:10.160
+Thank you and enjoy
+
+00:09:10.160 --> 00:09:13.680
+the rest of EmacsConf 2021.
+
+00:09:13.680 --> 00:09:14.680
+[captions by sachac]
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--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--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--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-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-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 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.vtt
new file mode 100644
index 00000000..b450f532
--- /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.vtt
@@ -0,0 +1,1054 @@
+WEBVTT
+
+00:00.880 --> 00:02.720
+[Raymond Puzio]: Hello, I'm Raymond Puzio.
+
+00:02.720 --> 00:04.799
+I first learned about Emacs and Lisp
+
+00:04.799 --> 00:05.920
+at an enrichment program
+
+00:05.920 --> 00:07.200
+for high school students.
+
+00:07.200 --> 00:09.120
+When I studied physics at the university,
+
+00:09.120 --> 00:10.400
+I used Emacs and Tex
+
+00:10.400 --> 00:12.320
+to write mathematical documents.
+
+00:12.320 --> 00:13.920
+Later on, I became active
+
+00:13.920 --> 00:16.480
+in Emacs and Lisp user groups where,
+
+00:16.480 --> 00:18.160
+among other things, I learned about
+
+00:18.160 --> 00:20.400
+Org mode for reproducible research.
+
+00:20.400 --> 00:21.680
+Nowadays, I am working on
+
+00:21.680 --> 00:24.080
+synthesizing Emacs and other programs
+
+00:24.080 --> 00:25.599
+into an end-to-end platform
+
+00:25.599 --> 00:30.560
+for scientific research and collaboration.
+
+00:30.560 --> 00:31.519
+[Joe Corneli]: I'm Joe Corneli.
+
+00:31.519 --> 00:33.920
+I also started using Emacs in high school
+
+00:33.920 --> 00:35.440
+in a course on C programming,
+
+00:35.440 --> 00:36.800
+and now I'm technically
+
+00:36.800 --> 00:38.239
+a computer scientist.
+
+00:38.239 --> 00:39.280
+My research background
+
+00:39.280 --> 00:43.120
+is in mathematics and online communities.
+
+00:43.120 --> 00:45.039
+[Noorah Alhasan]: Hi, I'm Noorah Alhasan.
+
+00:45.039 --> 00:46.719
+I'm a member of the ERG group
+
+00:46.719 --> 00:49.600
+and a PhD student at UT Austin
+
+00:49.600 --> 00:51.760
+studying climate policy.
+
+00:51.760 --> 00:54.239
+So for this talk, the four of us
+
+00:54.239 --> 00:56.640
+met at EmacsConf 2020 last year
+
+00:56.640 --> 00:57.760
+with a common interest
+
+00:57.760 --> 00:59.520
+in Emacs and research.
+
+00:59.520 --> 01:01.760
+we've met almost every week since then
+
+01:01.760 --> 01:02.640
+because we wanted to
+
+01:02.640 --> 01:04.479
+keep the conversation going.
+
+01:04.479 --> 01:05.519
+In this short talk,
+
+01:05.519 --> 01:06.560
+we share information
+
+01:06.560 --> 01:08.240
+about the methods we use.
+
+01:08.240 --> 01:09.680
+Here's the outline of our talk.
+
+01:09.680 --> 01:10.560
+First, we'll tell you
+
+01:10.560 --> 01:12.320
+about the technologies we use
+
+01:12.320 --> 01:13.840
+and show a short demo video
+
+01:13.840 --> 01:15.360
+from one of the meetings.
+
+01:15.360 --> 01:16.320
+We'll then focus on
+
+01:16.320 --> 01:18.880
+the time and content structuring methods
+
+01:18.880 --> 01:21.040
+we use in our live sessions.
+
+01:21.040 --> 01:22.240
+Finally, we'll talk about
+
+01:22.240 --> 01:24.320
+what came out of all this work.
+
+01:24.320 --> 01:28.159
+For example, we wrote a paper for the
+
+01:28.159 --> 01:30.400
+Pattern Languages of Programs conference,
+
+01:30.400 --> 01:31.759
+and we designed a workshop
+
+01:31.759 --> 01:33.920
+using the knowledge we created together.
+
+01:33.920 --> 01:35.600
+Very practically,
+
+01:35.600 --> 01:37.119
+this has improved the quality
+
+01:37.119 --> 01:38.640
+of our own collaboration
+
+01:38.640 --> 01:39.680
+and we have some lessons
+
+01:39.680 --> 01:41.360
+about how you can create
+
+01:41.360 --> 00:01:45.999
+a research community similar to ours.
+
+01:46.000 --> 01:48.399
+[Joe]: You'll have noticed that we all have
+
+01:48.399 --> 01:50.159
+different research backgrounds
+
+01:50.159 --> 01:52.640
+and we do think that transdisciplinarity
+
+01:52.640 --> 01:54.960
+is important for solving big problems.
+
+01:54.960 --> 01:56.719
+However, if you have people
+
+01:56.719 --> 01:58.000
+from different research backgrounds
+
+01:58.000 --> 01:58.560
+working together,
+
+01:58.560 --> 01:59.680
+they need some scaffolding,
+
+01:59.680 --> 02:01.360
+both in terms of tools and methods,
+
+02:01.360 --> 02:02.880
+to have good conversations.
+
+02:02.880 --> 02:04.320
+And of course, as Emacs users,
+
+02:04.320 --> 02:05.439
+we wanted to have Emacs
+
+02:05.439 --> 02:07.360
+at the center of that.
+
+02:07.360 --> 02:08.640
+Being in a meeting,
+
+02:08.640 --> 02:10.720
+taking real-time notes
+
+02:10.720 --> 02:11.920
+collaboratively with Emacs
+
+02:11.920 --> 02:13.440
+realizes a dream that some of us
+
+02:13.440 --> 02:14.480
+have been entertaining
+
+02:14.480 --> 02:15.520
+(and experimenting with)
+
+02:15.520 --> 02:18.800
+for a while. The package crdt.el
+
+02:18.800 --> 02:21.440
+by Qiantan Hong makes this easy.
+
+02:21.440 --> 02:22.959
+We take notes in our meetings
+
+02:22.959 --> 02:24.239
+using Org Mode.
+
+02:24.239 --> 02:25.520
+Since we've seen this before
+
+02:25.520 --> 02:27.040
+in talks on reproducible research,
+
+02:27.040 --> 02:29.920
+and since Leo is the maintainer of org-roam,
+
+02:29.920 --> 02:31.680
+it was a natural choice for us.
+
+02:31.680 --> 02:32.400
+It allows us to
+
+02:32.400 --> 02:34.080
+put our notes online using git
+
+02:34.080 --> 02:36.080
+and the static state generator Firn.
+
+02:36.080 --> 02:37.599
+And lastly, of course, we need
+
+02:37.599 --> 02:38.720
+a real-time meeting tool.
+
+02:38.720 --> 02:39.519
+For that purpose,
+
+02:39.519 --> 02:41.920
+we use BBB in our weekly sessions
+
+02:41.920 --> 02:43.519
+(in fact, we use the same server
+
+02:43.519 --> 02:44.879
+that's used by EmacsConf,
+
+02:44.879 --> 02:46.720
+thanks again to Leo).
+
+02:46.720 --> 02:48.000
+All of these tools are
+
+02:48.000 --> 02:49.380
+free/libre/open source.
+
+02:49.380 --> 02:50.720
+However, BBB does have
+
+02:50.720 --> 00:02:53.679
+some intensive hardware requirements.
+
+02:53.680 --> 02:54.800
+Next up, here's a
+
+02:54.800 --> 02:56.239
+short pre-recorded snippet
+
+02:56.239 --> 02:57.680
+from one of our recent meetings
+
+02:57.680 --> 03:01.840
+so you can get a sense of how they go.
+
+03:01.840 --> 03:02.640
+[Demo - Leo Vivier]: Are we okay
+
+03:02.640 --> 03:04.159
+pushing the demo to the end?
+
+03:04.159 --> 03:05.440
+That kind of presupposes
+
+03:05.440 --> 03:07.120
+a different structure
+
+03:07.120 --> 03:08.080
+that you would usually have
+
+03:08.080 --> 03:08.800
+in a presentation.
+
+03:08.800 --> 03:09.760
+Generally you have...
+
+03:09.760 --> 03:12.800
+You introduce the demo, you do the demo,
+
+03:12.800 --> 03:14.720
+and then you do the conclusions,
+
+03:14.720 --> 03:16.560
+or what was good about the demo.
+
+03:16.560 --> 03:18.159
+Does that make sense to everyone?
+
+03:18.159 --> 03:18.560
+[Ray]: Let's see.
+
+03:18.560 --> 03:19.599
+When you usually do that,
+
+03:19.599 --> 03:21.760
+that's because whatever you're demonstrating
+
+03:21.760 --> 03:23.840
+is the main point of your talk,
+
+03:23.840 --> 03:25.840
+so if this was a talk about action reviews,
+
+03:25.840 --> 03:29.760
+that would make sense, but isn't it not ERG?
+
+03:29.760 --> 03:32.319
+[Leo]: But it's because we are telling...
+
+03:32.319 --> 03:34.400
+For me, I think it's a compound element.
+
+03:34.400 --> 03:36.640
+Yes, we are demonstrating the power,
+
+03:36.640 --> 03:37.840
+but we are also demonstrating
+
+03:37.840 --> 03:39.680
+how we're working together by...
+
+03:39.680 --> 03:42.000
+Yes, we might have introduced CRDT before
+
+03:42.000 --> 03:43.840
+in the presentation itself,
+
+03:43.840 --> 03:46.959
+but if we need to be doing the power,
+
+03:46.959 --> 03:49.360
+and also showing tools like CRDT,
+
+03:49.360 --> 03:50.879
+obviously, we're not... probably not going
+
+03:50.879 --> 03:52.959
+to be talking about... oh by the way,
+
+03:52.959 --> 03:54.239
+here we are using CRDT
+
+03:54.239 --> 03:54.879
+and stuff like this.
+
+03:54.879 --> 03:57.280
+It feels like cramming a lot of stuff
+
+03:57.280 --> 03:58.720
+into this demo at the end.
+
+03:58.720 --> 04:00.159
+[Joe]: So I think demo to me
+
+04:00.159 --> 04:02.159
+is less about demoing one of the methods,
+
+04:02.159 --> 04:02.879
+because then people will get
+
+04:02.879 --> 04:05.439
+a bit hung up on that.
+
+04:05.439 --> 04:07.360
+I think the demo...
+
+04:07.360 --> 04:08.080
+You know, to be honest,
+
+04:08.080 --> 04:09.200
+here's another thing.
+
+04:09.200 --> 04:09.920
+What we could do--
+
+04:09.920 --> 04:10.959
+this would be very clever--
+
+04:10.959 --> 04:12.400
+we could make this the demo,
+
+04:12.400 --> 04:13.920
+what we're doing right now,
+
+04:13.920 --> 04:15.519
+writing this talk is the demo,
+
+04:15.519 --> 04:18.560
+and just go back into the video
+
+04:18.560 --> 04:20.160
+and just get out a two-minute section,
+
+04:20.160 --> 04:22.479
+so we say, look we tried to write this talk,
+
+04:22.479 --> 04:23.680
+we went around, had a discussion,
+
+04:23.680 --> 04:25.040
+we had these things and then we just take...
+
+04:25.040 --> 04:26.240
+We're going to pick two minutes
+
+04:26.240 --> 04:26.880
+out of this video
+
+04:26.880 --> 04:27.440
+and show you that
+
+04:27.440 --> 04:29.280
+as a demo of how we actually work
+
+04:29.280 --> 04:30.320
+and then we'll go back to the talk.
+
+04:30.320 --> 04:31.199
+I mean, it'd be very funny,
+
+04:31.199 --> 04:32.880
+and then we've already done the demo.
+
+04:32.880 --> 04:34.560
+It's just, like... uh yeah,
+
+04:34.560 --> 04:35.280
+then we're good to go.
+
+04:35.280 --> 04:37.120
+And it's got neural lines on the floor.
+
+04:37.120 --> 04:39.199
+It's like a perfect writer's room.
+
+04:39.199 --> 04:41.199
+It's a total amazing writer's room scenario,
+
+04:41.199 --> 04:43.120
+specifically because she's lying on her back
+
+04:43.120 --> 04:45.360
+on the floor. Anyway. I mean,
+
+04:45.360 --> 04:47.680
+I think this would be fine.
+
+04:47.680 --> 04:49.520
+[Leo]: I think I particularly like the idea
+
+04:49.520 --> 04:52.080
+of taking the snippet,
+
+04:52.080 --> 04:54.000
+the two minutes before the realization
+
+04:54.000 --> 04:56.400
+that we could be using this as the demo,
+
+04:56.400 --> 05:00.240
+and then seeing the... well my face light up
+
+05:00.240 --> 05:01.680
+because it feels like a good idea,
+
+05:01.680 --> 05:03.360
+and Joe gets excited about this.
+
+05:03.360 --> 05:04.720
+I think this could be a good demo,
+
+05:04.720 --> 05:07.120
+and I think this would be
+
+05:07.120 --> 05:08.479
+a very genuine demonstration
+
+05:08.479 --> 05:09.360
+of how we work here
+
+05:09.360 --> 05:10.400
+and how we get excited about
+
+05:10.400 --> 00:05:13.599
+some of our ideas sometimes.
+
+05:13.600 --> 05:14.639
+[Noorah]: In the demo,
+
+05:14.639 --> 05:16.240
+you saw a very improvised
+
+05:16.240 --> 05:18.000
+free-flowing conversation.
+
+05:18.000 --> 05:19.840
+In order to have this kind of conversation
+
+05:19.840 --> 05:20.960
+and still get things done,
+
+05:20.960 --> 05:23.520
+we need a pretty rigorous structure in place
+
+05:23.520 --> 05:26.000
+at the bigger scale of the meetings.
+
+05:26.000 --> 05:27.120
+This involves both
+
+05:27.120 --> 05:31.280
+a timetable for the meetings
+
+05:31.280 --> 00:05:35.119
+and some review and planning processes.
+
+05:35.120 --> 05:36.320
+[Joe]: Just to say a little bit more
+
+05:36.320 --> 05:40.160
+about the timetable, if you could go back,
+
+05:40.160 --> 05:42.320
+the meetings are generally following
+
+05:42.320 --> 05:45.199
+a structure as we have up on the screen
+
+05:45.199 --> 05:46.479
+of informal check-ins
+
+05:46.479 --> 05:48.400
+followed by any announcements,
+
+05:48.400 --> 05:50.960
+and then two topics, at most two topics,
+
+05:50.960 --> 05:52.560
+with a break in the middle.
+
+05:52.560 --> 05:54.800
+The whole thing takes about two hours,
+
+05:54.800 --> 05:56.400
+and we meet weekly.
+
+05:56.400 --> 05:58.160
+The consistency of these meetings
+
+05:58.160 --> 05:58.800
+is really important
+
+05:58.800 --> 00:06:00.719
+for how the group works.
+
+06:00.720 --> 06:02.560
+[Ray]: At at the end of every meeting,
+
+06:02.560 --> 06:03.600
+we ask and answer
+
+06:03.600 --> 06:04.800
+a series of questions
+
+06:04.800 --> 06:07.120
+adapted from the ‘After Action Review’
+
+06:07.120 --> 06:08.880
+developed by the United States Army
+
+06:08.880 --> 06:10.800
+in their training programs,
+
+06:10.800 --> 06:13.840
+and also used in some business contexts.
+
+06:13.840 --> 06:15.759
+The adaptation we use here
+
+06:15.759 --> 06:17.440
+came out of the Peeragogy project,
+
+06:17.440 --> 06:19.600
+which some of us have been involved with
+
+06:19.600 --> 06:22.160
+since 2012, and it's designed to be
+
+06:22.160 --> 06:24.560
+less hierarchical than the army's review.
+
+06:24.560 --> 06:26.960
+By writing down and sharing these reviews,
+
+06:26.960 --> 06:28.240
+we create a resource
+
+06:28.240 --> 06:29.600
+for further peer learning
+
+06:29.600 --> 00:06:32.239
+later down the line.
+
+06:32.240 --> 06:33.280
+[Joe]: So, specifically,
+
+06:33.280 --> 06:34.560
+every six weeks or so,
+
+06:34.560 --> 06:35.840
+we look at the transcripts
+
+06:35.840 --> 06:37.360
+from the previous action reviews
+
+06:37.360 --> 06:39.120
+using a four-layered framework
+
+06:39.120 --> 06:41.199
+that comes from future studies,
+
+06:41.199 --> 06:42.560
+and we use this to better understand
+
+06:42.560 --> 06:43.759
+the underlying themes
+
+06:43.759 --> 06:44.880
+that surface in the reviews
+
+06:44.880 --> 06:46.479
+and to develop the deeper motivations
+
+06:46.479 --> 06:48.160
+for ongoing work together.
+
+06:48.160 --> 06:49.680
+This helps us get a big-picture sense
+
+06:49.680 --> 06:50.720
+of where we're going,
+
+06:50.720 --> 06:51.840
+and we can keep that up to date
+
+06:51.840 --> 06:52.720
+at a slower pace
+
+06:52.720 --> 06:54.479
+than we do in the weekly meetings.
+
+06:54.479 --> 06:55.759
+This also helps us tie our work
+
+06:55.759 --> 06:56.880
+into a broader context
+
+06:56.880 --> 06:57.759
+and gives us some hope
+
+06:57.759 --> 06:59.919
+that over time we can contribute to
+
+06:59.919 --> 00:07:02.318
+solving big problems.
+
+07:02.319 --> 07:02.880
+[Ray]: Going back
+
+07:02.880 --> 07:04.880
+to solving larger problems.
+
+07:04.880 --> 07:06.560
+When we carry out the analysis,
+
+07:06.560 --> 07:08.400
+we don't just think about what happened
+
+07:08.400 --> 07:09.440
+at previous meetings,
+
+07:09.440 --> 07:11.520
+but we also take a longer view,
+
+07:11.520 --> 07:12.960
+thinking about things such as
+
+07:12.960 --> 07:15.680
+structuring a community of collaborators,
+
+07:15.680 --> 07:16.960
+or building platforms
+
+07:16.960 --> 07:18.720
+for scientific research.
+
+07:18.720 --> 07:20.080
+We want to think about how
+
+07:20.080 --> 07:21.120
+what we have been doing
+
+07:21.120 --> 07:23.599
+fits into broader historical patterns
+
+07:23.599 --> 07:24.720
+and trends.
+
+07:24.720 --> 07:27.120
+In the past, the pattern is a
+
+07:27.120 --> 07:28.240
+historical pattern;
+
+07:28.240 --> 07:30.000
+in the present, we contextualize
+
+07:30.000 --> 07:32.400
+what we learned about designed futures;
+
+07:32.400 --> 07:34.639
+towards the future, we use these patterns
+
+07:34.639 --> 07:37.440
+to augment our big-picture analysis
+
+07:37.440 --> 07:38.800
+with the next steps.
+
+07:38.800 --> 00:07:42.879
+This helps keep us on track.
+
+07:42.880 --> 07:44.720
+[Noorah]: Okay. So we have been working on
+
+07:44.720 --> 07:46.160
+several projects: a paper
+
+07:46.160 --> 07:47.280
+for the pattern conference
+
+07:47.280 --> 07:48.240
+mentioned earlier,
+
+07:48.240 --> 07:50.080
+a workshop, and a user study,
+
+07:50.080 --> 07:51.280
+and we'll say a little bit more
+
+07:51.280 --> 00:07:53.598
+about these.
+
+07:53.599 --> 07:56.319
+We co-authored a paper
+
+07:56.319 --> 07:57.919
+that touches on all of the topics
+
+07:57.919 --> 07:58.960
+we mentioned earlier
+
+07:58.960 --> 08:01.120
+and presented it at the leading conference
+
+08:01.120 --> 08:02.080
+on Design Patterns
+
+08:02.080 --> 08:04.000
+for programs and programming.
+
+08:04.000 --> 08:09.520
+One of the case studies in the paper
+
+08:09.520 --> 08:12.960
+sums up the way we work in ERG.
+
+08:12.960 --> 08:16.000
+The paper puts ERG in context
+
+08:16.000 --> 08:17.520
+with other peer learning communities,
+
+08:17.520 --> 08:18.960
+and we aim to describe
+
+08:18.960 --> 08:20.160
+our way of working
+
+08:20.160 --> 08:22.720
+in a way that others would find accessible
+
+08:22.720 --> 00:08:24.559
+and potentially useful.
+
+08:24.560 --> 08:25.680
+We are also developing
+
+08:25.680 --> 08:27.039
+an interactive workshop
+
+08:27.039 --> 08:28.800
+based on the ideas in the paper,
+
+08:28.800 --> 08:31.039
+which we piloted at the PLoP conference.
+
+08:31.039 --> 08:32.479
+Our intent with the workshop
+
+08:32.479 --> 08:34.800
+was to build a method
+
+08:34.800 --> 08:36.240
+for rapid problem solving,
+
+08:36.240 --> 08:37.839
+which could, at least in principle,
+
+08:37.839 --> 08:40.159
+expand beyond the workshop setting
+
+08:40.159 --> 08:41.839
+to distributed networks.
+
+08:41.839 --> 08:44.080
+The workshop involves made-up roles,
+
+08:44.080 --> 08:45.440
+like a kaiju communicator
+
+08:45.440 --> 08:46.800
+who helps understand problems
+
+08:46.800 --> 08:47.839
+as they arise.
+
+08:47.839 --> 08:49.760
+We also realize that it has given us
+
+08:49.760 --> 08:51.279
+a lot of wealth for thinking about
+
+08:51.279 --> 00:08:57.518
+the roles we take on in our weekly meetings.
+
+08:57.519 --> 08:59.920
+[Ray]: Free software may be lacking
+
+08:59.920 --> 09:01.200
+on ‘user’ aspects.
+
+09:01.200 --> 09:02.720
+People too often program
+
+09:02.720 --> 09:04.320
+to scratch their own itches,
+
+09:04.320 --> 09:06.720
+and assume others will do the same.
+
+09:06.720 --> 09:09.360
+To deal with this, we did several things.
+
+09:09.360 --> 09:11.040
+We looked at user experience
+
+09:11.040 --> 09:12.160
+and development together
+
+09:12.160 --> 09:13.760
+to see how the process went
+
+09:13.760 --> 09:15.440
+and where the gaps might be.
+
+09:15.440 --> 09:17.600
+We compared Emacs with other platforms,
+
+09:17.600 --> 09:19.279
+not just a technical level,
+
+09:19.279 --> 09:21.440
+but also at the user experience level.
+
+09:21.440 --> 09:22.640
+We had guest sessions,
+
+09:22.640 --> 09:25.440
+where we've started to gather user stories.
+
+09:25.440 --> 09:26.880
+Building on these conversations,
+
+09:26.880 --> 09:28.480
+we would like to do more research
+
+09:28.480 --> 09:29.839
+in all these topics,
+
+09:29.839 --> 09:30.959
+and eventually be able to
+
+09:30.959 --> 09:32.160
+say something like:
+
+09:32.160 --> 09:34.160
+‘If you are someone who does X,
+
+09:34.160 --> 09:35.279
+these are the packages
+
+09:35.279 --> 00:09:38.479
+that would work for you.’
+
+09:38.480 --> 09:40.640
+[Joe]: Putting these ideas into practice,
+
+09:40.640 --> 09:42.880
+our PLoP paper and the plans it contains
+
+09:42.880 --> 09:43.680
+become a /template/
+
+09:43.680 --> 09:44.720
+for some of the other things
+
+09:44.720 --> 09:45.600
+we want to work on
+
+09:45.600 --> 09:46.880
+as we go forward.
+
+09:46.880 --> 09:49.120
+If we imagine things in 2-3 years,
+
+09:49.120 --> 09:49.920
+what would it actually take
+
+09:49.920 --> 09:52.240
+to realize the vision from that paper?
+
+09:52.240 --> 09:53.200
+Thinking about the future:
+
+09:53.200 --> 09:54.480
+this is one of the main reasons why
+
+09:54.480 --> 09:55.839
+we want to share these ideas
+
+09:55.839 --> 09:56.800
+and invite other people
+
+09:56.800 --> 09:58.160
+into this way of working.
+
+09:58.160 --> 09:59.600
+There's no way we can actually achieve
+
+09:59.600 --> 10:00.560
+everything in our vision
+
+10:00.560 --> 10:02.160
+if we work all by ourselves.
+
+10:02.160 --> 10:03.200
+What we've been focusing on
+
+10:03.200 --> 10:05.120
+in Season Zero of the Emacs Research Group
+
+10:05.120 --> 10:06.640
+is methods that people can use
+
+10:06.640 --> 00:10:08.559
+to organize their own research groups.
+
+10:08.560 --> 10:10.000
+We decided to share this talk
+
+10:10.000 --> 10:12.079
+so that folks can learn from our community.
+
+10:12.079 --> 10:13.040
+Our goal has been to share
+
+10:13.040 --> 10:14.000
+how we've been doing things,
+
+10:14.000 --> 10:14.959
+and we hope this information
+
+10:14.959 --> 10:16.079
+is useful for you
+
+10:16.079 --> 10:18.800
+in your own communities and collaborations.
+
+10:18.800 --> 10:19.262
+Thank you.
+
+10:19.262 --> 10:20.279
+[captions by speakers and sachac]
diff --git a/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt b/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt
new file mode 100644
index 00000000..a5edb43f
--- /dev/null
+++ b/2021/captions/emacsconf-2021-exec--org-as-an-executable-format--tom-gillespie--main.vtt
@@ -0,0 +1,550 @@
+WEBVTT
+
+00:00.320 --> 00:00:03.679
+Hello all! Welcome to EmacsConf 2021.
+
+00:00:03.679 --> 00:00:05.040
+I'm Tom Gillespie.
+
+00:00:05.040 --> 00:00:06.799
+Thank you to the organizers for
+
+00:00:06.799 --> 00:00:07.680
+all your hard work,
+
+00:00:07.680 --> 00:00:08.639
+and for inviting me to
+
+00:00:08.639 --> 00:00:10.021
+give this short talk on
+
+00:00:10.021 --> 00:00:12.240
+"Org as an executable format".
+
+00:00:12.240 --> 00:00:13.840
+The links to the talk page,
+
+00:00:13.840 --> 00:00:16.000
+the GitHub page for the project,
+
+00:00:16.000 --> 00:00:18.880
+and the package on MELPA
+
+00:18.880 --> 00:00:20.160
+are listed on the right.
+
+00:00:20.160 --> 00:00:21.760
+Let's start with one of the motivating
+
+00:00:21.760 --> 00:00:25.920
+use cases for executable Org files.
+
+00:25.920 --> 00:00:29.339
+Many users keep global configuration
+
+00:00:29.339 --> 00:00:31.840
+for Org in an init.el file,
+
+00:00:31.840 --> 00:00:33.520
+which works for many workflows.
+
+00:00:33.520 --> 00:00:36.239
+However, for reproducible research,
+
+00:00:36.239 --> 00:00:37.600
+this is a challenge
+
+00:00:37.600 --> 00:00:39.280
+because if an Org file is
+
+00:00:39.280 --> 00:00:41.440
+dissociated from the init.el file,
+
+00:00:41.440 --> 00:00:43.040
+then often it will no longer
+
+00:00:43.040 --> 00:00:44.640
+function as expected.
+
+00:44.640 --> 00:46.719
+One potential solution to this problem
+
+00:46.719 --> 00:48.160
+is to be able to include all of the
+
+00:48.160 --> 00:00:50.239
+global configuration for Emacs
+
+00:00:50.239 --> 00:00:52.960
+and the environment in the Org file itself,
+
+00:00:52.960 --> 00:00:53.840
+in which case when you
+
+00:00:53.840 --> 00:00:55.440
+go to reuse the Org file,
+
+00:00:55.440 --> 00:00:58.640
+it will work as expected.
+
+00:58.640 --> 00:01:00.480
+What does an executable Org file
+
+00:01:00.480 --> 00:01:02.559
+look like in action?
+
+01:02.559 --> 01:05.280
+Here's a demo of an executable Org file
+
+01:05.280 --> 01:09.680
+running in Bash, Dash, Zsh, and PowerShell.
+
+01:09.680 --> 00:01:14.799
+So, we are currently in Bash,
+
+01:14.799 --> 01:19.360
+and we can run our demo,
+
+01:19.360 --> 00:01:21.119
+and it will print some stuff,
+
+00:01:21.119 --> 00:01:22.640
+and wait for input.
+
+01:22.640 --> 00:01:24.144
+We can also run it in Dash,
+
+00:01:24.144 --> 00:01:25.720
+which is the default for Debian
+
+00:01:25.720 --> 00:01:29.840
+and derivatives.
+
+01:29.840 --> 01:32.320
+Same program works as expected.
+
+01:32.320 --> 00:01:38.560
+Zsh also. And lastly PowerShell,
+
+01:38.560 --> 00:01:41.439
+if we try to run demo.org itself,
+
+00:01:41.439 --> 00:01:42.640
+we see (that) we get an error
+
+00:01:42.640 --> 00:01:43.764
+because PowerShell cares
+
+00:01:43.764 --> 00:01:45.439
+about file extensions,
+
+01:45.439 --> 00:01:49.840
+so, if we symlink to ps1,
+
+00:01:49.840 --> 00:01:51.680
+then it works as expected,
+
+00:01:51.680 --> 00:01:53.341
+and there are ways to alias this,
+
+00:01:53.341 --> 00:01:55.044
+so that you can run it as a program
+
+00:01:55.044 --> 00:01:58.640
+without the ps1 extension.
+
+01:58.640 --> 02:03.920
+So, how does this work?
+
+02:03.920 --> 00:02:05.759
+There are three components
+
+00:02:05.759 --> 00:02:07.352
+to an executable Org file
+
+00:02:07.352 --> 00:02:08.560
+that all need to be present
+
+00:02:08.560 --> 00:02:10.080
+in order for this to work.
+
+02:10.080 --> 02:11.920
+Starting from the top of the file,
+
+02:11.920 --> 02:14.239
+we have a shebang block.
+
+02:14.239 --> 00:02:16.640
+Next we have an Org Babel block
+
+00:02:16.640 --> 00:02:17.760
+written in Emacs Lisp,
+
+00:02:17.760 --> 00:02:20.000
+which is what we actually saw executing,
+
+00:02:20.000 --> 00:02:20.959
+and then there are some
+
+00:02:20.959 --> 00:02:23.520
+eval local variables or Elvs
+
+02:23.520 --> 02:25.200
+that are involved in making this
+
+02:25.200 --> 02:26.800
+actually executable.
+
+02:26.800 --> 02:29.760
+Let's start with the shebang block.
+
+02:29.760 --> 00:02:33.280
+Org syntax does not have support
+
+00:02:33.280 --> 00:02:34.959
+for shebang lines.
+
+02:34.959 --> 02:37.120
+However, it supports the shebang block.
+
+02:37.120 --> 02:39.440
+This is because Org comments, blocks,
+
+02:39.440 --> 00:02:41.760
+keywords, etc. that start with the
+
+00:02:41.760 --> 00:02:43.920
+sharp sign have the same syntax as
+
+00:02:43.920 --> 00:02:46.720
+comments in POSIX and PowerShell.
+
+02:46.720 --> 00:02:53.280
+This block is in fact valid
+
+02:53.280 --> 00:02:55.040
+Bash, Dash, Zsh, PowerShell,
+
+00:02:55.040 --> 00:02:57.280
+and maybe some other shells as well.
+
+02:57.280 --> 00:03:02.480
+In essence what it does is,
+
+03:02.480 --> 00:03:03.440
+perform some setup
+
+00:03:03.440 --> 00:03:06.080
+to avoid polluting standard output,
+
+00:03:06.080 --> 00:03:07.516
+and then it runs Emacs
+
+00:03:07.516 --> 00:03:08.959
+to load the file itself.
+
+00:03:08.959 --> 00:03:12.640
+The Elisp that is passed on the command line
+
+00:03:12.640 --> 00:03:14.959
+is explicated over here on the right,
+
+03:14.959 --> 00:03:17.920
+and in essence what it does is,
+
+00:03:17.920 --> 00:03:20.480
+to keep the startup time minimal
+
+00:03:20.480 --> 00:03:21.760
+and as low as possible,
+
+00:03:21.760 --> 00:03:24.080
+it loads the absolute bare minimum
+
+00:03:24.080 --> 00:03:25.120
+needed for Babel,
+
+00:03:25.120 --> 00:03:27.519
+and then it calls hack-local-variables
+
+00:03:27.519 --> 00:03:31.680
+triggering the eval-local-variables.
+
+03:31.680 --> 00:03:33.614
+What do the eval-local-variables do,
+
+00:03:33.614 --> 00:03:34.799
+and how those work?
+
+00:03:34.799 --> 00:03:36.319
+The essence of the approach is to
+
+00:03:36.319 --> 00:03:38.720
+use org-confirm-babel-evaluate
+
+00:03:38.720 --> 00:03:40.480
+to allow Babel execution.
+
+00:03:40.480 --> 00:03:43.360
+We can't set it to nil because that is
+
+00:03:43.360 --> 00:03:45.308
+an arbitrary code execution vector,
+
+00:03:45.308 --> 00:03:48.000
+which we don't want if we're sharing files.
+
+03:48.000 --> 00:03:49.555
+Instead what we do is,
+
+00:03:49.555 --> 00:03:52.000
+we use the fact that it can be a function,
+
+00:03:52.000 --> 00:03:55.280
+and we normalize the block of code,
+
+00:03:55.280 --> 00:03:57.320
+we checksum it, and then we check
+
+00:03:57.320 --> 00:03:59.280
+that it matches this checksum up here
+
+00:03:59.280 --> 00:04:00.400
+at the top of the file,
+
+00:04:00.400 --> 00:04:02.640
+and then sort of inside there,
+
+04:02.640 --> 00:04:04.159
+inside of org-sbe,
+
+00:04:04.159 --> 00:04:06.560
+which is Org source block evaluate,
+
+04:06.560 --> 04:08.959
+we call the block.
+
+04:08.959 --> 00:04:11.120
+The actual implementation of this
+
+00:04:11.120 --> 00:04:12.497
+is somewhat more complicated.
+
+00:04:12.497 --> 00:04:14.799
+However, it's small enough to fit in
+
+00:04:14.799 --> 00:04:17.519
+the local variables at the end of the file.
+
+04:17.519 --> 00:04:19.040
+One thing to note is that
+
+00:04:19.040 --> 00:04:20.799
+if you are using PowerShell,
+
+00:04:20.799 --> 00:04:23.919
+PowerShell parses the whole file
+
+00:04:23.919 --> 00:04:25.040
+which means that
+
+00:04:25.040 --> 00:04:27.759
+for any normal Org content,
+
+00:04:27.759 --> 00:04:28.639
+you need to put it in
+
+04:28.639 --> 00:04:30.240
+a multi-line PowerShell comment,
+
+00:04:30.240 --> 00:04:31.199
+and close it.
+
+00:04:31.199 --> 00:04:32.371
+So, once we hit
+
+00:04:32.371 --> 00:04:34.160
+hack-local-variables at the end,
+
+00:04:34.160 --> 00:04:37.120
+we run the eval-local-variables block,
+
+00:04:37.120 --> 00:04:40.880
+then we enter this Elisp block,
+
+04:40.880 --> 00:04:42.720
+and you can write whatever you want.
+
+00:04:42.720 --> 00:04:44.160
+All the power of Org Babel is
+
+00:04:44.160 --> 00:04:45.360
+now at your fingertips
+
+00:04:45.360 --> 00:04:47.199
+in order to do what you need
+
+04:47.199 --> 04:48.800
+for this file.
+
+04:48.800 --> 00:04:50.320
+Finally, let's do a quick demo
+
+00:04:50.320 --> 00:04:52.453
+of how to use this to make
+
+00:04:52.453 --> 00:04:54.800
+your own Org files executable.
+
+04:54.800 --> 00:05:01.840
+Orgstrap is available on MELPA as mentioned,
+
+05:01.840 --> 00:05:06.080
+and it can be installed using package.el
+
+00:05:06.080 --> 00:05:11.280
+by calling package-install orgstrap.
+
+05:11.280 --> 05:13.520
+It will download, and it will install.
+
+05:13.520 --> 00:05:18.720
+Then you can open an existing file
+
+05:18.720 --> 00:05:21.919
+or a new file. In this case,
+
+00:05:21.919 --> 00:05:25.199
+let me open a file called example.org.
+
+05:25.199 --> 00:05:26.996
+And then orgstrap provides
+
+00:05:26.996 --> 00:05:29.360
+command called orgstrap-init.
+
+05:29.360 --> 00:05:30.953
+What orgstrap-init does is,
+
+00:05:30.953 --> 00:05:33.759
+it populates a file with the machinery
+
+05:33.759 --> 00:05:36.639
+needed to run an orgstrap block.
+
+00:05:36.639 --> 00:05:38.560
+We're just going to do a message
+
+05:38.560 --> 05:43.440
+"hello orgstrap!".
+
+05:43.440 --> 00:05:46.160
+If you look up at the top,
+
+00:05:46.160 --> 00:05:47.386
+you will see that the
+
+00:05:47.386 --> 00:05:50.320
+orgstrap-block-checksum will change
+
+05:50.320 --> 00:05:51.520
+when I save the file.
+
+00:05:51.520 --> 00:05:53.840
+This makes it much easier to author files
+
+00:05:53.840 --> 00:05:55.120
+with orgstrap blocks.
+
+00:05:55.120 --> 00:05:56.560
+And then we need one last piece
+
+00:05:56.560 --> 00:05:57.876
+of machinery,
+
+00:05:57.876 --> 00:06:00.400
+which is the shebang block.
+
+00:06:00.400 --> 00:06:01.520
+I am just going to steal
+
+00:06:01.520 --> 00:06:02.560
+the shebang block from
+
+00:06:02.560 --> 00:06:06.080
+this other file over here
+
+06:06.080 --> 00:06:07.039
+since it is available.
+
+00:06:07.039 --> 00:06:08.880
+You can also get it from shebang.org,
+
+00:06:08.880 --> 00:06:10.800
+and I have plans to add a command
+
+00:06:10.800 --> 00:06:12.560
+to insert this into the file directly,
+
+00:06:12.560 --> 00:06:15.600
+which may actually be done by the time
+
+00:06:15.600 --> 00:06:19.520
+this video is actually posted and visible.
+
+06:19.520 --> 00:06:21.120
+There's one last step,
+
+00:06:21.120 --> 00:06:24.160
+which is that we need to run dired
+
+06:24.160 --> 00:06:27.520
+in order to… There we go.
+
+06:27.520 --> 06:31.039
+So, we use Shift m, capital m,
+
+06:31.039 --> 00:06:32.800
+in order to make our
+
+00:06:32.800 --> 00:06:35.520
+example file executable,
+
+06:35.520 --> 00:06:42.140
+and then if we come back to here,
+
+00:06:42.140 --> 00:06:47.360
+we see that example.org is now executable,
+
+00:06:47.360 --> 00:06:48.000
+and we can run it.
+
+06:48.000 --> 06:50.560
+"hello orgstrap!", and we're done.
+
+06:50.560 --> 06:52.639
+So, that's the basic workflow
+
+06:52.639 --> 06:54.880
+for getting orgstrap files
+
+06:54.880 --> 00:06:56.240
+to be executable.
+
+00:06:56.240 --> 00:06:58.960
+I will be around to answer questions live,
+
+00:06:58.960 --> 00:07:00.800
+and I will be also available in
+
+00:07:00.800 --> 00:07:03.280
+the #emacsconf IRC channel all day.
+
+00:07:03.280 --> 00:07:04.960
+I hope you have found this useful,
+
+00:07:04.960 --> 00:07:08.160
+and thank you very much for watching.
+
+00:07:08.160 --> 00:07:09.160
+[captions by bhavin192 (Bhavin Gandhi)]
diff --git a/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt b/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--chapters.vtt
new file mode 100644
index 00000000..9aa57433
--- /dev/null
+++ b/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--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-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-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt b/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt
new file mode 100644
index 00000000..057b85f5
--- /dev/null
+++ b/2021/captions/emacsconf-2021-faster--optimizing-emacs-lisp-code--dmitry-gutov--main.vtt
@@ -0,0 +1,1528 @@
+WEBVTT
+
+00:01.120 --> 00:00:04.640
+Hi. Greetings from the cloudy St. Petersburg.
+
+00:04.640 --> 00:00:06.080
+My name is Dmitry Gutov.
+
+00:00:06.080 --> 00:00:09.280
+I write Ruby by day, Emacs Lisp by night
+
+00:00:09.280 --> 00:00:12.080
+when I don't do anything else.
+
+00:12.080 --> 00:00:14.559
+You might know my work
+
+00:00:14.559 --> 00:00:18.160
+from a number of third-party packages
+
+00:00:18.160 --> 00:00:22.240
+as well as built-in ones.
+
+00:22.240 --> 00:00:25.599
+The idea for this talk came out from
+
+00:25.599 --> 00:00:26.800
+an improvement request
+
+00:00:26.800 --> 00:00:32.960
+for the performance of grep-like commands
+
+00:32.960 --> 00:00:35.200
+using the xref interface
+
+00:00:35.200 --> 00:00:43.280
+and its storage types, container types
+
+00:00:43.280 --> 00:00:47.840
+for the search results,
+
+00:47.840 --> 00:00:51.440
+complaining that it's not as fast
+
+00:00:51.440 --> 00:00:54.320
+as it potentially could have been
+
+00:54.320 --> 00:00:58.239
+when there are lots of search results
+
+00:00:58.239 --> 00:01:01.600
+coming for a given search.
+
+01:01.600 --> 00:01:06.159
+I have noticed myself that
+
+00:01:06.159 --> 00:01:10.159
+when working on it, and probably before.
+
+00:01:10.159 --> 00:01:16.560
+My approach to optimizing Lisp code
+
+01:16.560 --> 00:01:21.680
+has changed recently-ish,
+
+01:21.680 --> 00:01:26.960
+and I'd like to talk about it here.
+
+01:26.960 --> 00:01:34.079
+This talk is for people who already
+
+01:34.079 --> 00:01:37.040
+know how to write some Emacs Lisp
+
+00:01:37.040 --> 00:01:38.880
+to solve their problems
+
+00:01:38.880 --> 00:01:43.360
+and who have possibly encountered
+
+00:01:43.360 --> 00:01:49.200
+some performance issues doing that.
+
+01:49.200 --> 00:01:51.600
+Also, if you want to contribute
+
+00:01:51.600 --> 00:01:54.799
+some improvements to the code
+
+00:01:54.799 --> 00:01:56.960
+that is already in Emacs
+
+00:01:56.960 --> 00:02:02.159
+or to other packages
+
+00:02:02.159 --> 00:02:04.479
+which are owned by somebody else,
+
+00:02:04.479 --> 00:02:13.520
+it should also be helpful. Let's start.
+
+00:02:13.520 --> 00:02:18.640
+First of all, about Emacs and Emacs Lisp.
+
+00:02:18.640 --> 00:02:21.360
+It's not the fastest language.
+
+02:21.360 --> 00:02:26.560
+Let's switch to the notes.
+
+00:02:26.560 --> 00:02:31.440
+I hope the font is big enough
+
+00:02:31.440 --> 00:02:36.479
+to be readable on this video, really hope.
+
+02:36.480 --> 00:02:40.160
+Emacs Lisp is not the fastest of the bunch.
+
+00:02:40.160 --> 00:02:44.400
+The garbage collector creates pauses
+
+00:02:44.400 --> 00:02:48.800
+whenever it needs to sweep data.
+
+02:48.800 --> 00:02:51.760
+The interpreter is not the fastest one,
+
+02:51.760 --> 00:02:54.720
+even though the native compilation branch
+
+00:02:54.720 --> 00:02:59.120
+is improving on that by twice
+
+00:02:59.120 --> 00:03:04.640
+in certain scenarios, which is good.
+
+03:04.640 --> 00:03:10.560
+The standard library or functions
+
+00:03:10.560 --> 00:03:12.800
+for working with collections, for example,
+
+03:12.800 --> 00:03:17.599
+are not so uniformly great.
+
+03:17.599 --> 00:03:20.080
+So there is some work to be done there.
+
+03:20.080 --> 00:03:22.239
+Maybe you can contribute
+
+03:22.239 --> 00:03:26.640
+the next improvement in there.
+
+03:26.640 --> 00:03:33.200
+And also, if your package displays stuff,
+
+00:03:33.200 --> 00:03:35.040
+it has a visual component,
+
+03:35.040 --> 00:03:36.959
+then you might have to deal with
+
+00:03:36.959 --> 00:03:43.120
+some drawbacks of the display engine
+
+03:43.120 --> 00:03:47.760
+which might slow to a crawl
+
+00:03:47.760 --> 00:03:53.680
+when your code has...
+
+00:03:53.680 --> 00:03:56.560
+when you're trying to display lines
+
+00:03:56.560 --> 00:04:00.319
+which are a little too long--
+
+00:04:00.319 --> 00:04:03.120
+trying to print a [long] line, for example--
+
+04:03.120 --> 00:04:07.120
+or you are using a lot of overlays,
+
+04:07.120 --> 00:04:09.120
+if you know what it is.
+
+04:09.120 --> 00:04:12.640
+With lots of overlays
+
+00:04:12.640 --> 00:04:19.839
+on the same visual line, in particular.
+
+04:19.840 --> 00:04:24.160
+But okay. The first thing to understand,
+
+00:04:24.160 --> 00:04:27.680
+and I hope everybody who's done
+
+00:04:27.680 --> 00:04:29.520
+some programming in the past knows,
+
+00:04:29.520 --> 00:04:35.120
+it's: first you write correctly,
+
+00:04:35.120 --> 00:04:37.360
+and then you try to benchmark.
+
+04:37.360 --> 00:04:39.199
+and see where the problems are,
+
+00:04:39.199 --> 00:04:40.720
+if there are any.
+
+04:40.720 --> 00:04:45.919
+So first do it right, then do it fast.
+
+04:45.919 --> 00:04:50.720
+How do we find the hotspots,
+
+00:04:50.720 --> 00:04:52.400
+the bottlenecks on the second step?
+
+00:04:52.400 --> 00:04:54.720
+We try to do some profiling
+
+00:04:54.720 --> 00:04:58.960
+or measuring how long the code takes.
+
+04:58.960 --> 00:05:03.038
+Emacs has two different profilers.
+
+00:05:03.039 --> 00:05:05.440
+One is the native profiler,
+
+05:05.440 --> 00:05:10.639
+which as I recall was contributed by
+
+00:05:10.639 --> 00:05:13.280
+Tomohiro Matsuyama, the author
+
+00:05:13.280 --> 00:05:16.240
+of the autocomplete package
+
+05:16.240 --> 00:05:22.720
+back in Emacs 24.3, apparently.
+
+05:22.720 --> 00:05:24.320
+It's a low overhead profiler.
+
+00:05:24.320 --> 00:05:31.520
+It's sampling, which is good on one hand
+
+05:31.520 --> 00:05:33.919
+but might be less good on the other hand.
+
+05:33.919 --> 00:05:35.199
+Let's try using it.
+
+00:05:35.199 --> 00:05:40.960
+So we start with profiler-start.
+
+00:05:40.960 --> 00:05:44.960
+Let's just ask for CPU profiling here,
+
+00:05:44.960 --> 00:05:48.320
+but it also can profile memory locations.
+
+05:48.320 --> 00:05:56.400
+Let's try a search for some string
+
+00:05:56.400 --> 00:06:01.360
+in the current project.
+
+06:01.360 --> 00:06:04.080
+Let's do it a few times, maybe three times,
+
+00:06:04.080 --> 00:06:09.360
+so the profiler has more data to work with.
+
+06:09.360 --> 00:06:13.680
+Let's call the report.
+
+06:13.680 --> 00:06:16.960
+Okay. So here we have the tree,
+
+00:06:16.960 --> 00:06:19.360
+the execution tree with percentages
+
+00:06:19.360 --> 00:06:22.960
+of the time spent in each function.
+
+06:22.960 --> 00:06:25.840
+You can unwrap it by going up and down
+
+00:06:25.840 --> 00:06:35.039
+and pressing TAB to unwrap every element.
+
+06:35.039 --> 00:06:52.000
+This is weird.
+
+06:52.000 --> 00:06:55.199
+Okay, here we see that the actual command
+
+00:06:55.199 --> 00:06:56.639
+that was called only takes
+
+00:06:56.639 --> 00:06:59.599
+8% of the whole runtime,
+
+06:59.599 --> 00:07:07.759
+meaning the input was...
+
+07:07.759 --> 00:07:10.960
+The command took not enough time
+
+00:07:10.960 --> 00:07:13.360
+for us to really dig into it.
+
+00:07:13.360 --> 00:07:18.960
+Let's try a shorter input with more matches.
+
+00:07:18.960 --> 00:07:25.680
+So profiler-start again, CPU.
+
+07:25.680 --> 00:07:34.240
+Let's search for list.
+
+07:34.240 --> 00:07:40.160
+Don't mind the minibuffer just yet.
+
+07:40.160 --> 00:07:47.680
+Okay. So let's look at the report.
+
+07:47.680 --> 00:07:52.000
+We can unwrap it here, and we see
+
+00:07:52.000 --> 00:07:55.759
+52% of the time was spent doing this,
+
+07:55.759 --> 00:07:58.240
+at least according to the profile.
+
+00:07:58.240 --> 00:08:00.960
+We can unwrap it, see the description
+
+00:08:00.960 --> 00:08:02.800
+of any function that was called
+
+00:08:02.800 --> 00:08:08.479
+by hitting d, or even jump to it
+
+00:08:08.479 --> 00:08:12.960
+by tapping f.
+
+08:12.960 --> 00:08:16.160
+By going down the stream,
+
+08:16.160 --> 00:08:18.240
+we unwrap it with TAB,
+
+08:18.240 --> 00:08:22.400
+you can see where time was spent.
+
+08:22.400 --> 00:08:25.199
+One of the bigger drawbacks
+
+00:08:25.199 --> 00:08:30.639
+of this profiler is the arithmetics
+
+08:30.639 --> 00:08:39.200
+don't always work out,
+
+00:08:39.200 --> 00:08:45.760
+like you might have...
+
+08:45.760 --> 00:08:47.519
+This is not a good example,
+
+00:08:47.519 --> 00:08:52.640
+but okay, you have 14% spent in here,
+
+00:08:52.640 --> 00:08:57.200
+but when we expand this entry,
+
+00:08:57.200 --> 00:09:01.760
+we only see like 6%, 3%, and 0%.
+
+00:09:01.760 --> 00:09:06.640
+Different sum, sometimes even bigger than that.
+
+00:09:06.640 --> 00:09:10.800
+So the native profiler
+
+00:09:10.800 --> 00:09:13.200
+can give an accurate picture
+
+00:09:13.200 --> 00:09:15.920
+and it has little overhead,
+
+00:09:15.920 --> 00:09:20.399
+but the specific numbers
+
+00:09:20.399 --> 00:09:22.959
+are not very precise
+
+09:22.959 --> 00:09:28.640
+because the principle is probabilistic.
+
+09:28.640 --> 00:09:31.199
+Let's stop here.
+
+09:31.200 --> 00:09:36.959
+There is another package called elp,
+
+09:36.959 --> 00:09:39.360
+Emacs Lisp Profiler,
+
+00:09:39.360 --> 00:09:43.440
+which is much older than that.
+
+09:43.440 --> 00:09:47.920
+It allows us to instrument
+
+09:47.920 --> 00:09:53.600
+just specific functions or a package.
+
+09:53.600 --> 00:09:57.680
+We're instrumenting the xref package here.
+
+09:57.680 --> 00:10:01.360
+It works through advice. You can see
+
+00:10:01.360 --> 00:10:03.279
+the description of one of the functions
+
+00:10:03.279 --> 00:10:04.320
+in the package, and we see
+
+00:10:04.320 --> 00:10:12.640
+that it has had :around device added.
+
+10:12.640 --> 00:10:18.000
+If we run the same search,
+
+10:18.000 --> 00:10:21.360
+we can see that -- when it finishes --
+
+00:10:21.360 --> 00:10:30.399
+the table of all the numbers,
+
+10:30.399 --> 00:10:32.640
+that every function in the package
+
+00:10:32.640 --> 00:10:41.680
+has been called, and the times
+
+00:10:41.680 --> 00:10:48.000
+which the runtime has spent inside of them.
+
+10:48.000 --> 00:10:55.040
+sorted by impact, as it understands that.
+
+10:55.040 --> 00:11:00.079
+The main problem with this profiler is
+
+00:11:00.079 --> 00:11:04.160
+it is slower because it adds overhead
+
+00:11:04.160 --> 00:11:06.880
+to every function call,
+
+11:06.880 --> 00:11:11.519
+so it, in the end, might give an impression
+
+00:11:11.519 --> 00:11:19.519
+that functions with lots of calls,
+
+11:19.519 --> 00:11:21.839
+which have been called a lot of times,
+
+11:21.839 --> 00:11:26.880
+are more important,
+
+11:26.880 --> 00:11:29.279
+hotter than they actually are,
+
+00:11:29.279 --> 00:11:30.959
+because it slows down
+
+00:11:30.959 --> 00:11:32.640
+every such function call,
+
+11:32.640 --> 00:11:35.279
+including the subsequent calls
+
+00:11:35.279 --> 00:11:38.160
+that these functions do
+
+00:11:38.160 --> 00:11:40.560
+inside the same package.
+
+11:40.560 --> 00:11:48.240
+So it's a good way to analyze and drill down
+
+11:48.240 --> 00:11:50.320
+to see which functions here
+
+00:11:50.320 --> 00:11:51.200
+take a lot of time,
+
+00:11:51.200 --> 00:11:53.839
+but just keep in mind
+
+00:11:53.839 --> 00:11:57.760
+that sometimes you might end up
+
+00:11:57.760 --> 00:12:00.079
+trying to optimize one of these
+
+00:12:00.079 --> 00:12:01.600
+smaller functions called
+
+00:12:01.600 --> 00:12:09.279
+or usually smaller, and that the result
+
+00:12:09.279 --> 00:12:11.040
+might not actually affect
+
+00:12:11.040 --> 00:12:18.720
+the production runtime at all.
+
+12:18.720 --> 00:12:22.240
+But it's still a good tool,
+
+00:12:22.240 --> 00:12:25.440
+especially when you already know
+
+12:25.440 --> 00:12:30.560
+which set of actions you are interested in,
+
+00:12:30.560 --> 00:12:33.760
+and which functions might be slower.
+
+12:33.760 --> 00:12:37.120
+elp allows you to instrument a package
+
+00:12:37.120 --> 00:12:42.720
+or a set of functions. Just don't forget
+
+00:12:42.720 --> 00:12:49.600
+to un-instrument them all afterwards,
+
+00:12:49.600 --> 00:12:52.000
+or else your session,
+
+00:12:52.000 --> 00:12:55.920
+your subsequent optimization efforts
+
+00:12:55.920 --> 00:12:59.360
+might not work as well as you might
+
+12:59.360 --> 00:13:01.359
+want to work.
+
+13:01.360 --> 00:13:04.560
+And there's also this very nice,
+
+00:13:04.560 --> 00:13:09.600
+very handy package called benchmark,
+
+13:09.600 --> 00:13:12.480
+which unfortunately
+
+00:13:12.480 --> 00:13:16.000
+not everybody knows about.
+
+13:16.000 --> 00:13:21.519
+It turns out that a lot of
+
+00:13:21.519 --> 00:13:30.079
+older Emacs Lisp developers,
+
+13:30.079 --> 00:13:34.160
+users, package developers usually have
+
+00:13:34.160 --> 00:13:38.000
+some benchmarking macros of their own.
+
+00:13:38.000 --> 00:13:42.880
+But there is this package
+
+00:13:42.880 --> 00:13:46.160
+with perfectly usable interface
+
+00:13:46.160 --> 00:13:49.199
+which doesn't require you
+
+00:13:49.199 --> 00:13:51.120
+to define something else,
+
+00:13:51.120 --> 00:13:52.560
+especially when you are in
+
+00:13:52.560 --> 00:13:57.120
+an emacs -Q session
+
+13:57.120 --> 00:14:00.480
+trying to benchmark your code
+
+00:14:00.480 --> 00:14:05.440
+in a bare Emacs. So it has
+
+00:14:05.440 --> 00:14:09.680
+two main endpoints, I would say.
+
+14:09.680 --> 00:14:14.480
+First one is the benchmark macro,
+
+14:14.480 --> 00:14:19.199
+and the second one is benchmark-progn.
+
+00:14:19.199 --> 00:14:20.399
+benchmark is a function,
+
+00:14:20.399 --> 00:14:25.040
+and benchmark-progn is a macro.
+
+14:25.040 --> 00:14:27.839
+The first one you can use by specifying
+
+00:14:27.839 --> 00:14:30.480
+the number of iterations and the form.
+
+00:14:30.480 --> 00:14:36.800
+I hope the minibuffer is easy to read here.
+
+14:36.800 --> 00:14:43.360
+For instance, we can take this long list
+
+00:14:43.360 --> 00:14:44.800
+and try nreverse-ing it,
+
+00:14:44.800 --> 00:14:49.680
+and we see how long that takes.
+
+14:49.680 --> 00:14:54.160
+Then you can do it,
+
+14:54.160 --> 00:14:55.600
+adjust the inner code,
+
+00:14:55.600 --> 00:14:58.079
+and then basically compare
+
+00:14:58.079 --> 00:14:59.519
+to figure out how much
+
+00:14:59.519 --> 00:15:01.440
+and how long nreverse takes
+
+00:15:01.440 --> 00:15:03.839
+in this scenario.
+
+15:03.839 --> 00:15:07.760
+Or, we can take a function
+
+00:15:07.760 --> 00:15:10.880
+which we have probably found
+
+15:10.880 --> 00:15:12.880
+using one of the previous methods
+
+00:15:12.880 --> 00:15:17.279
+which we anticipate that,
+
+15:17.279 --> 00:15:19.440
+as we understand, it takes a while,
+
+15:19.440 --> 00:15:26.720
+and annotate it with a benchmark-progn form,
+
+00:15:26.720 --> 00:15:33.360
+which... just execute the body
+
+00:15:33.360 --> 00:15:36.880
+and report, each and every one of them,
+
+15:36.880 --> 00:15:41.360
+how long that body execution took.
+
+15:41.360 --> 00:15:45.360
+So for instance, here we added
+
+00:15:45.360 --> 00:15:46.959
+a few message calls
+
+00:15:46.959 --> 00:15:49.040
+inside those benchmark-progns,
+
+00:15:49.040 --> 00:15:53.199
+so we can see how long each part
+
+00:15:53.199 --> 00:16:03.600
+of the function xref-matches-in-files
+
+00:16:03.600 --> 00:16:06.320
+takes when it is run.
+
+16:06.320 --> 00:16:11.839
+Let's try it. Let's first call
+
+16:11.839 --> 00:16:17.199
+emacs-lisp-byte-compile-and-load,
+
+16:17.199 --> 00:16:20.720
+so that we're sure that we are running
+
+16:20.720 --> 00:16:24.079
+the fastest possible version of this code,
+
+16:24.079 --> 00:16:29.519
+so when we do find the bottlenecks,
+
+00:16:29.519 --> 00:16:31.279
+we are sure that they are real
+
+00:16:31.279 --> 00:16:36.240
+and not because of the uncompiled code,
+
+00:16:36.240 --> 00:16:43.519
+macro expansion, or the lack of
+
+00:16:43.519 --> 00:16:46.160
+some substitutions, other substitutions
+
+00:16:46.160 --> 00:16:50.800
+that our code is relying on
+
+16:50.800 --> 00:17:01.279
+but which might not be available
+
+17:01.279 --> 00:17:03.279
+in the interpreter mode
+
+00:17:03.279 --> 00:17:07.039
+just in the compiled code.
+
+17:07.039 --> 00:17:10.160
+Let's run.
+
+17:10.160 --> 00:17:14.880
+So we have this list,
+
+17:14.880 --> 00:17:26.160
+search for list,
+
+17:26.160 --> 00:17:29.760
+and the remaining time is spent during
+
+00:17:29.760 --> 00:17:36.720
+printing of the results, which we didn't
+
+17:36.720 --> 00:17:38.320
+annotate with the benchmarking macro,
+
+00:17:38.320 --> 00:17:41.280
+but it's still there.
+
+17:41.280 --> 00:17:43.679
+So we can see by switching to the
+
+17:43.679 --> 00:17:49.919
+*Messages* buffer, C-h e,
+
+17:49.919 --> 00:17:52.080
+that unquoting was very fast.
+
+00:17:52.080 --> 00:17:59.280
+So the search took 400 milliseconds.
+
+00:17:59.280 --> 00:18:02.480
+It's slower than it would be
+
+18:02.480 --> 00:18:06.080
+without the video being recorded, as well
+
+00:18:06.080 --> 00:18:09.039
+as the rest of the measurements here.
+
+18:09.039 --> 00:18:12.160
+So the parsing of the results took more
+
+00:18:12.160 --> 00:18:16.559
+than that, and the object allocation
+
+18:16.559 --> 00:18:21.919
+took even more, which is unfortunate
+
+00:18:21.919 --> 00:18:23.919
+but it's the reality
+
+00:18:23.919 --> 00:18:26.400
+when we're dealing with a lot of
+
+00:18:26.400 --> 00:18:29.840
+search results, because, well,
+
+18:29.840 --> 00:18:33.520
+Emacs Lisp is slower than grep.
+
+18:34.559 --> 00:18:49.200
+That's just a given.
+
+18:49.200 --> 00:18:54.400
+What can be done and what had been done
+
+00:18:54.400 --> 00:18:57.120
+to improve on this?
+
+18:57.120 --> 00:19:04.240
+Well, first of all,
+
+19:04.240 --> 00:19:06.000
+let's change the question,
+
+00:19:06.000 --> 00:19:07.360
+because this is more of
+
+00:19:07.360 --> 00:19:09.760
+a retrospective sort of talk
+
+19:09.760 --> 00:19:13.439
+rather than talking about future plans.
+
+00:19:13.440 --> 00:19:19.679
+What can one do to improve performance?
+
+19:19.679 --> 00:19:24.160
+Well, basically, two things:
+
+00:19:24.160 --> 00:19:27.919
+first, you try to make sure
+
+00:19:27.919 --> 00:19:30.559
+that you're writing less code,
+
+00:19:30.559 --> 00:19:37.200
+then your code does fewer things,
+
+19:37.200 --> 00:19:40.400
+Fewer iterations of your operations.
+
+19:40.400 --> 00:19:42.000
+Basically, it's the realm
+
+00:19:42.000 --> 00:19:46.880
+of choosing your algorithm well.
+
+19:46.880 --> 00:19:54.880
+But make sure it's as little complexity
+
+00:19:54.880 --> 00:20:00.239
+as you can manage reasonably.
+
+20:00.240 --> 00:20:05.760
+Another is to try to reduce memory allocations.
+
+20:05.760 --> 00:20:13.760
+It's creating conses, the links of the list,
+
+20:13.760 --> 00:20:17.919
+of the lists. If you are mapping through
+
+00:20:17.919 --> 00:20:19.200
+a list, creating a new one,
+
+00:20:19.200 --> 00:20:22.640
+you are creating conses.
+
+00:20:22.640 --> 00:20:26.159
+New objects in memory, anyway.
+
+20:26.159 --> 00:20:30.480
+And also, when you call string operations
+
+00:20:30.480 --> 00:20:33.679
+like substring, when you create new strings,
+
+20:33.679 --> 00:20:36.640
+that's also what you do.
+
+20:36.640 --> 00:20:39.200
+When you allocate new memory,
+
+00:20:39.200 --> 00:20:43.600
+that triggers garbage collections later,
+
+00:20:43.600 --> 00:20:49.200
+which affect the performance of your code
+
+20:49.200 --> 00:21:01.600
+quite severely. I have found that actually,
+
+00:21:01.600 --> 00:21:04.960
+contrary to my personal intuition,
+
+21:04.960 --> 00:21:08.240
+when you try to fine-tune the code
+
+00:21:08.240 --> 00:21:13.120
+working on long lists of elements,
+
+00:21:13.120 --> 00:21:15.520
+long, long collection, large collections,
+
+00:21:15.520 --> 00:21:20.159
+it's even more important to try to avoid
+
+21:20.159 --> 00:21:23.200
+or reduce memory allocations
+
+21:23.200 --> 00:21:26.400
+rather than try to ensure
+
+00:21:26.400 --> 00:21:32.240
+that less code is running,
+
+21:32.240 --> 00:21:34.960
+less operations are performed,
+
+21:34.960 --> 00:21:38.080
+because the garbage collector
+
+21:38.080 --> 00:21:44.799
+can hit you in the posterior quite suddenly
+
+00:21:44.799 --> 00:21:49.520
+that you will not always...
+
+21:49.520 --> 00:21:51.760
+When you measure the input impact,
+
+00:21:51.760 --> 00:21:56.799
+you might not always measure the whole of it.
+
+21:56.799 --> 00:22:02.640
+And sometimes even when you have
+
+00:22:02.640 --> 00:22:06.559
+a few operations, you can measure
+
+22:06.559 --> 00:22:09.520
+all three of them, but at some point,
+
+00:22:09.520 --> 00:22:11.919
+if you just reduce a lot,
+
+22:11.919 --> 00:22:14.720
+remove most of the allocations,
+
+00:22:14.720 --> 00:22:16.799
+all three of them, the improvement
+
+00:22:16.799 --> 00:22:21.520
+might be even bigger than the total
+
+22:21.520 --> 00:22:23.440
+of three improvements
+
+00:22:23.440 --> 00:22:27.200
+which you might have measured previously,
+
+22:27.200 --> 00:22:29.679
+like separately.
+
+22:29.679 --> 00:22:33.039
+So it's something to be on the lookout for,
+
+00:22:33.039 --> 00:22:39.520
+but of course, when you pick the algorithm,
+
+00:22:39.520 --> 00:22:45.200
+it's important not to do
+
+00:22:45.200 --> 00:22:52.158
+more operations than you have to.
+
+22:52.159 --> 00:22:56.000
+We have examples of both
+
+00:22:56.000 --> 00:22:58.720
+in the recent changes
+
+00:22:58.720 --> 00:23:02.559
+to the xref and project packages,
+
+23:02.559 --> 00:23:06.960
+which we can examine here.
+
+23:06.960 --> 00:23:11.200
+Let's take a look at this one.
+
+23:11.200 --> 00:23:14.880
+This commit message lies a little bit
+
+23:14.880 --> 00:23:19.039
+because it's referring to
+
+00:23:19.039 --> 00:23:24.559
+the use of assoc instead of cl-assoc,
+
+23:24.559 --> 00:23:29.919
+and the actual change incorporates that,
+
+00:23:29.919 --> 00:23:33.440
+but it also incorporates
+
+00:23:33.440 --> 00:23:39.440
+the second part of the sentence
+
+00:23:39.440 --> 00:23:41.360
+which actually replaced
+
+00:23:41.360 --> 00:23:46.960
+the use of assoc in there.
+
+23:46.960 --> 00:23:50.480
+Curiously, cl-assoc was pretty slow
+
+00:23:50.480 --> 00:23:52.559
+because not only it created
+
+00:23:52.559 --> 00:23:57.919
+quadratic complexity in the operation
+
+23:57.919 --> 00:23:59.919
+and it was also calling
+
+00:23:59.919 --> 00:24:02.880
+the Lisp function [equal]
+
+24:02.880 --> 00:24:04.400
+for every iteration,
+
+00:24:04.400 --> 00:24:08.880
+whereas if we just use assoc there,
+
+24:08.880 --> 00:24:10.080
+which was the first version
+
+00:24:10.080 --> 00:24:13.919
+of this change, of the improvement,
+
+24:13.919 --> 00:24:15.760
+it became already much faster,
+
+00:24:15.760 --> 00:24:20.640
+but then switching to a hash table
+
+24:20.640 --> 00:24:28.080
+which turned this lookup
+
+00:24:28.080 --> 00:24:31.760
+from O(n) complexity
+
+24:31.760 --> 00:24:35.600
+into, well, amortized constant one,
+
+24:35.600 --> 00:24:37.600
+even better.
+
+24:37.600 --> 00:24:45.679
+So, use hash tables, kids.
+
+24:45.679 --> 00:24:52.400
+Another commit here is about using
+
+00:24:52.400 --> 00:24:55.520
+the inhibit-modification-hooks.
+
+00:24:55.520 --> 00:24:58.000
+So, turns out when you're printing
+
+00:24:58.000 --> 00:25:01.679
+into a buffer, even if you have already
+
+25:01.679 --> 00:25:06.159
+disabled the undo history,
+
+25:06.159 --> 00:25:08.480
+binding this variable to
+
+25:08.480 --> 00:25:10.880
+a non-null value is pretty good
+
+00:25:10.880 --> 00:25:15.520
+because you are able to avoid running
+
+25:15.520 --> 00:25:21.120
+a number of hooks, which improves performance.
+
+25:21.120 --> 00:25:28.640
+Next. This one was about moving the
+
+00:25:28.640 --> 00:25:32.000
+file-remote-p call
+
+25:32.000 --> 00:25:37.279
+from inside the loop.
+
+25:37.279 --> 00:25:42.039
+This function is actually
+
+00:25:42.039 --> 00:25:49.039
+surprisingly slow-ish for the goal,
+
+25:49.039 --> 00:25:52.000
+for its purpose, so you don't really want
+
+25:52.000 --> 00:25:56.159
+to call it on every file name in the list
+
+00:25:56.159 --> 00:25:59.520
+when you have a lot of them,
+
+25:59.520 --> 00:26:02.000
+and especially if your code
+
+00:26:02.000 --> 00:26:04.640
+is running in a buffer
+
+00:26:04.640 --> 00:26:10.640
+visiting a remote file, like through TRAMP.
+
+26:10.640 --> 00:26:15.120
+You might end up trying to
+
+00:26:15.120 --> 00:26:16.880
+devise different approaches
+
+00:26:16.880 --> 00:26:20.159
+to avoid checking whether
+
+00:26:20.159 --> 00:26:23.279
+every file name is remote
+
+26:23.279 --> 00:26:25.360
+if you're dealing with a list of file names,
+
+00:26:25.360 --> 00:26:34.640
+so this one, take a look, be careful with it.
+
+26:34.640 --> 00:26:43.120
+A similar, slower function, with-current-buffer,
+
+26:43.120 --> 00:26:46.880
+but not so much. So it all depends on
+
+26:46.880 --> 00:26:48.400
+really how often you call it.
+
+00:26:48.400 --> 00:26:51.279
+Sometimes you might want to
+
+00:26:51.279 --> 00:26:52.720
+rewrite your code so that
+
+00:26:52.720 --> 00:26:54.720
+it's called less often.
+
+26:54.720 --> 00:26:59.760
+And expand-file-name, which hits the disk.
+
+26:59.760 --> 00:27:01.200
+So if you're dealing with file names,
+
+00:27:01.200 --> 00:27:02.960
+you might want to replace it
+
+00:27:02.960 --> 00:27:07.520
+with concatenation at certain points.
+
+27:07.520 --> 00:27:22.159
+Okay, back to these changes later.
+
+27:22.159 --> 00:27:28.480
+This one just removed a location of a cons
+
+27:28.480 --> 00:27:33.679
+per match hit, and still it brought 5%
+
+27:33.679 --> 00:27:37.039
+or something like that improvement
+
+00:27:37.039 --> 00:27:41.120
+to the whole command.
+
+27:41.120 --> 00:27:46.000
+So that's a pretty significant improvement
+
+00:27:46.000 --> 00:27:53.600
+for a small change like that.
+
+27:53.600 --> 00:28:01.679
+Similarly, here we just made sure
+
+00:28:01.679 --> 00:28:09.520
+to avoid a splits... no, a substring call,
+
+28:09.520 --> 00:28:12.399
+and probably an allocation of the whole
+
+28:12.399 --> 00:28:16.320
+buffer string, but in my testing,
+
+00:28:16.320 --> 00:28:19.440
+that doesn't actually matter much,
+
+00:28:19.440 --> 00:28:22.399
+at least so much, but a substring call
+
+00:28:22.399 --> 00:28:28.960
+per result... If we see,
+
+00:28:28.960 --> 00:28:33.039
+since we changed to manual parsing
+
+00:28:33.039 --> 00:28:37.440
+of the buffer, with the strings
+
+00:28:37.440 --> 00:28:41.440
+delimited with zero bytes,
+
+28:41.440 --> 00:28:43.840
+it gave an overall improvement
+
+00:28:43.840 --> 00:28:47.440
+of 20%, again on my machine
+
+00:28:47.440 --> 00:28:50.720
+with a pretty fast SSD,
+
+00:28:50.720 --> 00:28:53.679
+and with a warm disk cache, of course.
+
+28:53.679 --> 00:29:05.360
+But still... Going back to this revision,
+
+00:29:05.360 --> 00:29:09.440
+it was actually quite surprising
+
+00:29:09.440 --> 00:29:15.200
+that migration to a cl-defstruct
+
+29:15.200 --> 00:29:24.080
+from eieio, the Common Lisp-inspired
+
+00:29:24.080 --> 00:29:26.480
+object system first introduced
+
+00:29:26.480 --> 00:29:34.240
+in the CEDET tools,
+
+00:29:34.240 --> 00:29:39.360
+that was a bit of a surprise,
+
+00:29:39.360 --> 00:29:44.799
+because not much of my
+
+00:29:44.799 --> 00:29:46.080
+benchmark benchmarking
+
+00:29:46.080 --> 00:29:50.960
+actually pointed at it being the problem.
+
+29:50.960 --> 00:29:55.760
+Probably because the accessors
+
+00:29:55.760 --> 00:29:57.520
+were not the actual problem,
+
+29:57.520 --> 00:30:00.399
+like the oref macros
+
+00:30:00.399 --> 00:30:06.960
+and the code accessing the slots,
+
+30:06.960 --> 00:30:10.720
+but the construction,
+
+00:30:10.720 --> 00:30:14.320
+the object construction code,
+
+30:14.320 --> 00:30:16.559
+that was where most of the time
+
+00:30:16.559 --> 00:30:21.200
+was spent unnecessarily,
+
+30:21.200 --> 00:30:24.240
+maybe doing type-checking,
+
+30:24.240 --> 00:30:28.880
+maybe some other stuff.
+
+30:28.880 --> 00:30:36.080
+So if you have lots of values,
+
+30:36.080 --> 00:30:39.120
+you need to treat like objects in... and
+
+00:30:39.120 --> 00:30:42.000
+virtual dispatch on them in your package,
+
+00:30:42.000 --> 00:30:45.200
+you might want to look into
+
+30:45.200 --> 00:30:52.239
+cl-defstruct for them.
+
+30:52.240 --> 00:30:54.080
+Going on to the next section,
+
+00:30:54.080 --> 00:31:01.200
+I have prepared the sort of comparison
+
+31:01.200 --> 00:31:05.519
+between cl-lib, dash, and seq,
+
+00:31:05.519 --> 00:31:09.360
+the collection libraries we have
+
+31:09.360 --> 00:31:11.279
+available for us in Emacs.
+
+00:31:11.279 --> 00:31:15.760
+That is the popular ones,
+
+31:15.760 --> 00:31:21.440
+but since I'm running behind on time,
+
+00:31:21.440 --> 00:31:27.760
+I'll probably just summarize the findings.
+
+31:27.760 --> 00:31:31.919
+First of all, seq is nice.
+
+00:31:31.919 --> 00:31:38.480
+Its generic approach is probably
+
+31:38.480 --> 00:31:41.919
+quite decent for most of the situations,
+
+31:41.919 --> 00:31:49.840
+but there are places where it could be
+
+31:49.840 --> 00:31:53.679
+optimized better, so instead of having
+
+31:53.679 --> 00:31:56.399
+quadratic performance, it could use a
+
+31:56.399 --> 00:31:59.200
+hash table, like for instance,
+
+31:59.200 --> 00:32:02.000
+dash does here--
+
+32:02.000 --> 00:32:06.240
+in dash, union or delete-dups
+
+00:32:06.240 --> 00:32:12.960
+does in its implementation.
+
+32:12.960 --> 00:32:16.640
+The dash itself is curiously fast,
+
+00:32:16.640 --> 00:32:20.000
+at least faster than I might have expected,
+
+32:20.000 --> 00:32:21.600
+possibly because of
+
+00:32:21.600 --> 00:32:25.120
+the implementation approach
+
+00:32:25.120 --> 00:32:33.200
+where it uses code generation
+
+00:32:33.200 --> 00:32:35.840
+to avoid function calls,
+
+32:35.840 --> 00:32:37.840
+at least some of them,
+
+32:37.840 --> 00:32:41.120
+which is interesting.
+
+32:41.120 --> 00:32:45.600
+But since both seq and dash
+
+00:32:45.600 --> 00:32:49.919
+avoid mutations--they don't really have
+
+32:49.919 --> 00:32:52.399
+mutating counterparts to common functions
+
+00:32:52.399 --> 00:32:56.480
+like you have with cl-remove-if, cl-delete-if,
+
+32:56.480 --> 00:33:02.000
+or just cl-remove, cl-delete,
+
+33:02.000 --> 00:33:08.000
+it still can be valuable to look into
+
+00:33:08.000 --> 00:33:12.240
+destructive versions of those functions,
+
+33:12.240 --> 00:33:16.880
+something from the core library
+
+00:33:16.880 --> 00:33:22.559
+like delete-dups or nreverse,
+
+33:22.559 --> 00:33:24.399
+for your code when you're really trying
+
+33:24.399 --> 00:33:29.519
+to get as close to the metal
+
+00:33:29.519 --> 00:33:34.320
+or whatever as you can,
+
+00:33:34.320 --> 00:33:40.080
+because avoiding extra allocations,
+
+00:33:40.080 --> 00:33:43.200
+it can really be useful.
+
+33:43.200 --> 00:33:46.159
+You can really improve their performance
+
+33:46.159 --> 00:33:54.080
+if you don't do a lot of other stuff.
+
+33:54.080 --> 00:34:00.080
+delete-consecutive-dups is blazing faster.
+
+34:00.080 --> 00:34:03.919
+It only requires pre-sorted strings.
+
+34:03.919 --> 00:34:08.399
+What else to say...
+
+34:08.399 --> 00:34:13.200
+If you are going to read these measurements,
+
+34:13.200 --> 00:34:15.359
+make sure to keep in mind
+
+00:34:15.359 --> 00:34:18.000
+that reverse is not free,
+
+34:18.000 --> 00:34:20.240
+so for instance, if we're looking
+
+00:34:20.240 --> 00:34:22.480
+at this comparison
+
+00:34:22.480 --> 00:34:26.399
+between remove and delete, for instance,
+
+34:26.399 --> 00:34:27.919
+they're using reverse
+
+00:34:27.919 --> 00:34:32.159
+to avoid modifying the data,
+
+34:32.159 --> 00:34:34.800
+the sample data, so we don't have to
+
+34:34.800 --> 00:34:36.720
+create it every time.
+
+34:36.720 --> 00:34:41.919
+But to compare how much faster
+
+00:34:41.919 --> 00:34:43.760
+delete is than remove,
+
+34:43.760 --> 00:34:50.800
+we need to subtract 787 milliseconds
+
+34:50.800 --> 00:34:52.320
+from here and from here
+
+00:34:52.320 --> 00:34:58.480
+so it comes out to like 230 milliseconds
+
+00:34:58.480 --> 00:35:02.560
+in this example, the last example,
+
+00:35:02.560 --> 00:35:12.000
+and 100 to 1 second, 250 milliseconds here,
+
+00:35:12.000 --> 00:35:17.599
+so the difference is 5-fold here.
+
+35:17.599 --> 00:35:20.160
+Not 2-fold.
+
+35:20.160 --> 00:35:26.480
+All right. With this, I'm going to
+
+35:26.480 --> 00:35:29.520
+thank you for listening, for watching
+
+35:29.520 --> 00:35:31.920
+and I'll be taking questions.
+
+35:31.920 --> 00:35:32.920
+Thank you.
+
+00:35:32.920 --> 00:35:35.160
+[captions by sachac]
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
new file mode 100644
index 00000000..3e716c43
--- /dev/null
+++ b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--answers--chapters.vtt
@@ -0,0 +1,82 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:26.318
+Thanks
+
+00:00:26.319 --> 00:03:09.598
+In your opinion, what is Emacs' Achilles heel?
+
+00:03:09.599 --> 00:05:06.959
+What is your opinion about the documentation of Emacs in other languages?
+
+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:06:31.840 --> 00:07:11.999
+Can you name a few features from other programming languages that you miss in Emacs Lisp?
+
+00:07:12.000 --> 00:08:22.399
+What are your opinions on Emacs's commitments to free software?
+
+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:11:42.960 --> 00:12:57.919
+Another way people can help inspire others to use Emacs
+
+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: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:15:22.080 --> 00:15:38.479
+When will David Wilson and Protesilaos collaborate?
+
+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:16:28.640 --> 00:18:29.679
+How do you feel being an Emacs-focused YouTuber?
+
+00:18:29.680 --> 00:20:31.119
+More typesetting capabilities versus better performance
+
+00:20:31.120 --> 00:24:43.199
+Sneak peek of what's coming in the YouTube channel soon?
+
+00:24:43.200 --> 00:25:07.919
+Principles and compromises
+
+00:25:07.920 --> 00:26:10.399
+Understanding the value of Emacs Lisp
+
+00:26:10.400 --> 00:26:44.319
+Will you do a video showing your personal workflow?
+
+00:26:44.320 --> 00:28:12.799
+What do you think about Guix or NixOS?
+
+00:28:12.800 --> 00:31:18.399
+Can you talk about your actual work?
+
+00:31:18.400 --> 00:35:23.119
+Do your colleagues use Emacs as well?
+
+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: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:42:29.920 --> 00:43:50.719
+How hard is it to get into the native code side of Emacs?
+
+00:43:50.720 --> 00:46:28.399
+Emacs Chats
+
+00:46:28.400 --> 00:53:34.879
+Livestreams
+
+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--chapters.vtt b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--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--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-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-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt
new file mode 100644
index 00000000..026216c8
--- /dev/null
+++ b/2021/captions/emacsconf-2021-forever--m-x-forever-why-emacs-will-outlast-text-editor-trends--david-wilson-system-crafters--main.vtt
@@ -0,0 +1,2674 @@
+WEBVTT
+
+00:01.280 --> 00:02.800
+Hi everyone! I'm very excited
+
+00:02.800 --> 00:05.200
+to be here at EmacsConf 2021 today
+
+00:05.200 --> 00:06.640
+to give my talk called
+
+00:06.640 --> 00:09.360
+"M-x Forever: How Emacs Will Outlast
+
+00:09.360 --> 00:11.519
+Text Editor Trends."
+
+00:11.519 --> 00:13.759
+So let's start with the conclusion first.
+
+00:13.759 --> 00:15.040
+I know, it's a little bit unorthodox,
+
+00:15.040 --> 00:16.960
+but let's just try and see what happens.
+
+00:16.960 --> 00:18.400
+So no matter what happens
+
+00:18.400 --> 00:19.760
+in the wider software world,
+
+00:19.760 --> 00:21.520
+GNU Emacs will continue to be
+
+00:21.520 --> 00:22.640
+a beloved program
+
+00:22.640 --> 00:24.080
+with a dedicated community
+
+00:24.080 --> 00:25.199
+and a healthy team
+
+00:25.199 --> 00:00:28.079
+of maintainers and contributors.
+
+00:28.080 --> 00:29.439
+You're probably wondering
+
+00:29.439 --> 00:31.141
+who am I to be making such a claim,
+
+00:31.141 --> 00:32.640
+so I'll tell you.
+
+00:32.640 --> 00:34.640
+I am David Wilson, the creator of the
+
+00:34.640 --> 00:36.000
+System Crafters YouTube channel
+
+00:36.000 --> 00:38.079
+and community. If you want to see
+
+00:38.079 --> 00:39.040
+a lot of really great videos
+
+00:39.040 --> 00:41.280
+about GNU Emacs, GNU Guix, etc.,
+
+00:41.280 --> 00:42.719
+come check out my YouTube channel.
+
+00:42.719 --> 00:44.480
+I'm also on LBRY and Odysee
+
+00:44.480 --> 00:46.399
+if you don't want to go use YouTubea
+
+00:46.399 --> 00:47.360
+And also, if you're the type of person
+
+00:47.360 --> 00:48.399
+who doesn't want to use
+
+00:48.399 --> 00:49.680
+any of these websites
+
+00:49.680 --> 00:51.039
+and you want to see my videos anyway,
+
+00:51.039 --> 00:52.160
+please just send me an email
+
+00:52.160 --> 00:53.280
+at the email address below
+
+00:53.280 --> 00:54.079
+and I'll see if I can set you up
+
+00:54.079 --> 00:55.520
+with that. You can also check out
+
+00:55.520 --> 00:58.160
+my website and the places where we chat,
+
+00:58.160 --> 00:59.440
+especially on libera.chat
+
+00:59.440 --> 01:01.440
+at the #systemcrafters channel.
+
+01:01.440 --> 01:02.719
+If you have any thoughts
+
+01:02.719 --> 01:03.600
+after seeing this talk,
+
+01:03.600 --> 01:04.799
+please feel free to send me an email
+
+01:04.799 --> 00:01:07.199
+or find me on chat.
+
+01:07.200 --> 01:09.920
+So there is a recurring concern
+
+01:09.920 --> 01:11.119
+in the Emacs community
+
+01:11.119 --> 01:12.799
+about its popularity.
+
+01:12.799 --> 01:14.320
+This is something that keeps coming back
+
+01:14.320 --> 01:16.479
+time and time again. You probably see it
+
+01:16.479 --> 01:18.640
+every year or two where people on Reddit
+
+01:18.640 --> 01:19.840
+or maybe on the emacs-devel
+
+01:19.840 --> 01:21.600
+mailing list are talking about ways
+
+01:21.600 --> 01:24.000
+to increase Emacs popularity.
+
+01:24.000 --> 01:25.600
+More recently, there was a discussion
+
+01:25.600 --> 01:27.600
+on Hacker News where somebody posted
+
+01:27.600 --> 01:28.159
+a link to this
+
+01:28.159 --> 01:31.360
+Making Emacs Popular Again blog post
+
+01:31.360 --> 01:32.479
+which does chronicle some of the
+
+01:32.479 --> 01:34.479
+more recent discussions on emacs-devel
+
+01:34.479 --> 01:35.840
+about things that could be done
+
+01:35.840 --> 01:38.479
+to make Emacs a more popular editor.
+
+01:38.479 --> 01:40.079
+So the title of my talk claims
+
+01:40.079 --> 01:41.280
+that Emacs is going to
+
+01:41.280 --> 01:43.759
+outlast text editor trends.
+
+01:43.759 --> 01:45.840
+So to elaborate on this claim,
+
+01:45.840 --> 01:46.799
+we're going to try to answer
+
+01:46.799 --> 01:48.720
+a few specific questions.
+
+01:48.720 --> 01:51.200
+First of all, what is popularity
+
+01:51.200 --> 01:53.280
+and how do you even measure it?
+
+01:53.280 --> 01:54.240
+If people are saying
+
+01:54.240 --> 01:55.920
+that Emacs needs to be more popular,
+
+01:55.920 --> 01:57.040
+then what do we really mean
+
+01:57.040 --> 01:59.040
+by popularity?
+
+01:59.040 --> 02:00.159
+Also, what are the benefits
+
+02:00.159 --> 02:01.920
+of popularity? If emacs did somehow
+
+02:01.920 --> 02:03.920
+become more popular, what benefits
+
+02:03.920 --> 02:05.680
+would it receive from that?
+
+02:05.680 --> 02:07.439
+And also, how does an editor
+
+02:07.439 --> 02:08.720
+lose popularity, and what are
+
+02:08.720 --> 02:11.120
+the possible consequences to that?
+
+02:11.120 --> 02:12.480
+And then what are the unique factors
+
+02:12.480 --> 02:13.680
+about Emacs that will ensure
+
+02:13.680 --> 02:16.000
+that it survives long term?
+
+02:16.000 --> 02:17.520
+What is special about Emacs
+
+02:17.520 --> 02:19.440
+that will help it to thrive
+
+02:19.440 --> 02:21.920
+despite whatever happens in the
+
+02:21.920 --> 02:24.560
+popular sphere of text editors and
+
+02:24.560 --> 00:02:26.958
+programming languages, etc.?
+
+02:26.959 --> 02:28.800
+So, first of all, what does popularity
+
+02:28.800 --> 02:30.720
+really mean? When someone says
+
+02:30.720 --> 02:32.400
+that Emacs needs to become more popular,
+
+02:32.400 --> 02:33.680
+what are they really saying
+
+02:33.680 --> 02:35.840
+is that there needs to be more users,
+
+02:35.840 --> 02:37.102
+and that they stick around.
+
+02:37.102 --> 02:38.800
+Like, they learn how to use Emacs
+
+02:38.800 --> 02:41.680
+and they continue to be users.
+
+02:41.680 --> 02:42.800
+If we did get those new users,
+
+02:42.800 --> 02:45.599
+what would it actually do for Emacs?
+
+02:45.599 --> 02:47.440
+Also, is it that there are
+
+02:47.440 --> 02:48.959
+more community members that are
+
+02:48.959 --> 02:51.040
+creating new packages?
+
+02:51.040 --> 02:52.480
+You know, that sort of assumes
+
+02:52.480 --> 02:53.519
+that the editor itself
+
+02:53.519 --> 02:54.720
+doesn't have enough packages,
+
+02:54.720 --> 02:55.519
+or that the only way
+
+02:55.519 --> 02:57.120
+that the an editor stays alive
+
+02:57.120 --> 02:58.800
+is for there to be constant churn,
+
+02:58.800 --> 03:01.440
+with new packages coming around.
+
+03:01.440 --> 03:03.120
+Is it that there is more content
+
+03:03.120 --> 03:04.319
+being created by users,
+
+03:04.319 --> 03:05.840
+like more blog posts being written,
+
+03:05.840 --> 03:07.920
+more YouTube videos being made,
+
+03:07.920 --> 03:09.360
+more other ways that people are
+
+03:09.360 --> 03:11.599
+evangelizing the use of Emacs
+
+03:11.599 --> 03:14.720
+and also teaching people how to use it?
+
+03:14.720 --> 03:16.080
+Also, is it that
+
+03:16.080 --> 03:18.720
+more long-term stability is had
+
+03:18.720 --> 03:20.159
+in the editor, and more core
+
+03:20.159 --> 03:21.280
+improvements that are being made
+
+03:21.280 --> 03:22.879
+over time? I mean, I guess you could say
+
+03:22.879 --> 03:23.760
+that it does make sense
+
+03:23.760 --> 03:25.680
+that if the editor is more popular,
+
+03:25.680 --> 03:26.959
+then people will be more invested
+
+03:26.959 --> 03:28.080
+in improving it, and there will be
+
+03:28.080 --> 03:30.000
+more new contributors coming in,
+
+03:30.000 --> 03:32.480
+but is greater and greater popularity
+
+03:32.480 --> 03:33.280
+really what's needed
+
+03:33.280 --> 03:35.280
+to ensure that this happens?
+
+03:35.280 --> 03:37.040
+Also, it could just be that
+
+03:37.040 --> 03:38.080
+there's more validation
+
+03:38.080 --> 03:40.480
+for someone's personal choices.
+
+03:40.480 --> 03:42.159
+You know, people tend to use
+
+03:42.159 --> 03:43.760
+these software choices they use
+
+03:43.760 --> 03:44.799
+as part of their identity.
+
+03:44.799 --> 03:46.000
+So is it that they want Emacs
+
+03:46.000 --> 03:46.799
+to be more popular
+
+03:46.799 --> 03:48.319
+so that they can finally say,
+
+03:48.319 --> 03:49.440
+"I'm an Emacs user,"
+
+03:49.440 --> 03:50.080
+and have people think
+
+03:50.080 --> 03:51.840
+that they're cool or "hip" or whatever?
+
+03:51.840 --> 03:52.720
+I hope that... Hopefully,
+
+03:52.720 --> 03:53.370
+that's not the case.
+
+03:53.370 --> 03:54.239
+Hopefully, it's one of these
+
+03:54.239 --> 03:56.000
+other points. But it could be something
+
+03:56.000 --> 03:57.120
+because, as we see, you know,
+
+03:57.120 --> 03:59.439
+there's a lot of trends and fashion
+
+03:59.439 --> 04:00.879
+when it comes to software development
+
+04:00.879 --> 04:02.640
+and also free software
+
+04:02.640 --> 04:04.159
+and open source tools.
+
+04:04.159 --> 04:05.840
+So as we go through this talk,
+
+04:05.840 --> 04:07.200
+keep these questions in mind
+
+04:07.200 --> 04:07.760
+as we talk about
+
+04:07.760 --> 04:09.680
+some of the finer points on all of this,
+
+04:09.680 --> 04:11.280
+and see whether you think
+
+04:11.280 --> 04:13.680
+that popularity really correlates
+
+04:13.680 --> 00:04:15.679
+with these things.
+
+04:15.680 --> 04:17.919
+So first of all, how do we measure
+
+04:17.919 --> 04:20.720
+popularity? What information do we have
+
+04:20.720 --> 04:21.600
+to actually determine
+
+04:21.600 --> 04:23.360
+which editors are popular,
+
+04:23.360 --> 04:25.199
+and whether they're gaining or losing
+
+04:25.199 --> 04:26.880
+popularity? So I've got a few,
+
+04:26.880 --> 04:27.759
+or a couple places here
+
+04:27.759 --> 04:29.120
+that we can look at
+
+04:29.120 --> 04:30.560
+to judge the popularity
+
+04:30.560 --> 00:04:32.399
+of various editors.
+
+04:32.400 --> 04:33.840
+First of all, Google Trends.
+
+04:33.840 --> 04:35.199
+Google actually gives us the ability
+
+04:35.199 --> 04:37.199
+to track and compare search volume
+
+04:37.199 --> 04:39.040
+for particular terms and topics
+
+04:39.040 --> 04:41.759
+over time. So if you wanted to know
+
+04:41.759 --> 04:43.040
+how often someone was searching
+
+04:43.040 --> 04:44.800
+about Emacs, maybe to try to find help
+
+04:44.800 --> 04:46.479
+for something, or look for documentation,
+
+04:46.479 --> 04:48.800
+or maybe look for blog posts, etc.,
+
+04:48.800 --> 04:49.919
+you can look at Google Trends
+
+04:49.919 --> 04:51.600
+to see how often people are searching
+
+04:51.600 --> 04:53.440
+for Emacs over time.
+
+04:53.440 --> 04:55.199
+One useful ability is that we can
+
+04:55.199 --> 04:57.360
+compare how much people are searching
+
+04:57.360 --> 04:58.720
+across various different topics
+
+04:58.720 --> 05:00.000
+and see a graph, which is
+
+05:00.000 --> 05:01.680
+what i'm going to show you right now.
+
+05:01.680 --> 05:04.000
+This graph shows you the search volume
+
+05:04.000 --> 05:06.320
+for Emacs compared to Vim, Atom,
+
+05:06.320 --> 05:08.800
+Sublime Text, and Visual Studio Code
+
+05:08.800 --> 05:11.120
+from 2004 to the present
+
+05:11.120 --> 05:12.880
+worldwide, so all across the world
+
+05:12.880 --> 05:14.479
+where searches are happening.
+
+05:14.479 --> 05:16.240
+You can see that in 2004,
+
+05:16.240 --> 05:18.479
+Emacs is the reigning king supreme
+
+05:18.479 --> 05:21.039
+where you have the most search terms
+
+05:21.039 --> 05:22.720
+or searches happening on emacs
+
+05:22.720 --> 05:25.199
+at that time. Also, Vim is quite high
+
+05:25.199 --> 05:26.960
+on this list as well.
+
+05:26.960 --> 05:28.560
+Let's see. Sublime Text is a bit lower
+
+05:28.560 --> 05:31.120
+in the list, but it's in third place.
+
+05:31.120 --> 05:32.080
+Nope. Yep. That's right.
+
+05:32.080 --> 05:34.880
+Then atom is quite low, but I think that
+
+05:34.880 --> 05:36.320
+Atom didn't exist yet,
+
+05:36.320 --> 05:37.759
+so maybe at that point, you know,
+
+05:37.759 --> 05:39.120
+this is probably something else.
+
+05:39.120 --> 05:41.360
+Google is just getting random data.
+
+05:41.360 --> 05:42.880
+And then Visual Studio Code
+
+05:42.880 --> 05:43.919
+also didn't exist,
+
+05:43.919 --> 05:45.039
+so probably this is like
+
+05:45.039 --> 05:46.479
+Visual Studio searches,
+
+05:46.479 --> 05:48.000
+but then as you go across the years,
+
+05:48.000 --> 05:48.960
+you see that gradually,
+
+05:48.960 --> 05:52.160
+Emacs popularity appears to be declining.
+
+05:52.160 --> 05:54.639
+As does Vim, but not quite so much.
+
+05:54.639 --> 05:56.560
+And then over time, Sublime Text
+
+05:56.560 --> 05:57.520
+becomes more popular,
+
+05:57.520 --> 05:59.280
+and then VS Code in more recent years
+
+05:59.280 --> 06:00.319
+becomes very popular
+
+06:00.319 --> 06:02.400
+compared to everything else.
+
+06:02.400 --> 06:04.479
+So it looks like Emacs
+
+06:04.479 --> 06:06.960
+has declined significantly in popularity,
+
+06:06.960 --> 06:09.600
+while the other editors have taken over.
+
+06:09.600 --> 06:11.360
+But is the search volume really
+
+06:11.360 --> 06:12.800
+the only important factor
+
+06:12.800 --> 06:14.800
+that indicates popularity or health
+
+06:14.800 --> 06:16.080
+of a given editor?
+
+06:16.080 --> 00:06:18.318
+That still remains to be seen.
+
+06:18.319 --> 06:19.680
+We can also take a look
+
+06:19.680 --> 06:22.400
+at the yearly survey
+
+06:22.400 --> 06:24.602
+that the website Stack Overflow puts out
+
+06:24.602 --> 06:26.533
+asking developers about the tools
+
+06:26.533 --> 06:27.360
+that they use to find out
+
+06:27.360 --> 06:28.720
+which ones are being used
+
+06:28.720 --> 06:29.759
+most frequently and that are
+
+06:29.759 --> 06:31.919
+gaining popularity over time.
+
+06:31.919 --> 06:33.680
+So there is a great blog post
+
+06:33.680 --> 06:35.039
+by someone named Roben Kleene,
+
+06:35.039 --> 06:37.039
+who synthesizes some
+
+06:37.039 --> 06:37.840
+of this data together,
+
+06:37.840 --> 06:39.120
+specifically about editors,
+
+06:39.120 --> 06:40.240
+and provides us with a graph
+
+06:40.240 --> 06:41.680
+that we can take a look at
+
+06:41.680 --> 06:43.440
+that compares the popularity
+
+06:43.440 --> 06:44.639
+of particular editors
+
+06:44.639 --> 06:46.560
+in the last maybe four or five years,
+
+06:46.560 --> 06:49.199
+at least 2015 to 2019,
+
+06:49.199 --> 06:50.560
+based on the responses
+
+06:50.560 --> 06:52.560
+to the Stack Overflow survey.
+
+06:52.560 --> 06:54.479
+In this case we see that
+
+06:54.479 --> 06:56.560
+Emacs is the light blue line,
+
+06:56.560 --> 06:59.440
+and it sort of stays in maybe, let's see,
+
+06:59.440 --> 07:00.960
+maybe third place in the beginning,
+
+07:00.960 --> 07:02.000
+and then fifth place,
+
+07:02.000 --> 07:03.520
+and basically just stays in fifth place
+
+07:03.520 --> 07:05.039
+the whole time, compared to things like
+
+07:05.039 --> 07:07.120
+Atom, Sublime Text, and VS Code.
+
+07:07.120 --> 07:08.560
+As we saw before, the VS Code
+
+07:08.560 --> 07:10.960
+just sort of ramps up at the end.
+
+07:10.960 --> 07:13.199
+Now, this is another thing
+
+07:13.199 --> 07:14.560
+that basically is showing us
+
+07:14.560 --> 07:17.039
+similarly to the Google Trends
+
+07:17.039 --> 07:19.280
+that Emacs's popularity is not quite
+
+07:19.280 --> 07:21.840
+as much as other editors out there.
+
+07:21.840 --> 07:23.840
+You can also look at the 2021 results
+
+07:23.840 --> 07:26.160
+of the Stack Overflow survey,
+
+07:26.160 --> 07:27.199
+which I'll show you now,
+
+07:27.199 --> 07:30.319
+which shows Emacs in 16th place.
+
+07:30.319 --> 07:31.680
+Let's see. If we look here,
+
+07:31.680 --> 07:32.960
+we see Visual Studio Code
+
+07:32.960 --> 07:34.400
+is the most popular, then we have
+
+07:34.400 --> 07:36.800
+a whole bunch of other well-known editors.
+
+07:36.800 --> 07:37.840
+Some are kind of surprising,
+
+07:37.840 --> 07:40.400
+like Notepad++ is quite high up there,
+
+07:40.400 --> 07:42.080
+but then we have Emacs here
+
+07:42.080 --> 07:43.199
+coming right in behind
+
+07:43.199 --> 07:44.879
+PhpStorm and NetBeans,
+
+07:44.879 --> 07:46.400
+which is pretty funny to me.
+
+07:46.400 --> 07:48.879
+But it just goes to show you
+
+07:48.879 --> 07:54.000
+that the Emacs community is smaller
+
+07:54.000 --> 07:55.599
+than what you might consider
+
+07:55.599 --> 07:56.960
+for other editors, or at least
+
+07:56.960 --> 07:58.800
+the Emacs user base, maybe.
+
+07:58.800 --> 07:59.440
+Maybe it's just the people
+
+07:59.440 --> 08:00.800
+who actually respond to the survey.
+
+08:00.800 --> 08:02.080
+You can't really tell for sure
+
+08:02.080 --> 08:03.759
+because all this data is coming from
+
+08:03.759 --> 08:05.039
+a self-selected group of people
+
+08:05.039 --> 08:06.720
+who have responded to the survey.
+
+08:06.720 --> 08:08.879
+So I think what... Basically,
+
+08:08.879 --> 08:10.560
+what I'm trying to say is that
+
+08:10.560 --> 08:12.080
+if you look at all these things,
+
+08:12.080 --> 08:14.080
+you would probably get the perception
+
+08:14.080 --> 08:15.919
+that Emacs is dead
+
+08:15.919 --> 08:17.199
+and that maybe nobody really
+
+08:17.199 --> 08:18.240
+uses the editor anymore,
+
+08:18.240 --> 00:08:19.999
+or that it's on its way out.
+
+08:20.000 --> 08:21.599
+However, I think there's another way
+
+08:21.599 --> 08:24.879
+to look at the health or popularity
+
+08:24.879 --> 08:27.280
+of Emacs (or any other editor, really),
+
+08:27.280 --> 08:28.240
+and that is to judge
+
+08:28.240 --> 08:29.520
+the popularity and health
+
+08:29.520 --> 08:30.240
+by taking a look
+
+08:30.240 --> 08:32.080
+at the community activity
+
+08:32.080 --> 08:33.680
+in places such as Reddit,
+
+08:33.680 --> 08:35.760
+or maybe on Discord servers,
+
+08:35.760 --> 08:38.880
+Slack servers, IRC channels,
+
+08:38.880 --> 08:40.000
+mailing lists, particularly
+
+08:40.000 --> 08:41.120
+on emacs-devel,
+
+08:41.120 --> 08:42.640
+where all of the conversation
+
+08:42.640 --> 08:45.120
+about the development of Emacs happens.
+
+08:45.120 --> 08:46.640
+Blogs. There's quite a lot of people
+
+08:46.640 --> 08:47.519
+in the Emacs community
+
+08:47.519 --> 08:48.959
+writing blog posts.
+
+08:48.959 --> 08:50.640
+There's quite a few YouTube channels now
+
+08:50.640 --> 08:52.399
+making content about Emacs
+
+08:52.399 --> 08:53.839
+pretty frequently, and then
+
+08:53.839 --> 08:56.880
+conferences like this one, EmacsConf.
+
+08:56.880 --> 08:58.399
+If you've spent any time
+
+08:58.399 --> 08:59.600
+in any of these places recently,
+
+08:59.600 --> 09:00.640
+did you actually get the sense
+
+09:00.640 --> 09:03.440
+that Emacs community lacks activity?
+
+09:03.440 --> 09:04.800
+I personally don't.
+
+09:04.800 --> 09:06.560
+I see quite a lot of activity on Reddit,
+
+09:06.560 --> 09:07.360
+I see a lot of activity
+
+09:07.360 --> 09:08.320
+in various other places,
+
+09:08.320 --> 09:11.040
+even my own chats that I've created.
+
+09:11.040 --> 09:12.480
+Lots of people talking about Emacs
+
+09:12.480 --> 09:16.320
+every day. But this is harder to measure,
+
+09:16.320 --> 09:18.160
+because you would have to go count
+
+09:18.160 --> 09:21.279
+all of the mailing list emails
+
+09:21.279 --> 09:22.560
+compared to other editors,
+
+09:22.560 --> 09:23.760
+or maybe like the Reddit posts
+
+09:23.760 --> 09:24.959
+compared to other editors.
+
+09:24.959 --> 09:26.880
+We could do that, but really,
+
+09:26.880 --> 09:27.839
+the more important thing
+
+09:27.839 --> 09:29.920
+is to just go experience the community
+
+09:29.920 --> 09:31.279
+by going to one of these places
+
+09:31.279 --> 09:33.360
+and take a look at what's going on.
+
+09:33.360 --> 09:34.560
+You can get a really good sense of that
+
+09:34.560 --> 09:37.760
+by checking out Sacha Chua's Emacs News
+
+09:37.760 --> 09:39.120
+roll-up blog posts
+
+09:39.120 --> 09:40.399
+that come out every week.
+
+09:40.399 --> 09:42.000
+It's a very good distillation of things
+
+09:42.000 --> 09:42.560
+that are happening
+
+09:42.560 --> 09:43.920
+in the Emacs community.
+
+09:43.920 --> 09:48.080
+If you look at those things
+
+09:48.080 --> 09:49.040
+and look at all that,
+
+09:49.040 --> 09:50.640
+you can tell that there is actually
+
+09:50.640 --> 09:51.360
+something happening
+
+09:51.360 --> 09:52.240
+in the Emacs community
+
+09:52.240 --> 09:54.000
+that is more than what you see
+
+09:54.000 --> 09:55.680
+in the numbers on Google Trends
+
+09:55.680 --> 09:58.080
+and on Stack Overflow.
+
+09:58.080 --> 09:59.200
+Another interesting point
+
+09:59.200 --> 10:00.480
+that doesn't really fit into all this,
+
+10:00.480 --> 10:01.440
+but if you want to look
+
+10:01.440 --> 10:02.640
+at the actual data
+
+10:02.640 --> 10:03.920
+from the Emacs community
+
+10:03.920 --> 10:06.160
+about how the community uses Emacs,
+
+10:06.160 --> 10:06.880
+check out the results
+
+10:06.880 --> 10:08.480
+of the 2020 Emacs survey.
+
+10:08.480 --> 10:09.040
+I'm sure there's going to be
+
+10:09.040 --> 10:11.760
+another Emacs survey at some point soon,
+
+10:11.760 --> 10:13.120
+as well, but that will give you
+
+10:13.120 --> 10:14.480
+some insight into what's happening
+
+10:14.480 --> 10:16.000
+within the community itself.
+
+10:16.000 --> 10:16.399
+You can see that
+
+10:16.399 --> 10:17.600
+there's quite a lot of activity
+
+10:17.600 --> 10:19.839
+and a lot of different use cases for Emacs
+
+10:19.839 --> 00:10:23.199
+and types of people who are using Emacs.
+
+10:23.200 --> 10:24.000
+Let's talk about
+
+10:24.000 --> 10:26.079
+how editors lose popularity.
+
+10:26.079 --> 10:26.880
+So people are worried
+
+10:26.880 --> 10:29.360
+that Emacs is going to lose popularity.
+
+10:29.360 --> 10:31.440
+What do they worry is going to happen
+
+10:31.440 --> 10:34.000
+if that happens?
+
+10:37.040 --> 00:10:38.319
+Or how actually could it happen?
+
+10:38.320 --> 10:39.680
+So maybe a new editor
+
+10:39.680 --> 10:41.839
+with better features appears.
+
+10:41.839 --> 10:43.440
+So one theory for why users
+
+10:43.440 --> 10:45.920
+left TextMate for Sublime Text...
+
+10:45.920 --> 10:46.880
+If you don't know about TextMate,
+
+10:46.880 --> 10:49.600
+it was a very popular editor on macOS
+
+10:49.600 --> 10:52.160
+back probably in the Ruby on Rails craze
+
+10:52.160 --> 10:54.079
+time frame, maybe like the mid-2000s,
+
+10:54.079 --> 10:57.200
+2005 or so. Then eventually Sublime Text
+
+10:57.200 --> 10:59.519
+came along, and it had
+
+10:59.519 --> 11:01.360
+a better extensibility API
+
+11:01.360 --> 11:03.200
+and really good performance.
+
+11:03.200 --> 11:05.200
+It also was able to use
+
+11:05.200 --> 11:07.040
+some of the same stuff from TextMate,
+
+11:07.040 --> 11:08.720
+like these syntax highlighting grammars
+
+11:08.720 --> 11:11.040
+and the snippet definitions, etc.
+
+11:11.040 --> 11:12.240
+So you had TextMate
+
+11:12.240 --> 11:13.519
+which was a well-loved editor,
+
+11:13.519 --> 11:15.200
+but then a new editor called Sublime Text
+
+11:15.200 --> 11:17.200
+came along with better functionality,
+
+11:17.200 --> 11:18.880
+and people started switching over to it
+
+11:18.880 --> 11:20.160
+because it could do more things
+
+11:20.160 --> 11:21.680
+and the user had more ability
+
+11:21.680 --> 11:24.399
+to add functionality to it.
+
+11:24.399 --> 11:26.880
+Also, VS Code came along
+
+11:26.880 --> 11:27.920
+and used a similar model
+
+11:27.920 --> 11:29.120
+to the Atom editor,
+
+11:29.120 --> 11:31.360
+basically being a web-based editor
+
+11:31.360 --> 11:32.480
+using Electron,
+
+11:32.480 --> 11:34.640
+but it greatly improved upon performance
+
+11:34.640 --> 11:36.640
+and IDE tooling ecosystem.
+
+11:36.640 --> 11:38.640
+For people getting real work done
+
+11:38.640 --> 11:39.519
+with large projects,
+
+11:39.519 --> 11:41.120
+you need to have things like IntelliSense,
+
+11:41.120 --> 11:42.800
+and being able to find definitions
+
+11:42.800 --> 11:45.839
+of functions or classes that are defined.
+
+11:45.839 --> 11:47.040
+So you have a new editor
+
+11:47.040 --> 11:47.519
+that comes along
+
+11:47.519 --> 11:49.440
+that has basically better functionality
+
+11:49.440 --> 11:51.279
+than the one that was there before.
+
+11:51.279 --> 11:52.399
+But the thing is,
+
+11:52.399 --> 11:53.760
+if you have a new editor that comes along
+
+11:53.760 --> 11:54.720
+with better functionality,
+
+11:54.720 --> 11:57.120
+it still has to be at least as good as
+
+11:57.120 --> 11:58.800
+or better than the previous editor
+
+11:58.800 --> 12:00.000
+for people to stick with it.
+
+12:00.000 --> 12:02.480
+So it's a very tall order
+
+12:02.480 --> 12:03.680
+for someone to say
+
+12:03.680 --> 12:05.200
+there's going to be some editor
+
+12:05.200 --> 12:05.839
+that will come along
+
+12:05.839 --> 12:07.040
+that would be better than Emacs
+
+12:07.040 --> 12:08.240
+on every dimension,
+
+12:08.240 --> 12:09.680
+because there are some unique dimensions
+
+12:09.680 --> 12:11.360
+that are hard to beat
+
+12:11.360 --> 12:14.160
+in an editor like Emacs.
+
+12:14.160 --> 12:15.920
+Lack of sufficient maintenance.
+
+12:15.920 --> 12:16.560
+That's one thing
+
+12:16.560 --> 12:17.600
+that could possibly happen
+
+12:17.600 --> 12:19.279
+if an editor loses popularity.
+
+12:19.279 --> 12:20.687
+So maybe sometimes...
+
+12:20.687 --> 12:22.480
+Sorry, that's something
+
+12:22.480 --> 12:23.440
+that can cause a lack,
+
+12:23.440 --> 00:12:25.679
+a loss of popularity.
+
+12:25.680 --> 12:26.959
+Sometimes the development team
+
+12:26.959 --> 12:28.320
+for an editor either moves on
+
+12:28.320 --> 12:29.279
+or maybe switches focus
+
+12:29.279 --> 12:30.720
+to a different project.
+
+12:30.720 --> 12:32.079
+When this happens, the development
+
+12:32.079 --> 12:33.360
+of the editor can stagnate,
+
+12:33.360 --> 12:36.240
+giving the impression that it's dead.
+
+12:37.279 --> 12:38.160
+You can see this happening
+
+12:38.160 --> 12:40.720
+a lot of times on repositories
+
+12:40.720 --> 12:41.920
+for open source projects,
+
+12:41.920 --> 12:43.440
+where if someone doesn't make any commits
+
+12:43.440 --> 12:44.639
+or adding new features for a while,
+
+12:44.639 --> 12:45.839
+people just automatically assume
+
+12:45.839 --> 12:46.880
+that the thing is dead,
+
+12:46.880 --> 12:48.399
+even if it's in a very stable state
+
+12:48.399 --> 12:49.920
+and doesn't really need any improvements
+
+12:49.920 --> 12:53.680
+to be made. This is something
+
+12:53.680 --> 12:55.360
+that can happen over time.
+
+12:55.360 --> 12:56.720
+The developers of Sublime Text
+
+12:56.720 --> 12:57.920
+sometimes give the impression
+
+12:57.920 --> 12:59.519
+that the editor isn't being maintained
+
+12:59.519 --> 13:02.000
+because of long breaks between updates,
+
+13:02.000 --> 13:03.360
+and this gives people...
+
+13:03.360 --> 13:04.560
+If you go search for
+
+13:04.560 --> 13:05.440
+"Is Sublime Text dead?",
+
+13:05.440 --> 13:06.800
+you'll see posts about this
+
+13:07.519 --> 13:08.240
+every couple years,
+
+13:08.240 --> 13:09.120
+where people are wondering
+
+13:09.120 --> 13:10.320
+what's happening with Sublime Text,
+
+13:10.320 --> 13:12.320
+when in reality, there's actually
+
+13:12.320 --> 13:15.120
+development happening on this project,
+
+13:15.120 --> 13:18.160
+and paid users are getting these updates
+
+13:18.160 --> 13:19.279
+because they've paid,
+
+13:19.279 --> 13:20.639
+but the product is not open source.
+
+13:20.639 --> 13:21.600
+You have no visibility
+
+13:21.600 --> 13:22.399
+into the development.
+
+13:22.399 --> 13:24.639
+So if people have the perception
+
+13:24.639 --> 13:26.160
+that the editor is not being maintained,
+
+13:26.160 --> 13:26.880
+then there's going to be
+
+13:26.880 --> 13:28.079
+rumors getting started,
+
+13:28.079 --> 13:29.200
+and that could cause
+
+13:29.200 --> 13:30.959
+the mentality of people to shift
+
+13:30.959 --> 13:32.639
+and try to move on to other editors
+
+13:32.639 --> 13:34.240
+because they perceive them to be
+
+13:34.240 --> 13:36.399
+more well-maintained or more active.
+
+13:36.399 --> 13:37.920
+Another problem can be that there are
+
+13:37.920 --> 13:39.839
+major bugs that persist over a long time
+
+13:39.839 --> 13:41.040
+that aren't being fixed
+
+13:41.040 --> 13:42.560
+while the maintainers are focusing on
+
+13:42.560 --> 13:44.639
+some other efforts in the project,
+
+13:44.639 --> 13:46.000
+and this could hurt sentiment
+
+13:46.000 --> 13:48.160
+in the community and cause a backlash
+
+13:48.160 --> 13:49.120
+leading to an exodus.
+
+13:49.120 --> 13:51.120
+So if you have really bad bugs
+
+13:51.120 --> 13:51.600
+and people think
+
+13:51.600 --> 13:52.560
+that you're not really concerned
+
+13:52.560 --> 13:53.519
+about fixing them,
+
+13:53.519 --> 13:54.399
+then that could be something
+
+13:54.399 --> 13:55.360
+that would cause an editor
+
+13:55.360 --> 13:56.399
+to lose popularity
+
+13:56.399 --> 13:58.000
+as people move on to find something else
+
+13:58.000 --> 00:14:01.039
+that appears to be more stable.
+
+14:01.040 --> 14:03.199
+Lastly, sometimes all it takes is
+
+14:03.199 --> 14:04.480
+for a new programming language
+
+14:04.480 --> 14:05.279
+to become popular
+
+14:05.279 --> 14:06.880
+or for an influential person to say
+
+14:06.880 --> 14:08.720
+that they switched to a different editor,
+
+14:08.720 --> 14:14.560
+because people are capable of being led
+
+14:14.560 --> 14:16.720
+by someone else who is influential,
+
+14:16.720 --> 14:18.320
+so sometimes it's just...
+
+14:18.320 --> 14:20.240
+All it takes is someone to say, you know,
+
+14:20.240 --> 14:22.240
+I'm not going to use this editor any more,
+
+14:22.240 --> 14:24.000
+and other people will follow.
+
+14:24.000 --> 14:26.240
+But oftentimes, it's not just about
+
+14:26.240 --> 14:27.199
+the fashion changing,
+
+14:27.199 --> 14:28.560
+it's also there's other problems
+
+14:28.560 --> 14:29.040
+that are happening.
+
+14:29.040 --> 14:29.680
+Some of these other things
+
+14:29.680 --> 14:30.959
+that I mentioned before
+
+14:30.959 --> 14:32.160
+that could be contributing
+
+14:32.160 --> 14:33.839
+to this overall sentiment
+
+14:33.839 --> 00:14:36.958
+that caused people to move on.
+
+14:36.959 --> 14:38.000
+So then what happens
+
+14:38.000 --> 14:40.000
+when an editor loses popularity?
+
+14:40.000 --> 14:40.800
+If people are worried
+
+14:40.800 --> 14:43.120
+that Emacs is going to lose popularity,
+
+14:43.120 --> 14:44.880
+what happens if it doesn't gain more?
+
+14:44.880 --> 14:47.839
+So what are the possible consequences?
+
+14:47.839 --> 14:49.120
+Well, maybe core maintainers
+
+14:49.120 --> 14:50.399
+will gradually leave the project
+
+14:50.399 --> 14:52.160
+with nobody to replace them. I mean,
+
+14:52.160 --> 14:53.839
+if you have a project like Emacs
+
+14:53.839 --> 14:57.199
+where there's a core
+
+14:57.199 --> 14:58.240
+that's written in a language
+
+14:58.240 --> 14:59.600
+that's different than the language
+
+14:59.600 --> 15:01.040
+everybody uses to extend it,
+
+15:01.040 --> 15:02.240
+then maybe it's risky
+
+15:02.240 --> 15:03.440
+to have people leave the project
+
+15:03.440 --> 15:04.800
+because you don't have other people
+
+15:04.800 --> 15:06.560
+to come along who can help maintain it
+
+15:06.560 --> 15:10.240
+and to carry on the knowledge of the core.
+
+15:10.240 --> 15:11.519
+Also, maybe no new features
+
+15:11.519 --> 15:13.279
+are being added to stay competitive
+
+15:13.279 --> 15:14.800
+with other editors.
+
+15:14.800 --> 15:15.920
+So this is one of these things
+
+15:15.920 --> 15:17.120
+where people kind of feel like
+
+15:17.120 --> 15:18.800
+there's a feature mill, where you know
+
+15:18.800 --> 15:20.880
+if new features are coming online
+
+15:20.880 --> 15:21.680
+in other editors,
+
+15:21.680 --> 15:23.279
+maybe your editor needs to catch up.
+
+15:23.279 --> 15:24.160
+Well, I don't really think that
+
+15:24.160 --> 15:25.279
+that's necessarily needed,
+
+15:25.279 --> 15:28.160
+but if there are new paradigms
+
+15:28.160 --> 15:29.839
+or usage patterns or workflows
+
+15:29.839 --> 15:32.320
+that are becoming...
+
+15:32.320 --> 15:33.759
+I guess you could say mainstream,
+
+15:33.759 --> 15:34.800
+sometimes it does make sense
+
+15:34.800 --> 15:37.199
+for an editor to be able to adopt these,
+
+15:37.199 --> 15:37.759
+but if you have
+
+15:37.759 --> 15:39.519
+a sufficiently extendable editor,
+
+15:39.519 --> 15:41.440
+then oftentimes, you don't really need to
+
+15:41.440 --> 15:42.079
+do anything other than
+
+15:42.079 --> 15:44.480
+just write a new package.
+
+15:44.480 --> 15:46.160
+Critical bugs that never get fixed...
+
+15:46.160 --> 15:48.240
+I mean, if people start to drift off
+
+15:48.240 --> 15:49.839
+from the project, it is much more likely
+
+15:49.839 --> 15:52.720
+that bad bugs won't get fixed over time.
+
+15:52.720 --> 15:54.079
+Less community interest in creating
+
+15:54.079 --> 15:55.199
+and maintaining packages.
+
+15:55.199 --> 15:56.320
+There's another possibility
+
+15:56.320 --> 15:57.519
+if people don't feel like
+
+15:57.519 --> 15:58.880
+it's worth their time anymore
+
+15:58.880 --> 16:00.079
+because not many people
+
+16:00.079 --> 16:00.880
+are using an editor,
+
+16:00.880 --> 16:02.480
+maybe they'll have more users
+
+16:02.480 --> 16:03.279
+or more interaction
+
+16:03.279 --> 16:04.959
+if they go write a similar package
+
+16:04.959 --> 16:07.440
+for a different editor.
+
+16:07.440 --> 16:10.079
+Less blog posts, videos, content.
+
+16:10.079 --> 16:11.519
+Basically, like, if people feel
+
+16:11.519 --> 16:12.480
+that it's not worth their time
+
+16:12.480 --> 16:13.839
+to make content about the editor either,
+
+16:13.839 --> 16:15.360
+or if you're just not interested any more,
+
+16:15.360 --> 16:17.040
+then those things will dry up.
+
+16:17.040 --> 16:18.639
+And also one thing that is possible,
+
+16:18.639 --> 16:19.839
+but probably not very likely,
+
+16:19.839 --> 16:21.839
+is that the program may not be
+
+16:21.839 --> 16:24.000
+packaged any more in Linux distributions
+
+16:24.000 --> 16:25.680
+or for other operating systems.
+
+16:25.680 --> 16:27.519
+So if it's not worth someone to package it,
+
+16:27.519 --> 16:29.040
+or they just sort of lose interest
+
+16:29.040 --> 16:31.360
+in the editor, then maybe those things
+
+16:31.360 --> 16:32.320
+sort of drift away
+
+16:32.320 --> 16:33.920
+and you can't even install it any more
+
+16:33.920 --> 16:35.360
+in many places.
+
+16:35.360 --> 16:36.399
+But I feel that these things
+
+16:36.399 --> 16:37.279
+would only really happen
+
+16:37.279 --> 16:39.279
+if there was already other major issues
+
+16:39.279 --> 16:41.920
+in the dev team or in the community,
+
+16:41.920 --> 16:44.320
+like maybe a high profile schism
+
+16:44.320 --> 16:45.199
+in the maintainer team,
+
+16:45.199 --> 16:47.519
+sort of like what we saw with GNU Emacs
+
+16:47.519 --> 16:49.759
+versus XEmacs, because you have
+
+16:49.759 --> 16:50.959
+two competing versions
+
+16:50.959 --> 16:52.160
+of the same idea
+
+16:52.160 --> 16:53.600
+with different implementations,
+
+16:53.600 --> 16:54.800
+and then over time,
+
+16:54.800 --> 16:55.920
+one of them may fade out
+
+16:55.920 --> 16:57.839
+because people just lose interest
+
+16:57.839 --> 17:00.800
+and maybe something like GNU Emacs
+
+17:00.800 --> 17:02.399
+gradually catches up and surpasses it
+
+17:02.399 --> 17:04.720
+in functionality. So these things
+
+17:04.720 --> 17:07.520
+can happen, but it's not really
+
+17:07.520 --> 00:17:10.239
+as likely as people would think, I think.
+
+17:10.240 --> 17:12.959
+So how is Emacs going to survive
+
+17:12.959 --> 17:15.280
+despite popularity? I feel that
+
+17:15.280 --> 17:16.640
+there are a few important
+
+17:16.640 --> 17:17.679
+and unique factors
+
+17:17.679 --> 00:17:20.159
+that are going to contribute to this.
+
+17:20.160 --> 17:21.520
+First of all, Emacs is
+
+17:21.520 --> 17:22.720
+more deeply hackable
+
+17:22.720 --> 17:24.959
+than almost all other editors.
+
+17:24.959 --> 17:26.000
+I'm couching that a bit,
+
+17:26.000 --> 17:26.880
+but really it is
+
+17:26.880 --> 17:28.000
+basically more extensible
+
+17:28.000 --> 17:28.960
+than any other editor.
+
+17:28.960 --> 17:29.679
+I haven't seen one
+
+17:29.679 --> 17:31.440
+that's more extensible than Emacs so far,
+
+17:31.440 --> 17:32.000
+and that's because
+
+17:32.000 --> 17:34.160
+Emacs was designed for this.
+
+17:34.160 --> 17:35.360
+The whole point of Emacs
+
+17:35.360 --> 17:36.960
+is that you should be able to go in
+
+17:36.960 --> 17:38.320
+and customize your workflow,
+
+17:38.320 --> 17:39.600
+and customize the editor to do
+
+17:39.600 --> 17:41.039
+exactly what you want it to do.
+
+17:41.039 --> 17:44.080
+It's this whole idea of user freedom.
+
+17:44.080 --> 17:46.320
+You're not letting the editor designer
+
+17:46.320 --> 17:47.120
+tell you what to do,
+
+17:47.120 --> 17:48.880
+you're telling the editor what to do
+
+17:48.880 --> 17:50.559
+at every step of the way.
+
+17:50.559 --> 17:53.440
+Also, an Emacs user can grow their skills
+
+17:53.440 --> 17:55.039
+from small configuration tweaks,
+
+17:55.039 --> 17:56.240
+just basically setting variables
+
+17:56.240 --> 17:57.280
+and whatnot, to writing
+
+17:57.280 --> 17:58.960
+their own packages over time,
+
+17:58.960 --> 17:59.600
+and then eventually
+
+17:59.600 --> 18:01.280
+to contributing to Emacs itself--
+
+18:01.280 --> 18:02.320
+the same skill set,
+
+18:02.320 --> 18:03.360
+because the majority
+
+18:03.360 --> 18:04.640
+of the functionality of the editor
+
+18:04.640 --> 18:06.160
+is written with the same language
+
+18:06.160 --> 18:07.600
+that you use to configure it.
+
+18:07.600 --> 18:09.280
+So unlike other editors,
+
+18:09.280 --> 18:10.960
+where you have...
+
+18:10.960 --> 18:12.960
+the way that you write extensions
+
+18:12.960 --> 18:13.440
+for the editor,
+
+18:13.440 --> 18:14.960
+that has a specific API,
+
+18:14.960 --> 18:16.400
+but if you go contribute to the core,
+
+18:16.400 --> 18:18.160
+the code base is completely different.
+
+18:18.160 --> 18:19.280
+It's different with Emacs
+
+18:19.280 --> 18:22.640
+because you have basically the same APIs,
+
+18:22.640 --> 18:24.320
+the same code and same everything
+
+18:24.320 --> 18:26.080
+that you use to write a package
+
+18:26.080 --> 18:28.160
+versus writing actual code
+
+18:28.160 --> 18:29.600
+for functionality for the editor.
+
+18:29.600 --> 18:30.960
+Now obviously, there's the C layer
+
+18:30.960 --> 18:32.000
+that is different,
+
+18:32.000 --> 18:34.000
+but I think a lot of the actual packages
+
+18:34.000 --> 18:35.280
+and functionality in Emacs
+
+18:35.280 --> 18:36.640
+are at the Emacs Lisp layer.
+
+18:36.640 --> 18:38.797
+So what this means is that
+
+18:38.797 --> 18:41.120
+Emacs configuration hackers
+
+18:41.120 --> 18:42.000
+and package authors
+
+18:42.000 --> 18:43.200
+are prime candidates
+
+18:43.200 --> 18:44.880
+for eventually becoming contributors
+
+18:44.880 --> 18:46.960
+to Emacs itself. You see this play out
+
+18:46.960 --> 18:48.559
+a lot of times in Emacs community,
+
+18:48.559 --> 18:49.760
+where someone writes
+
+18:49.760 --> 18:51.039
+some really good packages,
+
+18:51.039 --> 18:52.240
+and either parts of those
+
+18:52.240 --> 18:53.440
+get merged into Emacs
+
+18:53.440 --> 18:55.520
+or that person maybe makes contributions
+
+18:55.520 --> 18:57.280
+to Emacs to add new functionality
+
+18:57.280 --> 18:59.360
+that their own packages can use,
+
+18:59.360 --> 19:01.679
+or just to improve Emacs as a whole.
+
+19:01.679 --> 19:03.679
+So there's much more chance
+
+19:03.679 --> 19:04.880
+that people who are involved
+
+19:04.880 --> 19:06.160
+in the community of Emacs
+
+19:06.160 --> 19:07.440
+can actually become contributors
+
+19:07.440 --> 19:08.480
+to the project itself.
+
+19:08.480 --> 19:09.200
+I think that's going to be
+
+19:09.200 --> 19:11.600
+very important for its health.
+
+19:11.600 --> 19:13.200
+Also, you don't need to add functionality
+
+19:13.200 --> 19:14.080
+to Emacs core
+
+19:14.080 --> 19:16.160
+to make the editor itself better.
+
+19:16.160 --> 19:17.120
+Package authors are on
+
+19:17.120 --> 19:18.480
+an equal playing field
+
+19:18.480 --> 19:19.679
+as the built-in functionality,
+
+19:19.679 --> 19:21.008
+for the same reason what I said before.
+
+19:21.008 --> 19:22.640
+Everything's written with Emacs Lisp,
+
+19:22.640 --> 19:24.160
+or I guess a lot of the functionality
+
+19:24.160 --> 19:26.000
+is written with Emacs Lisp.
+
+19:26.000 --> 19:28.720
+Since there's a lot of ways to hook into
+
+19:28.720 --> 19:30.720
+or replace functionality in Emacs,
+
+19:30.720 --> 19:33.280
+you can do a lot of deep customizations
+
+19:33.280 --> 19:35.360
+to Emacs itself to make it better
+
+19:35.360 --> 19:37.600
+in ways that aren't really...
+
+19:37.600 --> 19:39.760
+The core developers don't need to
+
+19:39.760 --> 19:40.960
+add new things for you to do that.
+
+19:40.960 --> 19:42.320
+You can just do it if you want to.
+
+19:42.320 --> 19:44.640
+So that gives Emacs more of
+
+19:44.640 --> 19:45.840
+a platform feel
+
+19:45.840 --> 19:47.440
+rather than just being an editor
+
+19:47.440 --> 00:19:51.439
+that can't really be changed very much.
+
+19:51.440 --> 19:53.440
+Also, Emacs has a strong community
+
+19:53.440 --> 19:56.080
+of highly-skilled packaged authors
+
+19:56.080 --> 19:58.000
+and the high-quality packages
+
+19:58.000 --> 19:59.919
+that they create make it far better
+
+19:59.919 --> 20:01.679
+and more uniquely valuable
+
+20:01.679 --> 20:02.960
+than many other editors.
+
+20:02.960 --> 20:04.960
+Specifically, things like Org mode,
+
+20:04.960 --> 20:06.240
+Magit, Org-roam,
+
+20:06.240 --> 20:07.039
+and a lot of other things
+
+20:07.039 --> 20:08.000
+that we've talked about
+
+20:08.000 --> 20:10.000
+on the System Crafters channel over time,
+
+20:10.000 --> 20:11.136
+and the hundreds of other
+
+20:11.136 --> 20:12.480
+workflow-improving packages
+
+20:12.480 --> 20:14.720
+that have been created over the years.
+
+20:14.720 --> 20:18.559
+So all these things really make Emacs
+
+20:18.559 --> 20:20.159
+a unique offering
+
+20:20.159 --> 20:21.679
+in the space of text editors,
+
+20:21.679 --> 20:22.640
+or development tools,
+
+20:22.640 --> 20:24.240
+or even just general
+
+20:24.240 --> 20:25.440
+information management tools,
+
+20:25.440 --> 20:27.120
+or desktop environments,
+
+20:27.120 --> 20:28.960
+if you want to call it that.
+
+20:28.960 --> 20:31.280
+So the people who are involved
+
+20:31.280 --> 20:32.159
+in making these things
+
+20:32.159 --> 20:33.600
+make Emacs far better than it could be
+
+20:33.600 --> 20:35.039
+just by itself,
+
+20:35.039 --> 20:37.360
+and this thriving ecosystem helps Emacs
+
+20:37.360 --> 20:39.120
+to continually feel fresh,
+
+20:39.120 --> 20:40.320
+regardless of what's happening
+
+20:40.320 --> 20:41.600
+in core Emacs development,
+
+20:41.600 --> 20:43.840
+because packages can do so much
+
+20:43.840 --> 20:45.280
+and because people can come along
+
+20:45.280 --> 20:46.640
+and propose sort of
+
+20:46.640 --> 20:47.760
+a new way of doing things
+
+20:47.760 --> 20:49.360
+and other people can start using it.
+
+20:49.360 --> 20:51.120
+Emacs itself doesn't have to be
+
+20:51.120 --> 20:52.400
+beholden to just what
+
+20:52.400 --> 20:53.840
+the core developers do.
+
+20:53.840 --> 20:55.280
+The community can also play
+
+20:55.280 --> 20:57.760
+a major role in making Emacs feel fresh
+
+20:57.760 --> 20:59.919
+and be modernized over time.
+
+20:59.919 --> 21:01.360
+Just take a look at what Doom Emacs
+
+21:01.360 --> 21:03.919
+is doing to give Emacs a better face,
+
+21:03.919 --> 21:04.960
+and Spacemacs as well.
+
+21:04.960 --> 21:06.240
+Those things are very good
+
+21:06.240 --> 21:08.000
+for making Emacs more palatable
+
+21:08.000 --> 21:09.440
+to the general public,
+
+21:09.440 --> 21:11.120
+because you have a much better experience
+
+21:11.120 --> 21:12.240
+out of the box, and a lot of things
+
+21:12.240 --> 21:12.880
+have been polished
+
+21:12.880 --> 00:21:15.279
+for the user experience.
+
+21:15.280 --> 21:17.200
+Emacs also has a very strong
+
+21:17.200 --> 21:18.799
+user community. Lots of activity
+
+21:18.799 --> 21:20.000
+and discussion about emacs
+
+21:20.000 --> 21:21.440
+is taking place all the time
+
+21:21.440 --> 21:22.559
+in various places,
+
+21:22.559 --> 21:23.919
+like we talked about before.
+
+21:23.919 --> 21:26.559
+Mailing lists, IRC, Reddit, etc.
+
+21:26.559 --> 21:28.159
+If you get into Emacs
+
+21:28.159 --> 21:28.880
+and you go take part
+
+21:28.880 --> 21:29.840
+in the Emacs community,
+
+21:29.840 --> 21:30.640
+there's always going to be
+
+21:30.640 --> 21:32.000
+somebody around who's going to want to
+
+21:32.000 --> 21:33.520
+talk about Emacs with you
+
+21:33.520 --> 21:34.960
+and answer your questions.
+
+21:34.960 --> 21:37.120
+So it's a very good thing
+
+21:37.120 --> 21:39.039
+for the health of the project
+
+21:39.039 --> 21:40.320
+because there's a lot of people there
+
+21:40.320 --> 21:42.640
+that are very invested in it every day
+
+21:42.640 --> 21:45.120
+and want to see it succeed.
+
+21:45.120 --> 21:47.039
+Also, there's many community members
+
+21:47.039 --> 21:47.840
+writing articles
+
+21:47.840 --> 21:49.440
+and making videos about Emacs,
+
+21:49.440 --> 21:51.280
+many of which are actually moving forward
+
+21:51.280 --> 21:52.240
+the state of the art
+
+21:52.240 --> 21:53.679
+about how we use the editor,
+
+21:53.679 --> 21:55.360
+and how we use it... I mean,
+
+21:55.360 --> 21:56.480
+how many times have you seen
+
+21:56.480 --> 21:57.520
+a really great blog post
+
+21:57.520 --> 21:59.120
+that completely blew your mind
+
+21:59.120 --> 22:00.880
+and showed you a new way
+
+22:00.880 --> 22:02.720
+to use Emacs, or a new way to think about
+
+22:02.720 --> 22:05.120
+how you use Emacs. I see stuff like that
+
+22:05.120 --> 22:08.480
+all the time, like posts by Protesilaos,
+
+22:08.480 --> 22:10.640
+or by Karthik, or by many other people
+
+22:10.640 --> 22:12.080
+who show you a new way
+
+22:12.080 --> 22:13.360
+to look at things, and then you're, like,
+
+22:13.360 --> 22:14.720
+Wow. This... I could do things
+
+22:14.720 --> 22:15.200
+completely different
+
+22:15.200 --> 22:16.559
+than I was doing before.
+
+22:16.559 --> 22:17.200
+This kind of stuff
+
+22:17.200 --> 22:18.240
+is extremely important
+
+22:18.240 --> 22:20.080
+for the health of the editor
+
+22:20.080 --> 22:22.799
+going forward, because people are able to
+
+22:22.799 --> 22:24.799
+inspire others to use the editor.
+
+22:24.799 --> 22:26.559
+It's a great thing for evangelism as well.
+
+22:26.559 --> 22:28.080
+Like, if someone happens to
+
+22:28.080 --> 22:30.080
+stumble across a video or a blog post,
+
+22:30.080 --> 00:22:33.439
+they may be really inspired to use Emacs.
+
+22:33.440 --> 22:35.280
+And lastly, the Emacs maintainers
+
+22:35.280 --> 22:36.720
+and contributors really care
+
+22:36.720 --> 22:38.000
+about the users.
+
+22:38.000 --> 22:39.280
+There are many core maintainers
+
+22:39.280 --> 22:40.080
+who have been with the project
+
+22:40.080 --> 22:43.360
+for 10+ years, some way longer than that.
+
+22:43.360 --> 22:45.200
+So it shows you that
+
+22:45.200 --> 22:46.559
+the people who work on this project
+
+22:46.559 --> 22:47.600
+really care a lot,
+
+22:47.600 --> 22:48.640
+and they're very invested
+
+22:48.640 --> 22:51.120
+in making sure that it remains healthy
+
+22:51.120 --> 22:53.360
+for the long term.
+
+22:53.360 --> 22:55.440
+They also really care about ensuring
+
+22:55.440 --> 22:56.720
+that Emacs continues to work well
+
+22:56.720 --> 22:58.159
+for long-time users,
+
+22:58.159 --> 23:00.080
+(and some people have been using it
+
+23:00.080 --> 23:01.280
+for 30 to 40 years,
+
+23:01.280 --> 23:02.400
+which is kind of insane,
+
+23:02.400 --> 23:03.760
+if you think about it),
+
+23:03.760 --> 23:05.679
+all while gradually and sensibly
+
+23:05.679 --> 23:07.120
+enabling new scenarios
+
+23:07.120 --> 23:08.080
+and core improvements
+
+23:08.080 --> 23:09.280
+that benefit all of us,
+
+23:09.280 --> 23:11.520
+even the new and the old users.
+
+23:11.520 --> 23:12.880
+Keeping a piece of software
+
+23:12.880 --> 23:13.600
+running and relevant
+
+23:13.600 --> 23:14.400
+for this many years
+
+23:14.400 --> 23:15.440
+is a huge effort,
+
+23:15.440 --> 23:16.799
+so I'm very thankful
+
+23:16.799 --> 23:18.480
+to the maintainers of Emacs,
+
+23:18.480 --> 23:20.159
+and I hope all of you are as well,
+
+23:20.159 --> 23:22.799
+because this is kind of an anomaly
+
+23:22.799 --> 23:23.600
+in the software field
+
+23:23.600 --> 23:24.960
+to have a piece of software
+
+23:24.960 --> 23:26.640
+that has existed for so long,
+
+23:26.640 --> 23:30.000
+who has managed to survive
+
+23:30.000 --> 23:31.840
+despite various different types
+
+23:31.840 --> 23:33.280
+of platform transitions,
+
+23:33.280 --> 23:35.280
+operating transitions over the years
+
+23:35.280 --> 23:37.360
+and still thrive and be a very useful
+
+23:37.360 --> 23:38.559
+and very key piece of software
+
+23:38.559 --> 00:23:40.959
+for a lot of people.
+
+23:40.960 --> 23:42.320
+So aren't all these things
+
+23:42.320 --> 23:43.039
+that we just talked about
+
+23:43.039 --> 23:43.840
+supposed to come
+
+23:43.840 --> 23:45.279
+when an editor is popular?
+
+23:45.279 --> 23:46.080
+We've been talking about
+
+23:46.080 --> 23:47.039
+what is popularity,
+
+23:47.039 --> 23:48.720
+what benefits come with popularity.
+
+23:48.720 --> 23:50.320
+So all the things I just mentioned,
+
+23:50.320 --> 23:51.120
+shouldn't that be something
+
+23:51.120 --> 23:52.720
+that would only be for editors
+
+23:52.720 --> 23:54.640
+that are super popular? Well, I guess
+
+23:54.640 --> 23:56.720
+the answer is maybe Emacs is actually
+
+23:56.720 --> 23:57.840
+popular enough.
+
+23:57.840 --> 23:58.799
+That doesn't necessarily mean
+
+23:58.799 --> 24:00.640
+that we should not try to
+
+24:00.640 --> 24:03.600
+help other people find Emacs,
+
+24:03.600 --> 24:04.960
+but I think that we should not
+
+24:04.960 --> 24:05.760
+worry so much about
+
+24:05.760 --> 24:06.880
+the popularity of Emacs,
+
+24:06.880 --> 24:08.480
+because what we have is great,
+
+24:08.480 --> 24:11.120
+and we should just focus our time
+
+24:11.120 --> 24:13.919
+on continuing to improve the health
+
+24:13.919 --> 24:15.520
+of the community that we have
+
+24:15.520 --> 24:17.360
+and the health of the editor itself,
+
+24:17.360 --> 24:19.440
+and not worry too much about chasing
+
+24:19.440 --> 24:20.880
+whatever is happening out in the world
+
+24:20.880 --> 00:24:22.879
+at any given point.
+
+24:22.880 --> 24:26.159
+To conclude, the next time someone says
+
+24:26.159 --> 24:27.760
+we should do this thing
+
+24:27.760 --> 24:28.559
+or this other thing
+
+24:28.559 --> 24:30.400
+to make Emacs more popular,
+
+24:30.400 --> 24:32.240
+ask them these questions.
+
+24:32.240 --> 24:35.200
+1. What does popularity mean to you?
+
+24:35.200 --> 24:37.279
+2. How do you measure it?
+
+24:37.279 --> 24:39.440
+3. What do you think Emacs is going to
+
+24:39.440 --> 24:41.600
+gain from increased popularity?
+
+24:41.600 --> 24:43.279
+So I hope that you found this talk
+
+24:43.279 --> 24:44.159
+inspiring and maybe
+
+24:44.159 --> 24:46.320
+a little bit reassuring. Thanks so much
+
+24:46.320 --> 24:48.240
+for your time, and happy hacking.
+
+24:48.240 --> 24:50.867
+We'll see ya.
+
+24:50.867 --> 24:51.559
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt b/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt
new file mode 100644
index 00000000..4f95164f
--- /dev/null
+++ b/2021/captions/emacsconf-2021-form--old-mccarthy-had-a-form--ian-eure--main.vtt
@@ -0,0 +1,1282 @@
+WEBVTT
+
+00:01.199 --> 00:00:02.320
+My name is Ian Eure,
+
+00:00:02.320 --> 00:00:03.199
+and welcome to my talk
+
+00:00:03.199 --> 00:00:05.120
+"Old McCarthy Had a Form".
+
+00:00:05.120 --> 00:00:05.759
+In this talk,
+
+00:00:05.759 --> 00:00:07.759
+I'm going to be discussing EIEIO,
+
+00:00:07.759 --> 00:00:09.920
+which is an Emacs Lisp implementation
+
+00:00:09.920 --> 00:00:12.320
+of the Common Lisp object system.
+
+00:12.320 --> 00:00:13.519
+CLOS is a way of writing
+
+00:13.519 --> 00:00:15.360
+object-oriented Common Lisp code,
+
+00:00:15.360 --> 00:00:17.920
+and with EIEIO you have much of that same
+
+00:17.920 --> 00:00:19.920
+power but inside Emacs.
+
+00:00:19.920 --> 00:00:21.359
+I'm going to be using those two names
+
+00:00:21.359 --> 00:00:22.988
+interchangeably throughout this talk,
+
+00:00:22.988 --> 00:00:26.640
+since they're nearly equivalent.
+
+00:26.640 --> 00:00:27.534
+You might wonder,
+
+00:00:27.534 --> 00:00:28.880
+"Why would I want to write
+
+00:00:28.880 --> 00:00:31.439
+object Emacs Lisp code?".
+
+00:00:31.439 --> 00:00:33.440
+I like it because I like writing
+
+00:00:33.440 --> 00:00:34.960
+in a functional programming style,
+
+00:00:34.960 --> 00:00:36.896
+or I like to do an imperative style
+
+00:00:36.896 --> 00:00:39.040
+that captures interactive key sequences
+
+00:00:39.040 --> 00:00:41.200
+that I might enter manually.
+
+00:41.200 --> 00:00:42.800
+Well, I think, different kinds of programs
+
+00:42.800 --> 00:00:45.120
+need different kind of programming paradigms,
+
+00:00:45.120 --> 00:00:47.760
+and sometimes OOP is the one that fits.
+
+00:00:47.760 --> 00:00:49.708
+Also, if you've done much OOP before,
+
+00:00:49.708 --> 00:00:50.655
+you might be surprised by
+
+00:00:50.655 --> 00:00:52.879
+how EIEIO works and the sorts of power
+
+00:00:52.879 --> 00:00:55.039
+that it brings to your programs.
+
+00:55.039 --> 00:00:58.480
+So, let's talk about that model now.
+
+00:58.480 --> 00:01:00.000
+Classes are pretty much what
+
+00:01:00.000 --> 00:01:01.120
+you would expect if you've done
+
+00:01:01.120 --> 00:01:02.879
+OOP programming before.
+
+01:02.879 --> 00:01:04.400
+In the CLOS model,
+
+00:01:04.400 --> 00:01:06.400
+they only have fields,
+
+00:01:06.400 --> 00:01:08.000
+they only encapsulate values,
+
+00:01:08.000 --> 00:01:10.720
+they don't have anything to do with methods.
+
+01:10.720 --> 00:01:13.040
+So, in this case, we have a base class for
+
+01:13.040 --> 00:01:15.040
+an EMMS player backend,
+
+00:01:15.040 --> 00:01:18.159
+and it has one field (a slot is what
+
+00:01:18.159 --> 00:01:20.000
+it's called in CLOS terminology),
+
+00:01:20.000 --> 00:01:22.720
+which indicates whether it's playing or not,
+
+00:01:22.720 --> 00:01:24.080
+and it's declared abstract,
+
+00:01:24.080 --> 00:01:25.439
+so you can't create an instance
+
+00:01:25.439 --> 00:01:27.040
+of an object based on this class,
+
+00:01:27.040 --> 00:01:29.280
+you can only extend it with another class,
+
+00:01:29.280 --> 00:01:31.119
+that's an EIEIO extension,
+
+00:01:31.119 --> 00:01:33.439
+but I think it's a pretty good one.
+
+01:33.439 --> 00:01:34.640
+You can also see there's a class
+
+00:01:34.640 --> 00:01:37.119
+that implements an mpv player back-end,
+
+00:01:37.119 --> 00:01:39.680
+and it extends the base class,
+
+00:01:39.680 --> 00:01:40.960
+it doesn't add any slots,
+
+00:01:40.960 --> 00:01:44.479
+and those get inherited from the base class.
+
+01:44.479 --> 00:01:45.936
+If you want these to do much more
+
+00:01:45.936 --> 00:01:46.960
+than encapsulate data,
+
+00:01:46.960 --> 00:01:48.880
+you need to start writing methods.
+
+00:01:48.880 --> 00:01:50.324
+The CLOS model is to have
+
+00:01:50.324 --> 00:01:51.439
+a generic function.
+
+00:01:51.439 --> 00:01:52.399
+A generic function is
+
+00:01:52.399 --> 00:01:53.680
+kind of like an interface,
+
+00:01:53.680 --> 00:01:55.600
+it's just a name and an argument list,
+
+01:55.600 --> 00:01:57.280
+and there's no implementation,
+
+00:01:57.280 --> 00:01:58.560
+you have to write a method
+
+00:01:58.560 --> 00:02:00.960
+in order to have an actual implementation.
+
+00:02:00.960 --> 00:02:02.880
+When you call the generic function,
+
+00:02:02.880 --> 00:02:04.960
+the system will do a dynamic dispatch
+
+00:02:04.960 --> 00:02:06.560
+to a method that matches based on
+
+00:02:06.560 --> 00:02:08.319
+its argument types and how the method
+
+00:02:08.319 --> 00:02:12.239
+has declared that it should be invoked.
+
+02:12.239 --> 00:02:14.239
+Here's an example of some methods
+
+00:02:14.239 --> 00:02:16.480
+for our mpv player backend,
+
+00:02:16.480 --> 00:02:19.599
+you can see that it'll play anything
+
+00:02:19.599 --> 00:02:21.200
+other than something
+
+00:02:21.200 --> 00:02:23.200
+with a keyword of `unplayable`,
+
+00:02:23.200 --> 00:02:25.328
+and it just has dummy start and stop methods
+
+00:02:25.328 --> 00:02:27.680
+that return "Started" and "Stopped" text.
+
+00:02:27.680 --> 00:02:29.599
+A method is just one implementation
+
+00:02:29.599 --> 00:02:30.552
+of a generic function,
+
+00:02:30.552 --> 00:02:32.640
+and you can have as many as you need.
+
+02:32.640 --> 00:02:33.920
+In order to determine
+
+00:02:33.920 --> 00:02:35.519
+which method gets dispatched
+
+00:02:35.519 --> 00:02:36.879
+when you call a generic function,
+
+00:02:36.879 --> 00:02:38.080
+they're specialized based on
+
+02:38.080 --> 00:02:39.360
+their argument type.
+
+00:02:39.360 --> 00:02:40.640
+In this case, you can see that
+
+00:02:40.640 --> 00:02:41.680
+first argument says
+
+00:02:41.680 --> 00:02:44.480
+`player talk/emms-player-mpv`,
+
+00:02:44.480 --> 00:02:46.239
+that means that if that first argument
+
+00:02:46.239 --> 00:02:48.480
+is an instance of the mpv player
+
+00:02:48.480 --> 00:02:50.080
+or a subclass of it,
+
+00:02:50.080 --> 00:02:52.000
+then those methods will be invoked,
+
+00:02:52.000 --> 00:02:53.560
+unless there's a more specific one
+
+00:02:53.560 --> 00:02:55.440
+based on that argument type.
+
+02:55.440 --> 00:02:56.656
+You don't have to define
+
+00:02:56.656 --> 00:02:57.760
+the generic functions.
+
+00:02:57.760 --> 00:02:59.040
+If you define a method,
+
+00:02:59.040 --> 00:03:00.451
+then it'll implicitly define
+
+00:03:00.451 --> 00:03:03.599
+the generic function for you.
+
+03:03.599 --> 00:03:05.440
+Specialization is really powerful.
+
+00:03:05.440 --> 00:03:06.939
+It lets the methods define
+
+00:03:06.939 --> 00:03:08.400
+how they get invoked
+
+00:03:08.400 --> 00:03:10.472
+If you've done much programming in Clojure,
+
+00:03:10.472 --> 00:03:12.959
+this sounds a little bit like multi-methods,
+
+00:03:12.959 --> 00:03:16.319
+but with multi-methods, only the main method,
+
+00:03:16.319 --> 00:03:18.000
+the equivalent of the generic function,
+
+00:03:18.000 --> 00:03:19.920
+can determine how they're dispatched.
+
+00:03:19.920 --> 00:03:21.519
+So, as the writer of an interface,
+
+00:03:21.519 --> 00:03:23.120
+you might not be able to foresee
+
+00:03:23.120 --> 00:03:25.519
+every way that someone who's implementing
+
+00:03:25.519 --> 00:03:26.959
+a version of that interface
+
+03:26.959 --> 00:03:28.400
+would like to dispatch.
+
+00:03:28.400 --> 00:03:29.920
+CLOS doesn't have that problem,
+
+00:03:29.920 --> 00:03:31.200
+you get to define your
+
+03:31.200 --> 00:03:34.080
+own invocation semantics.
+
+03:34.080 --> 00:03:35.360
+You're also not limited to
+
+00:03:35.360 --> 00:03:37.200
+dispatching based on the value
+
+00:03:37.200 --> 00:03:39.920
+being a subclass of an EIEIO type.
+
+00:03:39.920 --> 00:03:41.280
+You can dispatch based on
+
+03:41.280 --> 00:03:42.879
+a primitive type like integer,
+
+00:03:42.879 --> 00:03:45.360
+you can dispatch based on the value,
+
+03:45.360 --> 00:03:47.599
+you can dispatch on multiple arguments,
+
+03:47.599 --> 00:03:49.599
+and there's also a default dispatch
+
+00:03:49.599 --> 00:03:50.688
+that will get applied
+
+00:03:50.688 --> 00:03:53.200
+if there's no others that are defined.
+
+00:03:53.200 --> 00:03:54.319
+If you don't have a default,
+
+00:03:54.319 --> 00:03:55.439
+then you'll just get an error
+
+03:55.439 --> 00:03:56.480
+from the system,
+
+00:03:56.480 --> 00:03:57.439
+and if that doesn't cover it,
+
+00:03:57.439 --> 00:03:59.040
+you can even define your own.
+
+03:59.040 --> 00:04:00.239
+Definition is with the
+
+00:04:00.239 --> 00:04:01.760
+`cl-generic-generalizers`,
+
+00:04:01.760 --> 00:04:03.680
+which is itself a generic function.
+
+00:04:03.680 --> 00:04:05.680
+Much of CLOS is built in CLOS,
+
+00:04:05.680 --> 00:04:08.319
+which I think is really cool.
+
+04:08.319 --> 00:04:09.599
+In addition to all that,
+
+00:04:09.599 --> 00:04:12.319
+you have four different types of methods,
+
+04:12.319 --> 00:04:13.680
+and those are distinguished by
+
+00:04:13.680 --> 00:04:16.000
+what's called a qualifier.
+
+04:16.000 --> 00:04:18.400
+Every function can have methods
+
+00:04:18.400 --> 00:04:20.239
+that have all four different
+
+00:04:20.239 --> 00:04:21.280
+types of qualifiers,
+
+00:04:21.280 --> 00:04:22.960
+and based on your class inheritance,
+
+00:04:22.960 --> 00:04:25.680
+you might have multiple of each type.
+
+04:25.680 --> 00:04:26.800
+There's the primary method,
+
+00:04:26.800 --> 00:04:28.560
+which is equivalent to the method
+
+00:04:28.560 --> 00:04:29.919
+in any other OOP system,
+
+00:04:29.919 --> 00:04:32.160
+so we're not going to cover that too much.
+
+04:32.160 --> 00:04:33.759
+Then there's a `before` method.
+
+00:04:33.759 --> 00:04:35.600
+This is evaluated before
+
+00:04:35.600 --> 00:04:37.440
+the primary method for side effects,
+
+00:04:37.440 --> 00:04:40.080
+and its return value is discarded.
+
+00:04:40.080 --> 00:04:41.120
+There's an `after` method,
+
+00:04:41.120 --> 00:04:42.560
+which is the same but happens after
+
+00:04:42.560 --> 00:04:44.479
+the method has finished evaluating.
+
+04:44.479 --> 00:04:46.639
+And then there's an `around` method
+
+00:04:46.639 --> 00:04:49.199
+that happens around all the other three.
+
+04:49.199 --> 00:04:51.120
+And by using these types of methods
+
+00:04:51.120 --> 00:04:52.560
+and using class inheritance
+
+00:04:52.560 --> 00:04:54.560
+to compose them into your classes,
+
+00:04:54.560 --> 00:04:56.479
+you can add some really powerful
+
+00:04:56.479 --> 00:04:58.240
+mixin type functionality.
+
+00:04:58.240 --> 00:04:59.764
+You can use before and after
+
+00:04:59.764 --> 00:05:01.280
+to build things like logging,
+
+00:05:01.280 --> 00:05:02.479
+and you can use around
+
+00:05:02.479 --> 00:05:04.880
+to implement things like memoization.
+
+05:04.880 --> 00:05:06.720
+If you've done much Emacs Lisp programming,
+
+00:05:06.720 --> 00:05:08.160
+those before after and around
+
+00:05:08.160 --> 00:05:09.919
+might jog your memory because
+
+05:09.919 --> 00:05:11.440
+they're the same features you get
+
+00:05:11.440 --> 00:05:14.160
+with Emacs's built-in function advice.
+
+05:14.160 --> 00:05:15.680
+The thing with function advice is that
+
+05:15.680 --> 00:05:17.199
+it only works on functions
+
+00:05:17.199 --> 00:05:18.240
+in the global namespace,
+
+00:05:18.240 --> 00:05:20.360
+and there's no kind of conditionality,
+
+00:05:20.360 --> 00:05:21.840
+they always get dispatched
+
+00:05:21.840 --> 00:05:23.440
+when that function is invoked.
+
+05:23.440 --> 00:05:25.600
+The nice thing about the CLOS system is that
+
+00:05:25.600 --> 00:05:27.039
+whether they get invoked or not
+
+05:27.039 --> 00:05:28.872
+depends on whether they exist in
+
+00:05:28.872 --> 00:05:30.160
+the class hierarchy,
+
+00:05:30.160 --> 00:05:31.520
+so you can add them to your
+
+00:05:31.520 --> 00:05:32.880
+class hierarchy if you want
+
+00:05:32.880 --> 00:05:34.000
+that extra functionality
+
+00:05:34.000 --> 00:05:35.440
+like logging or memoization,
+
+00:05:35.440 --> 00:05:37.120
+and you can exclude it if you don't.
+
+00:05:37.120 --> 00:05:38.320
+I think that's really powerful
+
+05:38.320 --> 00:05:42.639
+and a very interesting way of doing it.
+
+05:42.639 --> 00:05:44.639
+It also supports multiple inheritance,
+
+05:44.639 --> 00:05:46.639
+which is the mechanism that you can use
+
+05:46.639 --> 00:05:48.560
+to compose all these different kinds of
+
+05:48.560 --> 00:05:50.479
+behaviors into a single object that does
+
+05:50.479 --> 00:05:52.240
+all the things that you want.
+
+00:05:52.240 --> 00:05:54.720
+Here's a quick example of a logger.
+
+00:05:54.720 --> 00:05:56.240
+So, you can see the class just has
+
+00:05:56.240 --> 00:05:58.319
+a single slot called `messages`,
+
+00:05:58.319 --> 00:05:59.840
+it has a `log` method
+
+00:05:59.840 --> 00:06:01.440
+that pushes a new message,
+
+00:06:01.440 --> 00:06:03.840
+which is a format string, into that,
+
+00:06:03.840 --> 00:06:05.520
+and then it will return them back out,
+
+00:06:05.520 --> 00:06:07.280
+or it'll just return the latest.
+
+06:07.280 --> 00:06:08.479
+And there's a simple example
+
+00:06:08.479 --> 00:06:09.600
+that shows it logging,
+
+00:06:09.600 --> 00:06:11.280
+and then shows it coming back out,
+
+00:06:11.280 --> 00:06:14.080
+pretty much what you would expect.
+
+06:14.080 --> 00:06:16.400
+Here's another class that adapts
+
+00:06:16.400 --> 00:06:19.039
+the `emms-player` to the `logger` class.
+
+00:06:19.039 --> 00:06:20.560
+It only extends the logger
+
+00:06:20.560 --> 00:06:22.400
+because it doesn't need any features
+
+00:06:22.400 --> 00:06:25.039
+of the `emms-player` class itself.
+
+00:06:25.039 --> 00:06:27.440
+It just implements methods that dispatch
+
+00:06:27.440 --> 00:06:30.240
+based on it being that logging player class,
+
+00:06:30.240 --> 00:06:31.759
+and you can see it logs whenever
+
+00:06:31.759 --> 00:06:34.240
+a track is started or stopped,
+
+00:06:34.240 --> 00:06:36.240
+and it also adds some track
+
+00:06:36.240 --> 00:06:37.520
+to tell you whether or not
+
+00:06:37.520 --> 00:06:38.560
+the track was playable,
+
+00:06:38.560 --> 00:06:41.199
+that is using the around method.
+
+00:06:41.199 --> 00:06:43.199
+So, you can see we have all three methods
+
+00:06:43.199 --> 00:06:45.280
+before, after, and around in this class,
+
+00:06:45.280 --> 00:06:48.160
+so you can see how those work.
+
+00:06:48.160 --> 00:06:49.440
+Then you need one more,
+
+00:06:49.440 --> 00:06:50.184
+which is the class
+
+00:06:50.184 --> 00:06:51.759
+that mixes it all together,
+
+00:06:51.759 --> 00:06:54.080
+So, that's the `logging-player-mpv`,
+
+00:06:54.080 --> 00:06:56.639
+and it extends both the `logging-player` class
+
+06:56.639 --> 00:06:59.680
+and the `emms-player-mpv` class.
+
+06:59.680 --> 00:07:01.440
+What's really interesting about this is
+
+07:01.440 --> 00:07:03.360
+that even though the logging player is
+
+07:03.360 --> 00:07:05.520
+part of the `emms-player` hierarchy,
+
+00:07:05.520 --> 00:07:06.472
+it doesn't depend on
+
+00:07:06.472 --> 00:07:08.240
+a specific implementation,
+
+00:07:08.240 --> 00:07:10.400
+so you can combine the two different
+
+00:07:10.400 --> 00:07:12.639
+classes that lets the logging class
+
+00:07:12.639 --> 00:07:13.919
+only care about logging,
+
+07:13.919 --> 00:07:15.440
+and the `emms-player` class
+
+00:07:15.440 --> 00:07:17.039
+only care about playing,
+
+00:07:17.039 --> 00:07:18.240
+and that is a really nice
+
+07:18.240 --> 00:07:19.599
+way of separating your concerns
+
+00:07:19.599 --> 00:07:21.440
+that I think is very powerful.
+
+07:21.440 --> 00:07:22.515
+Here's a quick example of
+
+00:07:22.515 --> 00:07:23.599
+just how that works,
+
+00:07:23.599 --> 00:07:25.199
+and you can see the `unplayable`
+
+07:25.199 --> 00:07:26.160
+track is not playable,
+
+00:07:26.160 --> 00:07:27.840
+and it gets logged as such,
+
+00:07:27.840 --> 00:07:29.360
+`foo` is playable, and you can see
+
+07:29.360 --> 00:07:31.120
+the logs in started and stopped.
+
+00:07:31.120 --> 00:07:32.560
+So, you can see it's having
+
+00:07:32.560 --> 00:07:34.000
+the side effects from those methods,
+
+00:07:34.000 --> 00:07:36.960
+and it's also returning
+
+00:07:36.960 --> 00:07:40.319
+the value off the player as well.
+
+07:40.319 --> 00:07:41.599
+I think this system has a bunch of
+
+07:41.599 --> 00:07:43.120
+really nice properties.
+
+07:43.120 --> 00:07:44.080
+First and foremost,
+
+00:07:44.080 --> 00:07:45.840
+it feels like a normal Lisp,
+
+00:07:45.840 --> 00:07:47.360
+all you're doing is calling functions,
+
+00:07:47.360 --> 00:07:49.840
+there's no magic involved.
+
+07:49.840 --> 00:07:51.919
+Also, you can use either or both of the
+
+07:51.919 --> 00:07:53.840
+classes or generic functions.
+
+00:07:53.840 --> 00:07:55.120
+If you only need to
+
+00:07:55.120 --> 00:07:56.960
+encapsulate data into a structure,
+
+00:07:56.960 --> 00:07:58.479
+then you can only use classes,
+
+07:58.479 --> 00:08:00.400
+you don't have to use generic functions.
+
+08:00.400 --> 00:08:02.080
+And if you only need dynamic dispatch,
+
+08:02.080 --> 00:08:03.068
+you can only implement
+
+00:08:03.068 --> 00:08:04.720
+a generic function and methods.
+
+00:08:04.720 --> 00:08:06.560
+You don't get forced into a model
+
+00:08:06.560 --> 00:08:08.000
+where you have to use both.
+
+00:08:08.000 --> 00:08:09.247
+You can mix and match for
+
+00:08:09.247 --> 00:08:10.800
+whatever needs your program has,
+
+00:08:10.800 --> 00:08:13.039
+which I think is really amazing.
+
+08:13.039 --> 00:08:15.440
+Any value can conform to an interface,
+
+08:15.440 --> 00:08:17.039
+meaning a generic function.
+
+00:08:17.039 --> 00:08:19.520
+So, you don't have to use those classes.
+
+00:08:19.520 --> 00:08:20.479
+You can even implement
+
+00:08:20.479 --> 00:08:22.240
+a generic function over `nil`,
+
+00:08:22.240 --> 00:08:23.599
+which gives you those really nice
+
+08:23.599 --> 00:08:24.800
+properties of Lisp,
+
+00:08:24.800 --> 00:08:26.460
+where you have nil-punning, you know,
+
+00:08:26.460 --> 00:08:28.800
+if you take the head of a nil list,
+
+00:08:28.800 --> 00:08:30.479
+then the output is `nil`,
+
+00:08:30.479 --> 00:08:31.283
+but you can do that
+
+00:08:31.283 --> 00:08:32.880
+with your object system too.
+
+00:08:32.880 --> 00:08:34.320
+And a really nice feature of that is
+
+08:34.320 --> 00:08:35.919
+that you have no possibility of
+
+00:08:35.919 --> 00:08:36.959
+null pointer exceptions
+
+00:08:36.959 --> 00:08:38.719
+like you do in other languages.
+
+00:08:38.719 --> 00:08:39.919
+They have a calling convention
+
+00:08:39.919 --> 00:08:42.880
+where you call object dot method,
+
+08:42.880 --> 00:08:45.600
+but in CLOS, you call a generic function,
+
+00:08:45.600 --> 00:08:47.279
+and you just give it some arguments.
+
+00:08:47.279 --> 00:08:48.959
+Typically, the first one is going to be
+
+00:08:48.959 --> 00:08:51.680
+an EIEIO class object,
+
+00:08:51.680 --> 00:08:53.200
+but it doesn't have to be,
+
+00:08:53.200 --> 00:08:54.640
+but because you're not calling that
+
+00:08:54.640 --> 00:08:55.519
+instance of an object,
+
+00:08:55.519 --> 00:08:57.279
+there's nothing to be nil in the first place,
+
+00:08:57.279 --> 00:08:58.320
+so there's no possibility of
+
+00:08:58.320 --> 00:09:00.080
+a nil pointer exception.
+
+09:00.080 --> 00:09:01.376
+And then the ability to
+
+00:09:01.376 --> 00:09:02.480
+have multiple inheritance
+
+00:09:02.480 --> 00:09:04.000
+and mix in all of these different
+
+00:09:04.000 --> 00:09:05.760
+functionalities into your final object
+
+00:09:05.760 --> 00:09:07.279
+is very powerful.
+
+09:07.279 --> 00:09:09.839
+Because you have multiple inheritance,
+
+00:09:09.839 --> 00:09:11.120
+your final object that
+
+00:09:11.120 --> 00:09:12.560
+composes all of those things
+
+00:09:12.560 --> 00:09:14.080
+is both a player and a logger,
+
+00:09:14.080 --> 00:09:15.600
+and it can be substituted into code
+
+00:09:15.600 --> 00:09:17.279
+that expects either of them.
+
+00:09:17.279 --> 00:09:19.040
+It's not an adapter class
+
+09:19.040 --> 00:09:21.360
+that only allows you to do one thing,
+
+00:09:21.360 --> 00:09:22.560
+it does both of them.
+
+00:09:22.560 --> 00:09:24.800
+I think that's amazing.
+
+09:24.800 --> 00:09:26.320
+So, here are some practical examples
+
+09:26.320 --> 00:09:27.387
+where I think maybe this
+
+00:09:27.387 --> 00:09:28.720
+could be a good idea.
+
+00:09:28.720 --> 00:09:30.399
+And I like to think about,
+
+09:30.399 --> 00:09:32.320
+"What is OOP actually good for?".
+
+00:09:32.320 --> 00:09:34.640
+I think it has three really amazing powers,
+
+09:34.640 --> 00:09:36.399
+encapsulation, abstraction,
+
+00:09:36.399 --> 00:09:37.279
+and extensibility,
+
+00:09:37.279 --> 00:09:39.200
+so let's look at those.
+
+09:39.200 --> 00:09:40.959
+Encapsulation is just keeping
+
+00:09:40.959 --> 00:09:42.480
+related data together.
+
+00:09:42.480 --> 00:09:43.680
+Here's an example from the
+
+09:43.680 --> 00:09:45.360
+transmission Torrent client.
+
+00:09:45.360 --> 00:09:46.399
+In order for it to work,
+
+00:09:46.399 --> 00:09:47.600
+it needs to have all four of
+
+09:47.600 --> 00:09:49.920
+these variables set consistently,
+
+00:09:49.920 --> 00:09:52.240
+but if you use the customization interface,
+
+09:52.240 --> 00:09:53.920
+they're kind of strewn all over the buffer
+
+00:09:53.920 --> 00:09:55.760
+because that shows them alphabetically
+
+00:09:55.760 --> 00:09:57.040
+by variable name instead of
+
+00:09:57.040 --> 00:09:59.920
+grouping them logically by function.
+
+09:59.920 --> 00:10:01.327
+You also have all these
+
+00:10:01.327 --> 00:10:02.480
+in the global namespace,
+
+00:10:02.480 --> 00:10:04.720
+so you need this disambiguation in front,
+
+00:10:04.720 --> 00:10:06.800
+you have to have a transmission prefix,
+
+00:10:06.800 --> 00:10:08.720
+so it's kind of ugly.
+
+10:08.720 --> 00:10:10.240
+An alternative example would be to
+
+10:10.240 --> 00:10:11.760
+encapsulate all of that
+
+00:10:11.760 --> 00:10:13.360
+in a single class.
+
+10:13.360 --> 00:10:16.160
+This has one slot for each of those values,
+
+00:10:16.160 --> 00:10:17.040
+except the username
+
+00:10:17.040 --> 00:10:18.000
+and password is broken out,
+
+00:10:18.000 --> 00:10:20.240
+there was only one in the previous example,
+
+00:10:20.240 --> 00:10:23.120
+but it works pretty much the same.
+
+10:23.120 --> 00:10:25.200
+The really neat thing about this is that
+
+10:25.200 --> 00:10:27.279
+the customization interface understands
+
+10:27.279 --> 00:10:29.920
+how to customize EIEIO objects,
+
+00:10:29.920 --> 00:10:32.640
+so you can set your custom variable
+
+00:10:32.640 --> 00:10:34.000
+to the value of an object,
+
+00:10:34.000 --> 00:10:35.760
+and in the customization interface,
+
+00:10:35.760 --> 00:10:37.040
+it shows you all of the fields,
+
+00:10:37.040 --> 00:10:38.399
+and it lets you edit the values
+
+00:10:38.399 --> 00:10:40.079
+of those slots directly.
+
+00:10:40.079 --> 00:10:41.760
+So, that keeps that logical grouping
+
+00:10:41.760 --> 00:10:44.800
+that I think makes things really easy to use.
+
+10:44.800 --> 00:10:46.160
+Another thing it's really good at is
+
+10:46.160 --> 00:10:48.268
+abstraction, and this is really core to
+
+00:10:48.268 --> 00:10:49.408
+a lot of what Emacs does
+
+00:10:49.408 --> 00:10:51.200
+because it runs on so many different systems,
+
+00:10:51.200 --> 00:10:53.308
+and it works with so many different
+
+00:10:53.308 --> 00:10:55.120
+kinds of similar tools.
+
+10:55.120 --> 00:10:56.109
+Here's an example from
+
+00:10:56.109 --> 00:10:58.079
+the built-in SQL implementation.
+
+00:10:58.079 --> 00:10:59.360
+This is the definition of
+
+00:10:59.360 --> 00:11:01.040
+the postgres backend,
+
+00:11:01.040 --> 00:11:02.160
+there's one of these for
+
+00:11:02.160 --> 00:11:04.000
+every supported database backend.
+
+00:11:04.000 --> 00:11:05.440
+And you can see, this is a pretty
+
+11:05.440 --> 00:11:08.480
+classic interface abstraction pattern.
+
+11:08.480 --> 00:11:09.680
+On the left-hand side,
+
+00:11:09.680 --> 00:11:10.880
+you have a symbol that's common
+
+00:11:10.880 --> 00:11:12.399
+among all the database backends,
+
+00:11:12.399 --> 00:11:14.160
+and the code that doesn't
+
+00:11:14.160 --> 00:11:16.240
+know about the implementation can use,
+
+00:11:16.240 --> 00:11:17.519
+no matter what implementation
+
+00:11:17.519 --> 00:11:19.040
+is being specified.
+
+00:11:19.040 --> 00:11:20.000
+On the right-hand side,
+
+00:11:20.000 --> 00:11:21.120
+you have the implementation
+
+00:11:21.120 --> 00:11:22.560
+specific values,
+
+00:11:22.560 --> 00:11:24.399
+in some cases these are just strings,
+
+00:11:24.399 --> 00:11:25.760
+or regexes, and in others
+
+00:11:25.760 --> 00:11:27.519
+those are actual functions.
+
+11:27.519 --> 00:11:29.440
+So, really this already is
+
+00:11:29.440 --> 00:11:30.720
+object orientation,
+
+00:11:30.720 --> 00:11:32.959
+it's just an ad-hoc system for it,
+
+00:11:32.959 --> 00:11:34.880
+but you don't have to use an ad-hoc system
+
+00:11:34.880 --> 00:11:35.519
+because there's this
+
+00:11:35.519 --> 00:11:38.000
+nice formal one instead.
+
+11:38.000 --> 00:11:38.880
+Another thing that it's
+
+00:11:38.880 --> 00:11:40.959
+really good at is extensibility,
+
+00:11:40.959 --> 00:11:42.160
+we saw some of that with
+
+00:11:42.160 --> 00:11:44.800
+the emms-player example earlier.
+
+00:11:44.800 --> 00:11:46.160
+But here's another thing I think
+
+00:11:46.160 --> 00:11:48.720
+it would be interesting to explore.
+
+11:48.720 --> 00:11:51.279
+Emacs has this idea of derived modes
+
+11:51.279 --> 00:11:52.639
+where you have a mode that's based on
+
+11:52.639 --> 00:11:54.639
+another, and that's a pretty clear
+
+11:54.639 --> 00:11:57.040
+inheritance pattern straight out of OOP
+
+11:57.040 --> 00:11:58.560
+as far as I'm concerned.
+
+00:11:58.560 --> 00:12:00.079
+What would it look like
+
+00:12:00.079 --> 00:12:02.959
+if major modes were EIEIO classes,
+
+00:12:02.959 --> 00:12:04.800
+and you could extend your mode
+
+12:04.800 --> 00:12:06.399
+by extending the class.
+
+00:12:06.399 --> 00:12:08.240
+I think that's a really interesting idea,
+
+00:12:08.240 --> 00:12:10.880
+and I'd like to explore that more.
+
+12:10.880 --> 00:12:14.079
+In conclusion, I think EIEIO is amazing,
+
+12:14.079 --> 00:12:16.079
+and I had no idea that such a powerful
+
+12:16.079 --> 00:12:18.079
+object orientation system
+
+00:12:18.079 --> 00:12:20.160
+was available in the Emacs.
+
+12:20.160 --> 00:12:21.519
+My goal with this talk
+
+00:12:21.519 --> 00:12:23.519
+is for anyone who writes Emacs Lisp,
+
+00:12:23.519 --> 00:12:25.360
+to look at these classes of problems,
+
+00:12:25.360 --> 00:12:27.360
+encapsulation, abstraction,
+
+00:12:27.360 --> 00:12:28.639
+and extensibility,
+
+00:12:28.639 --> 00:12:29.600
+and if you run into
+
+00:12:29.600 --> 00:12:31.279
+those problems in your code,
+
+12:31.279 --> 00:12:33.279
+instead of immediately reaching
+
+00:12:33.279 --> 00:12:34.959
+and building your own system,
+
+00:12:34.959 --> 00:12:35.760
+I want you to think:
+
+00:12:35.760 --> 00:12:37.279
+"Oh there's a thing for that,
+
+00:12:37.279 --> 00:12:39.040
+and I can just use it."
+
+12:39.040 --> 00:12:40.560
+That's my talk, thanks.
+
+00:12:40.560 --> 00:12:41.560
+Hack on!
+
+00:12:41.560 --> 00:12:43.880
+[captions by bhavin192 (Bhavin Gandhi)]
diff --git a/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--chapters.vtt b/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--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--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-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-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt b/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt
new file mode 100644
index 00000000..3f7600e1
--- /dev/null
+++ b/2021/captions/emacsconf-2021-freedom--how-emacs-made-me-appreciate-software-freedom--protesilaos-stavrou--main.vtt
@@ -0,0 +1,2512 @@
+WEBVTT
+
+00:11.610 --> 00:13.974
+Hello EmacsConf! Hello world!
+
+00:13.974 --> 00:15.940
+Today I will talk to you about
+
+00:15.940 --> 00:19.040
+how Emacs made me appreciate
+
+00:19.040 --> 00:20.900
+software freedom.
+
+00:20.900 --> 00:24.180
+My name is Protesilaos, also known as "Prot".
+
+00:24.180 --> 00:28.430
+I am joining you from the mountains of Cyprus.
+
+00:28.430 --> 00:30.274
+Cyprus is an island
+
+00:30.274 --> 00:32.940
+in the Eastern Mediterranean Sea.
+
+00:32.940 --> 00:35.107
+So let's remove this header
+
+00:35.107 --> 00:37.174
+from the top of the presentation
+
+00:37.174 --> 00:40.307
+and proceed with today's talk.
+
+00:40.307 --> 00:41.907
+In that header, you can find a link
+
+00:41.907 --> 00:45.974
+to my website, protesilaos.com .
+
+00:45.974 --> 00:50.207
+My presentation focuses on the intersection
+
+00:50.207 --> 00:52.210
+between software freedom
+
+00:52.210 --> 00:55.890
+and what we find in the Emacs milieu.
+
+00:55.890 --> 00:57.640
+Here "the Emacs milieu"
+
+00:57.640 --> 01:00.507
+encompasses two magnitudes:
+
+01:00.507 --> 01:03.320
+(i) the program we use and
+
+01:03.320 --> 01:06.740
+(ii) the diverse, global community of people
+
+01:06.740 --> 01:10.530
+that has grown organically around it.
+
+01:10.530 --> 01:12.007
+I will talk to you about
+
+01:12.007 --> 01:13.707
+how Emacs made me appreciate
+
+01:13.707 --> 01:14.940
+software freedom
+
+01:14.940 --> 01:16.674
+and helped me exercise it
+
+01:16.674 --> 01:19.830
+to its full potential.
+
+01:19.830 --> 01:21.440
+Personal anecdotes are not
+
+01:21.440 --> 01:23.650
+the main focus of this talk.
+
+01:23.650 --> 01:26.740
+Rather, they serve the ancillary role
+
+01:26.740 --> 01:31.470
+of making certain insights more relatable.
+
+01:31.470 --> 01:34.574
+The presentation is theoretical in nature
+
+01:34.574 --> 01:38.430
+and targeted at a general audience.
+
+01:38.430 --> 01:42.020
+No knowledge of programming is required.
+
+01:42.020 --> 01:43.840
+It is assumed, however,
+
+01:43.840 --> 01:45.374
+that you are familiar
+
+01:45.374 --> 01:47.074
+with some basic concepts,
+
+01:47.074 --> 01:50.707
+such as the fact that Emacs is extended
+
+01:50.707 --> 01:53.507
+with the Emacs Lisp programming language,
+
+01:53.507 --> 01:56.807
+or that Emacs is a GNU project
+
+01:56.807 --> 02:02.450
+that champions end-user software freedom.
+
+02:02.450 --> 02:04.574
+Let's start with a few words about me
+
+02:04.574 --> 02:07.280
+before elaborating further.
+
+02:07.280 --> 02:11.540
+I was born in Greece in 1988
+
+02:11.540 --> 02:13.379
+and was raised there.
+
+02:13.379 --> 02:16.307
+As a kid I was not into
+
+02:16.307 --> 02:19.207
+tech-related activities. Not at all.
+
+02:20.480 --> 02:22.973
+All I cared about was playing football
+
+02:22.973 --> 02:26.440
+(association football, also known as soccer)
+
+02:26.440 --> 02:29.840
+and staying outdoors.
+
+02:29.840 --> 02:33.074
+My formal education is in the humanities
+
+02:33.074 --> 02:35.690
+(or else, the liberal arts).
+
+02:35.690 --> 02:38.040
+I had a career in politics.
+
+02:38.040 --> 02:41.107
+I lived in Brussels, Belgium
+
+02:41.107 --> 02:42.840
+where I worked at the
+
+02:42.840 --> 02:46.050
+European Parliament, among others.
+
+02:46.050 --> 02:49.774
++ After some intense soul-searching,
+
+02:49.774 --> 02:52.607
+I realised I did not want to be
+
+02:52.607 --> 02:55.040
+a political operator any more
+
+02:55.040 --> 02:59.950
+and made radical changes in my life.
+
+02:59.950 --> 03:02.207
+I have since come to terms with the fact
+
+03:02.207 --> 03:04.709
+that I am a philosopher.
+
+03:04.709 --> 03:07.640
+I am not a programmer.
+
+03:07.640 --> 03:10.709
+Neither by trade nor education.
+
+03:10.709 --> 03:13.140
+I code for leisure.
+
+03:13.140 --> 03:17.370
+I was not tech-savvy until my mid-20s.
+
+03:17.370 --> 03:20.740
+I have been using GNU/Linux distributions
+
+03:20.740 --> 03:24.180
+since the summer of 2016.
+
+03:24.180 --> 03:26.374
+While I switched to Emacs full-time
+
+03:26.374 --> 03:30.190
+in the summer of 2019.
+
+03:30.190 --> 03:31.840
+Before that switch, I was running
+
+03:31.840 --> 03:33.774
+a bespoke environment
+
+03:33.774 --> 03:36.907
+that involved several standalone programs
+
+03:36.907 --> 03:41.360
+like Vim, Tmux, and a tiling window manager.
+
+03:41.360 --> 03:44.874
+I am the creator and maintainer
+
+03:44.874 --> 03:47.340
+of the modus-themes package.
+
+03:47.340 --> 03:50.707
+The themes are modus-operandi
+
+03:50.707 --> 03:52.440
+and modus-vivendi,
+
+03:52.440 --> 03:53.874
+but they are grouped together
+
+03:53.874 --> 03:57.007
+in the package called modus-themes.
+
+03:57.760 --> 03:59.274
+These are designed to conform
+
+03:59.274 --> 04:01.840
+with the highest accessibility standard
+
+04:01.840 --> 04:05.007
+for legibility, and optionally
+
+04:05.007 --> 04:07.007
+support the needs of users
+
+04:07.007 --> 04:09.269
+with red-green colour deficiency
+
+04:09.269 --> 04:12.307
+(deuteranopia, as it is known).
+
+04:12.307 --> 04:14.940
+The themes are built into
+
+04:14.940 --> 04:17.579
+Emacs version 28 or higher.
+
+04:17.579 --> 04:19.574
+A section of my website
+
+04:19.574 --> 04:21.307
+is dedicated to them
+
+04:21.307 --> 04:23.840
+as well as to all my other
+
+04:23.840 --> 04:27.620
+Emacs-related contributions.
+
+04:27.620 --> 04:30.274
+For the remainder of this 40-minute talk,
+
+04:30.274 --> 04:31.907
+I will explain how Emacs
+
+04:31.907 --> 04:34.240
+made me appreciate software freedom,
+
+04:34.240 --> 04:36.374
+how it empowers me
+
+04:36.374 --> 04:38.924
+in my day-to-day computing,
+
+04:38.924 --> 04:40.374
+and the lessons I have drawn
+
+04:40.374 --> 00:04:44.206
+from that liberating experience.
+
+04:44.207 --> 04:47.174
+So let's proceed to the body
+
+04:47.174 --> 04:48.407
+of this presentation,
+
+04:48.407 --> 04:51.740
+and the first section is titled:
+
+04:51.740 --> 04:54.807
+"The inherent Emacs qualities
+
+04:54.807 --> 04:56.860
+for an autodidact."
+
+04:56.860 --> 05:00.440
+Emacs has this reputation
+
+05:00.440 --> 05:02.774
+of being extremely hard to learn
+
+05:02.774 --> 05:06.469
+and difficult to get started with.
+
+05:06.469 --> 05:08.140
+So how does someone like me,
+
+05:08.140 --> 05:10.607
+who was not even tech-literate
+
+05:10.607 --> 05:11.907
+a few years ago,
+
+05:11.907 --> 05:15.120
+go on to use Emacs effectively?
+
+05:15.120 --> 05:16.640
+How do you start from zero,
+
+05:16.640 --> 05:19.140
+with no knowledge of ELisp
+
+05:19.140 --> 05:22.174
+and with only a rudimentary understanding
+
+05:22.174 --> 05:23.474
+of programming,
+
+05:23.474 --> 05:25.974
+to eventually maintain packages for Emacs,
+
+05:25.974 --> 05:29.430
+and even contribute directly to emacs.git
+
+05:29.430 --> 05:32.710
+and other sources?
+
+05:32.710 --> 05:35.207
+The answer to these and related questions
+
+05:35.207 --> 05:37.974
+lies in the very description of Emacs
+
+05:37.974 --> 05:41.539
+as a "self-documenting" piece of software.
+
+05:41.539 --> 05:45.574
+It means that Emacs has a robust Help system
+
+05:45.574 --> 05:48.207
+which informs you about the state
+
+05:48.207 --> 05:50.930
+of a given construct.
+
+05:50.930 --> 05:53.574
+Such as what the original and current values
+
+05:53.574 --> 05:56.430
+of a variable are.
+
+05:56.430 --> 05:58.574
+Or whether some function is being "advised",
+
+05:58.574 --> 05:59.640
+as it is known,
+
+05:59.640 --> 06:02.440
+else, dynamically adjusted,
+
+06:02.440 --> 06:04.074
+by another function,
+
+06:04.074 --> 06:08.939
+and what that advice amounts to.
+
+06:08.939 --> 06:10.907
+The self-documenting nature of Emacs
+
+06:10.907 --> 06:12.407
+is combined with the fact
+
+06:12.407 --> 06:16.319
+that it consists of free software.
+
+06:16.319 --> 06:18.040
+Not only do we get information
+
+06:18.040 --> 06:19.540
+about what Emacs knows,
+
+06:19.540 --> 06:22.009
+but have the underlying code
+
+06:22.009 --> 06:24.099
+readily available to us.
+
+06:24.099 --> 06:26.840
+For example, every Help buffer
+
+06:26.840 --> 06:29.107
+provides a link to the source
+
+06:29.107 --> 06:31.490
+of the item it references.
+
+06:31.490 --> 06:37.960
+We can study that and edit it as we wish.
+
+06:37.960 --> 06:39.340
+Self-documentation and free software
+
+06:39.340 --> 06:41.307
+are blended together
+
+06:41.307 --> 06:45.007
+with a third quality of Emacs:
+
+06:45.007 --> 06:48.174
+its implementation as a Lisp machine,
+
+06:48.174 --> 06:52.440
+or else, its ability to evaluate Lisp code
+
+06:52.440 --> 06:56.129
+and make use of it directly.
+
+06:56.129 --> 06:58.774
+The ubiquity and uniformity
+
+06:58.774 --> 07:00.307
+of the Lisp interpreter,
+
+07:00.307 --> 07:04.007
+together with the immediacy of its results
+
+07:04.007 --> 07:06.580
+help one learn how to use Emacs
+
+07:06.580 --> 07:10.360
+and how to write Emacs Lisp expressions.
+
+07:10.360 --> 07:13.474
+For someone who is self-taught like me
+
+07:13.474 --> 07:15.307
+and who often learns through
+
+07:15.307 --> 07:17.507
+a process of trial and error,
+
+07:17.507 --> 07:20.589
+this is of great value.
+
+07:20.589 --> 07:23.074
+Learning how to use Emacs
+
+07:23.074 --> 07:25.007
+and how to write in ELisp
+
+07:25.007 --> 07:27.707
+is the basic skillset you need
+
+07:27.707 --> 07:30.474
+to also start extending Emacs
+
+07:30.474 --> 07:32.140
+for your own use,
+
+07:32.140 --> 07:34.807
+or even for publishing packages
+
+07:34.807 --> 07:36.607
+and making contributions
+
+07:36.607 --> 07:40.490
+to emacs.git directly.
+
+07:40.490 --> 07:42.840
+That is because the skills you acquire
+
+07:42.840 --> 07:46.974
+by tinkering with your init.el as a beginner
+
+07:46.974 --> 07:49.207
+will always stay with you
+
+07:49.207 --> 07:53.550
+throughout your time as an Emacs user.
+
+07:53.550 --> 07:56.210
+That is empowering in itself.
+
+07:56.210 --> 07:58.593
+It rewards your investment
+
+07:58.593 --> 08:00.270
+in time and effort.
+
+08:00.270 --> 08:01.374
+The more you learn,
+
+08:01.374 --> 08:03.340
+the more capable you become
+
+08:03.340 --> 08:06.007
+to enact change,
+
+08:06.007 --> 08:08.074
+to configure things to your liking
+
+08:08.074 --> 08:11.974
+and develop the exact workflow that you want
+
+08:11.974 --> 08:16.569
+without making any compromises.
+
+08:16.569 --> 08:18.507
+Compare that to, say,
+
+08:18.507 --> 08:21.449
+my tiling window manager.
+
+08:21.449 --> 08:24.479
+I can configure it with a shell script.
+
+08:24.479 --> 08:29.689
+So I learn POSIX shell or, let's say, Bash.
+
+08:29.689 --> 08:31.804
+But my knowledge of the shell
+
+08:31.804 --> 08:34.072
+does not extend to modifying
+
+08:34.072 --> 08:37.593
+the behaviour of the window manager as such,
+
+08:37.593 --> 08:40.471
+because that is not implemented
+
+08:40.471 --> 08:42.140
+as a shell script,
+
+08:42.140 --> 08:44.250
+but in another language.
+
+08:44.250 --> 08:46.942
+So for an autodidact like me,
+
+08:46.942 --> 08:49.634
+it is more difficult to learn
+
+08:49.634 --> 08:51.430
+yet another paradigm
+
+08:51.430 --> 08:54.860
+before I can achieve what I want.
+
+08:54.860 --> 08:57.342
+How do you make that extra step
+
+08:57.342 --> 08:59.437
+without self-documentation
+
+08:59.437 --> 09:02.605
+and the immediacy as well as transparency
+
+09:02.605 --> 09:04.307
+that you get from
+
+09:04.307 --> 09:06.850
+the Emacs Lisp interpreter?
+
+09:06.850 --> 09:10.029
+It is more demanding,
+
+09:10.029 --> 09:12.843
+which makes Emacs comparatively easier
+
+09:12.843 --> 09:14.274
+when we account for
+
+09:14.274 --> 00:09:17.106
+the longer-term effort involved.
+
+09:17.107 --> 09:21.410
+Let's move to the next section:
+
+09:21.410 --> 09:24.640
+"The interconnectedness of the Emacs space."
+
+09:24.640 --> 09:27.607
+As I already mentioned,
+
+09:27.607 --> 09:28.874
+Emacs rewards you
+
+09:28.874 --> 09:31.374
+for the investment in time and effort
+
+09:31.374 --> 09:33.649
+you put into it.
+
+09:33.649 --> 09:34.891
+In my experience,
+
+09:34.891 --> 09:36.707
+this makes it easier to master
+
+09:36.707 --> 09:38.007
+than a combination
+
+09:38.007 --> 09:40.434
+of otherwise disparate tools,
+
+09:40.434 --> 09:42.649
+each with its own paradigm
+
+09:42.649 --> 09:45.440
+of interaction and particularities
+
+09:45.440 --> 09:48.350
+of implementation.
+
+09:48.350 --> 09:50.035
+Before switching to Emacs,
+
+09:50.035 --> 09:51.507
+I was using a combination
+
+09:51.507 --> 09:53.640
+of standalone programs
+
+09:53.640 --> 09:56.274
+as part of a bespoke computing environment
+
+09:56.274 --> 09:58.860
+that I had pieced together.
+
+09:58.860 --> 10:00.507
+The program called "Mutt"
+
+10:00.507 --> 10:02.140
+would handle my emails,
+
+10:02.140 --> 10:06.440
+Newsboat dealt with my RSS feeds,
+
+10:06.440 --> 10:08.407
+the Music Player Daemon
+
+10:08.407 --> 10:10.907
+took care of my music collection,
+
+10:10.907 --> 10:12.207
+while I was doing work
+
+10:12.207 --> 10:14.507
+inside of a terminal emulator
+
+10:14.507 --> 10:17.707
+which was running a multiplexer (tmux)
+
+10:17.707 --> 10:22.959
+and Vim for on-the-fly text editing.
+
+10:22.959 --> 10:25.707
+Each of these, and others related to them,
+
+10:25.707 --> 10:29.290
+are fine in their own right.
+
+10:29.290 --> 10:32.507
+But their gestalt, their combined form,
+
+10:32.507 --> 10:35.680
+leaves something to be desired.
+
+10:35.680 --> 10:38.174
+Their lack of homogeneity
+
+10:38.174 --> 10:40.800
+meant that I could not develop
+
+10:40.800 --> 10:43.240
+portable skills between them.
+
+10:43.240 --> 10:45.740
+There is no inter-operability.
+
+10:46.329 --> 10:48.140
+What holds true in Vim
+
+10:48.140 --> 10:50.210
+does not apply to the multiplexer.
+
+10:50.210 --> 10:53.240
+The prevalent methods in the email client
+
+10:53.240 --> 10:59.140
+cannot be used in the RSS reader, and so on.
+
+10:59.140 --> 10:59.940
+Whereas everything
+
+10:59.940 --> 11:02.207
+that is implemented in ELisp
+
+11:02.207 --> 11:04.440
+partakes in the same environment
+
+11:04.440 --> 11:05.540
+automatically.
+
+11:05.540 --> 11:08.574
+If, say, you know how to
+
+11:08.574 --> 11:10.174
+use keyboard macros to edit code,
+
+11:10.174 --> 11:12.274
+you already know how to
+
+11:12.274 --> 11:13.507
+use the exact same skill to,
+
+11:13.507 --> 11:19.221
+for example, create and delete windows
+
+11:19.221 --> 11:23.219
+in a process that involves text editing
+
+11:23.219 --> 11:25.107
+and some elaborate
+
+11:25.107 --> 11:27.340
+file management operations
+
+11:27.340 --> 11:30.607
+with Emacs's directory editor program,
+
+11:30.607 --> 11:33.107
+or file manager, Dired.
+
+11:33.107 --> 11:35.307
+If you have a command
+
+11:35.307 --> 11:38.374
+that scrolls down half a screen,
+
+11:38.374 --> 11:40.174
+it immediately works in all your buffers,
+
+11:40.174 --> 11:44.140
+regardless of whether their major mode
+
+11:44.140 --> 11:46.674
+is about reading emails, editing text,
+
+11:46.674 --> 11:51.269
+enqueuing songs to a playlist, and so on.
+
+11:51.269 --> 11:55.582
+Emacs provides a level of integration
+
+11:55.582 --> 11:58.420
+that I consider peerless.
+
+11:58.420 --> 12:00.471
+Everything the user deals with
+
+12:00.471 --> 12:02.060
+is implemented in ELisp.
+
+12:02.060 --> 12:04.402
+And all the user edits
+
+12:04.402 --> 12:07.459
+is ultimately done with ELisp.
+
+12:07.459 --> 12:10.463
+As such, the environment itself
+
+12:10.463 --> 12:13.749
+provides the conditions for drawing
+
+12:13.749 --> 12:15.774
+linkages between different,
+
+12:15.774 --> 12:18.540
+yet [consubstantial],
+
+12:18.540 --> 12:21.339
+modes of interaction.
+
+12:21.339 --> 12:25.040
+For example, I use bongo.el
+
+12:25.040 --> 12:26.406
+to play back songs
+
+12:26.406 --> 12:29.110
+from my music collection.
+
+12:29.110 --> 12:30.340
+My ~/Music directory
+
+12:30.340 --> 12:33.440
+is configured to have a special minor mode,
+
+12:33.440 --> 12:36.440
+so when I access it with dired,
+
+12:36.440 --> 12:38.407
+it has commands that allow me
+
+12:38.407 --> 12:41.140
+to enqueue albums/songs
+
+12:41.140 --> 12:42.074
+to a playlist,
+
+12:42.074 --> 12:44.999
+create playlists, et cetera.
+
+12:44.999 --> 12:48.307
+Also, I have an org-capture template
+
+12:48.307 --> 12:51.174
+which lets me store the details
+
+12:51.174 --> 12:53.274
+of the currently playing track
+
+12:53.274 --> 12:57.189
+and tag it accordingly.
+
+12:57.189 --> 12:59.603
+Continuing with the example of Bongo,
+
+12:59.603 --> 13:00.810
+I make it interface
+
+13:00.810 --> 13:04.210
+with my RSS reader, elfeed.el,
+
+13:04.210 --> 13:06.953
+by having the latter add
+
+13:06.953 --> 13:09.469
+podcast and video links
+
+13:09.469 --> 13:12.720
+to the former's playback queue.
+
+13:12.720 --> 13:14.131
+All this is done
+
+13:14.131 --> 13:15.709
+by simply re-using
+
+13:15.709 --> 13:18.283
+the same Emacs Lisp skills I learnt
+
+13:18.283 --> 13:23.120
+while configuring and extending Emacs.
+
+13:23.120 --> 13:26.989
+The interconnectedness of the Emacs space
+
+13:26.989 --> 13:29.160
+empowers the end-user.
+
+13:29.160 --> 13:33.149
+It makes such emergent workflows possible.
+
+13:33.149 --> 13:35.359
+And the best part is
+
+13:35.359 --> 13:38.334
+there are no dirty hacks involved:
+
+13:38.334 --> 13:41.690
+it is an innate feature of the system.
+
+13:41.690 --> 13:43.840
+You are leveraging the freedom
+
+13:43.840 --> 13:45.107
+that Emacs gives you
+
+13:45.107 --> 13:49.240
+in a way that confers agency on you.
+
+13:49.240 --> 13:50.970
+You assume the initiative.
+
+13:50.970 --> 13:53.707
+It gives you confidence
+
+13:53.707 --> 13:55.340
+to continue honing your skills
+
+13:55.340 --> 13:58.807
+in anticipation of further optimising---
+
+13:58.807 --> 13:59.807
+and controlling in full---
+
+13:59.807 --> 00:14:07.873
+your own integrated computing environment.
+
+14:07.874 --> 14:09.600
+Next section:
+
+14:09.600 --> 14:12.629
+the documentation culture
+
+14:12.629 --> 14:15.309
+of the Emacs community.
+
+14:15.309 --> 14:17.107
+If what I have mentioned thus far
+
+14:17.107 --> 14:19.140
+was all there was
+
+14:19.140 --> 14:20.007
+to the Emacs experience,
+
+14:20.007 --> 14:21.440
+there would still be
+
+14:21.440 --> 14:24.209
+something to be desired.
+
+14:24.209 --> 14:26.721
+Because while self-documentation is great,
+
+14:26.721 --> 14:28.808
+it is meant to draw from---
+
+14:28.808 --> 14:30.741
+and be a complement to---
+
+14:30.741 --> 14:32.829
+some hand-written material.
+
+14:32.829 --> 14:35.807
+Both new and existing users
+
+14:35.807 --> 14:37.380
+must be able to read
+
+14:37.380 --> 14:41.740
+what something is supposed to do,
+
+14:41.740 --> 14:42.774
+what its main points of entry are,
+
+14:42.774 --> 14:47.279
+how it relates to other parts, and so on.
+
+14:47.279 --> 14:50.181
+This is about the human aspect of Emacs,
+
+14:50.181 --> 14:52.280
+the strong documentation culture
+
+14:52.280 --> 14:53.425
+of its community,
+
+14:53.425 --> 14:55.589
+rather than an irreducible feature
+
+14:55.589 --> 14:58.839
+of the program we use.
+
+14:58.839 --> 15:02.393
+As a matter of packaging etiquette,
+
+15:02.393 --> 15:06.552
+every non-trivial form in an Elisp library
+
+15:06.552 --> 15:09.920
+must have a documentation string.
+
+15:09.920 --> 15:12.785
+What a variable or function does
+
+15:12.785 --> 15:16.189
+needs to be spelt out in clear terms.
+
+15:16.189 --> 15:17.788
+Furthermore, the best
+
+15:17.788 --> 15:20.333
+and most well-maintained packages,
+
+15:20.333 --> 15:22.507
+whether those are built into Emacs
+
+15:22.507 --> 15:24.440
+or distributed via
+
+15:24.440 --> 15:27.540
+an Emacs Lisp Package Archive,
+
+15:27.540 --> 15:28.674
+also known as ELPA,
+
+15:28.674 --> 15:33.350
+come with their own Info manual.
+
+15:33.350 --> 15:34.944
+Unlike a generic README,
+
+15:34.944 --> 15:37.112
+those manuals are more like
+
+15:37.112 --> 15:38.738
+fully fledged books,
+
+15:38.738 --> 15:42.146
+with a table of contents, cross-references,
+
+15:42.146 --> 15:45.107
+and indices for concepts, functions,
+
+15:45.107 --> 15:47.189
+variables, key bindings...
+
+15:47.189 --> 15:49.555
+In short, there is a tradition
+
+15:49.555 --> 15:52.262
+around programming with Emacs Lisp
+
+15:52.262 --> 15:55.387
+which values informative,
+
+15:55.387 --> 15:58.451
+high-quality guidelines
+
+15:58.451 --> 16:01.389
+intended for end-users.
+
+16:01.389 --> 16:02.274
+Apart from what
+
+16:02.274 --> 16:04.684
+each individual package does,
+
+16:04.684 --> 16:06.712
+Emacs itself ships with
+
+16:06.712 --> 16:10.174
+a helpful tutorial for newcomers,
+
+16:10.174 --> 16:11.374
+a comprehensive manual,
+
+16:11.374 --> 16:14.940
+a book targeted at non-programmers
+
+16:14.940 --> 16:17.474
+titled "An Introduction to
+
+16:17.474 --> 16:20.107
+Programming in Emacs Lisp",
+
+16:20.107 --> 16:21.307
+as well as a reference manual
+
+16:21.307 --> 16:24.290
+for Emacs Lisp itself.
+
+16:24.290 --> 16:25.999
+All this material,
+
+16:25.999 --> 16:28.699
+all that wealth of knowledge,
+
+16:28.699 --> 16:31.605
+is readily available to the end-user
+
+16:31.605 --> 16:34.350
+through the built-in Info reader.
+
+16:34.350 --> 16:37.936
+The details on how to access the Info reader
+
+16:37.936 --> 16:40.512
+are already explained
+
+16:40.512 --> 16:45.080
+in the initial learn-by-doing tutorial.
+
+16:45.080 --> 16:47.440
+For people like me who are self-taught,
+
+16:47.440 --> 16:51.408
+the documentation culture of the community
+
+16:51.408 --> 16:55.600
+ensures that we are not left behind.
+
+16:55.600 --> 16:56.840
+It gives us the chance
+
+16:56.840 --> 16:59.011
+to learn from the experts
+
+16:59.011 --> 17:03.639
+and to become better ourselves.
+
+17:03.639 --> 17:06.340
+Writing concise and clear documentation
+
+17:06.340 --> 17:09.474
+is also beneficial for those who do it:
+
+17:09.474 --> 17:10.707
+it helps them clarify their ideas
+
+17:10.707 --> 17:17.250
+and improve their communication skills.
+
+17:17.250 --> 17:19.868
+These contribute to fostering
+
+17:19.868 --> 17:22.399
+a more humane social element.
+
+17:22.399 --> 17:25.774
+In my experience, the Emacs community
+
+17:25.774 --> 17:30.646
+has a propensity against
+
+17:30.646 --> 17:32.149
+becoming elitist.
+
+17:32.149 --> 17:34.907
+It helps integrate new members
+
+17:34.907 --> 17:37.732
+by not hiding anything from them,
+
+17:37.732 --> 17:39.040
+on top of Emacs' inherent
+
+17:39.040 --> 17:43.470
+emancipatory qualities, as described before
+
+17:43.470 --> 17:46.374
+(self-documentation, Elisp interpreter,
+
+17:46.374 --> 17:47.960
+free software).
+
+17:47.960 --> 17:49.807
+At the same time,
+
+17:49.807 --> 17:52.899
+the community strives for excellence,
+
+17:52.899 --> 17:54.840
+so it expects newcomers
+
+17:54.840 --> 17:56.940
+to do their part in reading
+
+17:56.940 --> 18:00.680
+what is generously offered to them.
+
+18:00.680 --> 18:01.940
+There is a difference between
+
+18:01.940 --> 18:03.240
+sharing knowledge
+
+18:03.240 --> 18:06.740
+and spoon-feeding it to users.
+
+18:06.740 --> 18:09.140
+The latter method, that of spoon-feeding,
+
+18:09.140 --> 18:11.499
+keeps users dependent on it
+
+18:11.499 --> 18:14.574
+and is thus detrimental to them
+
+18:14.574 --> 18:15.940
+in the long run.
+
+18:15.940 --> 18:18.374
+The Emacs community
+
+18:18.374 --> 18:20.507
+disseminates what it knows
+
+18:20.507 --> 18:23.974
+and wants newcomers to assume agency
+
+18:23.974 --> 18:26.907
+and be responsible for doing their part
+
+18:26.907 --> 18:30.740
+in learning how things work.
+
+18:30.740 --> 18:33.307
+The community's documentation culture
+
+18:33.307 --> 18:36.074
+and uncompromising standards
+
+18:36.074 --> 18:37.674
+ensure that even
+
+18:37.674 --> 18:41.174
+once-unskilled users like me
+
+18:41.174 --> 18:43.707
+can become productive with Emacs
+
+18:43.707 --> 18:46.574
+and unleash its full potential.
+
+18:46.574 --> 18:50.488
+What newcomers need is commitment
+
+18:50.488 --> 00:18:55.039
+and an open mind to study what they have.
+
+18:55.040 --> 18:58.269
+Next section:
+
+18:58.269 --> 18:59.707
+"The Promethean Ideal
+
+18:59.707 --> 19:05.230
+of freeing know-how and expertise."
+
+19:05.230 --> 19:06.807
+The documentation culture
+
+19:06.807 --> 19:08.074
+of the Emacs community
+
+19:08.074 --> 19:10.307
+springs from a consideration
+
+19:10.307 --> 19:12.840
+of practicality.
+
+19:12.840 --> 19:15.351
+When you explain what your program does,
+
+19:15.351 --> 19:16.505
+it is more likely
+
+19:16.505 --> 19:19.477
+that others will show interest in it
+
+19:19.477 --> 19:22.450
+and incorporate it in their workflow,
+
+19:22.450 --> 19:24.674
+whereas freed source code
+
+19:24.674 --> 19:26.085
+that is distributed
+
+19:26.085 --> 19:29.309
+without any accompanying documentation
+
+19:29.309 --> 19:32.300
+will most likely only attract
+
+19:32.300 --> 19:35.690
+a handful of enthusiastic hackers.
+
+19:35.690 --> 19:39.460
+Still good, but could be better.
+
+19:39.460 --> 19:41.640
+Apart from its practical use though,
+
+19:41.640 --> 19:44.407
+writing documentation for the end-user
+
+19:44.407 --> 19:47.140
+shows a spirit of altruism,
+
+19:47.140 --> 19:50.274
+an ethos of caring for others
+
+19:50.274 --> 19:52.540
+and wanting to empower them
+
+19:52.540 --> 19:55.130
+in their endeavours.
+
+19:55.130 --> 19:57.774
+It essentially is the same
+
+19:57.774 --> 19:58.674
+as helping someone;
+
+19:58.674 --> 20:02.607
+helping them escape from the ignorance
+
+20:02.607 --> 20:03.907
+that contributes
+
+20:03.907 --> 20:07.810
+to their sense of powerlessness.
+
+20:07.810 --> 20:09.974
+I experienced this myself:
+
+20:09.974 --> 20:12.007
+by reading the docs,
+
+20:12.007 --> 20:13.450
+I was able to go from
+
+20:13.450 --> 20:15.274
+an unskilled rookie
+
+20:15.274 --> 20:17.909
+to a competent Emacs user.
+
+20:17.909 --> 20:20.839
+Part of that competence consists in
+
+20:20.839 --> 20:23.037
+maintaining Elisp packages
+
+20:23.037 --> 20:25.480
+and contributing code directly
+
+20:25.480 --> 20:28.760
+to emacs.git.
+
+20:28.760 --> 20:29.740
+Writing documentation
+
+20:29.740 --> 20:31.207
+is about disseminating
+
+20:31.207 --> 20:34.015
+knowledge and expertise,
+
+20:34.015 --> 20:36.707
+not keeping it an exclusive right
+
+20:36.707 --> 20:39.919
+of some elite.
+
+20:39.919 --> 20:42.928
+Allow me then to liken this
+
+20:42.928 --> 20:47.120
+to the ancient Greek myth of Prometheas
+
+20:47.120 --> 20:48.559
+(Prometheus).
+
+20:48.559 --> 20:52.972
+Prometheas was a titan, or else a deity,
+
+20:52.972 --> 20:54.988
+who decided to teach
+
+20:54.988 --> 20:57.772
+the know-how of handling fire
+
+20:57.772 --> 20:59.020
+to humanity.
+
+20:59.020 --> 21:00.447
+The art of fire
+
+21:00.447 --> 21:04.192
+is an allegory about know-how in general,
+
+21:04.192 --> 21:06.840
+not specifically pyrotechnics.
+
+21:06.840 --> 21:11.571
+So Prometheas liberated that key knowledge
+
+21:11.571 --> 21:13.215
+by taking it away
+
+21:13.215 --> 21:16.231
+from the exclusivity of the gods
+
+21:16.231 --> 21:17.693
+and bringing it
+
+21:17.693 --> 21:21.512
+into the domain of humankind
+
+21:21.512 --> 21:24.390
+as a libre resource.
+
+21:24.390 --> 21:26.507
+This act of altruism
+
+21:26.507 --> 21:30.029
+propelled humanity to new heights.
+
+21:30.029 --> 21:32.590
+Every field of expertise
+
+21:32.590 --> 21:35.255
+is about handling "fire",
+
+21:35.255 --> 21:38.681
+in the figurative sense
+
+21:38.681 --> 21:43.679
+of implementing essential know-how.
+
+21:43.679 --> 21:47.123
+Why would Prometheas, an exalted being,
+
+21:47.123 --> 21:48.586
+ever bother with
+
+21:48.586 --> 21:52.250
+the fallible and frail humanity?
+
+21:52.250 --> 21:56.007
+Why did a god want to empower humans
+
+21:56.007 --> 22:00.077
+instead of, say, making them dependent
+
+22:00.077 --> 22:02.970
+on the know-how of "fire"?
+
+22:02.970 --> 22:05.747
+If we look at the world around us,
+
+22:05.747 --> 22:07.970
+we witness how its overlords
+
+22:07.970 --> 22:10.186
+are unscrupulously trying
+
+22:10.186 --> 22:12.274
+to enclose the commons
+
+22:12.274 --> 22:16.076
+and take advantage of expertise
+
+22:16.076 --> 22:18.809
+in order to exploit us.
+
+22:18.809 --> 22:22.700
+Why would Prometheas not do the same thing
+
+22:22.700 --> 22:27.570
+and enslave us for the rest of eternity?
+
+22:27.570 --> 22:29.343
+The answer is that
+
+22:29.343 --> 22:32.891
+unlike this world's aspiring tyrants,
+
+22:32.891 --> 22:36.842
+Prometheas represents a higher conscience,
+
+22:36.842 --> 22:40.640
+one that is not corrupted by egocentrism
+
+22:40.640 --> 22:45.510
+and the greed of short-term profiteering.
+
+22:45.510 --> 22:47.490
+This higher conscience
+
+22:47.490 --> 22:50.332
+makes sense of the bigger picture
+
+22:50.332 --> 22:51.710
+and can foresee
+
+22:51.710 --> 22:54.260
+that the distribution of know-how
+
+22:54.260 --> 22:56.960
+empowers those who access it freely
+
+22:56.960 --> 23:00.530
+to reach their potential.
+
+23:00.530 --> 23:04.650
+It is no coincidence that the ancient sages
+
+23:04.650 --> 23:09.320
+used the name "Prometheas",
+
+23:09.320 --> 23:16.659
+meaning the "prescient one", the "foreseer".
+
+23:16.659 --> 23:19.765
+This is a lesson on the outlook
+
+23:19.765 --> 23:21.791
+we ought to maintain,
+
+23:21.791 --> 23:25.330
+where we aspire to our highest.
+
+23:25.330 --> 23:28.501
+We want to be the best version of ourselves,
+
+23:28.501 --> 23:31.710
+by being more like Prometheas.
+
+23:31.710 --> 23:33.940
+We want our actions to be guided
+
+23:33.940 --> 23:36.674
+by this Promethean Ideal
+
+23:36.674 --> 23:39.097
+of liberating know-how,
+
+23:39.097 --> 23:42.307
+of making expertise readily available,
+
+23:42.307 --> 23:44.507
+and of providing others
+
+23:44.507 --> 23:48.350
+with the chance to prosper.
+
+23:48.350 --> 23:49.927
+When we all do so,
+
+23:49.927 --> 23:52.500
+we are collectively better-off.
+
+23:52.500 --> 23:56.340
+Free software is a microcosm
+
+23:56.340 --> 00:23:59.528
+of that principle.
+
+23:59.529 --> 24:02.940
+So let's move on to the next section:
+
+24:02.940 --> 24:08.020
+"The 'killer apps' of Emacs."
+
+24:08.020 --> 24:10.860
+Let's be a bit more practical now.
+
+24:10.860 --> 24:13.789
+Many new users are attracted to Emacs
+
+24:13.789 --> 24:16.066
+because it has one or a few
+
+24:16.066 --> 24:18.858
+immensely useful applications
+
+24:18.858 --> 24:21.000
+they would like to use.
+
+24:21.000 --> 24:23.019
+This typically covers Org
+
+24:23.019 --> 24:27.090
+and/or one of its numerous accoutrements,
+
+24:27.090 --> 24:33.023
+though there are other excellent packages
+
+24:33.023 --> 24:34.760
+like Magit.
+
+24:34.760 --> 24:36.107
+The fact that Emacs has
+
+24:36.107 --> 24:38.870
+such killer apps is good.
+
+24:38.870 --> 24:41.535
+It shows that its extensibility
+
+24:41.535 --> 24:44.200
+is not some theoretical upside
+
+24:44.200 --> 24:46.340
+of the Lisp interpreter.
+
+24:46.340 --> 24:49.816
+It has tangible utility to a wide user base,
+
+24:49.816 --> 24:51.940
+including those who do not
+
+24:51.940 --> 24:54.850
+write Elisp themselves.
+
+24:54.850 --> 24:57.927
+Furthermore, those killer apps are good
+
+24:57.927 --> 25:00.418
+as they help bring newcomers
+
+25:00.418 --> 25:04.370
+and potential contributors to the fold,
+
+25:04.370 --> 25:06.968
+while they provide real value
+
+25:06.968 --> 25:10.519
+to the existing members of the community.
+
+25:10.519 --> 25:12.339
+The more people we have
+
+25:12.339 --> 25:15.330
+and the happier they are with Emacs,
+
+25:15.330 --> 25:18.726
+the higher the chances that we receive
+
+25:18.726 --> 25:21.600
+some new ideas or code from them.
+
+25:21.600 --> 25:26.305
+The notion of a killer app does, however,
+
+25:26.305 --> 25:29.519
+come with a latent downside
+
+25:29.519 --> 25:32.040
+when targeted at outsiders
+
+25:32.040 --> 25:34.470
+to the Emacs milieu.
+
+25:34.470 --> 25:36.307
+And that is because
+
+25:36.307 --> 25:39.362
+packages like Org and Magit
+
+25:39.362 --> 25:42.000
+do not have a standalone presence.
+
+25:42.000 --> 25:46.770
+They are always used in Emacs or, rather,
+
+25:46.770 --> 25:50.840
+together with the rest of Emacs,
+
+25:50.840 --> 25:54.470
+which means that the user has to know
+
+25:54.470 --> 25:57.120
+what to expect from Emacs.
+
+25:57.120 --> 25:59.986
+You may be aware of the type of user
+
+25:59.986 --> 26:02.680
+who proclaims that they want to
+
+26:02.680 --> 26:04.785
+boost their productivity
+
+26:04.785 --> 26:08.070
+but who also expects immediate results.
+
+26:08.070 --> 26:11.152
+When you bring the "killer app" rhetoric
+
+26:11.152 --> 26:12.581
+to such a crowd,
+
+26:12.581 --> 26:15.608
+you run the risk of misleading them
+
+26:15.608 --> 26:18.720
+into a false sense of self-confidence
+
+26:18.720 --> 26:24.330
+and concomitant expectations of success.
+
+26:24.330 --> 26:26.655
+Such users may be tempted
+
+26:26.655 --> 26:29.249
+to try Org, Magit, and others
+
+26:29.249 --> 26:32.470
+but are most likely going to endure
+
+26:32.470 --> 26:36.179
+a frustrating experience overall.
+
+26:36.179 --> 26:39.834
+The reason is that they are oblivious
+
+26:39.834 --> 26:41.598
+to what Emacs is
+
+26:41.598 --> 26:44.874
+and what is required
+
+26:44.874 --> 26:46.540
+to get started with it
+
+26:46.540 --> 26:47.820
+on a sustainable basis.
+
+26:47.820 --> 26:50.874
+Org, Magit, and friends
+
+26:50.874 --> 26:54.899
+are fantastic tools in their own right.
+
+26:54.899 --> 26:57.399
+But they still are part of Emacs.
+
+26:57.399 --> 26:59.406
+To use them effectively,
+
+26:59.406 --> 27:01.109
+you have to develop
+
+27:01.109 --> 27:04.090
+at least a modicum of understanding
+
+27:04.090 --> 27:06.340
+on what Emacs does.
+
+27:06.340 --> 27:07.692
+You must be patient
+
+27:07.692 --> 27:09.519
+and approach this endeavour
+
+27:09.519 --> 27:12.500
+with an open mind.
+
+27:12.500 --> 27:14.372
+Go through the tutorial,
+
+27:14.372 --> 27:18.939
+familiarise yourself with the Help system,
+
+27:18.939 --> 27:23.401
+make a habit out of reading Info manuals,
+
+27:23.401 --> 27:26.820
+and take things slowly.
+
+27:26.820 --> 27:30.358
+No killer app can ever be a substitute
+
+27:30.358 --> 27:33.132
+for commitment to a cause;
+
+27:33.132 --> 27:35.621
+no vaunted life hack
+
+27:35.621 --> 27:39.771
+will ever provide a direct conduit
+
+27:39.771 --> 27:44.419
+to some fountain of wisdom.
+
+27:44.419 --> 27:46.597
+With regard to software freedom
+
+27:46.597 --> 27:48.094
+and user empowerment,
+
+27:48.094 --> 27:50.024
+what I have learnt is that
+
+27:50.024 --> 27:52.240
+the impulse for the killer app
+
+27:52.240 --> 27:53.974
+ought to emanate
+
+27:53.974 --> 27:56.707
+from a position of knowledge.
+
+27:56.707 --> 27:58.974
+You need to know what you are searching for,
+
+27:58.974 --> 28:00.107
+and you need to know
+
+28:00.107 --> 28:01.840
+where you will implement that.
+
+28:01.840 --> 28:06.571
+First, we need to temper our expectations
+
+28:06.571 --> 28:10.340
+and prefer propitious growth in learning
+
+28:10.340 --> 28:14.159
+over instant gratification.
+
+28:14.159 --> 28:17.323
+With Emacs, we have a strong foundation
+
+28:17.323 --> 28:19.245
+for our computing freedom:
+
+28:19.245 --> 28:21.951
+it consists of the inherent qualities
+
+28:21.951 --> 28:23.367
+of the program
+
+28:23.367 --> 28:27.051
+together with the documentation culture
+
+28:27.051 --> 28:30.169
+and creativity of the community.
+
+28:30.169 --> 28:32.670
+Once we learn how to benefit from those,
+
+28:32.670 --> 28:34.174
+we have everything we need
+
+28:34.174 --> 28:35.893
+to become proficient
+
+28:35.893 --> 28:38.592
+in all the modes of interaction
+
+28:38.592 --> 28:42.330
+that are available to us.
+
+28:42.330 --> 28:46.889
+Think of it as choosing Emacs and Org,
+
+28:46.889 --> 28:48.876
+Emacs and Magit,
+
+28:48.876 --> 00:28:53.139
+Emacs and Org and Magit, et cetera.
+
+28:53.140 --> 28:56.889
+Next section:
+
+28:56.889 --> 29:01.899
+"You can't be an Emacs tourist."
+
+29:01.899 --> 29:04.521
+What I just talked about implies that
+
+29:04.521 --> 29:06.799
+you cannot simply switch to Emacs
+
+29:06.799 --> 29:09.960
+over the weekend or on a whimsy.
+
+29:09.960 --> 29:12.915
+You can't use it opportunistically
+
+29:12.915 --> 29:14.603
+to run a quick demo
+
+29:14.603 --> 29:18.901
+with which to impress your peers
+
+29:18.901 --> 29:22.940
+and win some inane "nerd cred".
+
+29:22.940 --> 29:24.907
+Forget about such frivolous
+
+29:24.907 --> 29:26.170
+superficialities.
+
+29:26.170 --> 29:29.000
+Emacs is a sophisticated tool
+
+29:29.000 --> 29:32.600
+intended for some serious work.
+
+29:32.600 --> 29:35.436
+It has been around for several decades
+
+29:35.436 --> 29:38.116
+and it incorporates the knowledge
+
+29:38.116 --> 29:41.639
+of a diverse group of contributors.
+
+29:41.639 --> 29:43.616
+Even if you want to use Emacs
+
+29:43.616 --> 29:46.766
+just for Org mode or whatever killer app,
+
+29:46.766 --> 29:48.605
+you still have to try
+
+29:48.605 --> 29:51.059
+to learn things in earnest.
+
+29:51.059 --> 29:52.140
+You still need to read
+
+29:52.140 --> 29:54.196
+the relevant Info manual,
+
+29:54.196 --> 29:56.663
+understand how to make changes
+
+29:56.663 --> 30:00.006
+to the plethora of user options on offer,
+
+30:00.006 --> 30:03.117
+and generally don't feel lost
+
+30:03.117 --> 30:05.710
+while working with Emacs.
+
+30:05.710 --> 30:08.264
+This is more so if you use Emacs
+
+30:08.264 --> 30:09.967
+to its full potential
+
+30:09.967 --> 30:13.297
+as an integrated computing environment;
+
+30:13.297 --> 30:16.127
+as your general purpose interface
+
+30:16.127 --> 30:17.460
+to the computer,
+
+30:17.460 --> 30:19.633
+where you handle uniformly
+
+30:19.633 --> 30:21.726
+coding and writing prose,
+
+30:21.726 --> 30:23.820
+your email correspondence,
+
+30:23.820 --> 30:25.022
+your RSS feeds,
+
+30:25.022 --> 30:26.908
+your music collection,
+
+30:26.908 --> 30:30.626
+your agenda and to-do lists,
+
+30:30.626 --> 30:31.909
+and so on.
+
+30:31.909 --> 30:33.872
+The difficulty of Emacs
+
+30:33.872 --> 30:37.144
+is much higher for those who approach it
+
+30:37.144 --> 30:38.667
+without understanding
+
+30:38.667 --> 30:41.299
+what they are getting themselves into,
+
+30:41.299 --> 30:43.711
+or for those who are naive enough
+
+30:43.711 --> 30:47.294
+to believe that they can cheat their way
+
+30:47.294 --> 30:50.340
+out of learning the fundamentals.
+
+30:50.340 --> 30:51.574
+The gist is that
+
+30:51.574 --> 30:54.940
+you cannot be an Emacs tourist.
+
+30:54.940 --> 30:57.165
+You can't go into Emacsland
+
+30:57.165 --> 30:59.469
+thinking that you will spend
+
+30:59.469 --> 31:02.475
+a couple of memorable days there
+
+31:02.475 --> 31:04.206
+and head back home
+
+31:04.206 --> 31:05.755
+to regale others
+
+31:05.755 --> 31:08.580
+with stories about your adventures.
+
+31:08.580 --> 31:11.850
+It does not work that way.
+
+31:11.850 --> 31:15.250
+You commit to Emacs for the long-term,
+
+31:15.250 --> 31:17.990
+for the freedom it offers you.
+
+31:17.990 --> 31:20.142
+Freedom in the moral sense
+
+31:20.142 --> 31:23.123
+but also in the very practical ways
+
+31:23.123 --> 31:25.851
+in which you can mould and extend
+
+31:25.851 --> 31:27.907
+your personal workflows
+
+31:27.907 --> 31:31.160
+with precision.
+
+31:31.160 --> 31:32.773
+Now you may wonder
+
+31:32.773 --> 31:35.320
+why do I mention those things?
+
+31:35.320 --> 31:39.169
+Shouldn't we make Emacs easier for everyone?
+
+31:39.169 --> 31:42.333
+Yes, we should make everything
+
+31:42.333 --> 31:44.760
+as simple as possible.
+
+31:44.760 --> 31:48.031
+Though that still does not refashion Emacs
+
+31:48.031 --> 31:51.460
+into something entirely different.
+
+31:51.460 --> 31:52.740
+We continue to have
+
+31:52.740 --> 31:55.829
+a potent tool at our disposal
+
+31:55.829 --> 31:57.040
+that we must treat
+
+31:57.040 --> 32:00.020
+with the requisite respect.
+
+32:00.020 --> 32:03.954
+Take, for instance, the various frameworks
+
+32:03.954 --> 32:07.571
+that set up Emacs in an opinionated way
+
+32:07.571 --> 32:10.465
+so that newcomers get everything
+
+32:10.465 --> 32:13.360
+set up for them out-of-the-box.
+
+32:13.360 --> 32:14.507
+There is nothing wrong
+
+32:14.507 --> 32:16.220
+with those frameworks.
+
+32:16.220 --> 32:19.417
+In fact, a large part of the community
+
+32:19.417 --> 32:21.690
+uses them to great effect.
+
+32:21.690 --> 32:24.105
+However, the point stands:
+
+32:24.105 --> 32:26.342
+even after every package
+
+32:26.342 --> 32:28.490
+has been set up for you,
+
+32:28.490 --> 32:30.174
+you still have to put in the work
+
+32:30.174 --> 32:31.507
+in making use
+
+32:31.507 --> 32:35.360
+of your newfound computing freedom.
+
+32:35.360 --> 32:37.648
+But, you may insist,
+
+32:37.648 --> 32:41.789
+is that not some sort of gate-keeping?
+
+32:41.789 --> 32:43.750
+Are you not being an elitist
+
+32:43.750 --> 32:45.972
+by telling people how they must
+
+32:45.972 --> 32:48.009
+invest time and effort
+
+32:48.009 --> 32:49.804
+in making the best
+
+32:49.804 --> 32:52.639
+out of their Emacs experience?
+
+32:52.639 --> 32:56.830
+No, I think this is not elitism.
+
+32:56.830 --> 32:59.358
+There are no secrets here,
+
+32:59.358 --> 33:02.530
+no artificial barriers to entry,
+
+33:02.530 --> 33:06.562
+no impediments to making progress,
+
+33:06.562 --> 33:09.409
+no tricks and gimmicks.
+
+33:09.409 --> 33:13.460
+It just is a statement of fact.
+
+33:13.460 --> 33:16.309
+Freedom entails responsibility.
+
+33:16.309 --> 33:20.481
+It requires people to take the initiative
+
+33:20.481 --> 33:23.728
+and assert control over the factors
+
+33:23.728 --> 33:26.420
+that are within their reach.
+
+33:26.420 --> 33:29.267
+Freedom ultimately means
+
+33:29.267 --> 33:33.254
+that we no longer remain dependent
+
+33:33.254 --> 33:35.419
+on being spoon-fed.
+
+33:35.419 --> 00:33:39.173
+We assume agency.
+
+33:39.174 --> 33:41.540
+And with this, I want to come to
+
+33:41.540 --> 33:44.940
+the final section of this presentation.
+
+33:44.940 --> 33:46.407
+The title is:
+
+33:46.407 --> 33:52.250
+"Emacs as a champion of software freedom."
+
+33:52.250 --> 33:56.272
+To my mind, Emacs is the embodiment
+
+33:56.272 --> 33:59.289
+of the GNU project's ethos.
+
+33:59.289 --> 34:01.245
+Everything you expect from a program
+
+34:01.245 --> 34:02.990
+that is underpinned by the values
+
+34:02.990 --> 34:05.342
+of software freedom
+
+34:05.342 --> 34:07.460
+is found in Emacs.
+
+34:07.460 --> 34:10.962
+What you get is not merely an ethical tool,
+
+34:10.962 --> 34:13.032
+important though that is,
+
+34:13.032 --> 34:17.405
+but also a gift that will keep on giving;
+
+34:17.405 --> 34:20.840
+a gift for you to further empower yourself
+
+34:20.840 --> 34:24.020
+as a computer user.
+
+34:24.020 --> 34:27.457
+I understood that freedom of software
+
+34:27.457 --> 34:31.600
+is not about liberating the code itself.
+
+34:31.600 --> 34:34.950
+It is about sharing libre code
+
+34:34.950 --> 34:38.410
+in order to emancipate the user.
+
+34:38.410 --> 34:40.899
+The best way to achieve that
+
+34:40.899 --> 34:43.302
+is by emulating Prometheas:
+
+34:43.302 --> 34:47.187
+don't just give people the so-called "fire";
+
+34:47.187 --> 34:50.907
+offer them the underlying know-how.
+
+34:50.907 --> 34:52.940
+Emacs taught me
+
+34:52.940 --> 34:54.378
+the virtues of software freedom
+
+34:54.378 --> 34:57.362
+in a way that nothing else
+
+34:57.362 --> 35:01.150
+in the GNU/Linux space ever did.
+
+35:01.150 --> 35:04.210
+Here's an example from a few years ago.
+
+35:04.210 --> 35:07.050
+I needed a Markdown editor.
+
+35:07.050 --> 35:09.099
+I wanted it to centre
+
+35:09.099 --> 35:12.080
+the body of the text on display.
+
+35:12.080 --> 35:15.384
+It should have configurable font families
+
+35:15.384 --> 35:17.030
+and point sizes.
+
+35:17.030 --> 35:19.646
+Spell checking for Greek and English
+
+35:19.646 --> 35:20.990
+should be included.
+
+35:20.990 --> 35:25.007
+The colours had to be editable as well,
+
+35:25.007 --> 35:26.940
+so I could adjust them
+
+35:26.940 --> 35:30.064
+to a level of legibility
+
+35:30.064 --> 35:32.760
+I was comfortable with.
+
+35:32.760 --> 35:35.657
+While there were plenty of libre programs,
+
+35:35.657 --> 35:37.174
+I did not find one
+
+35:37.174 --> 35:39.905
+I could control and inspect
+
+35:39.905 --> 35:43.190
+to the extent I can with Emacs.
+
+35:43.190 --> 35:46.982
+Which made me feel that I had stagnated:
+
+35:46.982 --> 35:49.572
+there was an indelible line
+
+35:49.572 --> 35:53.500
+dividing users from developers.
+
+35:53.500 --> 35:55.899
+Whereas Emacs invites you
+
+35:55.899 --> 35:58.106
+to blur the distinction
+
+35:58.106 --> 36:00.590
+between user and the developer.
+
+36:00.590 --> 36:03.837
+It furnishes the means to become
+
+36:03.837 --> 36:05.510
+proficient in it,
+
+36:05.510 --> 36:07.717
+while the community complements those
+
+36:07.717 --> 36:10.744
+with its documentation culture
+
+36:10.744 --> 36:12.990
+and overall creativity.
+
+36:12.990 --> 36:15.679
+You start off as a complete ignoramus,
+
+36:15.679 --> 36:19.190
+but soon pick up skills that remain useful
+
+36:19.190 --> 36:22.200
+for as long as you work with Emacs.
+
+36:22.200 --> 36:23.574
+And if you really want to
+
+36:23.574 --> 36:25.150
+take it a step further,
+
+36:25.150 --> 36:27.569
+you know where to look
+
+36:27.569 --> 36:30.620
+for inspiration and guidance.
+
+36:30.620 --> 36:32.722
+Before you realise it,
+
+36:32.722 --> 36:35.556
+you start writing code in ELisp
+
+36:35.556 --> 36:39.030
+and can one day share it with others.
+
+36:39.030 --> 36:42.060
+What I have learnt over the past 2.5 years
+
+36:42.060 --> 36:43.331
+as an Emacs user
+
+36:43.331 --> 36:45.661
+is that if you go from scratch
+
+36:45.661 --> 36:48.442
+and are meticulous in your approach,
+
+36:48.442 --> 36:51.379
+you will need a few days or weeks
+
+36:51.379 --> 36:54.750
+before everything starts to make sense.
+
+36:54.750 --> 36:57.477
+After that initial awkward phase
+
+36:57.477 --> 37:00.428
+during which you familiarise yourself
+
+37:00.428 --> 37:01.748
+with the basics,
+
+37:01.748 --> 37:06.050
+everything else will become easier to learn.
+
+37:06.050 --> 37:09.524
+It is a matter of gaining more experience,
+
+37:09.524 --> 37:11.060
+one step at a time.
+
+37:11.060 --> 37:13.537
+As with every field of expertise,
+
+37:13.537 --> 37:15.870
+Emacs expects you to work for it
+
+37:15.870 --> 37:19.110
+and to earn it.
+
+37:19.110 --> 37:21.240
+For me, that is worth it.
+
+37:21.240 --> 37:23.655
+In terms of being malleable
+
+37:23.655 --> 37:25.294
+in a consistent way
+
+37:25.294 --> 37:28.388
+and transparent in what it does,
+
+37:28.388 --> 37:31.390
+Emacs is in a league of its own.
+
+37:31.390 --> 37:33.707
+In conclusion, folks,
+
+37:33.707 --> 37:36.898
+Emacs allowed me to assert control
+
+37:36.898 --> 37:39.260
+over a great portion
+
+37:39.260 --> 37:42.780
+of my quotidian computing.
+
+37:42.780 --> 37:44.827
+It helped me grow out of
+
+37:44.827 --> 37:47.448
+the state of ignorance I was in;
+
+37:47.448 --> 37:49.811
+a state that rendered me
+
+37:49.811 --> 37:52.528
+powerless to use the computer
+
+37:52.528 --> 37:54.430
+exactly how I wanted.
+
+37:54.430 --> 37:57.910
+For that I am grateful.
+
+37:57.910 --> 38:00.071
+I now consider it my duty
+
+38:00.071 --> 38:02.025
+to contribute back to
+
+38:02.025 --> 38:04.007
+this wonderful project
+
+38:04.007 --> 38:06.390
+and this awesome community.
+
+38:06.390 --> 38:09.174
+So thank you very much for your attention
+
+38:09.174 --> 38:12.690
+in watching today's presentation.
+
+38:12.690 --> 38:13.874
+Special thanks to
+
+38:13.874 --> 38:18.207
+the EmacsConf organizers and volunteers.
+
+38:18.207 --> 38:20.574
+This is all from my side, folks.
+
+38:20.574 --> 38:23.910
+Thank you very much. Goodbye.
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--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--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--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-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-frownies--the-true-frownies-are-the-friends-we-made-along-the-way-an-anecdote-of-emacs-s-malleability--case-duckworth--main.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.vtt
new file mode 100644
index 00000000..41e5e248
--- /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.vtt
@@ -0,0 +1,1552 @@
+WEBVTT
+
+00:00.000 --> 00:02.770
+Hi everyone! My name is Case Duckworth
+
+00:02.770 --> 00:04.070
+and I've been using Emacs
+
+00:04.070 --> 00:05.536
+for about a year and a half.
+
+00:05.536 --> 00:06.736
+If you do the math,
+
+00:06.736 --> 00:08.403
+you'll see that was pretty soon
+
+00:08.403 --> 00:11.470
+after the pandemic hit us in the U.S.
+
+00:11.470 --> 00:13.970
+While I was busy making bread
+
+00:13.970 --> 00:14.970
+and walking my dogs,
+
+00:14.970 --> 00:17.936
+trying not to drive myself crazy
+
+00:17.936 --> 00:18.970
+in the house,
+
+00:18.970 --> 00:20.603
+I tried Emacs again.
+
+00:20.603 --> 00:23.270
+I don't know if I was successful in that,
+
+00:23.270 --> 00:26.936
+going crazy... I mean, I still use Emacs.
+
+00:26.936 --> 00:30.436
+But I have been able to enjoy
+
+00:30.436 --> 00:31.670
+the infinitely-malleable,
+
+00:31.670 --> 00:32.870
+immensely enjoyable,
+
+00:32.870 --> 00:34.936
+and sublimely parenthetical world
+
+00:34.936 --> 00:36.470
+of Emacs the editor,
+
+00:36.470 --> 00:37.570
+the community,
+
+00:37.570 --> 00:39.470
+and of course, the Lisp language.
+
+00:39.470 --> 00:42.270
+So. And in this I'm going to
+
+00:42.270 --> 00:46.103
+explore just a little anecdote of that,
+
+00:46.103 --> 00:48.536
+a little nugget of what I think
+
+00:48.536 --> 00:50.870
+makes Emacs so great,
+
+00:50.870 --> 00:53.703
+using the lens of a package that I wrote
+
+00:53.703 --> 00:57.370
+about a month ago now
+
+00:57.370 --> 00:59.536
+called frowny.el.
+
+00:59.536 --> 00:01:01.569
+So yeah, let's go ahead and jump in.
+
+01:01.570 --> 01:08.236
+So, before the beginning,
+
+01:08.236 --> 01:09.036
+I want to talk about
+
+01:09.036 --> 01:10.770
+my very beginning with Linux.
+
+01:10.770 --> 01:12.136
+I first installed Linux
+
+01:12.136 --> 01:13.170
+for the first time
+
+01:13.170 --> 01:15.703
+as a freshman in college, way back in 2008.
+
+01:15.703 --> 01:17.703
+I don't know if you were around,
+
+01:17.703 --> 01:19.503
+but 2008 was not
+
+01:19.503 --> 01:21.570
+the year of the Linux desktop.
+
+01:21.570 --> 01:26.803
+WiFi was weird. Sound was weird.
+
+01:26.803 --> 01:30.136
+Everything was odd and strange and weird.
+
+01:30.136 --> 01:31.670
+I mean, it wasn't good.
+
+01:31.670 --> 01:33.603
+So, at that time,
+
+01:33.603 --> 01:36.203
+I knew absolutely nothing about anything.
+
+01:36.203 --> 01:41.203
+I installed this terrible
+
+01:41.203 --> 01:43.470
+distro called gOS.
+
+01:43.470 --> 01:44.803
+I always forget what it's called
+
+01:44.803 --> 01:45.703
+and then I looked it up.
+
+01:45.703 --> 01:47.636
+And this is what I looked at
+
+01:47.636 --> 01:49.836
+when I signed in.
+
+01:49.836 --> 01:51.903
+It wasn't good.
+
+01:51.903 --> 01:53.203
+I think it was trying to
+
+01:53.203 --> 01:57.003
+integrate better with Google tools?
+
+01:57.003 --> 01:58.870
+So I was, like, oh, yeah, you know,
+
+01:58.870 --> 02:00.870
+Gmail and Google Calendar,
+
+02:00.870 --> 02:02.436
+so this will have it all there.
+
+02:02.436 --> 02:04.536
+Anyway, the company's defunct now
+
+02:04.536 --> 02:07.003
+and it's pretty obvious why.
+
+02:07.003 --> 00:02:07.635
+It was really bad.
+
+02:07.636 --> 02:08.903
+So I thought to myself,
+
+02:08.903 --> 02:11.670
+I'll delete the partition.
+
+02:11.670 --> 02:12.903
+Easy peasy. So I did,
+
+02:12.903 --> 02:13.770
+and I rebooted,
+
+02:13.770 --> 02:15.336
+and the Master Boot Record was gone,
+
+02:15.336 --> 02:16.370
+so I couldn't boot Windows,
+
+02:16.370 --> 02:17.936
+and it was all, bleah, and I was like,
+
+02:17.936 --> 02:22.103
+oh, shit, I have to do my schoolwork.
+
+02:24.536 --> 02:26.203
+So I thought I was terribly hosed
+
+02:26.203 --> 02:28.870
+so I just installed Linux.
+
+02:28.870 --> 02:31.970
+I think I installed Crunchbang Linux first.
+
+02:31.970 --> 02:33.270
+It looked like this.
+
+02:33.270 --> 02:35.203
+It's not super exciting.
+
+02:35.203 --> 02:41.303
+It was an Openbox-based, Debian-based distro
+
+02:41.303 --> 02:43.403
+run by this one guy out in England.
+
+02:43.403 --> 02:46.570
+It was great. I really enjoyed it.
+
+02:46.570 --> 02:47.970
+The forums were amazing.
+
+02:47.970 --> 02:50.603
+It still kind of lives on
+
+02:50.603 --> 02:53.003
+through a project called BunsenLabs
+
+02:53.003 --> 02:54.936
+so go check them out if you want.
+
+02:54.936 --> 00:02:56.169
+It was a good time. Anyway.
+
+02:56.170 --> 02:58.803
+I was using that for a long time,
+
+02:58.803 --> 03:00.436
+and, you know, probably familiar
+
+03:00.436 --> 03:01.670
+to many of you,
+
+03:01.670 --> 03:02.903
+I hopped around
+
+03:02.903 --> 03:03.836
+from distro to distro,
+
+03:03.836 --> 03:08.970
+from WM to DE, just on and on and on,
+
+03:08.970 --> 03:10.270
+trying different things.
+
+03:10.270 --> 03:12.003
+I'm not a programmer.
+
+03:12.003 --> 03:12.736
+I actually went to school
+
+03:12.736 --> 03:15.136
+for English writing,
+
+03:15.136 --> 03:17.536
+and so I learned programming
+
+03:17.536 --> 03:19.636
+mostly from configuring
+
+03:19.636 --> 03:20.836
+different window managers.
+
+03:20.836 --> 03:23.803
+I learned Lua with AwesomeWM.
+
+03:23.803 --> 03:25.836
+I learned Haskell with Xmonad.
+
+03:25.836 --> 03:28.070
+Sort of Haskell. I mean, I liked Haskell.
+
+03:28.070 --> 03:30.770
+I like Haskell a lot,
+
+03:30.770 --> 03:32.536
+at least the syntax.
+
+03:32.536 --> 03:36.070
+It looks like words.
+
+03:36.070 --> 03:40.103
+You can define functions multiple times
+
+03:40.103 --> 03:41.670
+for different inputs.
+
+03:41.670 --> 03:42.703
+It has that really great pattern matching.
+
+03:42.703 --> 03:45.270
+The thing I really didn't get was monads.
+
+03:45.270 --> 03:46.570
+What is a monad?
+
+03:46.570 --> 03:48.103
+Is it a burrito? Is it a box?
+
+03:48.103 --> 03:49.770
+Is it a burrito inside of a box?
+
+03:49.770 --> 03:51.370
+Is it a box inside of a burrito?
+
+03:51.370 --> 03:53.203
+Is there a cat involved,
+
+03:53.203 --> 03:55.336
+or a superposition of such?
+
+03:55.336 --> 03:58.936
+I don't know. Anyway, it got confusing.
+
+03:58.936 --> 04:01.436
+That's really where I lost me.
+
+04:01.436 --> 04:05.170
+Again, you know, if you like Haskell,
+
+04:05.170 --> 04:05.970
+if you write Haskell,
+
+04:05.970 --> 04:08.136
+more power to you.
+
+04:08.136 --> 04:11.370
+It didn't fit my brain right.
+
+04:11.370 --> 04:14.403
+So that was that,
+
+04:14.403 --> 04:15.436
+but it kinda ruined me
+
+04:15.436 --> 04:17.003
+for a lot of other programming languages,
+
+04:17.003 --> 04:19.970
+because the functional style
+
+04:19.970 --> 04:22.403
+I really get. That part I did get.
+
+04:22.403 --> 04:25.703
+And stuff like Python, really,
+
+04:25.703 --> 04:27.070
+object orientation...
+
+04:27.070 --> 04:32.570
+I would always get way too into classes
+
+04:32.570 --> 04:34.703
+and figuring out this and that.
+
+04:34.703 --> 04:35.870
+It just didn't work for me.
+
+04:35.870 --> 04:37.870
+I was kind of floating.
+
+04:37.870 --> 04:41.503
+Learned Bash, which is, you know, Bash.
+
+04:41.503 --> 04:43.603
+It's fine, but it's Bash.
+
+04:43.603 --> 04:46.703
+It wasn't great either.
+
+04:46.703 --> 04:51.470
+Anyway. That was six years or so,
+
+04:51.470 --> 00:04:52.935
+just kind of did that, right.
+
+04:52.936 --> 04:55.870
+And yes, I was using Vim.
+
+04:55.870 --> 04:58.370
+I mean... Keeps you clean, right?
+
+04:58.370 --> 04:59.636
+I'm just kidding.
+
+04:59.636 --> 05:02.536
+I was using Vim, the editor.
+
+05:02.536 --> 05:03.470
+It was fine.
+
+05:03.470 --> 05:05.936
+It was great. I mean...
+
+05:05.936 --> 05:08.203
+Emacs and Vim, they go head to head
+
+05:08.203 --> 05:10.536
+because they're both 40 years old.
+
+05:10.536 --> 05:13.270
+They both are super powerful.
+
+05:13.270 --> 05:15.336
+They both have their own paradigms.
+
+05:15.336 --> 05:16.836
+If you get into it, then it's like
+
+05:16.836 --> 05:19.236
+powpowpow, you're doing all this stuff
+
+05:19.236 --> 05:20.503
+it's great.
+
+05:20.503 --> 05:22.036
+I wrote some plugins with Vim,
+
+05:22.036 --> 05:25.536
+a couple of themes, this and that,
+
+05:25.536 --> 05:28.636
+but you know, VimScript is not great.
+
+05:28.636 --> 05:31.803
+I think one of the common
+
+05:31.803 --> 05:34.936
+criticisms of Elisp
+
+05:34.936 --> 05:37.170
+it's like, oh, it's this weird kind of...
+
+05:37.170 --> 05:38.536
+It's written for (inaudible)...
+
+05:38.536 --> 05:43.336
+Tell you, it's way less than
+
+05:43.336 --> 05:44.470
+VimScript is. Oof.
+
+05:44.470 --> 05:49.670
+Anyway. That, also, really terminal-first,
+
+05:49.670 --> 05:52.570
+which I used for a long time and then
+
+05:52.570 --> 05:54.436
+I only think I started noticing
+
+05:54.436 --> 05:56.236
+now that I'm using Emacs more,
+
+05:56.236 --> 05:57.803
+like, that terminal-first workflow,
+
+05:57.803 --> 06:01.136
+again, for my brain,
+
+06:01.136 --> 06:02.803
+it doesn't super work for me.
+
+06:02.803 --> 06:06.636
+I always had this Platonic ideal
+
+06:06.636 --> 06:08.470
+of what a workflow should look like,
+
+06:08.470 --> 06:10.836
+and I was always working towards it.
+
+06:10.836 --> 06:12.803
+I would run into this problem
+
+06:12.803 --> 06:14.003
+and I wouldn't know how to solve it.
+
+06:14.003 --> 06:15.736
+so I kind of quit. Do something else.
+
+06:15.736 --> 06:17.003
+I think that's part of why
+
+06:17.003 --> 06:17.836
+I had so much churn
+
+06:17.836 --> 06:18.670
+for such a long time.
+
+06:18.670 --> 06:20.336
+Because at the end of the day,
+
+06:20.336 --> 06:23.936
+window managing, you're just
+
+06:23.936 --> 06:26.567
+moving around little boxes on your screen.
+
+06:26.567 --> 06:30.536
+So I was spinning wheels
+
+06:30.536 --> 06:31.203
+for a long time.
+
+06:31.203 --> 06:36.203
+But yes. And it wasn't like
+
+06:36.203 --> 06:36.803
+it was all bad.
+
+06:36.803 --> 06:38.036
+Most of this stuff
+
+06:38.036 --> 06:39.603
+just came out now that
+
+06:39.603 --> 06:40.236
+I'm thinking about it,
+
+06:40.236 --> 06:42.970
+now that I'm kind of going through this
+
+06:42.970 --> 06:45.736
+in my head, like, that part of it wasn't great.
+
+06:45.736 --> 06:46.703
+I was having a good time.
+
+06:46.703 --> 06:48.670
+I was still... Open source,
+
+06:48.670 --> 06:49.936
+I was getting in the community.
+
+06:49.936 --> 06:50.603
+I was doing all this stuff.
+
+06:50.603 --> 00:06:51.802
+It was all great.
+
+06:51.803 --> 06:56.336
+But anyway, the pandemic hit, obviously,
+
+06:56.336 --> 06:58.736
+really hard, last spring, in the US.
+
+06:58.736 --> 07:00.870
+And here we are,
+
+07:00.870 --> 07:03.070
+talking about the pandemic in 2021.
+
+07:03.070 --> 07:04.370
+Can you imagine?
+
+07:04.370 --> 07:05.836
+So, I didn't lose my job.
+
+07:05.836 --> 07:06.903
+Thank goodness.
+
+07:06.903 --> 07:09.236
+But I did... I work for the government,
+
+07:09.236 --> 07:10.236
+I was sent home for two months.
+
+07:10.236 --> 07:11.803
+I had all this free time on my hands.
+
+07:11.803 --> 07:13.903
+I got into baking,
+
+07:13.903 --> 07:16.236
+I bought a 50-pound bag of flour.
+
+07:16.236 --> 07:18.470
+I started a bread-themed tilde server,
+
+07:18.470 --> 07:20.436
+you know, those shared Unix servers
+
+07:20.436 --> 07:21.803
+all the cool kids talk about?
+
+07:21.803 --> 07:26.970
+Yeah, it's breadpunk.club, go check it out!
+
+07:26.970 --> 00:07:29.769
+Join if you want. Anyway. Yeah.
+
+07:29.770 --> 07:32.703
+So I decided to try Emacs again.
+
+07:32.703 --> 07:33.803
+Kind of on a whim, I think.
+
+07:33.803 --> 07:36.170
+I don't super remember, but I think I did.
+
+07:36.170 --> 07:42.103
+I tried Spacemacs. It didn't stick.
+
+07:42.103 --> 07:44.036
+Spacemacs was trying to be Vim,
+
+07:44.036 --> 07:46.403
+but enough things didn't fit in
+
+07:46.403 --> 07:48.636
+with what I was expecting
+
+07:48.636 --> 07:50.603
+with my Vim workflow.
+
+07:50.603 --> 07:53.836
+All sorts of plugins that did certain things
+
+07:53.836 --> 07:57.270
+and I didn't know to just get into Spacemacs.
+
+07:57.270 --> 08:01.070
+It just didn't work for me.
+
+08:01.070 --> 08:05.436
+I tried Emacs. This time, it stuck.
+
+08:05.436 --> 08:07.370
+I started out just vanilla,
+
+08:07.370 --> 08:09.470
+basic no init.el,
+
+08:09.470 --> 08:11.103
+then I wrote an init.el,
+
+08:11.103 --> 08:12.636
+and then I rewrote my init.el,
+
+08:12.636 --> 08:16.570
+and then I took my init.el, crumpled it up,
+
+08:16.570 --> 08:17.736
+threw it in the trash can,
+
+08:17.736 --> 08:19.603
+wrote it again from scratch.
+
+08:19.603 --> 08:21.203
+I'm actually currently
+
+08:21.203 --> 08:23.036
+in the middle of Bankruptcy #8,
+
+08:23.036 --> 08:25.136
+which I think I really got this time.
+
+08:25.136 --> 08:29.036
+It's either that or Number 9.
+
+08:29.036 --> 08:32.936
+So I have 1700-ish commits.
+
+08:32.936 --> 08:37.536
+I also have like, 3 or 4 .emacs repositories
+
+08:37.536 --> 08:41.500
+around my various Git hosting platforms
+
+08:41.500 --> 08:42.270
+that I use.
+
+08:42.270 --> 08:44.103
+I was on GitHub, GitLab, ~/git...
+
+08:44.103 --> 08:47.403
+I don't use Git very well.
+
+08:47.403 --> 00:08:50.002
+I'm very much amateur in that entire thing.
+
+08:50.003 --> 08:52.970
+Anyway, that is all to say
+
+08:52.970 --> 08:55.170
+I got into it, right.
+
+08:55.170 --> 08:57.470
+Like, really into it.
+
+08:57.470 --> 08:59.000
+I was watching
+
+08:59.000 --> 09:02.136
+Emacs Conference videos. Live.
+
+09:02.136 --> 09:06.003
+I was reading /r/emacs.
+
+09:06.003 --> 09:07.036
+I was reading Planet Emacs.
+
+09:07.036 --> 09:09.036
+I subscribed to both.
+
+09:09.036 --> 09:11.603
+I have other blogs that I read.
+
+09:11.603 --> 09:13.570
+All the greats.
+
+09:13.570 --> 09:16.203
+Everyone who's presenting here, probably.
+
+09:16.203 --> 09:18.836
+I started watching people on YouTube
+
+09:18.836 --> 09:20.803
+like Prot, like David Wilson
+
+09:20.803 --> 09:23.003
+who does System Crafters.
+
+09:23.003 --> 09:25.336
+I was already on IRC
+
+09:25.336 --> 09:26.836
+with the tildeverse,
+
+09:26.836 --> 09:29.670
+and so I hopped over to #emacs on Freenode
+
+09:29.670 --> 09:30.936
+(remember Freenode?).
+
+09:30.936 --> 09:34.403
+Anyway, it was a good time.
+
+09:34.403 --> 09:36.003
+So I was doing all this stuff.
+
+09:36.003 --> 00:09:38.235
+And... oh yeah. Right.
+
+09:38.236 --> 09:40.636
+Anyway, so that's all to say...
+
+09:40.636 --> 09:46.736
+Frowns. I was on #systemcrafters channel
+
+09:46.736 --> 09:47.970
+on libera.chat,
+
+09:47.970 --> 09:51.203
+the channel for the YouTube channel
+
+09:51.203 --> 09:53.403
+System Crafters by David Wilson.
+
+09:53.403 --> 09:55.436
+I think he's on later.
+
+09:55.436 --> 09:57.070
+I'm sure he'll talk about it.
+
+09:57.070 --> 09:58.370
+I don't know what he's talking about.
+
+09:58.370 --> 10:01.270
+Anyway, one day we were chatting
+
+10:01.270 --> 10:02.770
+and this guy alphapapa, who also
+
+10:02.770 --> 10:08.236
+has written a lot of these packages, said
+
+10:08.236 --> 10:09.370
+"electric-pair-mode messes up
+
+10:09.370 --> 10:10.733
+my frowny faces sometimes."
+
+10:10.733 --> 10:14.036
+You can see here
+
+10:14.036 --> 10:15.170
+this frowny, what is this...
+
+10:15.170 --> 10:23.136
+You can see it there on the screen.
+
+10:23.136 --> 10:24.303
+What is that, right?
+
+10:24.303 --> 10:27.070
+It's terrifying.
+
+10:27.070 --> 10:28.203
+What is this?
+
+10:28.203 --> 10:30.970
+What is that?
+
+10:30.970 --> 10:31.803
+I don't know.
+
+10:31.803 --> 00:10:32.735
+I don't know what that is.
+
+10:32.736 --> 10:34.736
+And then I said, you know,
+
+10:34.736 --> 10:35.567
+"I have a hook
+
+10:35.567 --> 10:36.536
+that disables electric-pair-mode
+
+10:36.536 --> 10:37.970
+for chat buffers."
+
+10:37.970 --> 10:39.136
+Which, actually, fun fact,
+
+10:39.136 --> 10:40.167
+I was lying.
+
+10:40.167 --> 10:41.836
+Not that that matters.
+
+10:41.836 --> 10:43.370
+I have a hook.
+
+10:43.370 --> 10:44.436
+You could have a hook
+
+10:44.436 --> 10:46.203
+that just disables electric-pair-mode
+
+10:46.203 --> 10:46.800
+in chat buffers.
+
+10:46.800 --> 10:47.803
+To which he replied,
+
+10:47.803 --> 10:50.667
+"Yeah, but I want electric-pair-mode
+
+10:50.667 --> 10:51.900
+everywhere, except for
+
+10:51.900 --> 10:53.670
+when I type a frowny face."
+
+10:53.670 --> 10:56.503
+And this sandwich face. What is that?
+
+10:56.503 --> 10:59.870
+He said, "I could stop typing frowny faces."
+
+10:59.870 --> 11:01.270
+And then I said, "Hmm..."
+
+11:01.270 --> 11:02.533
+And then I said, "I feel like
+
+11:02.533 --> 11:03.200
+you're in the best position
+
+11:03.200 --> 11:05.336
+to write a package, like frowny.el,"
+
+11:05.336 --> 11:07.270
+I said as a joke.
+
+11:07.270 --> 11:10.636
+And then conversation went on,
+
+11:10.636 --> 11:12.636
+we talked about... made some jokes
+
+11:12.636 --> 00:11:14.669
+about Lisp and all that stuff.
+
+11:14.670 --> 11:18.370
+So anyway, went on, went on,
+
+11:18.370 --> 11:20.503
+and then apparently,
+
+11:20.503 --> 11:21.703
+23 minutes later,
+
+11:21.703 --> 11:24.603
+I had a frowny.el package
+
+11:24.603 --> 11:26.770
+just wrote up real quick.
+
+11:26.770 --> 11:30.903
+And yeah. That was it.
+
+11:30.903 --> 11:31.803
+I said, you know, buddy,
+
+11:31.803 --> 00:11:33.069
+anyway...
+
+11:33.070 --> 11:34.270
+So now we're going to look at
+
+11:34.270 --> 11:35.803
+the package that I wrote.
+
+11:35.803 --> 11:36.970
+frowny.el.
+
+11:36.970 --> 11:40.070
+It was actually pretty easy.
+
+11:40.070 --> 11:41.936
+Let's see here.
+
+11:41.936 --> 11:44.170
+This is it now.
+
+11:44.170 --> 11:50.203
+I kind of want to go back into...
+
+11:50.203 --> 11:53.236
+Let's go back to the very beginning.
+
+11:53.236 --> 11:56.536
+We'll see what we have here.
+
+11:56.536 --> 11:57.303
+Here's our very first,
+
+11:57.303 --> 11:59.370
+my very first commit.
+
+11:59.370 --> 12:03.370
+I already had all of this crap.
+
+12:03.370 --> 12:05.736
+Oh, I already did have a...
+
+12:05.736 --> 12:08.336
+I had a defgroup, I had frowny-eyes...
+
+12:08.336 --> 12:11.236
+This is basically the way I thought it was.
+
+12:11.236 --> 12:14.736
+You want to insert a frowny face.
+
+12:14.736 --> 12:16.670
+You type in the colon,
+
+12:16.670 --> 12:18.670
+or the equal sign, or whatever.
+
+12:18.670 --> 12:19.836
+for the eyes,
+
+12:19.836 --> 12:21.436
+and then you type the open parenthesis
+
+12:21.436 --> 12:22.836
+for the frown.
+
+12:22.836 --> 12:25.703
+And the problem is that
+
+12:25.703 --> 12:27.870
+the parenthesis then triggers
+
+12:27.870 --> 12:29.170
+electric-pair-mode.
+
+12:29.170 --> 12:30.303
+It's like, oh, no, I got
+
+12:30.303 --> 12:32.503
+a close parenthesis.
+
+12:32.503 --> 12:33.836
+So we just short-circuit that
+
+12:33.836 --> 12:36.270
+whenever there's a thing,
+
+12:36.270 --> 12:38.636
+a colon or equals sign before,
+
+12:38.636 --> 12:40.136
+and just insert the thing.
+
+12:40.136 --> 12:41.736
+Where did it go?
+
+12:41.736 --> 12:43.303
+That's kind of what I did.
+
+12:43.303 --> 12:45.370
+So I wrote out... This is it.
+
+12:45.370 --> 12:46.603
+This is the whole package.
+
+12:46.603 --> 12:49.803
+It's one function, one minor mode,
+
+12:49.803 --> 12:52.536
+one defcustom, and one group. That's it.
+
+12:52.536 --> 12:54.303
+Super simple.
+
+12:54.303 --> 12:56.970
+Basically, all it does is
+
+12:56.970 --> 12:59.803
+it inserts a frowny
+
+12:59.803 --> 13:04.603
+if it looks back and sees frowny eyes
+
+13:04.603 --> 13:07.536
+which are up here.
+
+13:07.536 --> 13:08.136
+The eyes are up here.
+
+13:08.136 --> 13:11.536
+Colon, equals sign...
+
+13:11.536 --> 13:13.336
+and then it inserts it
+
+13:13.336 --> 13:15.970
+or it does a self insert command.
+
+13:15.970 --> 13:17.636
+That simple.
+
+13:17.636 --> 13:18.803
+self-insert-command is what
+
+13:18.803 --> 13:22.770
+electric-pair-mode hooks into.
+
+13:22.770 --> 13:24.370
+So that's it.
+
+13:24.370 --> 13:25.503
+And then the minor mode
+
+13:25.503 --> 13:27.070
+just makes it a minor mode.
+
+13:27.070 --> 13:28.503
+So that was that.
+
+13:28.503 --> 13:32.436
+And you know, that worked just fine.
+
+13:32.436 --> 13:35.670
+That's the thing. It works just fine.
+
+13:35.670 --> 13:37.270
+Of course, after that,
+
+13:37.270 --> 13:39.103
+I had it do a couple of different things.
+
+13:39.103 --> 13:40.236
+I added a mascot.
+
+13:40.236 --> 13:42.370
+I had to add a README.
+
+13:42.370 --> 13:45.070
+I added a global-frowny-mode
+
+13:45.070 --> 13:49.036
+which was kind of interesting
+
+13:49.036 --> 13:49.870
+because I had to figure out
+
+13:49.870 --> 13:51.603
+turn on the frowny mode,
+
+13:51.603 --> 13:56.336
+I wrote this define-globalized-minor-mode
+
+13:56.336 --> 13:58.603
+which... is that the one
+
+13:58.603 --> 14:00.870
+No, that one's not super new.
+
+14:00.870 --> 14:04.203
+There was another one. Something else
+
+14:04.203 --> 14:07.170
+that was actually for 28 or 27,
+
+14:07.170 --> 14:09.036
+and I tried using it at work,
+
+14:09.036 --> 14:10.970
+where I have Windows
+
+14:10.970 --> 14:13.436
+and it was 27,
+
+14:13.436 --> 14:14.670
+so it must have been for 28.
+
+14:14.670 --> 14:16.103
+Anyway, something didn't work
+
+14:16.103 --> 14:17.170
+and I had to do all this stuff.
+
+14:17.170 --> 14:20.870
+Oops, sorry.
+
+14:20.870 --> 14:23.070
+I added some customization options,
+
+14:23.070 --> 14:25.370
+made package-lint happy...
+
+14:25.370 --> 14:27.336
+So yeah, let's see.
+
+14:27.336 --> 14:30.170
+That's 0.1.
+
+14:30.170 --> 14:33.370
+This version 0.1 was basically
+
+14:33.370 --> 14:36.770
+basic information.
+
+14:36.770 --> 14:39.670
+So then somebody... I put it on GitHub,
+
+14:39.670 --> 14:40.270
+good to go.
+
+14:40.270 --> 14:43.103
+It actually got some traction on Reddit.
+
+14:43.103 --> 14:45.903
+alphapapa, shout out to you
+
+14:45.903 --> 14:47.303
+who posted it there.
+
+14:47.303 --> 14:50.636
+But then I got an issue.
+
+14:50.636 --> 14:51.770
+Somebody said, hey, could you add
+
+14:51.770 --> 14:52.936
+smiley support?
+
+14:52.936 --> 14:54.403
+I was, like, well,
+
+14:54.403 --> 14:55.070
+I don't really understand
+
+14:55.070 --> 14:56.003
+why that's important.
+
+14:56.003 --> 14:58.236
+Well, you know, why not?
+
+14:58.236 --> 15:01.270
+They had a use case for it, I forget,
+
+15:01.270 --> 15:02.270
+but they had a use case for it.
+
+15:02.270 --> 15:03.770
+So, okay, fine.
+
+15:03.770 --> 15:05.270
+So I added smiley support right here.
+
+15:05.270 --> 15:12.570
+Oh, and I added some more eyes
+
+15:12.570 --> 15:13.670
+at some point.
+
+15:13.670 --> 15:16.736
+Now you have... you can do a tear.
+
+15:16.736 --> 15:18.103
+You can do a nose.
+
+15:18.103 --> 15:23.603
+Let's see...
+
+15:23.603 --> 15:27.270
+I had to change frowny-self-insert
+
+15:27.270 --> 15:28.803
+to frowny-insert-character,
+
+15:28.803 --> 15:33.400
+I added frowny-self-insert-frowny
+
+15:33.400 --> 15:34.170
+right here.
+
+15:34.170 --> 15:38.536
+I added... I had an obsolete function alias.
+
+15:38.536 --> 15:39.503
+That was super fun.
+
+15:39.503 --> 15:40.870
+That was a cool thing to do.
+
+15:40.870 --> 15:43.970
+I have insert-smiley as well.
+
+15:43.970 --> 15:45.536
+They're both very similar.
+
+15:45.536 --> 15:47.336
+They're all still there.
+
+15:47.336 --> 15:49.403
+I added a keymap.
+
+15:49.403 --> 15:50.833
+That was pretty much it.
+
+15:50.833 --> 15:51.303
+And you know, again,
+
+15:51.303 --> 15:54.203
+super simple, very small.
+
+15:54.203 --> 15:56.270
+Let me try this again.
+
+15:56.270 --> 15:58.336
+I added comments and docstrings.
+
+15:58.336 --> 15:59.170
+At some point, I decided
+
+15:59.170 --> 16:03.870
+let me try to make a frowny prog mode
+
+16:03.870 --> 16:06.236
+that only works in programming modes,
+
+16:06.236 --> 16:07.536
+that only works in strings
+
+16:07.536 --> 16:09.303
+and in comments, but...
+
+16:09.303 --> 16:11.803
+There's still a branch for it,
+
+16:11.803 --> 16:14.003
+if you want to go check it out.
+
+16:14.003 --> 16:15.303
+It wasn't super useful,
+
+16:15.303 --> 16:16.336
+and I think, actually,
+
+16:16.336 --> 16:18.136
+electric-pair-mode already does that.
+
+16:18.136 --> 16:19.070
+I'm not a hundred percent sure.
+
+16:19.070 --> 16:21.503
+I got a pull request
+
+16:21.503 --> 16:23.903
+from alphapapa, adding HISTORY.org.
+
+16:23.903 --> 16:26.170
+So you can go read the IRC logs about it.
+
+16:26.170 --> 16:29.703
+There's... Let's see...
+
+16:29.703 --> 16:31.236
+And then just recently,
+
+16:31.236 --> 16:33.636
+I actually had to add frowny-inhibit-modes
+
+16:33.636 --> 16:39.603
+because with dired, I kept getting this...
+
+16:39.603 --> 16:43.236
+I would try to hit open parenthesis
+
+16:43.236 --> 16:47.536
+which is my dired-hide-details-mode,
+
+16:47.536 --> 16:50.536
+but it kept saying, hey,
+
+16:50.536 --> 16:51.903
+it's a read-only buffer. I'm, like, what?
+
+16:51.903 --> 16:55.303
+Oh yeah! Right! It's Emacs. I can C-h k
+
+16:55.303 --> 16:59.703
+and then (, and oh, frowny-self-insert.
+
+16:59.703 --> 17:01.636
+Oh, duh. So I had to add
+
+17:01.636 --> 17:05.036
+this little frowny-inhibit-modes bit.
+
+17:05.036 --> 17:06.836
+So now there's a little custom in here.
+
+17:06.836 --> 17:09.136
+Right now, it just defaults to special-mode.
+
+17:09.136 --> 17:12.170
+I added dired myself on my config.
+
+17:12.170 --> 17:14.236
+I might add that as a default as well.
+
+17:14.236 --> 17:15.270
+I'm going to think about it.
+
+17:15.270 --> 17:21.536
+And then, yeah. So now we're at version 0.3,
+
+17:21.536 --> 17:23.470
+that's where we're at now.
+
+17:23.470 --> 17:26.070
+I just updated the README with the last one.
+
+17:26.070 --> 17:28.603
+Basically, lots of functionality,
+
+17:28.603 --> 17:30.303
+plus this frowny-inhibit-mode,
+
+17:30.303 --> 17:32.836
+and yeah, now it is just...
+
+17:32.836 --> 17:34.503
+This is it. This is the whole thing
+
+17:34.503 --> 17:36.736
+right here. It's pretty short.
+
+17:36.736 --> 17:39.103
+I think it's a total of 113 lines.
+
+17:39.103 --> 17:42.203
+But you know what, it's got...
+
+17:42.203 --> 17:43.803
+It's useful for people,
+
+17:43.803 --> 17:45.136
+and it's something where
+
+17:45.136 --> 17:47.770
+I never thought I would write
+
+17:47.770 --> 17:49.470
+software that people would use.
+
+17:49.470 --> 17:51.136
+As I said, I'm not a programmer.
+
+17:51.136 --> 17:54.003
+I'm just this guy.
+
+17:54.003 --> 17:55.070
+I like using Emacs
+
+17:55.070 --> 17:56.103
+because I'm kind of a nerd.
+
+17:56.103 --> 17:57.436
+I like tinkering around
+
+17:57.436 --> 17:58.436
+and doing things the hard way.
+
+17:58.436 --> 18:02.570
+I don't... I could use Microsoft Word.
+
+18:02.570 --> 18:04.136
+I should. I was trying to
+
+18:04.136 --> 18:06.136
+write this presentation up
+
+18:06.136 --> 18:07.500
+and my wife said, "Why don't you just
+
+18:07.500 --> 18:08.903
+write it in Google Docs?"
+
+18:08.903 --> 18:11.503
+And I said, "I don't want to."
+
+18:11.503 --> 18:13.036
+I mean, that's really it.
+
+18:13.036 --> 18:15.036
+Isn't that why we're all here?
+
+18:15.036 --> 18:18.936
+So yeah, you know,
+
+18:18.936 --> 18:21.003
+so anyway, that's the story about frowny
+
+18:21.003 --> 18:22.270
+That's the story about me,
+
+18:22.270 --> 18:25.436
+my journey to Emacs,
+
+18:25.436 --> 18:27.136
+my journey to this conference,
+
+18:27.136 --> 18:30.636
+and the journey of this package.
+
+18:30.636 --> 18:32.536
+I think it's about done.
+
+18:32.536 --> 18:36.136
+I'm not sure what else needs to go in there.
+
+18:36.136 --> 18:38.103
+If you have any suggestions,
+
+18:38.103 --> 18:39.803
+pull requests, comments,
+
+18:39.803 --> 18:43.370
+there's a GitHub right here,
+
+18:43.370 --> 18:45.436
+frowny.el.
+
+18:45.436 --> 18:49.236
+Let's see if I can pull it up.
+
+18:49.236 --> 18:52.370
+frowny.el.
+
+18:52.370 --> 18:55.236
+I'll put it on (inaudible).
+
+18:55.236 --> 18:57.336
+That's something I still don't understand.
+
+18:57.336 --> 18:59.203
+Packages, the whole keywords thing...
+
+18:59.203 --> 19:00.236
+I'm still confused on that.
+
+19:00.236 --> 19:04.636
+But yeah. Just requires Emacs 24.
+
+19:04.636 --> 19:09.970
+That's it. So anyway,
+
+19:09.970 --> 19:12.470
+I'm not sure if I'm going to be
+
+19:12.470 --> 19:13.803
+live for questions.
+
+19:13.803 --> 19:14.736
+I'm recording this, obviously,
+
+19:14.736 --> 19:15.903
+a bit before,
+
+19:15.903 --> 19:18.636
+and I will be travelling that weekend,
+
+19:18.636 --> 19:20.303
+this weekend, when you're watching this,
+
+19:20.303 --> 19:25.236
+so I'm going to... But right now,
+
+19:25.236 --> 19:26.836
+I'm recording it, I'm not 100% sure.
+
+19:26.836 --> 19:28.636
+I will know obviously by then.
+
+19:28.636 --> 19:30.003
+So maybe I'll talk to you
+
+19:30.003 --> 19:31.070
+in a moment, maybe not.
+
+19:31.070 --> 19:33.300
+Otherwise, have a
+
+19:33.300 --> 19:34.336
+great conference, everybody.
+
+19:34.336 --> 19:38.303
+I'm really excited to see everyone's talks.
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-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt b/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt
new file mode 100644
index 00000000..083f2278
--- /dev/null
+++ b/2021/captions/emacsconf-2021-gregorian--typesetting-gregorian-chant-with-emacs--spencer-king--main.vtt
@@ -0,0 +1,820 @@
+WEBVTT
+
+00:00.240 --> 00:00:02.320
+Hello, everyone, my name is Spencer,
+
+00:00:02.320 --> 00:00:03.600
+and today I'm going to tell you all
+
+00:00:03.600 --> 00:00:05.296
+a little bit about how to typeset
+
+00:00:05.296 --> 00:00:06.640
+Gregorian chant sheet music
+
+00:00:06.640 --> 00:00:10.000
+using Emacs and a tool called Gregorio.
+
+00:10.000 --> 00:00:12.160
+Now I expect many, if not all, of you
+
+00:00:12.160 --> 00:00:14.000
+are unfamiliar with Gregorio,
+
+00:00:14.000 --> 00:00:14.719
+so we'll start off
+
+00:00:14.719 --> 00:00:16.240
+with a brief overview of the tool
+
+00:16.240 --> 00:18.080
+and the appropriate syntax.
+
+00:18.080 --> 00:19.760
+Next, I'll show you how I've automated
+
+00:19.760 --> 00:00:20.720
+some of the workflow
+
+00:00:20.720 --> 00:00:22.480
+using some Emacs Lisp functions
+
+00:00:22.480 --> 00:00:23.920
+which I've slowly been turning into
+
+00:00:23.920 --> 00:00:26.080
+a package called `gregorian-mode`.
+
+00:26.080 --> 00:00:26.720
+This will include
+
+00:00:26.720 --> 00:00:28.320
+some live typesetting examples
+
+00:00:28.320 --> 00:00:29.359
+to give you a better idea
+
+00:00:29.359 --> 00:00:31.279
+of how this all works.
+
+00:31.279 --> 00:00:32.079
+Finally, I'll share
+
+00:00:32.079 --> 00:00:33.120
+some information with you
+
+00:00:33.120 --> 00:00:34.480
+about how you can contribute
+
+00:34.480 --> 00:00:35.680
+to the package if you'd like,
+
+00:00:35.680 --> 00:00:38.000
+and how you can learn more about
+
+00:38.000 --> 00:39.600
+both Gregorio and `gregorian-mode`.
+
+00:39.600 --> 00:00:41.120
+And of course, all of the examples
+
+00:00:41.120 --> 00:00:42.320
+from this presentation today
+
+00:00:42.320 --> 00:00:44.079
+have been available online
+
+00:00:44.079 --> 00:00:44.879
+so you can review them
+
+00:00:44.879 --> 00:00:46.800
+all at your own pace.
+
+00:46.800 --> 00:49.440
+Gregorio is a tool that takes
+
+00:49.440 --> 00:51.500
+a `gabc` text file and compiles it
+
+00:51.500 --> 00:52.879
+into a LaTeX document.
+
+00:52.879 --> 00:00:54.719
+Gregorio is included by default
+
+00:00:54.719 --> 00:00:56.559
+with many LaTeX distributions,
+
+00:00:56.559 --> 00:00:58.079
+so you may already have it installed
+
+00:00:58.079 --> 00:01:01.120
+on your machine if you are a user of LaTeX.
+
+01:01.120 --> 01:02.879
+You can see here on the left an example
+
+01:02.879 --> 00:01:04.960
+of some input `gabc` text,
+
+00:01:04.960 --> 00:01:05.600
+and on the right,
+
+00:01:05.600 --> 00:01:08.080
+what the compiled score will look like.
+
+01:08.080 --> 01:10.080
+Looking at the `gabc`, we can see that
+
+01:10.080 --> 01:12.640
+it starts with the clef in parentheses,
+
+01:12.640 --> 00:01:13.600
+and then following this
+
+00:01:13.600 --> 00:01:15.119
+are the syllables of the lyrics
+
+00:01:15.119 --> 00:01:18.080
+and the corresponding notes in parentheses.
+
+01:18.080 --> 01:21.119
+For example, you can see that "EX,"
+
+01:21.119 --> 00:01:22.240
+the first syllable,
+
+00:01:22.240 --> 00:01:24.080
+corresponds to a `d` note
+
+00:01:24.080 --> 00:01:25.920
+in parentheses there,
+
+00:01:25.920 --> 00:01:27.119
+and if you look at the right,
+
+00:01:27.119 --> 00:01:28.560
+you can easily verify that
+
+00:01:28.560 --> 00:01:30.320
+in the output.
+
+01:30.320 --> 00:01:31.040
+Now the last thing
+
+00:01:31.040 --> 00:01:31.680
+that I want to note here
+
+01:31.680 --> 01:34.079
+is that `gabc` files are all plain text,
+
+01:34.079 --> 01:36.320
+meaning they can easily be shared
+
+01:36.320 --> 01:38.000
+and can easily be tracked using
+
+01:38.000 --> 01:40.400
+your favorite version-control software.
+
+01:40.400 --> 01:41.920
+Since these are plain text,
+
+01:41.920 --> 01:43.520
+it's really pretty easy to integrate
+
+01:43.520 --> 01:46.079
+them into your existing workflows.
+
+01:46.079 --> 00:01:48.079
+The `gabc` format also supports
+
+00:01:48.079 --> 00:01:49.439
+many optional header fields
+
+00:01:49.439 --> 00:01:50.560
+for adding more information
+
+00:01:50.560 --> 00:01:51.920
+about your score.
+
+01:51.920 --> 01:53.520
+You can see all the supported fields
+
+01:53.520 --> 00:01:54.799
+listed below, along with
+
+00:01:54.799 --> 00:01:56.479
+some placeholder text.
+
+01:56.479 --> 00:01:57.360
+These fields are placed
+
+00:01:57.360 --> 00:01:58.399
+at the top of a file
+
+00:01:58.399 --> 00:02:01.000
+and are separated from the actual score
+
+02:01.000 --> 00:02:01.439
+by the two percent symbols
+
+00:02:01.439 --> 00:02:03.000
+seen at the bottom.
+
+02:03.000 --> 02:04.399
+After these symbols, you would have the
+
+02:04.399 --> 00:02:05.600
+lines of your score,
+
+00:02:05.600 --> 00:02:07.080
+similar to what you saw
+
+00:02:07.080 --> 00:02:08.560
+on the previous slide.
+
+02:08.560 --> 00:02:09.599
+As I said earlier,
+
+00:02:09.599 --> 00:02:10.560
+I've automated some of
+
+02:10.560 --> 02:12.959
+the score build steps using Emacs Lisp,
+
+02:12.959 --> 00:02:14.000
+and have started turning them
+
+00:02:14.000 --> 00:02:16.480
+into a package called `gregorian-mode`.
+
+02:16.480 --> 00:02:18.160
+This is my first Emacs package,
+
+00:02:18.160 --> 00:02:20.400
+so the code is rather messy at the moment,
+
+00:02:20.400 --> 00:02:22.160
+and for the most part is just a wrapper
+
+02:22.160 --> 02:24.319
+around the Gregorio build process.
+
+02:24.319 --> 00:02:25.536
+However, I have made some
+
+00:02:25.536 --> 00:02:26.720
+quality-of-life improvements
+
+00:02:26.720 --> 00:02:27.920
+to the score writing,
+
+00:02:27.920 --> 00:02:30.239
+and have some more planned for the future.
+
+02:30.239 --> 00:02:31.360
+You'll get to see some of that
+
+00:02:31.360 --> 00:02:32.480
+in some live examples
+
+00:02:32.480 --> 00:02:34.319
+in just a little bit.
+
+02:34.319 --> 02:36.000
+This package is not currently on MELPA
+
+02:36.000 --> 00:02:37.760
+at the time of recording,
+
+00:02:37.760 --> 00:02:38.640
+so if you want it,
+
+00:02:38.640 --> 00:02:40.000
+you will have to clone it manually
+
+00:02:40.000 --> 00:02:41.920
+from GitHub, but it is planned
+
+02:41.920 --> 02:44.080
+to be on MELPA in the near future.
+
+02:44.080 --> 00:02:44.959
+It just needs to go through
+
+00:02:44.959 --> 00:02:46.400
+a little more rigorous cleanup
+
+00:02:46.400 --> 00:02:48.640
+and testing.
+
+02:48.640 --> 02:50.400
+Now that we've covered the basics,
+
+02:50.400 --> 02:52.560
+let's take a look at an actual example.
+
+02:52.560 --> 02:54.319
+In this example, I'm assuming that
+
+02:54.319 --> 02:56.480
+my `gregorian-mode` package is installed.
+
+02:56.480 --> 02:57.920
+However, there is nothing in these steps
+
+02:57.920 --> 00:02:59.200
+that cannot be done manually
+
+00:02:59.200 --> 00:03:01.120
+by just following the official
+
+03:01.120 --> 03:02.480
+Gregorio documentation.
+
+03:02.480 --> 03:04.000
+So if you don't want to use a package,
+
+03:04.000 --> 03:05.840
+you can do all of this pretty easily
+
+03:05.840 --> 03:07.280
+on your own just by following
+
+03:07.280 --> 03:10.000
+their documentation.
+
+03:10.000 --> 00:03:11.680
+So first we'll open up Emacs,
+
+00:03:11.680 --> 00:03:12.480
+and in my case,
+
+00:03:12.480 --> 00:03:14.560
+I'm using the GUI version.
+
+03:14.560 --> 03:16.640
+So now that Emacs is open, we can call
+
+03:16.640 --> 03:21.440
+the function `gregorian-create-new-gabc`,
+
+03:21.440 --> 03:23.680
+and this will prompt us for a file name.
+
+03:23.680 --> 03:25.599
+So we need to pick out a name
+
+03:25.599 --> 03:26.799
+for our new score.
+
+03:26.799 --> 00:03:28.239
+So I think I'm going to go ahead
+
+00:03:28.239 --> 00:03:33.280
+and name ours `emacsconf2021`.
+
+03:33.280 --> 03:34.959
+So you can see here that we now have
+
+03:34.959 --> 00:03:36.879
+a new `gabc` file with all of the
+
+00:03:36.879 --> 00:03:38.720
+optional header fields added,
+
+00:03:38.720 --> 00:03:40.400
+and we can keep whichever of these
+
+00:03:40.400 --> 00:03:41.120
+that we would like,
+
+03:41.120 --> 03:43.200
+and we can modify them as needed.
+
+03:43.200 --> 03:45.360
+So for right now, all I'm going to change
+
+03:45.360 --> 03:47.360
+is this commentary; I'm going to update
+
+03:47.360 --> 00:03:52.560
+this source of words to `emacsconf`,
+
+03:52.560 --> 00:03:53.760
+and then at the bottom here,
+
+00:03:53.760 --> 00:03:55.040
+this is where we'd go ahead
+
+00:03:55.040 --> 00:03:56.959
+and add our score.
+
+03:56.959 --> 03:58.799
+So I don't have time today to typeset
+
+03:58.799 --> 04:01.040
+an entire score, and I think that would
+
+04:01.040 --> 00:04:02.239
+probably be rather boring
+
+00:04:02.239 --> 00:04:03.760
+for most of you to watch,
+
+00:04:03.760 --> 00:04:05.680
+so I'll just demonstrate very briefly
+
+00:04:05.680 --> 00:04:08.500
+with a few syllables and notes here.
+
+04:15.840 --> 04:17.680
+Okay, so now that we have our first few
+
+04:17.680 --> 04:19.840
+syllables and notes down, let's take a
+
+04:19.840 --> 04:21.759
+look at what our score actually looks
+
+04:21.759 --> 04:23.520
+like so far.
+
+04:23.520 --> 04:25.040
+So in order to do this, we're going to
+
+04:25.040 --> 04:29.600
+call the function `gregorian-build`,
+
+04:29.600 --> 00:04:31.199
+and what this function does is
+
+00:04:31.199 --> 00:04:32.320
+it takes this score
+
+00:04:32.320 --> 00:04:33.680
+and creates a LaTeX file for it
+
+04:33.680 --> 04:36.080
+and then goes ahead and compiles it
+
+04:36.080 --> 04:38.160
+into a PDF file that we can actually
+
+04:38.160 --> 04:39.840
+take a look at.
+
+04:39.840 --> 04:42.479
+And this does take a few seconds to run...
+
+04:42.479 --> 04:44.320
+and there it goes...
+
+04:44.320 --> 04:47.040
+so we can see here we have a new buffer
+
+04:47.040 --> 04:48.560
+with all of the output
+
+04:48.560 --> 04:50.320
+from that build process,
+
+04:50.320 --> 00:04:51.840
+but what we really care about
+
+00:04:51.840 --> 00:04:54.000
+is that PDF.
+
+04:56.080 --> 04:58.479
+So opening that up, you can see
+
+04:58.479 --> 05:00.560
+we have a very short score.
+
+05:00.560 --> 05:02.320
+So far we haven't done a whole lot,
+
+05:02.320 --> 05:03.919
+but if you go ahead and compare the
+
+05:03.919 --> 05:05.000
+score on the right
+
+05:05.000 --> 05:06.479
+with the file on the left,
+
+05:06.479 --> 05:08.080
+you can really pretty clearly see that
+
+05:08.080 --> 05:10.080
+those are, in fact, the lyrics
+
+05:10.080 --> 05:11.199
+that we wrote.
+
+05:11.199 --> 05:13.280
+You can see at the top right there,
+
+05:13.280 --> 05:14.300
+the source has, in fact,
+
+05:14.300 --> 05:16.000
+changed to `emacsconf`
+
+05:16.000 --> 00:05:18.240
+so at this point, we could go ahead
+
+00:05:18.240 --> 00:05:20.000
+and just keep adding more lines,
+
+00:05:20.000 --> 00:05:22.240
+more notes, and so on,
+
+05:22.240 --> 05:24.080
+and we would end up with
+
+05:24.080 --> 05:25.919
+a completed score.
+
+05:25.919 --> 00:05:27.919
+Now this process is great and all,
+
+00:05:27.919 --> 00:05:29.120
+but as you can imagine,
+
+00:05:29.120 --> 00:05:30.880
+more complex `gabc` files
+
+05:30.880 --> 05:32.720
+can quickly become pretty difficult
+
+05:32.720 --> 05:34.479
+to read with the notes and the syllables
+
+05:34.479 --> 05:36.080
+all bunched together.
+
+05:36.080 --> 05:37.840
+So to get around this, I've been playing
+
+05:37.840 --> 05:39.840
+around with an alternative format
+
+05:39.840 --> 05:41.000
+called a `greg` file.
+
+05:41.000 --> 05:42.160
+I have an example of that
+
+05:42.160 --> 05:43.919
+for you right here.
+
+05:43.919 --> 05:45.919
+So here we can see there are
+
+05:45.919 --> 05:48.000
+two files side-by-side:
+
+05:48.000 --> 05:50.000
+on the left, we have a `gabc` file,
+
+05:50.000 --> 00:05:51.022
+and then on the right,
+
+00:05:51.022 --> 00:05:52.000
+we have a `greg` file,
+
+05:52.000 --> 05:53.360
+both of them for the same score.
+
+05:53.360 --> 05:55.600
+Now in my opinion, the `gabc` on the left
+
+05:55.600 --> 00:05:57.199
+is really rather difficult to read
+
+00:05:57.199 --> 00:05:58.319
+at a glance.
+
+00:05:58.319 --> 00:05:59.280
+You can see there
+
+00:05:59.280 --> 00:06:00.880
+the notes and the syllables
+
+00:06:00.880 --> 00:06:02.160
+are really all grouped together
+
+00:06:02.160 --> 00:06:03.919
+pretty tightly.
+
+06:03.919 --> 00:06:05.520
+Looking at the `greg` on the right,
+
+00:06:05.520 --> 00:06:06.560
+you can see that all of the
+
+00:06:06.560 --> 00:06:08.479
+header information is the same,
+
+00:06:08.479 --> 00:06:09.680
+but the score itself
+
+00:06:09.680 --> 00:06:11.840
+is split across several lines.
+
+06:11.840 --> 00:06:13.039
+The idea here is that
+
+00:06:13.039 --> 00:06:15.039
+the notes and the corresponding syllables
+
+00:06:15.039 --> 00:06:16.560
+will be on separate lines,
+
+00:06:16.560 --> 00:06:17.600
+one after the other,
+
+06:17.600 --> 06:20.639
+to help improve readability.
+
+06:20.639 --> 00:06:21.906
+Now the `greg` file format
+
+00:06:21.906 --> 00:06:23.800
+is still a work-in-progress.
+
+06:23.800 --> 06:24.960
+It's really not
+
+06:24.960 --> 06:27.520
+set in stone at all,
+
+06:27.520 --> 06:29.840
+but already I think this is a pretty
+
+06:29.840 --> 06:32.560
+substantial quality-of-life improvement,
+
+06:32.560 --> 06:34.720
+and already `gregorian-mode` can, in fact,
+
+06:34.720 --> 00:06:36.720
+build scores from `greg` files
+
+00:06:36.720 --> 00:06:38.300
+as long as they follow the conventions
+
+06:38.300 --> 06:40.400
+that you see in this file here,
+
+06:40.400 --> 00:06:42.560
+and I'm planning to have that
+
+00:06:42.560 --> 00:06:44.240
+quite a bit more well-defined
+
+00:06:44.240 --> 00:06:45.360
+moving forward.
+
+06:45.360 --> 06:47.360
+Like I said, this is really still
+
+06:47.360 --> 06:49.520
+a work-in-progress.
+
+06:49.520 --> 00:06:51.039
+Finally, I want to end today
+
+00:06:51.039 --> 00:06:52.319
+by sharing some resources
+
+00:06:52.319 --> 00:06:53.840
+where you can learn more.
+
+06:53.840 --> 00:06:55.039
+First, you can learn more about
+
+00:06:55.039 --> 00:06:56.319
+the Gregorio project
+
+00:06:56.319 --> 00:06:57.500
+on their official website,
+
+06:57.500 --> 06:58.960
+and I have the link for that
+
+06:58.960 --> 07:00.720
+on this slide here,
+
+07:00.720 --> 07:02.319
+and this site has several detailed examples
+
+07:02.319 --> 07:04.080
+and a lot of additional information
+
+07:04.080 --> 00:07:05.840
+about the project
+
+00:07:05.840 --> 00:07:07.500
+and about chant notation in general.
+
+07:07.500 --> 07:09.500
+It goes into much more depth
+
+07:09.500 --> 00:07:12.000
+than what we covered in this presentation,
+
+00:07:12.000 --> 00:07:13.199
+and overall, it's really
+
+00:07:13.199 --> 00:07:14.960
+a fantastic resource
+
+07:14.960 --> 07:16.560
+for learning more about how to use
+
+07:16.560 --> 07:19.360
+the Gregorio software and more about
+
+07:19.360 --> 07:21.840
+the specifics of chant notation.
+
+07:21.840 --> 00:07:23.680
+Second, if you're interested in using
+
+00:07:23.680 --> 00:07:25.840
+or contributing to `gregorian-mode`,
+
+00:07:25.840 --> 00:07:28.240
+you can check out the project on GitHub
+
+07:28.240 --> 07:30.400
+with the link here on this slide.
+
+07:30.400 --> 07:31.919
+And if you're interested in helping out
+
+07:31.919 --> 07:34.080
+in any way, feel free to open an issue,
+
+07:34.080 --> 07:36.560
+and we can discuss further.
+
+07:36.560 --> 00:07:38.160
+And finally, all of the examples
+
+00:07:38.160 --> 00:07:40.400
+from today are also available on GitHub,
+
+07:40.400 --> 07:42.479
+and that's the last link on this slide,
+
+07:42.479 --> 07:44.160
+and you can feel free to experiment
+
+07:44.160 --> 07:45.919
+with these and really just use them
+
+07:45.919 --> 07:48.560
+in any way that you'd like.
+
+07:48.560 --> 07:50.319
+Now that's all that I had for today,
+
+07:50.319 --> 00:07:51.360
+but I do want to take a moment
+
+00:07:51.360 --> 00:07:52.000
+to thank you all
+
+07:52.000 --> 07:54.160
+for checking out my presentation,
+
+07:54.160 --> 07:55.680
+and I want to thank the organizers
+
+07:55.680 --> 00:07:56.400
+for giving me some time
+
+00:07:56.400 --> 00:07:57.759
+to speak with you all.
+
+07:57.759 --> 00:07:59.120
+I hope that this was at least
+
+00:07:59.120 --> 00:08:01.120
+a little bit interesting to some of you,
+
+00:08:01.120 --> 00:08:02.319
+and I hope that you all enjoy
+
+00:08:02.319 --> 00:08:02.800
+the rest of the conference.
+
+08:02.800 --> 00:08:06.520
+Thank you for your time today.
+
+00:08:06.520 --> 00:08:07.520
+[captions by Hannah Miller]
diff --git a/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt b/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt
new file mode 100644
index 00000000..5d822eae
--- /dev/null
+++ b/2021/captions/emacsconf-2021-imaginary--imaginary-programming--shane-mulligan--main.vtt
@@ -0,0 +1,697 @@
+WEBVTT
+
+00:01.920 --> 00:03.280
+Hi everyone!
+
+00:03.280 --> 00:04.400
+My name is Shane,
+
+00:04.400 --> 00:09.679
+and it's truly a real honor to be
+
+00:09.679 --> 00:14.480
+able to speak at EmacsConf.
+
+00:14.480 --> 00:16.880
+I love Emacs. I love Emacs Lisp,
+
+00:16.880 --> 00:19.279
+and this is also another topic
+
+00:19.279 --> 00:22.233
+that really excites me ever since
+
+00:22.233 --> 00:28.160
+I got my hands on OpenAI's GPT-3.
+
+00:28.160 --> 00:29.920
+Six months ago, I knew that it was
+
+00:29.920 --> 00:33.920
+important to research this for Emacs,
+
+00:33.920 --> 00:35.980
+you know, asides from being somebody
+
+00:35.980 --> 00:39.040
+who never wants to leave Emacs myself,
+
+00:39.040 --> 00:41.440
+and I hope that….
+
+00:41.440 --> 00:43.120
+Being one of the few Emacs users,
+
+00:43.120 --> 00:45.360
+possibly the only one that had
+
+00:45.360 --> 00:48.160
+access to GPT-3 for this long,
+
+00:48.160 --> 00:52.559
+I hope that I can contribute.
+
+00:52.559 --> 00:55.199
+So, Emacs, sorry.
+
+00:55.199 --> 00:58.960
+Imaginary programming is…,
+
+00:58.960 --> 01:01.280
+it's based on prompt engineering currently,
+
+01:01.280 --> 01:02.559
+but it's an abstraction over
+
+01:02.559 --> 01:03.359
+prompt engineering.
+
+01:03.359 --> 01:06.479
+You can read about prompt engineering
+
+01:06.479 --> 01:08.560
+and language models,
+
+01:08.560 --> 01:13.040
+that's quite easy to google for.
+
+01:13.040 --> 01:15.520
+And imaginary programming is a subfield
+
+01:15.520 --> 01:17.360
+of imaginary computing,
+
+01:17.360 --> 01:19.424
+which is just the larger domain
+
+01:19.424 --> 01:21.420
+of employing of computing
+
+01:21.420 --> 01:24.240
+that's based on imagination,
+
+01:24.240 --> 01:25.600
+artificial imagination,
+
+01:25.600 --> 01:29.920
+so, basically, dreaming up user interfaces
+
+01:29.920 --> 01:32.159
+instead of…, or at least partially
+
+01:32.159 --> 01:34.079
+dreaming them up.
+
+01:34.079 --> 01:41.439
+I suppose that it's a fringe paradigm,
+
+01:41.439 --> 01:43.759
+but it's extremely useful.
+
+01:43.759 --> 01:47.759
+Imaginary computing,
+
+01:47.759 --> 01:49.200
+if you're willing to call it that,
+
+01:49.200 --> 01:51.920
+would be what's used to
+
+01:51.920 --> 01:53.413
+imagine simulations
+
+01:53.413 --> 01:54.320
+for self-driving cars,
+
+01:54.320 --> 01:57.840
+as they're trained for example.
+
+01:57.840 --> 01:58.984
+But this technology finds
+
+01:58.984 --> 02:00.960
+its way to the public,
+
+02:00.960 --> 02:04.880
+and it should be in the public domain.
+
+02:04.880 --> 02:06.799
+So, Demis Hassabis
+
+02:06.799 --> 02:08.959
+he's the founder of DeepMind,
+
+02:08.959 --> 02:12.400
+and he did his Ph.D. in human imagination,
+
+02:12.400 --> 02:16.900
+now he's working on artificial imagination.
+
+02:16.900 --> 02:20.239
+So, just a couple of days ago
+
+02:20.239 --> 02:25.040
+I took AlephAlpha's world model API
+
+02:25.040 --> 02:28.080
+and I plugged it into Emacs's eww browser,
+
+02:28.080 --> 02:30.800
+and now I have a way of generating
+
+02:30.800 --> 02:33.840
+text for the images instead of actually…,
+
+02:33.840 --> 02:38.072
+so I can stay in my text only Emacs,
+
+02:38.072 --> 02:42.560
+which is the way it should be.
+
+02:42.560 --> 02:45.636
+Intelligent NFTs, I'll leave this
+
+02:45.636 --> 02:47.360
+for you guys to look at.
+
+02:47.360 --> 02:49.280
+Information bubbles.
+
+02:49.280 --> 02:55.360
+So, there's some potential bad outcomes
+
+02:55.360 --> 03:05.680
+from the runaway empowering of these
+
+03:05.680 --> 03:08.959
+large language models and other models
+
+03:08.959 --> 03:10.000
+in commercial hands.
+
+03:10.000 --> 03:13.680
+It's causing information bubbles and
+
+03:13.680 --> 03:15.680
+ways of controlling people.
+
+03:15.680 --> 03:19.440
+So, for example,
+
+03:19.440 --> 03:21.680
+micro tasks and stuff that…,
+
+03:21.680 --> 03:23.650
+furthermore just automating away,
+
+03:23.650 --> 03:26.000
+or abstracting away the role
+
+03:26.000 --> 03:27.680
+of a programmer,
+
+03:27.680 --> 03:29.360
+and the automating more and more
+
+03:29.360 --> 03:32.319
+increasingly abstract tasks,
+
+03:32.319 --> 03:33.659
+and I think the solution is to
+
+03:33.659 --> 03:36.319
+decentralize and break up these tasks.
+
+03:36.319 --> 03:39.120
+I have a potential way of doing that,
+
+03:39.120 --> 03:40.693
+but firstly I'll talk about
+
+03:40.693 --> 03:42.400
+the imaginary web briefly
+
+03:42.400 --> 03:44.720
+because the thing about these
+
+03:44.720 --> 03:48.000
+language models is,
+
+03:48.000 --> 03:49.280
+they can replace basically
+
+03:49.280 --> 03:52.159
+everything on the internet.
+
+03:52.159 --> 03:55.280
+So, like, replace your Wikipedia,
+
+03:55.280 --> 03:57.680
+or Stack Overflow,
+
+03:57.680 --> 04:01.519
+replace conversation if you want it with,
+
+04:01.519 --> 04:05.920
+from real people to chatbots instead,
+
+04:05.920 --> 04:13.120
+replace basically anything there's
+
+04:13.120 --> 04:14.959
+a website for.
+
+04:14.959 --> 04:17.280
+And that means that rich media has gone
+
+04:17.280 --> 04:20.639
+from becoming images and video
+
+04:20.639 --> 04:22.560
+and even from paywalls
+
+04:22.560 --> 04:26.400
+now into intelligent and truthful,
+
+04:26.400 --> 04:29.520
+because generating fictional websites
+
+04:29.520 --> 04:31.919
+is going to become a very easy thing to do,
+
+04:31.919 --> 04:35.120
+and actually the best way to do it,
+
+04:35.120 --> 04:37.440
+and the most useful way to do it,
+
+04:37.440 --> 04:40.560
+so then you need a source of truth.
+
+04:40.560 --> 04:43.759
+The imaginary web is a thing,
+
+04:43.759 --> 04:46.000
+imaginary interpreters are a thing,
+
+04:46.000 --> 04:50.000
+so you imagine your interpreter,
+
+04:50.000 --> 04:53.759
+or you overlay prompting on top of
+
+04:53.759 --> 04:55.520
+a real interpreter to see
+
+04:55.520 --> 04:57.440
+what you might want to do
+
+04:57.440 --> 04:58.800
+in an interpreter,
+
+04:58.800 --> 05:01.039
+and what you might want to say to somebody
+
+05:01.039 --> 05:01.919
+if you're talking to them.
+
+05:01.919 --> 05:03.199
+If you're inside, say,
+
+05:03.199 --> 05:05.840
+ERC in Emacs, an IRC client,
+
+05:05.840 --> 05:07.440
+and you prompt after somebody
+
+05:07.440 --> 05:08.479
+says something,
+
+05:08.479 --> 05:10.400
+then the prompt will probably suggest,
+
+05:10.400 --> 05:13.120
+what you might say in return,
+
+05:13.120 --> 05:15.199
+and then you can prompt like a multiverse,
+
+05:15.199 --> 05:18.800
+and you can pick from them.
+
+05:18.800 --> 05:23.912
+There's a bunch of crazy utilities
+
+05:23.912 --> 05:26.560
+for these language models.
+
+05:26.560 --> 05:28.960
+Paracosm vs Metaverse.
+
+05:28.960 --> 05:30.828
+So, Mark Zuck wants you to live in
+
+05:30.828 --> 05:34.320
+his virtual reality as defined by him,
+
+05:34.320 --> 05:36.160
+and he's going to do it
+
+05:36.160 --> 05:40.539
+by using these models to make you
+
+05:40.539 --> 05:42.639
+a fictional world that you can live in.
+
+05:42.639 --> 05:43.280
+You can do that,
+
+05:43.280 --> 05:46.400
+or you can use them yourself,
+
+05:46.400 --> 05:50.000
+and you build your own Paracosm.
+
+05:50.000 --> 05:51.440
+And I think that's an important
+
+05:51.440 --> 05:53.440
+ability to be able to have,
+
+05:53.440 --> 05:56.880
+otherwise we will be like the borg,
+
+05:56.880 --> 06:01.520
+and we'll be connected to Mark Zuckerberg.
+
+06:01.520 --> 06:06.400
+Truth is a hot topic.
+
+06:06.400 --> 06:08.880
+So, the way that I think we should do this
+
+06:08.880 --> 06:10.720
+to decentralize the language models is,
+
+06:10.720 --> 06:13.199
+to use Structuralism.
+
+06:13.199 --> 06:19.600
+Universal grammar,
+
+06:19.600 --> 06:21.680
+template metaprogramming, and GPT-3
+
+06:21.680 --> 06:23.919
+what do they have in common?
+
+06:23.919 --> 06:27.759
+Well, you have some kind of basis,
+
+06:27.759 --> 06:31.408
+like, you train your GPT-3,
+
+06:31.408 --> 06:32.663
+and then you do all your prompting
+
+06:32.663 --> 06:33.360
+on top of it.
+
+06:33.360 --> 06:35.840
+Like a person is born with this grammar,
+
+06:35.840 --> 06:37.759
+and then they quickly learn language,
+
+06:37.759 --> 06:40.240
+and like with C++ templates,
+
+06:40.240 --> 06:42.080
+you pre-process and then
+
+06:42.080 --> 06:44.800
+the run time runs on that.
+
+06:44.800 --> 06:48.000
+So, anyway, that was a slide.
+
+06:48.000 --> 06:50.479
+Structuralism.
+
+06:50.479 --> 06:52.080
+I think you can decompile…,
+
+06:52.080 --> 06:52.880
+think you can break,
+
+06:52.880 --> 06:53.840
+so you can decompose
+
+06:53.840 --> 06:55.840
+the language models into units,
+
+06:55.840 --> 06:57.759
+but those units won't look like neurons,
+
+06:57.759 --> 06:59.440
+they would look like these,
+
+06:59.440 --> 07:01.759
+and you put them onto a blockchain.
+
+07:01.759 --> 07:02.744
+But you can look at that later
+
+07:02.744 --> 07:03.840
+if you want anyway.
+
+07:03.840 --> 07:07.199
+I'm going to skip straight to ilambda,
+
+07:07.199 --> 07:09.919
+running out of time.
+
+07:09.919 --> 07:12.240
+I'll just quickly show you
+
+07:12.240 --> 07:15.199
+the ilambda primitive in ilambda.
+
+07:15.199 --> 07:19.199
+So, it evaluates instead of run,
+
+07:19.199 --> 07:21.680
+for example, here's the reduced function,
+
+07:21.680 --> 07:22.632
+and you've defined your
+
+07:22.632 --> 07:25.520
+imaginary lambda here.
+
+07:25.520 --> 07:26.560
+And it doesn't have a body,
+
+07:26.560 --> 07:31.599
+it's just got the comment
+
+07:31.599 --> 07:33.120
+and the parameters,
+
+07:33.120 --> 07:36.560
+and that's enough for….
+
+07:36.560 --> 07:38.720
+Once you have that ilambda
+
+07:38.720 --> 07:40.080
+that runs now as a function,
+
+07:40.080 --> 07:40.800
+you can stick it into
+
+07:40.800 --> 07:42.720
+a reduced function, for example,
+
+07:42.720 --> 07:46.240
+and it'll reduce this list.
+
+07:46.240 --> 07:50.560
+You could even remove…, yeah,
+
+07:50.560 --> 07:51.759
+so you kind of need the comment
+
+07:51.759 --> 07:56.048
+otherwise it's too hard to imagine
+
+07:56.048 --> 07:57.360
+what would happen next,
+
+07:57.360 --> 08:01.520
+but for a function you can literally
+
+08:01.520 --> 08:03.360
+have an idefun even without
+
+08:03.360 --> 08:04.639
+the argument list.
+
+08:04.639 --> 08:06.319
+It was just like generate-fib-sequence,
+
+08:06.319 --> 08:09.919
+and most likely when you run that defun,
+
+08:09.919 --> 08:13.759
+it would work the way you want it.
+
+08:13.759 --> 08:16.000
+The more information you give the idefun,
+
+08:16.000 --> 08:17.840
+the imaginary defun,
+
+08:17.840 --> 08:20.879
+the better it would capture the task
+
+08:20.879 --> 08:22.000
+which you're trying to do,
+
+08:22.000 --> 08:23.039
+in this case you want to generate
+
+08:23.039 --> 08:24.080
+a Fibonacci sequence.
+
+08:24.080 --> 08:28.319
+And yeah, you can define functions
+
+08:28.319 --> 08:30.560
+without having a body,
+
+08:30.560 --> 08:32.640
+and they run an inference instead.
+
+08:32.640 --> 08:34.159
+Here's a way of overriding
+
+08:34.159 --> 08:36.000
+the language model that's used,
+
+08:36.000 --> 08:40.640
+for example, using dynamic scope.
+
+08:40.640 --> 08:41.863
+So, under the hood,
+
+08:41.863 --> 08:47.040
+idefun just uses an ilambda.
+
+08:47.040 --> 08:50.959
+This function here just doubles things.
+
+08:50.959 --> 08:53.752
+So, here's a function that gets you
+
+08:53.752 --> 08:59.279
+a hexadecimal color just from the name.
+
+08:59.279 --> 09:00.160
+And you can create
+
+09:00.160 --> 09:02.160
+arbitrary functions like this,
+
+09:02.160 --> 09:04.268
+so, what we need is like a library
+
+09:04.268 --> 09:07.200
+of imaginary functions, I think,
+
+09:07.200 --> 09:12.800
+that match a language model.
+
+09:12.800 --> 09:15.760
+Macros on the other hand,
+
+09:15.760 --> 09:18.160
+as different from functions,
+
+09:18.160 --> 09:20.000
+they actually macro expand
+
+09:20.000 --> 09:21.360
+and generate code.
+
+09:21.360 --> 09:23.279
+So, when you macro expand this,
+
+09:23.279 --> 09:26.320
+you'll get this,
+
+09:26.320 --> 09:30.000
+and that's because this has an arity of 3,
+
+09:30.000 --> 09:31.839
+and then when you macro expand
+
+09:31.839 --> 09:32.959
+that underlying macro,
+
+09:32.959 --> 09:35.120
+it generates the actual source code.
+
+09:35.120 --> 09:37.839
+You can actually run these macros,
+
+09:37.839 --> 09:41.279
+and it will cache the output…,
+
+09:41.279 --> 09:42.480
+it will catch the source code,
+
+09:42.480 --> 09:44.240
+so the macro runs the same
+
+09:44.240 --> 09:45.839
+every single time,
+
+09:45.839 --> 09:47.519
+or generates the same code,
+
+09:47.519 --> 09:48.560
+but you can just use it
+
+09:48.560 --> 09:49.920
+to generate code really easily
+
+09:49.920 --> 09:52.000
+while you're programming.
+
+09:52.000 --> 09:55.920
+I hope that this has been informative,
+
+09:55.920 --> 09:57.600
+it wasn't too much time,
+
+09:57.600 --> 10:00.312
+but there's plenty of material
+
+10:00.312 --> 10:01.680
+for you to dig into it more
+
+10:01.680 --> 10:04.000
+if you're interested.
+
+10:04.000 --> 10:04.959
+Thank you very much
+
+10:04.959 --> 10:09.519
+for letting me talk today.
+
+10:09.519 --> 10:15.680
+Peace out!
+
+10:15.680 --> 10:16.680
+[captions by bhavin192 (Bhavin Gandhi)]
diff --git a/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt b/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt
new file mode 100644
index 00000000..ecb67f63
--- /dev/null
+++ b/2021/captions/emacsconf-2021-invoice--find-your-invoice-emacs-for-invoicing--bala-ramadurai--main.vtt
@@ -0,0 +1,706 @@
+WEBVTT
+
+00:10.290 --> 00:22.480
+What is an invoice?
+
+00:22.480 --> 00:25.630
+Invoice is a document
+
+00:25.630 --> 00:28.660
+that you give it to your customer
+
+00:28.660 --> 00:30.416
+so that they can pay you
+
+00:30.416 --> 00:31.450
+for your service or your goods.
+
+00:31.450 --> 00:35.720
+But you are a professor and consultant.
+
+00:35.720 --> 00:38.730
+Why do you need to generate invoices?
+
+00:38.730 --> 00:39.730
+Well...
+
+00:39.730 --> 00:46.640
+I do a service for my clients
+
+00:46.640 --> 00:47.884
+if I'm a consultant,
+
+00:47.884 --> 00:48.999
+and when I'm a professor,
+
+00:48.999 --> 00:51.530
+I'm teaching students,
+
+00:51.530 --> 00:54.910
+so I have to generate an invoice.
+
+00:54.910 --> 00:58.420
+Why not use Excel or something simple
+
+00:58.420 --> 01:00.079
+to generate your invoices?
+
+01:00.079 --> 01:01.079
+I've tried that.
+
+01:01.079 --> 01:04.609
+It's no good, when it... particularly,
+
+01:04.609 --> 01:07.150
+when there are many clients,
+
+01:07.150 --> 01:09.035
+managing Excels and templates
+
+01:09.035 --> 01:10.799
+becomes very very tricky.
+
+01:10.799 --> 01:15.725
+Why don't you hire someone, you know, professional
+
+01:15.725 --> 01:17.350
+to do these for you?
+
+01:17.350 --> 01:18.428
+I've tried it.
+
+01:18.428 --> 01:22.381
+I have to give them lots of information.
+
+01:22.381 --> 01:25.140
+Not that there's anything wrong with them,
+
+01:25.140 --> 01:30.130
+just that I found it to be a bit too tricky.
+
+01:30.130 --> 01:31.250
+Professional software?
+
+01:31.250 --> 01:33.902
+Good point. I've tried that too.
+
+01:33.902 --> 01:36.900
+But, what's the fun in that, right?
+
+01:36.900 --> 01:38.850
+So what did you do?
+
+01:38.850 --> 01:40.869
+Haa.. this is the interesting part!
+
+01:40.869 --> 01:45.600
+I took a software called Emacs Org mode
+
+01:45.600 --> 01:50.640
+and with that, I added Python code to it.
+
+01:50.640 --> 01:52.418
+I added so many other things to it,
+
+01:52.418 --> 01:56.168
+and then it became a really nice
+
+01:56.168 --> 01:59.640
+customizable way to generate invoices.
+
+01:59.640 --> 02:04.549
+Whoa whoa whoa... Just slow it down, bro.
+
+02:04.549 --> 02:06.659
+Give me the story.
+
+02:06.659 --> 02:10.170
+Hey. Okay... Okay... I will.
+
+02:10.170 --> 02:11.170
+Story.
+
+02:11.170 --> 02:14.620
+Uh.. Story is simple.
+
+02:14.620 --> 02:16.590
+The client wanted an invoice.
+
+02:16.590 --> 02:19.900
+So, I generated an invoice.
+
+02:19.900 --> 02:21.419
+It wasn't good enough.
+
+02:21.419 --> 02:24.959
+So, I hacked some little bit of it.
+
+02:24.959 --> 02:28.480
+I changed every time a new client came.
+
+02:28.480 --> 02:29.848
+I had to do it all over again.
+
+02:29.848 --> 02:30.989
+I did that. I did it.
+
+02:30.989 --> 02:33.110
+Then I got really tired of it.
+
+02:33.110 --> 02:36.760
+And that's what led me to all these customizations.
+
+02:36.760 --> 02:38.632
+I want features.
+
+02:38.632 --> 02:43.249
+So, rapid fire questions. Ready? Yep.
+
+02:43.249 --> 02:46.079
+Project management? Yep.
+
+02:46.079 --> 02:48.079
+Format customization? Yes.
+
+02:48.079 --> 02:50.079
+PDF export? Yes.
+
+02:50.079 --> 02:52.079
+Multi-client support? Yes.
+
+02:52.079 --> 02:53.579
+Washing my clothes?
+
+02:53.579 --> 02:54.959
+Yes... No.
+
+02:54.959 --> 02:57.013
+Haa. I was just testing you,
+
+02:57.013 --> 03:00.900
+if you're paying attention or not.
+
+03:00.900 --> 03:04.659
+Logo and signature customization? Yes.
+
+03:04.659 --> 03:06.730
+Multi-currency support? Yes.
+
+03:06.730 --> 03:08.930
+Okay, enough talky or it's just...
+
+03:08.930 --> 03:10.930
+Can you show me a demo that you did?
+
+03:10.930 --> 03:12.950
+Or is it just talky.
+
+03:12.950 --> 03:15.239
+Yes, of course. Demo.
+
+03:15.239 --> 03:16.969
+Okay, demo time.
+
+03:16.969 --> 03:18.909
+Some ingredients for invoicing.
+
+03:18.909 --> 03:21.069
+Org mode, of course.
+
+03:21.069 --> 03:23.849
+Python environment and libraries for Python:
+
+03:23.849 --> 03:25.930
+pandas, tabulate, numbers.
+
+03:25.930 --> 03:28.260
+yasnippet package, very useful.
+
+03:28.260 --> 03:30.969
+And I use for LaTeX, MikTeX packages.
+
+03:30.969 --> 03:34.090
+So, I have a project already set up.
+
+03:34.090 --> 03:36.540
+This is what we have.
+
+03:36.540 --> 03:38.673
+The project is Teaching 2021
+
+03:38.673 --> 03:41.239
+and you can set all this up.
+
+03:41.239 --> 03:43.819
+So let's start with the first and foremost.
+
+03:43.819 --> 03:46.849
+Okay, so we're going to use
+
+03:46.849 --> 03:49.209
+the yasnippet package.
+
+03:49.209 --> 03:52.219
+uh.. um.. sorry, the invoice, okay.
+
+03:52.219 --> 03:54.550
+This one introduced, it gives you this whole...
+
+03:54.550 --> 03:56.377
+generates this whole bunch of code
+
+03:56.377 --> 03:57.150
+based on a template.
+
+03:57.150 --> 03:58.371
+All you're going to do
+
+03:58.371 --> 04:00.939
+is to type out the client's name.
+
+04:00.939 --> 04:02.797
+Okay and that's it.
+
+04:02.797 --> 04:04.469
+That's all there is to it.
+
+04:04.469 --> 04:06.446
+Okay there's a whole bunch of instructions
+
+04:06.446 --> 04:07.199
+that you can follow.
+
+04:07.199 --> 04:09.284
+If it's for the first time,
+
+04:09.284 --> 04:10.549
+use bankinfo.org.
+
+04:10.549 --> 04:14.409
+Let's check out what bankinfo.org involves.
+
+04:14.409 --> 04:16.819
+Okay so you can copy this template
+
+04:16.819 --> 04:19.269
+from my GitHub repository.
+
+04:19.269 --> 04:24.300
+It's basically setup of the LaTeX tags,
+
+04:24.300 --> 04:26.854
+and particularly this text file,
+
+04:26.854 --> 04:28.620
+which is a template.
+
+04:28.620 --> 04:30.469
+There's some personal info
+
+04:30.469 --> 04:32.125
+for all the details that you want.
+
+04:32.125 --> 04:33.814
+Bank information.
+
+04:33.814 --> 04:35.580
+You can look at it in detail
+
+04:35.580 --> 04:40.330
+from my repo. The tax invoice...
+
+04:40.330 --> 04:42.840
+There are some basic constructs.
+
+04:42.840 --> 04:45.809
+You can totally change any of these
+
+04:45.809 --> 04:47.620
+to your liking.
+
+04:47.620 --> 04:50.320
+Okay, so that's bank info.
+
+04:50.320 --> 04:52.200
+Go back. That's the first part.
+
+04:52.200 --> 04:55.540
+The second part is creating a client name.
+
+04:55.540 --> 04:58.420
+So let's look at this setup,
+
+04:58.420 --> 05:00.710
+and I have one created already.
+
+05:00.710 --> 05:02.804
+So, in order to create this,
+
+05:02.804 --> 05:03.880
+all you need to do
+
+05:03.880 --> 05:06.610
+is to use the inv-setup
+
+05:06.610 --> 05:10.300
+invoice setup for your client,
+
+05:10.300 --> 05:12.230
+and it will give you all the information.
+
+05:12.230 --> 05:14.790
+All you need to do is type in here
+
+05:14.790 --> 05:16.410
+and then type in the client's name,
+
+05:16.410 --> 05:18.785
+exactly the same that you see
+
+05:18.785 --> 05:20.210
+as the file name.
+
+05:20.210 --> 05:22.620
+Okay, client one. And that's it.
+
+05:22.620 --> 05:24.250
+You're all set for you.
+
+05:24.250 --> 05:26.218
+Okay, so that's what it looks like.
+
+05:26.218 --> 05:28.043
+All the address and stuff
+
+05:28.043 --> 05:29.710
+filled out here.
+
+05:29.710 --> 05:32.131
+Okay. And then the next one
+
+05:32.131 --> 05:37.010
+is to use the... One time,
+
+05:37.010 --> 05:38.890
+you're going to do the invoice item,
+
+05:38.890 --> 05:40.590
+which is the rate table.
+
+05:40.590 --> 05:42.490
+So let's do the invoice.
+
+05:42.490 --> 05:44.400
+Invoice item...
+
+05:44.400 --> 05:47.080
+This is item master.
+
+05:47.080 --> 05:50.320
+So here again, another place
+
+05:50.320 --> 05:53.060
+where you have to enter the client name,
+
+05:53.060 --> 05:56.780
+and your rate table is ready for use.
+
+05:56.780 --> 05:58.891
+Okay. So that was...
+
+05:58.891 --> 06:00.749
+Now we go to step two,
+
+06:00.749 --> 06:02.510
+which is clock table for reference.
+
+06:02.510 --> 06:04.150
+Okay. Let's go to the clock table.
+
+06:04.150 --> 06:09.660
+I already set up this for ACMEClient1,
+
+06:09.660 --> 06:12.030
+and I give it a tag: billable.
+
+06:12.030 --> 06:13.260
+Okay. We will see that...
+
+06:13.260 --> 06:17.470
+Where have I done that?
+
+06:17.470 --> 06:23.890
+Okay, so that's the client, you know,
+
+06:23.890 --> 06:25.360
+ACMEClient1 table teaching 2021.
+
+06:25.360 --> 06:29.090
+I've clocked it for the previous month.
+
+06:29.090 --> 06:30.090
+That's what you will see.
+
+06:30.090 --> 06:31.090
+Let's see it again.
+
+06:31.090 --> 06:34.840
+Okay. That's... Let's put the instructions.
+
+06:34.840 --> 06:38.110
+And then you go to clock table
+
+06:38.110 --> 06:40.490
+to generate the clock table for the client.
+
+06:40.490 --> 06:42.342
+Okay. So clock table...
+
+06:42.342 --> 06:44.335
+This is only for your reference,
+
+06:44.335 --> 06:45.484
+not going to be exported.
+
+06:45.484 --> 06:50.586
+Here we get a clock table. All right.
+
+06:50.586 --> 06:53.150
+So with this, you get the clock table.
+
+06:53.150 --> 06:55.670
+Okay. Now go into the items part.
+
+06:55.670 --> 06:59.810
+You will see two Python blocks,
+
+06:59.810 --> 07:01.500
+which is what the next instruction says.
+
+07:01.500 --> 07:03.526
+Go into the python block
+
+07:03.526 --> 07:06.180
+and do Control-c c (C-c c).
+
+07:06.180 --> 07:09.860
+Go to the control python source block,
+
+07:09.860 --> 07:12.413
+second one, and do Ctrl-c c...
+
+07:12.413 --> 07:14.490
+Ctrl-c Ctrl-c (C-c C-c) rather.
+
+07:14.490 --> 07:16.028
+and then finally come back
+
+07:16.028 --> 07:18.765
+to Raise Invoice and do dispatcher
+
+07:18.765 --> 07:21.270
+which is exported into PDF.
+
+07:21.270 --> 07:22.718
+Okay, let's do that.
+
+07:22.718 --> 07:27.853
+First one is... I just run this code,
+
+07:27.853 --> 07:30.950
+and it generated this table for me.
+
+07:30.950 --> 07:34.160
+Okay. So it has all the details.
+
+07:34.160 --> 07:35.253
+Now we go in
+
+07:35.253 --> 07:39.560
+the second source code block,
+
+07:39.560 --> 07:41.700
+and does all this...
+
+07:41.700 --> 07:43.530
+And it has generated this stuff.
+
+07:43.530 --> 07:46.335
+Plus, you should note that for beancount,
+
+07:46.335 --> 07:50.795
+it has also generated the block for that.
+
+07:50.795 --> 07:51.775
+It's all in the code.
+
+07:51.775 --> 07:53.820
+You can customize it if you're on Ledger.
+
+07:53.820 --> 07:54.782
+You can customize it
+
+07:54.782 --> 07:55.390
+to the way you want,
+
+07:55.390 --> 07:56.978
+any accounts that you want to change.
+
+07:56.978 --> 07:58.870
+It's all customizable.
+
+07:58.870 --> 08:00.710
+Here, even the currency symbols
+
+08:00.710 --> 08:02.840
+can be changed from INR and Rupees
+
+08:02.840 --> 08:04.681
+to whatever currency you have
+
+08:04.681 --> 08:07.190
+can be changed accordingly.
+
+08:07.190 --> 08:11.304
+I have org-babel-tangle-append code
+
+08:11.304 --> 08:12.650
+that I will share in the...
+
+08:12.650 --> 08:13.872
+I've borrowed it
+
+08:13.872 --> 08:14.889
+from somebody on the Internet,
+
+08:14.889 --> 08:16.440
+so I'll share that as well
+
+08:16.440 --> 08:18.650
+in my GitHub repo.
+
+08:18.650 --> 08:20.830
+Lastly, I just want to share that
+
+08:20.830 --> 08:23.730
+you can fill your GST website
+
+08:23.730 --> 08:24.988
+with these info,
+
+08:24.988 --> 08:26.171
+so you can... You can even put in
+
+08:26.171 --> 08:27.590
+as many entries as you want
+
+08:27.590 --> 08:29.370
+in your yasnippet.
+
+08:29.370 --> 08:30.560
+Customize it the way you want.
+
+08:30.560 --> 08:32.590
+I also added a month later
+
+08:32.590 --> 08:33.820
+due date reminder,
+
+08:33.820 --> 08:36.239
+saying if the invoice is paid or not.
+
+08:36.239 --> 08:37.209
+Okay.
+
+08:37.209 --> 08:42.051
+So, a few tips to end this demo.
+
+08:42.051 --> 08:44.990
+You can customize currency symbol
+
+08:44.990 --> 08:45.860
+and currency words
+
+08:45.860 --> 08:47.540
+according to your own currency.
+
+08:47.540 --> 08:51.269
+I use the European/Indian date format
+
+08:51.269 --> 08:54.980
+which is %d-%m-%Y. You can also...
+
+08:54.980 --> 08:56.816
+The language is Indian English,
+
+08:56.816 --> 08:57.998
+so it will change according--
+
+08:57.998 --> 08:59.860
+the numerals change according to the
+
+08:59.860 --> 09:02.180
+Indian format. Numbering format
+
+09:02.180 --> 09:04.959
+for invoice number is today's date
+
+09:04.959 --> 09:06.620
+followed by client name.
+
+09:06.620 --> 09:07.959
+That's my default.
+
+09:07.959 --> 09:11.120
+You can customize that as well.
+
+09:11.120 --> 09:13.574
+Let's try and export this
+
+09:13.574 --> 09:17.325
+to the subtree. Ctrl-s.
+
+09:17.325 --> 09:20.579
+So that's step number seven.
+
+09:20.579 --> 09:22.029
+And there it is,
+
+09:22.029 --> 09:23.339
+the tax invoice
+
+09:23.339 --> 09:25.870
+for Dr. Wile E. Coyote,
+
+09:25.870 --> 09:27.810
+and with a lovely signature as well.
+
+09:27.810 --> 09:29.990
+[Interviewer:] Well, that's great!
+
+09:29.990 --> 09:34.309
+If I were to try this out, what do I do?
+
+09:34.309 --> 09:36.779
+Go to github.com, into my repository.
+
+09:36.779 --> 09:38.915
+I'll leave my GitHub URL.
+
+09:38.915 --> 09:42.790
+You can download it use it,
+
+09:42.790 --> 09:43.848
+and let me know
+
+09:43.848 --> 09:46.829
+how it pans out for you.
+
+09:46.829 --> 09:47.632
+[Interviewer:] I have spent
+
+00:09:47.632 --> 00:09:49.018
+so much time on this.
+
+00:09:49.018 --> 00:09:50.060
+May I invoice you?
diff --git a/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt b/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt
new file mode 100644
index 00000000..7e9e4bb8
--- /dev/null
+++ b/2021/captions/emacsconf-2021-janitor--a-day-in-the-life-of-a-janitor--stefan-monnier--main.vtt
@@ -0,0 +1,1780 @@
+WEBVTT
+
+00:01.520 --> 00:04.400
+Hello, my name is Stefan Monnier,
+
+00:04.400 --> 00:06.799
+and I'm going to talk to you about--
+
+00:06.799 --> 00:08.240
+well, I'm going to present a bit
+
+00:08.240 --> 00:11.840
+of the life of a janitor.
+
+00:11.840 --> 00:14.050
+So by and large, there's just
+
+00:14.050 --> 00:16.299
+nothing to see here,
+
+00:16.299 --> 00:17.199
+and that's probably
+
+00:17.199 --> 00:18.240
+not super interesting,
+
+00:18.240 --> 00:19.920
+but some of you might actually like to
+
+00:19.920 --> 00:00:23.050
+see how I work, so I figured why not.
+
+00:25.359 --> 00:27.279
+Usually what I do just doesn't make any
+
+00:27.279 --> 00:00:29.920
+any significant difference,
+
+00:00:29.920 --> 00:00:32.160
+and so I basically take existing code
+
+00:00:32.160 --> 00:00:35.040
+that's working, and I try to change it
+
+00:00:35.040 --> 00:00:37.680
+hopefully without breaking it too much
+
+00:00:37.680 --> 00:00:40.079
+and make it slightly more...
+
+00:40.079 --> 00:42.719
+you know, following some of the more
+
+00:42.719 --> 00:44.640
+modern style, let's say,
+
+00:44.640 --> 00:00:46.719
+and sometimes along the way,
+
+00:00:46.719 --> 00:00:50.399
+it actually fixes some bugs.
+
+00:50.399 --> 00:00:51.983
+More concretely, the kind of things
+
+00:00:51.983 --> 00:00:54.079
+that I do is basically activate
+
+00:00:54.079 --> 00:00:54.480
+lexical scoping--
+
+00:54.480 --> 00:56.239
+that's really my main goal usually--
+
+00:56.239 --> 00:58.960
+but also do things like convert
+
+00:58.960 --> 00:01:00.719
+from `cl` to `cl-lib`,
+
+00:01:00.719 --> 00:01:01.440
+sometimes I have to
+
+01:01.440 --> 01:03.760
+fix some compilation dependencies,
+
+01:03.760 --> 01:07.280
+I might convert from `defadvice` to `advice-add`,
+
+01:07.280 --> 01:11.439
+and many of the things--
+
+01:11.439 --> 00:01:13.119
+in terms of number of changes,
+
+00:01:13.119 --> 00:01:14.000
+most of them are actually
+
+00:01:14.000 --> 00:01:16.560
+changing `quote fun` to `hash quote fun`
+
+00:01:16.560 --> 00:01:17.360
+because I prefer it,
+
+01:17.360 --> 00:01:19.920
+but also it often helps me
+
+00:01:19.920 --> 00:01:21.439
+have a better understanding
+
+00:01:21.439 --> 00:01:23.920
+of which function is called where,
+
+01:23.920 --> 01:26.799
+and so the warnings I get from it
+
+01:26.799 --> 01:28.799
+sometimes help me. You look concretely...
+
+01:28.799 --> 00:01:30.880
+it's not nothing really clear;
+
+00:01:30.880 --> 00:01:33.360
+it's more in terms of helping me
+
+00:01:33.360 --> 00:01:35.759
+have a mental image
+
+00:01:35.759 --> 00:01:39.439
+of how the package works.
+
+01:39.439 --> 01:42.880
+So let's take a look.
+
+01:42.880 --> 00:01:45.840
+I'm going to start with
+
+00:01:45.840 --> 00:01:46.799
+the package `heap`,
+
+00:01:46.799 --> 00:01:50.560
+which I saw had a few weird things in it,
+
+00:01:50.560 --> 00:01:53.680
+so I'm going to compile it.
+
+01:53.680 --> 01:55.600
+That's basically the way the way I work,
+
+01:55.600 --> 00:01:57.840
+right. I take a package.
+
+00:01:57.840 --> 00:02:00.479
+I just pass it to the byte compiler.
+
+00:02:00.479 --> 00:02:02.159
+I do that by just having
+
+02:02.159 --> 02:04.560
+a clone of the whole
+
+02:04.560 --> 00:02:06.799
+GNU ELPA repository,
+
+00:02:06.799 --> 00:02:10.000
+and so that's why I built them.
+
+02:10.000 --> 02:11.520
+I use the build rules
+
+02:11.520 --> 02:15.120
+from the GNU ELPA repository.
+
+02:15.120 --> 00:02:16.720
+These build rules enforce--
+
+00:02:16.720 --> 00:02:17.680
+make sure that the files
+
+00:02:17.680 --> 00:02:19.680
+are compiled in a clean environment
+
+00:02:19.680 --> 00:02:21.920
+so you get fairly good warnings.
+
+00:02:21.920 --> 00:02:23.680
+If you look at the warnings you see here,
+
+00:02:23.680 --> 00:02:24.720
+there's a lot of things
+
+00:02:24.720 --> 00:02:26.480
+which are completely irrelevant,
+
+00:02:26.480 --> 00:02:28.400
+which are due to details
+
+00:02:28.400 --> 00:02:30.319
+of the way I have my Emacs set up
+
+00:02:30.319 --> 00:02:31.599
+and some of the local changes
+
+00:02:31.599 --> 00:02:34.319
+I had in it so, you know,
+
+00:02:34.319 --> 00:02:35.280
+there's no point
+
+00:02:35.280 --> 00:02:37.920
+paying too much attention to it,
+
+02:37.920 --> 02:40.400
+but here we have a first warning.
+
+02:40.400 --> 02:42.959
+We see that this is using `cl`,
+
+02:42.959 --> 02:45.040
+so we want to change this to `cl-lib`,
+
+02:45.040 --> 00:02:46.879
+but that also means
+
+00:02:46.879 --> 00:02:48.400
+that we may have a new dependency
+
+00:02:48.400 --> 00:02:49.920
+on the `cl-lib` package,
+
+00:02:49.920 --> 00:02:51.120
+so we have to go check
+
+00:02:51.120 --> 00:02:52.000
+the start of the file
+
+00:02:52.000 --> 00:02:54.080
+to see if it already declares
+
+00:02:54.080 --> 00:02:56.800
+some dependency, and we see it doesn't,
+
+02:56.800 --> 00:03:00.640
+not even on a on a recent-enough Emacs,
+
+00:03:00.640 --> 00:03:02.325
+so we have to add--
+
+00:03:02.325 --> 00:03:05.360
+sorry, that's not going very well...
+
+03:05.360 --> 03:06.480
+oh...
+
+03:06.480 --> 03:08.560
+okay, we're going to get there somewhere...
+
+03:08.560 --> 03:13.200
+somehow...
+
+03:13.200 --> 03:18.020
+oh, that still wasn't it, wow, okay--
+
+03:20.480 --> 03:22.159
+and along the way...
+
+03:22.159 --> 00:03:24.159
+Of course, since we converted to `cl-lib`,
+
+00:03:24.159 --> 00:03:26.159
+we have to update the uses
+
+00:03:26.159 --> 00:03:29.840
+so `defstruct` shouldn't be used anymore.
+
+03:29.840 --> 03:31.599
+We may want to reindent this
+
+03:31.599 --> 03:36.000
+to get something a bit cleaner.
+
+03:37.040 --> 00:03:40.589
+We have here a missing quote...
+
+00:03:40.589 --> 00:03:41.920
+hash, sorry.
+
+03:41.920 --> 00:03:46.480
+We have `decf`, so `decf` is here,
+
+03:46.480 --> 00:03:48.000
+and that needs to be replaced
+
+00:03:48.000 --> 00:03:49.920
+with `cl-decf`.
+
+00:03:49.920 --> 00:03:51.120
+Sometimes it's worth doing
+
+00:03:51.120 --> 00:03:53.360
+a search-and-replace.
+
+00:03:53.360 --> 00:03:54.799
+Here I see there's only two,
+
+00:03:54.799 --> 00:03:57.760
+so it's not worth the trouble;
+
+03:57.760 --> 00:04:00.711
+I just do it by hand, and that's it.
+
+00:04:00.711 --> 00:04:02.000
+Well, that was easy.
+
+04:02.000 --> 04:05.000
+So let's recompile, see what it says.
+
+04:10.159 --> 04:12.959
+Ah, this is clean. Perfect!
+
+04:12.959 --> 04:15.000
+Let's.. we can go see...
+
+04:15.000 --> 04:17.280
+There is another one I had.
+
+04:17.280 --> 04:20.239
+Was it `counsel`, I think. Yes.
+
+04:20.239 --> 00:04:24.160
+So also I saw some funny things
+
+00:04:24.160 --> 00:04:24.320
+going on here.
+
+04:24.320 --> 00:04:26.479
+So I'm going to do
+
+00:04:26.479 --> 00:04:31.040
+the same procedure as before:
+
+00:04:31.040 --> 00:04:32.800
+I just compile the file
+
+00:04:32.800 --> 00:04:35.000
+and look at the warnings.
+
+04:38.000 --> 04:40.479
+Oh, we have many more here.
+
+04:40.479 --> 04:43.120
+So let's see...
+
+04:43.120 --> 00:04:46.504
+Okay, so we have missing quotes--
+
+00:04:46.504 --> 00:04:49.240
+oh, hashes. They're not really missing;
+
+04:49.240 --> 04:54.639
+it's just a personal preference.
+
+04:54.639 --> 04:57.440
+Oh, here... here's an important one:
+
+04:57.440 --> 04:59.280
+so as you know,
+
+04:59.280 --> 05:00.639
+if you look at the top of the file,
+
+05:00.639 --> 00:05:02.240
+you see that here
+
+00:05:02.240 --> 00:05:04.960
+it says it's using lexical binding,
+
+05:04.960 --> 05:07.120
+yet it's not fully using lexical binding,
+
+05:07.120 --> 00:05:08.960
+because as we just saw,
+
+00:05:08.960 --> 00:05:11.039
+there's a call to the `eval` function
+
+00:05:11.039 --> 00:05:11.680
+with only one argument,
+
+05:11.680 --> 05:13.280
+which means the second argument is nil,
+
+05:13.280 --> 05:16.880
+which means that the expression read
+
+05:16.880 --> 00:05:19.520
+by `read` here is going to be evaluated
+
+05:19.520 --> 00:05:22.160
+using the old dialects,
+
+00:05:22.160 --> 00:05:24.240
+which is only dynamic scoping.
+
+00:05:24.240 --> 00:05:25.680
+So here I like to just change this
+
+00:05:25.680 --> 00:05:26.800
+to use lexical scoping,
+
+05:26.800 --> 00:05:28.080
+which in most cases
+
+00:05:28.080 --> 00:05:29.680
+just doesn't make any difference.
+
+00:05:29.680 --> 00:05:30.870
+It just makes me feel better.
+
+05:35.919 --> 05:40.160
+So there's lots of those hashes
+
+05:40.160 --> 05:41.759
+all over the place.
+
+05:43.680 --> 05:45.680
+It's not strictly necessary, as you know,
+
+05:45.680 --> 05:51.500
+but I'm just going to add them anyway.
+
+05:52.479 --> 00:05:53.199
+Here we see
+
+00:05:53.199 --> 00:05:54.800
+it's not going to warn me here
+
+00:05:54.800 --> 00:05:55.759
+because it doesn't know
+
+00:05:55.759 --> 00:05:57.600
+that `ivy-make-magic-action`
+
+00:05:57.600 --> 00:05:58.400
+takes a function,
+
+00:05:58.400 --> 00:06:02.319
+but it's a pretty good guess that it does.
+
+06:12.319 --> 06:14.479
+And here's some more.
+
+06:14.479 --> 06:16.080
+What else do we have?
+
+06:16.080 --> 06:19.120
+Is that all we have here?
+
+06:19.120 --> 06:21.440
+Well, looks like it. Oh, I see a few...
+
+06:21.440 --> 06:27.680
+a few more here...
+
+06:27.680 --> 06:30.639
+and one more.
+
+06:30.639 --> 06:33.039
+And oh, this is more interesting.
+
+06:33.039 --> 06:35.280
+So here we have a use of `defadvice`,
+
+06:35.280 --> 06:37.440
+so if we go back
+
+06:37.440 --> 06:38.479
+to the beginning of the file,
+
+06:40.720 --> 06:42.880
+we see that it actually depends
+
+06:42.880 --> 00:06:47.360
+on Emacs 24.5, so it actually has
+
+06:47.360 --> 00:06:49.280
+the new advice system available
+
+00:06:49.280 --> 00:06:51.520
+without having to add any dependency,
+
+00:06:51.520 --> 00:06:53.599
+so there's really no good reason
+
+00:06:53.599 --> 00:06:54.880
+to keep this.
+
+06:54.880 --> 00:06:56.160
+So we just convert this
+
+00:06:56.160 --> 00:06:58.560
+to an `advice-add`,
+
+06:58.560 --> 00:06:59.840
+so it just says, you know,
+
+00:06:59.840 --> 00:07:02.319
+this is the function that's advised.
+
+07:02.319 --> 07:04.560
+This was a `before` advice.
+
+07:04.560 --> 07:05.500
+The `before` advice, sometimes,
+
+07:05.500 --> 07:08.479
+when we convert it to `advice-add`,
+
+07:08.479 --> 07:11.199
+need to be converted to `around` advice.
+
+07:11.199 --> 07:13.280
+This is when the function
+
+07:13.280 --> 07:15.840
+looks or modifies the argument.
+
+07:15.840 --> 07:18.639
+In this case, if I look at it,
+
+07:18.639 --> 07:20.319
+I see it doesn't seem to be using
+
+07:20.319 --> 07:21.280
+the arguments at all.
+
+07:21.280 --> 00:07:25.280
+So I'm just going to keep it
+
+00:07:25.280 --> 00:07:27.520
+as a `before` advice.
+
+07:27.520 --> 00:07:28.672
+And we have to give it a name.
+
+00:07:28.672 --> 00:07:30.880
+Well, we don't really have to,
+
+07:30.880 --> 07:32.800
+but it's convenient to give it a name
+
+07:32.800 --> 07:34.800
+to the new function.
+
+07:34.800 --> 00:07:36.880
+So here, they actually had
+
+00:07:36.880 --> 00:07:38.080
+given a name to the advice,
+
+00:07:38.080 --> 00:07:39.599
+so we're going to keep it,
+
+00:07:39.599 --> 00:07:41.440
+and indeed it's the only function.
+
+00:07:41.440 --> 00:07:43.360
+This name is not used as a function,
+
+00:07:43.360 --> 00:07:44.160
+so we can use it
+
+00:07:44.160 --> 00:07:46.960
+as the name of the function.
+
+07:46.960 --> 00:07:49.039
+I'm going to add a dash here
+
+00:07:49.039 --> 00:07:51.120
+because I think this function
+
+00:07:51.120 --> 00:07:53.039
+is really fundamentally
+
+00:07:53.039 --> 00:07:54.639
+an internal function.
+
+07:54.639 --> 07:56.720
+So here I just said I add the advice,
+
+07:56.720 --> 07:58.000
+but I still need to actually
+
+07:58.000 --> 07:59.800
+define the function.
+
+08:02.879 --> 00:08:04.160
+So that's what I do here,
+
+00:08:04.160 --> 00:08:06.500
+and we need here to list the arguments
+
+08:06.500 --> 08:08.240
+that are going to be taken.
+
+08:08.240 --> 00:08:09.199
+I don't know what these are,
+
+00:08:09.199 --> 00:08:10.960
+but I know we're not using them,
+
+00:08:10.960 --> 00:08:13.759
+so we'll just accept anything,
+
+08:13.759 --> 08:16.560
+and that will do the trick.
+
+08:16.560 --> 08:19.199
+It's a future-proof as well,
+
+08:19.199 --> 08:22.240
+so that should work.
+
+08:22.240 --> 00:08:24.160
+Oh, here we have another, so it's
+
+00:08:24.160 --> 00:08:29.919
+basically the same story, I think.
+
+08:29.919 --> 00:08:31.599
+It's a `before` advice as well.
+
+00:08:31.599 --> 00:08:32.959
+It doesn't seem to be using
+
+00:08:32.959 --> 00:08:35.599
+the argument at all,
+
+08:35.599 --> 00:08:38.596
+and let's see if this name is not taken.
+
+00:08:38.596 --> 00:08:43.360
+Yeah, good, so we can just do the same:
+
+08:43.360 --> 08:46.880
+turn this into an `advice-add`...
+
+08:46.880 --> 08:48.300
+`before`...
+
+08:53.040 --> 08:55.000
+I just add a dash here.
+
+09:02.480 --> 00:09:05.440
+And same thing--
+
+00:09:05.440 --> 00:09:06.959
+a function that just takes...
+
+09:06.959 --> 09:08.240
+because I don't know which arguments
+
+09:08.240 --> 09:10.480
+these are so...
+
+09:10.480 --> 09:14.640
+I think that should do the trick.
+
+09:14.640 --> 00:09:16.080
+Actually, we see that this function
+
+00:09:16.080 --> 00:09:18.560
+is very similar to the other one.
+
+09:18.560 --> 09:23.000
+Let's look at the two side-by-side...
+
+09:31.519 --> 00:09:33.055
+...it really is--
+
+00:09:33.055 --> 00:09:36.097
+oh, it's not exactly identical...
+
+00:09:36.097 --> 00:09:39.120
+it's, you know, we could try
+
+09:39.120 --> 09:41.680
+to merge them into a single function,
+
+09:41.680 --> 09:43.279
+but it's probably not worth the trouble
+
+09:43.279 --> 09:45.920
+so we can keep it this way.
+
+09:45.920 --> 09:48.720
+Okay, next warning: an `eval` again,
+
+09:48.720 --> 09:50.640
+so I could just add `t` here,
+
+09:50.640 --> 00:09:55.120
+but if you look at it a bit more,
+
+00:09:55.120 --> 00:09:56.000
+you see that the code
+
+00:09:56.000 --> 00:09:57.760
+we're going to evaluate
+
+09:57.760 --> 00:09:59.279
+using either lexical scoping
+
+00:09:59.279 --> 00:10:00.560
+or dynamic scoping
+
+00:10:00.560 --> 00:10:03.440
+is actually just evaluating a symbol,
+
+00:10:03.440 --> 00:10:06.240
+since we just call an `intern` here.
+
+10:06.240 --> 00:10:07.839
+So instead of replacing this
+
+00:10:07.839 --> 00:10:09.279
+by adding an argument,
+
+00:10:09.279 --> 00:10:11.680
+I'm just going to call `symbol-value`
+
+00:10:11.680 --> 00:10:12.640
+because that's exactly
+
+00:10:12.640 --> 00:10:14.480
+what we need to do here, right.
+
+00:10:14.480 --> 00:10:16.320
+I call this "strength reduction,"
+
+00:10:16.320 --> 00:10:17.200
+and I'm using
+
+00:10:17.200 --> 00:10:19.680
+a more primitive function instead,
+
+00:10:19.680 --> 00:10:23.200
+which does just what we need,
+
+10:23.200 --> 10:25.680
+and this one knows that it has to be
+
+10:25.680 --> 00:10:30.640
+accessed by dynamic scoping, of course.
+
+10:30.640 --> 00:10:32.959
+Here I have a `kmacro-ring`,
+
+00:10:32.959 --> 00:10:35.600
+so here I have a function that uses--
+
+10:35.600 --> 00:10:37.360
+`kmacro-ring` comes from
+
+00:10:37.360 --> 00:10:39.760
+the `kmacro` package, obviously,
+
+10:39.760 --> 10:41.600
+and we probably don't want to
+
+10:41.600 --> 10:42.959
+`require` `kmacro` package
+
+10:42.959 --> 00:10:48.560
+all over the place in `counsel` itself,
+
+10:48.560 --> 00:10:50.240
+because `counsel` can be used
+
+00:10:50.240 --> 00:10:53.279
+without `kmacro`.
+
+10:53.279 --> 00:10:55.200
+So I think we're just going to add
+
+00:10:55.200 --> 00:11:04.000
+a `defvar` to silence the warning.
+
+11:05.519 --> 00:11:10.720
+And we have several more. So we have
+
+11:10.720 --> 00:11:14.000
+`initial-counter-value`. (Sorry.)
+
+11:20.480 --> 11:23.360
+We have `kmacro-counter`.
+
+11:23.360 --> 11:25.760
+Do we have more?
+
+11:25.760 --> 11:28.560
+Oh, yes, we do.
+
+11:28.560 --> 11:35.040
+We have `kmacro-counter-value-start`
+
+11:35.040 --> 11:40.839
+and `kmacro-counter-format-start`.
+
+11:40.839 --> 11:43.920
+Okay.
+
+11:45.040 --> 11:50.160
+I hope this is it.
+
+11:50.160 --> 11:52.880
+`kmacro-ring`, `counter`, `ring`...
+
+11:52.880 --> 11:54.959
+blah blah blah.
+
+11:54.959 --> 00:12:00.240
+Here we have another one, `quote`.
+
+12:00.240 --> 12:03.279
+Here we have another hash missing.
+
+12:03.279 --> 12:06.079
+It's not missing...
+
+12:06.079 --> 12:08.000
+but same thing here.
+
+12:12.079 --> 00:12:16.560
+Okay, this is a function from `kmacro`.
+
+12:16.560 --> 00:12:18.079
+We could declare it
+
+00:12:18.079 --> 00:12:20.880
+just to silence the warning
+
+12:20.880 --> 00:12:22.320
+although we don't actually...
+
+00:12:22.320 --> 00:12:24.480
+normally, when we declare such things--
+
+12:24.480 --> 00:12:25.279
+same thing with variables--
+
+00:12:25.279 --> 00:12:27.300
+we should try to make sure that indeed
+
+12:27.300 --> 12:28.760
+by the time the code is executed,
+
+12:28.760 --> 12:30.800
+the function will be available,
+
+12:30.800 --> 00:12:32.800
+and then very often is
+
+00:12:32.800 --> 00:12:34.320
+because there's a `require`
+
+00:12:34.320 --> 00:12:35.680
+sometimes inside a function,
+
+00:12:35.680 --> 00:12:36.399
+and so we should put
+
+00:12:36.399 --> 00:12:37.680
+the `declare` function
+
+00:12:37.680 --> 00:12:39.920
+right after the `require`,
+
+00:12:39.920 --> 00:12:41.839
+but I don't think it's the case here.
+
+12:41.839 --> 00:12:46.399
+So I'm just going to to add this.
+
+12:46.399 --> 12:49.040
+I know this comes from `kmacro`,
+
+12:49.040 --> 00:12:53.500
+and I could actually check the arguments.
+
+12:56.320 --> 00:12:58.480
+It's just taking an optional argument
+
+00:12:58.480 --> 00:13:00.880
+so I'm going to put it there,
+
+00:13:00.880 --> 00:13:06.720
+so we have it complete.
+
+13:06.720 --> 13:10.800
+Okay, we can just recompile,
+
+13:10.800 --> 00:13:14.800
+see what is left
+
+00:13:14.800 --> 00:13:17.760
+from those warnings we've fixed,
+
+00:13:17.760 --> 00:13:21.360
+and we may have new warnings, in any case,
+
+00:13:21.360 --> 00:13:25.440
+because especially when we add the hashes,
+
+00:13:25.440 --> 00:13:29.519
+it tends to give us more warnings.
+
+13:29.519 --> 00:13:31.200
+So we have two more functions
+
+00:13:31.200 --> 00:13:34.560
+which are not known.
+
+13:34.560 --> 13:39.440
+You can just add them here...
+
+13:39.440 --> 13:44.720
+`set-format "kmacro"`
+
+13:44.720 --> 13:48.160
+and same thing for `set-counter`.
+
+13:48.160 --> 13:50.000
+Okay, whatever.
+
+13:54.959 --> 00:13:57.120
+This just takes a `format` argument,
+
+00:13:57.120 --> 00:14:05.920
+and this one just takes an `arg` argument.
+
+14:05.920 --> 14:10.800
+Okay, so let's see what this says now.
+
+14:10.800 --> 14:15.519
+Hopefully, there's no warnings anymore.
+
+14:15.519 --> 14:17.839
+We're done. Okay!
+
+14:17.839 --> 00:14:20.079
+Okay, the last one we're going to see
+
+00:14:20.079 --> 00:14:23.440
+is in `enwc`, I saw the other day...
+
+14:23.440 --> 14:26.240
+I think I have it here...
+
+14:27.760 --> 14:29.680
+here we go, yes...
+
+14:29.680 --> 14:32.800
+so `enwc` is an interesting package here
+
+14:32.800 --> 14:35.680
+because it has-- as you can see it has--
+
+14:35.680 --> 14:37.760
+it's lexical binding,
+
+14:37.760 --> 14:39.760
+but actually some of the files in it
+
+14:39.760 --> 14:42.320
+do not use lexical binding,
+
+14:42.320 --> 14:44.320
+so it has been partly converted
+
+14:44.320 --> 14:46.160
+but not completely.
+
+14:46.160 --> 00:14:49.920
+So here I'm going to
+
+00:14:49.920 --> 00:14:54.160
+enable lexical binding.
+
+14:54.160 --> 14:58.880
+I have also, I think, in `cm`...
+
+14:58.880 --> 15:01.199
+yes...
+
+15:01.199 --> 15:04.000
+so I enable it here,
+
+15:04.000 --> 15:07.360
+and also, I think, `test`.
+
+15:07.360 --> 00:15:09.360
+The test files are often
+
+00:15:09.360 --> 00:15:11.839
+somewhat problematic
+
+00:15:11.839 --> 00:15:15.199
+because very often they're not quite
+
+15:15.199 --> 15:18.880
+as heavily tested themselves, actually,
+
+15:18.880 --> 00:15:20.320
+or they only run
+
+00:15:20.320 --> 00:15:22.160
+in very specific contexts,
+
+00:15:22.160 --> 00:15:24.399
+and so they may have problems
+
+00:15:24.399 --> 00:15:27.360
+with missing `requires` or using packages
+
+00:15:27.360 --> 00:15:29.199
+which are not explicitly in the dependencies
+
+15:29.199 --> 15:31.279
+and those kinds of things.
+
+15:31.279 --> 15:33.360
+I think this is not the case here,
+
+15:33.360 --> 15:35.440
+but we'll see.
+
+15:35.440 --> 15:38.880
+`enwc`...
+
+15:38.880 --> 15:42.320
+Yes, I want to save this one and that one.
+
+15:42.320 --> 15:45.000
+Let's see what it says.
+
+15:47.199 --> 15:51.440
+Okay, unused lexical variable `x`...
+
+15:51.440 --> 15:52.240
+`x`...
+
+15:52.240 --> 15:57.120
+Yes, so here we have an unused variable,
+
+15:57.120 --> 15:58.320
+and indeed, it's not used.
+
+15:58.320 --> 16:00.880
+It probably had to be named before
+
+16:00.880 --> 16:04.079
+because it was...
+
+16:04.079 --> 00:16:05.120
+with dynamic scoping,
+
+00:16:05.120 --> 00:16:06.399
+the `dotimes` requires
+
+00:16:06.399 --> 00:16:08.160
+the variable to be named, actually,
+
+00:16:08.160 --> 00:16:10.399
+because it's used internally somehow,
+
+16:10.399 --> 00:16:11.600
+but with lexical scoping,
+
+00:16:11.600 --> 00:16:12.320
+that's not the case,
+
+00:16:12.320 --> 00:16:14.079
+so we can just put an underscore.
+
+16:14.079 --> 00:16:15.199
+I'm going to change this
+
+00:16:15.199 --> 00:16:16.880
+because I really don't like
+
+16:16.880 --> 16:19.000
+this three-part `dotimes`.
+
+16:19.000 --> 00:16:21.360
+I prefer to have
+
+00:16:21.360 --> 00:16:23.040
+the return value at the end.
+
+16:23.040 --> 00:16:26.480
+It's sort of stashed hidden in the middle.
+
+16:26.480 --> 16:29.680
+That's just a personal preference.
+
+16:29.680 --> 16:31.920
+Okay, what else... we have a `widget`.
+
+16:31.920 --> 16:34.000
+Okay, this argument here says that
+
+16:34.000 --> 16:37.000
+it's not used, so if we look at...
+
+16:44.320 --> 00:16:47.040
+We were here, right? Yes. Right here.
+
+00:16:47.040 --> 00:16:50.480
+Indeed, `widget` is really not used.
+
+16:50.480 --> 16:51.230
+(Sorry.)
+
+16:53.600 --> 00:16:55.279
+Here's what I get for using
+
+00:16:55.279 --> 00:16:58.320
+a somewhat vanilla configuration of Emacs,
+
+16:58.320 --> 17:01.279
+compared to the one I use...
+
+17:01.279 --> 17:04.000
+the personally tricked one.
+
+17:04.000 --> 17:05.439
+Actually, I can...
+
+17:05.439 --> 17:07.919
+so we can just mark this argument
+
+17:07.919 --> 17:09.360
+as unused,
+
+17:09.360 --> 17:11.199
+and we don't want to remove the argument
+
+17:11.199 --> 00:17:12.480
+probably, or maybe we could;
+
+00:17:12.480 --> 00:17:15.679
+we could see where the function is used,
+
+17:15.679 --> 00:17:18.542
+and here we see that it's passed
+
+00:17:18.542 --> 00:17:20.959
+to a higher-order function,
+
+17:20.959 --> 17:24.480
+basically, so it's going to be...
+
+17:24.480 --> 00:17:25.360
+We can't really change
+
+00:17:25.360 --> 00:17:25.760
+the calling convention
+
+17:25.760 --> 17:27.120
+so we have to mark the argument
+
+17:27.120 --> 17:29.600
+as being just an unused argument,
+
+17:29.600 --> 17:34.000
+but we're going to still receive it.
+
+17:34.000 --> 00:17:35.360
+And here it says same thing:
+
+00:17:35.360 --> 00:17:38.240
+that `widget` is not used in this function.
+
+17:38.240 --> 17:40.000
+Let's take a look at the function.
+
+17:40.000 --> 17:42.400
+Indeed it seems it's not used,
+
+17:42.400 --> 17:44.000
+and so we're just going to mark it
+
+17:44.000 --> 17:46.480
+as unused.
+
+17:46.480 --> 00:17:48.320
+This is the part of the conversion
+
+00:17:48.320 --> 00:17:49.200
+to lexical scoping
+
+00:17:49.200 --> 00:17:51.280
+that's somewhat tricky sometimes
+
+00:17:51.280 --> 00:17:53.760
+because we don't really know
+
+00:17:53.760 --> 00:17:56.240
+whether this variable should be using
+
+00:17:56.240 --> 00:17:58.559
+lexical scoping or dynamic scoping.
+
+17:58.559 --> 00:18:00.480
+The fact that it's not used
+
+00:18:00.480 --> 00:18:02.320
+is a hint that there's probably
+
+00:18:02.320 --> 00:18:03.679
+something going on,
+
+18:03.679 --> 00:18:04.960
+so either it's not used
+
+00:18:04.960 --> 00:18:06.400
+because it should be using
+
+00:18:06.400 --> 00:18:07.200
+dynamic scoping--
+
+00:18:07.200 --> 00:18:08.080
+it is going to be used
+
+00:18:08.080 --> 00:18:10.480
+by some other code somewhere else--
+
+18:10.480 --> 00:18:11.840
+or it's really not used
+
+00:18:11.840 --> 00:18:14.000
+because it's just not used, right,
+
+00:18:14.000 --> 00:18:16.320
+and so we need to distinguish the two,
+
+00:18:16.320 --> 00:18:20.880
+and for that, I basically use
+
+00:18:20.880 --> 00:18:22.240
+my own judgment.
+
+18:22.240 --> 18:24.880
+This is based typically on the fact that
+
+18:24.880 --> 00:18:27.760
+this is just a very short name,
+
+00:18:27.760 --> 00:18:32.000
+and most local identifiers use short names,
+
+18:32.000 --> 18:34.400
+whereas item values used for dynamic scoping
+
+18:34.400 --> 18:36.720
+typically have a package prefix
+
+18:36.720 --> 00:18:37.679
+or something like this.
+
+00:18:37.679 --> 00:18:38.960
+So the fact that it's a short name
+
+00:18:38.960 --> 00:18:40.880
+gives me a good idea.
+
+18:40.880 --> 00:18:41.520
+Here in this case,
+
+00:18:41.520 --> 00:18:42.640
+I actually look at the code,
+
+00:18:42.640 --> 00:18:45.600
+and we see that there's nothing in here
+
+18:45.600 --> 00:18:47.039
+that may actually refer
+
+00:18:47.039 --> 00:18:48.080
+to this variable `widget`,
+
+00:18:48.080 --> 00:18:49.280
+so I think it's safe,
+
+18:49.280 --> 00:18:51.360
+but in the general case,
+
+00:18:51.360 --> 00:18:54.400
+we may look here and be surprised,
+
+18:54.400 --> 00:18:55.760
+or, you know, you may call out
+
+00:18:55.760 --> 00:18:58.320
+the functions which may themselves end up
+
+18:58.320 --> 19:00.080
+referring to this variable.
+
+19:00.080 --> 19:02.640
+So sometimes we need to investigate a
+
+19:02.640 --> 19:03.840
+little more.
+
+19:03.840 --> 19:05.919
+We are most of the time not completely sure
+
+19:05.919 --> 19:07.520
+whether the result is correct or not,
+
+19:07.520 --> 00:19:09.520
+of course, so the other thing
+
+00:19:09.520 --> 00:19:10.640
+you may want to check
+
+00:19:10.640 --> 00:19:12.160
+is also uses of things
+
+00:19:12.160 --> 00:19:14.400
+like `eval` or `symbol-value`.
+
+19:14.400 --> 19:17.200
+So it's often a good idea to search,
+
+19:17.200 --> 00:19:18.799
+and you do a search of `eval`,
+
+00:19:18.799 --> 00:19:21.490
+and you see here it's using `eval`.
+
+00:19:21.490 --> 00:19:24.160
+Hmmm... Okay, so what does this `eval` do?
+
+19:24.160 --> 00:19:25.760
+It's evaluating expressions
+
+00:19:25.760 --> 00:19:28.240
+that appear in `args` here
+
+19:28.240 --> 19:31.840
+so you can see where those args come from,
+
+19:31.840 --> 00:19:35.120
+and we see here, these are expressions
+
+00:19:35.120 --> 00:19:36.840
+that don't do anything very special.
+
+19:36.840 --> 19:41.520
+It's just using `make-supplicant-choice`,
+
+19:41.520 --> 19:44.960
+and `make-supplicant-choice` itself
+
+19:44.960 --> 19:47.120
+just doesn't refer to `widget`, for example,
+
+19:47.120 --> 19:50.000
+so you know we should be safe,
+
+19:50.000 --> 19:52.559
+but while I'm here...
+
+19:52.559 --> 19:53.840
+okay, well, then we can do that later.
+
+19:53.840 --> 19:55.679
+Well, that's actually the next warning,
+
+19:55.679 --> 00:19:58.080
+exactly. So here we see that this is
+
+00:19:58.080 --> 00:20:00.000
+using the dynamically-scoped dialect,
+
+00:20:00.000 --> 00:20:02.799
+so we convert it to lexical-scoped.
+
+20:02.799 --> 20:04.559
+Of course, this may introduce errors,
+
+20:04.559 --> 20:07.200
+but we hope it doesn't.
+
+20:07.200 --> 20:08.880
+And actually, it was a good change here,
+
+20:08.880 --> 20:12.080
+because if you see again,
+
+20:12.080 --> 00:20:14.240
+this actually evals expressions
+
+00:20:14.240 --> 00:20:16.159
+that appear here in `args`,
+
+20:16.159 --> 20:18.480
+and so these are expressions
+
+20:18.480 --> 20:21.039
+that are passed here.
+
+20:21.039 --> 20:23.679
+So this expression here used to be
+
+20:23.679 --> 00:20:24.480
+evaluated with dynamic scoping,
+
+00:20:24.480 --> 00:20:28.000
+even though it appears to be normal code
+
+00:20:28.000 --> 00:20:29.760
+within this file, which says
+
+00:20:29.760 --> 00:20:32.559
+it's using lexical scoping,
+
+20:32.559 --> 20:34.400
+and so there are some remnants
+
+20:34.400 --> 20:36.640
+of dynamic scoping all over the place
+
+20:36.640 --> 00:20:37.840
+in Emacs still, because we have
+
+00:20:37.840 --> 00:20:43.679
+those calls of `eval` with a nil argument.
+
+20:44.880 --> 20:47.039
+Here we have `cons`...
+
+20:47.039 --> 20:50.400
+that needs to be `hash quoted`.
+
+20:52.400 --> 00:20:54.080
+Oh, and we have a reference
+
+00:20:54.080 --> 00:20:56.720
+to this variable `enwc-edit-id'.
+
+00:20:56.720 --> 00:20:57.520
+So this is clearly
+
+00:20:57.520 --> 00:21:00.400
+a dynamic-scoped variable.
+
+21:00.400 --> 21:02.000
+We can either add a `defvar`
+
+21:02.000 --> 21:03.440
+to silence the warning,
+
+21:03.440 --> 00:21:06.799
+or maybe we can `require` the package.
+
+21:06.799 --> 21:10.080
+The file that defines it...
+
+21:14.080 --> 21:17.360
+So let's see where it's defined.
+
+21:17.360 --> 21:21.200
+Here it's defined in `enwc.el`,
+
+21:21.200 --> 00:21:23.440
+so I'm going to try just to add
+
+00:21:23.440 --> 00:21:25.039
+the dependency.
+
+21:25.039 --> 00:21:27.840
+I'm going to `require` here. This is risky.
+
+21:27.840 --> 21:30.159
+We'll see when we compile a file later,
+
+21:30.159 --> 21:32.320
+we may get a circular dependency
+
+21:32.320 --> 21:34.720
+because of it.
+
+21:34.720 --> 21:36.320
+If that's the case, we're going to
+
+21:36.320 --> 00:21:38.320
+have to remove this `require`
+
+00:21:38.320 --> 00:21:42.000
+and instead put `defvar`s.
+
+21:42.000 --> 21:42.559
+Sometimes it's worth actually
+
+21:42.559 --> 21:44.640
+looking further at the various files
+
+21:44.640 --> 00:21:48.080
+to see how to redefine the dependencies
+
+21:48.080 --> 21:49.840
+to break those circular dependencies,
+
+21:49.840 --> 21:52.320
+but it's often not really
+
+21:52.320 --> 21:54.720
+worth the trouble.
+
+21:55.679 --> 00:21:58.400
+Oh, no, that's not what--
+
+00:21:58.400 --> 00:22:01.440
+I'm not going to the right place...
+
+00:22:01.440 --> 00:22:07.039
+Here I was. So here `edit-map`.
+
+22:07.039 --> 22:09.760
+Well, we can probably...
+
+22:09.760 --> 22:12.159
+it may disappear or...
+
+22:12.159 --> 22:13.760
+oh, I see.
+
+22:13.760 --> 22:16.320
+Okay, so this `edit-map` actually is
+
+22:16.320 --> 22:18.559
+defined in this very file.
+
+22:18.559 --> 00:22:20.240
+It's just that it's defined later.
+
+00:22:20.240 --> 00:22:21.600
+So all we need to do
+
+00:22:21.600 --> 00:22:24.320
+is to move this definition
+
+00:22:24.320 --> 00:22:27.200
+to before its first use,
+
+22:27.200 --> 22:28.960
+since otherwise it's going to be taken
+
+22:28.960 --> 22:33.520
+as lexically-scoped, which we don't want.
+
+22:33.520 --> 22:35.360
+And while I'm here, I see this `copy-keymap`.
+
+22:35.360 --> 22:38.400
+I don't like `copy-keymap`,
+
+22:38.400 --> 22:40.960
+so I'm going to change this
+
+22:40.960 --> 22:44.080
+to a normal keymap,
+
+22:44.080 --> 22:46.159
+and then I'm just going to use
+
+22:46.159 --> 22:50.080
+`set-keymap-parent` instead of `copy-keymap`
+
+22:50.080 --> 00:22:51.600
+to get basically the same result,
+
+00:22:51.600 --> 00:22:55.280
+but without having copied anything.
+
+22:55.280 --> 22:57.760
+And this one will disappear...
+
+22:57.760 --> 23:00.240
+this one as well-- or should hopefully,
+
+23:00.240 --> 23:03.360
+thanks to the `require`.
+
+23:03.360 --> 23:09.840
+Here we have a `hash` missing,
+
+23:09.840 --> 00:23:11.840
+and we have some functions
+
+00:23:11.840 --> 00:23:14.000
+which are unknown,
+
+23:14.000 --> 00:23:14.666
+so let's see...
+
+00:23:14.666 --> 00:23:18.240
+Where is this function defined?
+
+23:18.240 --> 23:21.679
+Nowhere. Huh, wonderful, okay.
+
+23:21.679 --> 00:23:25.200
+So we'll just leave it like it is,
+
+00:23:25.200 --> 00:23:27.120
+and that's going to be
+
+00:23:27.120 --> 00:23:31.360
+for the author of the package to fix.
+
+23:31.360 --> 23:37.120
+How about this one?
+
+23:37.120 --> 23:40.240
+Oh, okay, so it's defined in `enwc.el`
+
+23:40.240 --> 00:23:41.679
+so presumably,
+
+00:23:41.679 --> 00:23:44.559
+this is going to disappear as well.
+
+23:50.159 --> 23:51.030
+One more...
+
+23:56.159 --> 23:58.640
+Okay, so this one
+
+23:58.640 --> 23:59.919
+is just like the previous one.
+
+23:59.919 --> 24:04.000
+We're going to leave it at that.
+
+24:04.000 --> 24:06.720
+And this is it! Huh, wonderful.
+
+24:06.720 --> 24:10.000
+So let's recompile.
+
+24:16.080 --> 24:23.520
+Oh, we have a warning for `fin`.
+
+24:25.679 --> 00:24:28.640
+This variable seems not to be used
+
+00:24:28.640 --> 00:24:32.000
+anywhere in the file, so we're just
+
+24:32.000 --> 00:24:33.440
+going to remove it.
+
+00:24:33.440 --> 00:24:34.880
+I leave it there just in case
+
+00:24:34.880 --> 00:24:36.000
+someone needs later on
+
+00:24:36.000 --> 00:24:37.679
+to look for a `fin` variable
+
+00:24:37.679 --> 00:24:39.760
+to see where it used to be.
+
+24:39.760 --> 24:41.600
+Again, you know, maybe it's actually used...
+
+24:41.600 --> 24:43.519
+yeah, dynamic scoping somehow,
+
+24:43.519 --> 24:46.159
+but given the short name,
+
+24:46.159 --> 24:48.960
+I presume this is not the case.
+
+24:48.960 --> 24:51.200
+Here, oh, that's the code removed
+
+24:51.200 --> 24:52.559
+that had a hash missing.
+
+24:52.559 --> 24:54.159
+That's the one that's not defined.
+
+24:54.159 --> 24:56.799
+This one is not defined,
+
+24:56.799 --> 24:58.000
+and this is it.
+
+24:58.000 --> 25:03.039
+Let's make a last recompilation
+
+25:03.039 --> 25:06.080
+to see if we missed yet something else.
+
+25:06.080 --> 25:07.919
+Nope, and that's it, okay.
+
+25:07.919 --> 25:11.200
+Well, here we go; we're done.
+
+25:11.200 --> 00:25:14.240
+Okay so this was it.
+
+00:25:14.240 --> 00:25:15.440
+You've seen, I think,
+
+25:15.440 --> 25:18.000
+pretty much examples of all of those,
+
+25:18.000 --> 25:20.159
+and I hope you enjoyed it.
+
+25:20.960 --> 25:22.580
+Lessons to take home:
+
+25:22.580 --> 25:23.919
+use the byte compiler.
+
+25:23.919 --> 25:26.000
+You can also use `flymake-mode` instead.
+
+25:26.000 --> 00:25:31.600
+I recommend enabling it as much as you can,
+
+25:31.600 --> 25:33.520
+and head the warnings.
+
+25:33.520 --> 25:35.440
+Follow the warnings. Try to fix them.
+
+25:35.440 --> 25:37.200
+If you can fix all of the warnings,
+
+25:37.200 --> 00:25:38.080
+it's always much better,
+
+00:25:38.080 --> 00:25:39.200
+because then the new warnings
+
+00:25:39.200 --> 00:25:40.960
+really show up.
+
+25:40.960 --> 25:42.880
+And once you've done it, it's really
+
+25:42.880 --> 00:25:44.559
+kind of-- because there's always
+
+00:25:44.559 --> 00:25:46.799
+new things coming up.
+
+25:46.799 --> 25:48.799
+And I think this is it.
+
+25:48.799 --> 00:25:50.720
+I hope you liked it, and thank you
+
+00:25:50.720 --> 00:25:56.000
+for attending this presentation. Bye.
+
+00:25:56.000 --> 00:25:57.000
+[captions by Hannah Miller]
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
new file mode 100644
index 00000000..0bd1e6d1
--- /dev/null
+++ b/2021/captions/emacsconf-2021-maintainers--how-to-help-emacs-maintainers---bastien-guerry--main.vtt
@@ -0,0 +1,730 @@
+WEBVTT
+
+00:00.799 --> 00:02.734
+Hello, I'm Bastien Guerry,
+
+00:02.734 --> 00:04.701
+and I'm very happy to be here.
+
+00:04.701 --> 00:07.734
+I've been the Org-mode maintainer
+
+00:07.734 --> 00:09.501
+for the last 10 years,
+
+00:09.501 --> 00:11.368
+and I would like to ask the question
+
+00:11.368 --> 00:14.034
+how to help GNU Emacs maintainers in general.
+
+00:14.400 --> 00:15.519
+By GNU Emacs, I mean
+
+00:15.519 --> 00:18.080
+the whole GNU Emacs ecosystem,
+
+00:18.080 --> 00:19.520
+including packages,
+
+00:19.520 --> 00:21.039
+not just the core GNU Emacs
+
+00:21.039 --> 00:24.880
+that we all love.
+
+00:24.880 --> 00:28.268
+After a decade of dealing with
+
+00:28.268 --> 00:29.368
+the Org community,
+
+00:29.368 --> 00:32.934
+my view of what a maintainer is changed.
+
+00:32.934 --> 00:35.101
+I'd like to share some ideas with you
+
+00:35.101 --> 00:37.234
+as I think they could be useful
+
+00:37.234 --> 00:39.201
+to help Emacs maintainers in general.
+
+00:39.201 --> 00:41.968
+And hopefully, these ideas also apply
+
+00:41.968 --> 00:43.601
+to other free software projects,
+
+00:43.601 --> 00:45.901
+at least those where contributors
+
+00:45.901 --> 00:47.568
+are all volunteers.
+
+00:47.568 --> 00:51.368
+First of all, what is a free software maintainer?
+
+00:51.368 --> 00:54.601
+Obviously this is some rich dude
+
+00:54.601 --> 00:56.268
+with a lot of free time
+
+00:56.268 --> 00:58.968
+Acting both as a supersmart hacker
+
+00:58.968 --> 01:02.401
+and a super-patient community manager
+
+01:02.401 --> 01:05.101
+Someone who acts as the central hotline
+
+01:05.101 --> 01:06.901
+for users and contributors
+
+01:06.901 --> 01:09.568
+Who knows how to write many emails,
+
+01:09.568 --> 01:11.468
+probably at the same time
+
+01:11.468 --> 01:14.101
+Who does not hesitate
+
+01:14.101 --> 01:16.934
+to publicly scold annoying users
+
+01:16.934 --> 01:19.801
+and someone narcissistic enough
+
+01:19.801 --> 01:22.668
+to seek credits for community efforts
+
+01:22.668 --> 01:26.034
+But really looking for a job
+
+01:26.034 --> 01:27.768
+in some big IT company
+
+01:27.768 --> 01:32.234
+Right? Well... no. That was a joke.
+
+01:32.234 --> 01:34.601
+But maybe you did smile
+
+01:34.601 --> 01:36.634
+and that's probably
+
+01:36.634 --> 01:39.401
+because there is some truth to it.
+
+01:39.401 --> 01:43.834
+Why? Because our culture encourages
+
+01:43.834 --> 01:45.634
+free software users and casual contributors
+
+01:45.634 --> 01:47.868
+to think about maintainers this way.
+
+01:47.868 --> 01:51.568
+Don't we continue to use the expression
+
+01:51.568 --> 01:54.001
+“Benevolent Dictator For Life”?
+
+01:54.001 --> 01:56.434
+This is what I'd call
+
+01:56.434 --> 01:58.068
+the “Spiderman syndrome”:
+
+01:58.068 --> 02:01.268
+maintenance is perceived in terms of
+
+02:01.268 --> 02:04.168
+great power and great responsibility.
+
+02:04.168 --> 02:07.268
+But I believe our culture of superheroes
+
+02:07.268 --> 02:09.101
+is not helpful here:
+
+02:09.101 --> 02:11.301
+it does not reflect the truth,
+
+02:11.301 --> 02:14.134
+it does not set the right expectations,
+
+02:14.134 --> 02:16.334
+and it prevents contributors
+
+02:16.334 --> 02:17.601
+to properly understand
+
+02:17.601 --> 02:19.601
+how to help maintainers.
+
+02:19.601 --> 02:21.334
+So let's start again.
+
+02:21.334 --> 02:24.968
+And instead of asking what a maintainer is,
+
+02:24.968 --> 02:27.068
+let me take the list of
+
+02:27.068 --> 02:30.001
+what I do as the Org maintainer.
+
+02:30.001 --> 02:31.034
+Here is my TODO-list:
+
+02:31.034 --> 02:33.934
+First of all, I take care of
+
+02:33.934 --> 02:35.201
+the orgmode.org website.
+
+02:35.201 --> 02:37.401
+I also take care of the
+
+02:37.401 --> 02:41.434
+org-contrib NonGNU ELPA package.
+
+02:41.434 --> 02:44.034
+I do gardening on the
+
+02:44.034 --> 02:46.168
+community-driven documentation, Worg.
+
+02:46.168 --> 02:48.401
+I do add contributors to Worg.
+
+02:48.401 --> 02:51.134
+I read emails on emacs-orgmode@,
+
+02:51.134 --> 02:54.134
+emacs-devel@ and bug-gnu-emacs@.
+
+02:54.134 --> 02:56.868
+I contribute to email moderation
+
+02:56.868 --> 02:59.801
+of the emacs-orgmode@ list
+
+02:59.801 --> 03:02.468
+with a bunch of other contributors.
+
+03:02.468 --> 03:05.134
+I reply to private emails
+
+03:05.134 --> 03:06.834
+asking me for help about org-mode.
+
+03:06.834 --> 03:10.168
+I coordinate with GNU Emacs maintainers
+
+03:10.168 --> 03:12.934
+and thanks to them for Emacs/Org integration.
+
+03:12.934 --> 03:16.034
+I contribute with public emails
+
+03:16.034 --> 03:17.801
+on the Org mailing list.
+
+03:17.801 --> 03:20.501
+I release new versions of Org-mode.
+
+03:20.501 --> 03:22.634
+and sometimes, sometimes,
+
+03:22.634 --> 03:24.601
+I contribute with code.
+
+03:24.601 --> 03:27.168
+Do you see a pattern here?
+
+03:27.168 --> 03:30.468
+Yes. I bet the last three tasks
+
+03:30.468 --> 03:31.801
+is what most people have in mind
+
+03:31.801 --> 03:34.201
+when they think of a maintainer:
+
+03:34.201 --> 03:35.534
+it's all about hacking
+
+03:35.534 --> 03:37.734
+and being an efficient hotline.
+
+03:37.734 --> 03:39.734
+But in fact, these tasks
+
+03:39.734 --> 03:41.601
+are only a superficial part
+
+03:41.601 --> 03:43.201
+of what I do as a maintainer.
+
+03:43.201 --> 03:47.001
+Some would consider that these core tasks
+
+03:47.001 --> 03:48.501
+are the interesting ones,
+
+03:48.501 --> 03:51.634
+while the others are the boring ones.
+
+03:51.634 --> 03:53.901
+I don't see it that way:
+
+03:53.901 --> 03:56.534
+some tasks are about the product,
+
+03:56.534 --> 03:58.801
+others are about the project.
+
+03:58.801 --> 04:00.834
+Without a good product,
+
+04:00.834 --> 04:02.168
+there is little chance
+
+04:02.168 --> 04:03.401
+you will have a good project,
+
+04:03.401 --> 04:07.534
+but maintaining a project requires thinking
+
+04:07.534 --> 04:09.301
+in terms of infrastructure,
+
+04:09.301 --> 04:11.068
+not in terms of bugs,
+
+04:11.068 --> 04:13.334
+thinking in terms of resources
+
+04:13.334 --> 04:16.701
+that enable both users and contributors,
+
+04:16.701 --> 04:18.401
+not in terms of commits.
+
+04:18.401 --> 04:21.001
+So let me try to define again
+
+04:21.001 --> 04:23.334
+what a free software maintainer is
+
+04:23.334 --> 04:24.434
+or should be.
+
+04:24.434 --> 04:26.234
+A free software maintainer
+
+04:26.234 --> 04:28.368
+is someone who cares about
+
+04:28.368 --> 04:30.968
+enabling users and contributors
+
+04:30.968 --> 04:32.768
+so that they collectively
+
+04:32.768 --> 04:34.201
+take care of the project.
+
+04:34.201 --> 04:36.734
+See another pattern here?
+
+04:36.734 --> 04:40.301
+Yeah, that's all about the project,
+
+04:40.301 --> 04:41.501
+versus the product.
+
+04:41.501 --> 04:43.634
+It's about taking care of it,
+
+04:43.634 --> 04:46.934
+versus being a direct hotline for users,
+
+04:46.934 --> 04:49.901
+so, it's caring about the project infrastructure
+
+04:49.901 --> 04:52.134
+and about empowering users
+
+04:52.134 --> 04:54.234
+with tools and incentives
+
+04:54.234 --> 04:55.268
+so that they care too.
+
+04:55.268 --> 04:58.434
+How can you help such a maintainer?
+
+04:58.434 --> 05:00.901
+By focusing on the project
+
+05:00.901 --> 05:03.901
+and becoming an enabler yourself.
+
+05:03.901 --> 05:06.934
+So, let's pause and summarize:
+
+05:06.934 --> 05:08.801
+our culture wants heroes
+
+05:08.801 --> 05:12.434
+and this leads us to expect maintainers
+
+05:12.434 --> 05:15.234
+to be superhackers and superactive hotlines.
+
+05:15.234 --> 05:19.568
+This is the HOT mindset of maintenance,
+
+05:19.568 --> 05:23.368
+where the maintainers are Headmasters Of Tweaks
+
+05:23.368 --> 05:26.901
+and soon becomes the Headmaster Of Troubles.
+
+05:26.901 --> 05:29.501
+To resist this HOT mindset,
+
+05:29.501 --> 05:33.201
+I suggest to redefine maintenance as ACDC:
+
+05:33.201 --> 05:36.534
+“Asynchronous Collective Distributed Care”:
+
+05:36.534 --> 05:38.968
+“Asynchronous” because time management
+
+05:38.968 --> 05:40.168
+is a private matter
+
+05:40.168 --> 05:41.968
+and we are all volunteers.
+
+05:41.968 --> 05:44.168
+“Collective” because, well,
+
+05:44.168 --> 05:45.634
+no man is an island.
+
+05:45.634 --> 05:49.201
+“Distributed”: because the more power
+
+05:49.201 --> 05:51.601
+to the “edges”, the more resilient
+
+05:51.601 --> 05:53.534
+the system and the project is.
+
+05:53.534 --> 05:56.368
+“Care” because this is all about care:
+
+05:56.368 --> 05:58.501
+with each other as users
+
+05:58.501 --> 06:00.134
+or as contributors,
+
+06:00.134 --> 06:02.101
+with the project's infrastructure
+
+06:02.101 --> 06:05.301
+(servers, websites, bug trackers, etc.)
+
+06:05.301 --> 06:08.701
+and care about having a useful product.
+
+06:08.701 --> 06:13.901
+So, “enabling” users and contributors means
+
+06:13.901 --> 06:16.468
+encouraging them to take ownership,
+
+06:16.468 --> 06:19.801
+which is more than just delegating tasks.
+
+06:19.801 --> 06:22.068
+Let your users and contributors know
+
+06:22.068 --> 06:23.901
+that they need to tap into
+
+06:23.901 --> 06:26.434
+the collective attention pool with care:
+
+06:26.434 --> 06:28.801
+the more autonomous they are, the better.
+
+06:28.801 --> 06:33.801
+So, with this ACDC definition in mind,
+
+06:33.801 --> 06:37.534
+how can <i>you</i> help Emacs maintainers?
+
+06:37.534 --> 06:41.268
+First of all, by <i>becoming</i> a maintainer
+
+06:41.268 --> 06:44.334
+for your own project*, however small.
+
+06:44.334 --> 06:47.001
+Think in terms of project vs. product.
+
+06:47.001 --> 06:49.034
+Empower users and contributors.
+
+06:49.034 --> 06:50.668
+This will help you understand
+
+06:50.668 --> 06:54.068
+how to help other maintainers.
+
+06:54.068 --> 06:56.501
+“More power to the edges!”
+
+06:56.501 --> 07:00.001
+<i>Volunteer</i> as a contributor steward
+
+07:00.001 --> 07:02.201
+for another project: you don't need to
+
+07:02.201 --> 07:03.868
+be a supersmart hacker
+
+07:03.868 --> 07:05.634
+to help others to contribute.
+
+07:05.634 --> 07:07.701
+For Org-mode, we are lucky to have
+
+07:07.701 --> 07:10.901
+two great contributor stewards.
+
+07:10.901 --> 07:12.868
+<i>Learn</i> how to teach,
+
+07:12.868 --> 07:16.468
+because pedagogical skills are invaluable.
+
+07:16.468 --> 07:18.301
+Taking the time to explain
+
+07:18.301 --> 07:20.868
+how to write a bug report or a patch
+
+07:20.868 --> 07:23.834
+is invaluable and this is a core part
+
+07:23.834 --> 07:25.401
+of the Org culture.
+
+07:25.401 --> 07:27.801
+<i>Test</i> and <i>enhance</i> the project's
+
+07:27.801 --> 07:30.001
+contribution process. For Org-mode,
+
+07:30.001 --> 07:33.268
+you would read and suggest contributions to
+
+07:33.268 --> 07:35.634
+the org-contribute pages on Worg.
+
+07:35.634 --> 07:38.601
+Take care of the project's <i>calls for help</i>.
+
+07:38.601 --> 07:40.968
+For Org-mode, this would be this list
+
+07:40.560 --> 07:43.599
+that we have on updates.orgmode.org
+
+07:43.599 --> 07:47.234
+For Emacs, this would be <i>etc/TODO</i> file.
+
+07:47.234 --> 07:50.834
+If the calls for help are not explicit enough,
+
+07:50.834 --> 07:52.834
+try to contribute some.
+
+07:52.834 --> 07:56.701
+<i>Encourage</i> users from outside the project
+
+07:56.701 --> 07:58.434
+to contribute to the core forum.
+
+07:58.434 --> 08:01.434
+For Org-mode, there are many hacks and fixes
+
+08:01.434 --> 08:03.901
+being shared on Reddit and Stack Overflow,
+
+08:03.901 --> 08:05.401
+and that's fine, but we we should not
+
+08:05.401 --> 08:07.401
+wait for months before having this
+
+08:07.401 --> 08:08.801
+shared on the list.
+
+08:08.801 --> 08:11.434
+Let the core forum <i>know</i> about
+
+08:11.434 --> 08:13.701
+what happens in this outside world
+
+08:13.701 --> 08:16.601
+by sharing important information yourself.
+
+08:16.601 --> 08:19.868
+<i>Propose</i> your help for non-code tasks:
+
+08:19.868 --> 08:21.368
+maintain a website,
+
+08:21.368 --> 08:23.734
+enhance the community-driven documentation,
+
+08:23.734 --> 08:26.101
+help with bug triage, etc.
+
+08:26.101 --> 08:29.568
+If you expect someone else to fix your bug,
+
+08:29.568 --> 08:33.234
+try fixing someone else's bug first, and too:
+
+08:33.234 --> 08:36.234
+that's how you'll learn Emacs Lisp
+
+08:36.234 --> 08:37.668
+and that's how you'll concretely
+
+08:37.668 --> 08:40.501
+train your empathy, your sense of taking care.
+
+08:40.501 --> 08:42.068
+That is so critical.
+
+08:42.068 --> 08:44.101
+Don't expect the maintainer
+
+08:44.101 --> 08:45.168
+to be a <i>hotline</i>,
+
+08:45.168 --> 08:46.801
+especially a private one.
+
+08:46.801 --> 08:49.234
+Address yourself to the community.
+
+08:49.234 --> 08:51.968
+and last but not least,
+
+08:51.968 --> 08:53.120
+<i>complete</i> this list.
+
+08:53.120 --> 08:54.959
+I'm trying to open a conversation here,
+
+08:54.959 --> 08:57.168
+so don't be shy.
+
+08:57.168 --> 09:01.760
+That's it. Uhm, is it hard? Yes, this is hard,
+
+09:01.760 --> 09:04.640
+and that's because helping maintainers
+
+09:04.640 --> 09:07.760
+by becoming such a enabler
+
+09:07.760 --> 09:09.839
+in this ACDC mindset
+
+09:09.839 --> 09:12.080
+is not immediately rewarding,
+
+09:12.080 --> 09:15.168
+whereas fixing a bug clearly, clearly is.
+
+09:15.168 --> 09:17.701
+But if you start thinking of the project
+
+09:17.701 --> 09:19.301
+as something that enables you
+
+09:19.301 --> 09:21.440
+to do amazing things, and I believe
+
+09:21.440 --> 09:23.434
+Org is this kind of project,
+
+09:23.434 --> 09:25.034
+and if you start thinking
+
+09:25.034 --> 09:26.634
+of the maintenance as something
+
+09:26.634 --> 09:28.934
+that enables more contributions,
+
+09:28.934 --> 09:31.734
+you will see how important and rewarding
+
+09:31.734 --> 09:35.668
+it is to become such an enabler.
+
+09:35.668 --> 09:39.701
+So, definitely grateful to all the enablers
+
+09:39.701 --> 09:41.401
+that we have in Org's community!
+
+09:41.401 --> 09:43.734
+And to everyone who maintains
+
+09:43.734 --> 09:45.701
+a culture of teaching and learning
+
+09:45.701 --> 09:49.068
+through polite and respectful interactions
+
+09:49.068 --> 09:50.801
+on the mailing list and elsewhere:
+
+09:50.801 --> 09:55.001
+we always need more “power to the edges”.
+
+09:55.001 --> 09:57.168
+And I'm also very grateful
+
+09:57.168 --> 09:59.034
+to the EmacsConf organizers,
+
+09:59.034 --> 10:02.568
+because that's really taking care
+
+10:02.568 --> 10:05.068
+of the community! So, thanks very much!
+
+10:05.068 --> 10:06.868
+[captions by sachac & zaeph]
diff --git a/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt b/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt
new file mode 100644
index 00000000..3985f09a
--- /dev/null
+++ b/2021/captions/emacsconf-2021-model--extending-the-model-of-emacs-to-other-applications--laszlo-krajnikovszkij--main.vtt
@@ -0,0 +1,676 @@
+WEBVTT
+
+00:06.399 --> 00:07.670
+Hello, everyone. My name is
+
+00:07.670 --> 00:08.800
+Laszlo Krajnikovszkij,
+
+00:08.800 --> 00:10.559
+and today I would like to share
+
+00:10.559 --> 00:12.000
+some ideas about extending
+
+00:12.000 --> 00:15.200
+the model of Emacs to other applications.
+
+00:15.200 --> 00:16.720
+Brief introduction of myself:
+
+00:16.720 --> 00:18.400
+I am from Budapest, Hungary;
+
+00:18.400 --> 00:20.320
+and I have a background
+
+00:20.320 --> 00:21.760
+in Financial Economics,
+
+00:21.760 --> 00:24.480
+but by occupation I run
+
+00:24.480 --> 00:26.320
+a software development company
+
+00:26.320 --> 00:29.119
+where I mostly do product management.
+
+00:29.119 --> 00:34.399
+I try to do most of my work from Emacs.
+
+00:34.399 --> 00:36.160
+I've been using it for the past
+
+00:36.160 --> 00:37.200
+two or three years
+
+00:37.200 --> 00:39.120
+as a computer science hobby
+
+00:39.120 --> 00:41.280
+and this fascinating piece of software
+
+00:41.280 --> 00:44.239
+taught me a lot of different concepts
+
+00:44.239 --> 00:46.000
+about software architecture
+
+00:46.000 --> 00:48.800
+and programming languages,
+
+00:48.800 --> 00:51.440
+and also raised a lot of
+
+00:51.440 --> 00:52.719
+philosophical questions
+
+00:52.719 --> 00:55.760
+about human-computer interaction.
+
+00:55.760 --> 00:57.039
+I've been mostly using it
+
+00:57.039 --> 00:59.680
+for organizing my personal information,
+
+00:59.680 --> 01:03.600
+writing notes and tracking my agenda,
+
+01:03.600 --> 01:05.519
+but occasionally, I've also used it
+
+01:05.519 --> 01:07.119
+for reading and writing code
+
+01:07.119 --> 01:09.360
+and for also reading news, email,
+
+01:09.360 --> 01:12.479
+and browsing the web.
+
+01:12.479 --> 01:16.400
+What do I mean by the 'model' of Emacs?
+
+01:16.400 --> 01:18.479
+For me, the 'model' of Emacs is about
+
+01:18.479 --> 01:21.920
+the interaction model.
+
+01:21.920 --> 01:24.880
+And it's not... Emacs is just a tool
+
+01:24.880 --> 01:26.560
+for interacting with the computer.
+
+01:26.560 --> 01:28.640
+It's sort of a universal interface
+
+01:28.640 --> 01:31.119
+that allows for consistency
+
+01:31.119 --> 01:33.280
+across different apps,
+
+01:33.280 --> 01:36.240
+because everything is brought down to
+
+01:36.240 --> 01:39.200
+an Emacs buffer, which is a
+
+01:39.200 --> 01:42.399
+text-oriented interface,
+
+01:42.399 --> 01:44.005
+but that can have consistent
+
+01:44.005 --> 01:44.880
+keybinding scheme,
+
+01:44.880 --> 01:46.960
+they have consistent color scheme,
+
+01:46.960 --> 01:50.640
+and consistent workflow in general.
+
+01:50.640 --> 01:53.200
+Also, Emacs has a lot of functionality
+
+01:53.200 --> 01:55.920
+and utilizes mnemonic key bindings
+
+01:55.920 --> 01:57.680
+for calling functions,
+
+01:57.680 --> 01:59.920
+which is much more powerful than
+
+01:59.920 --> 02:02.000
+navigating contextual menus
+
+02:02.000 --> 02:03.840
+with a pointer,
+
+02:03.840 --> 02:07.119
+because the functions that are
+
+02:07.119 --> 02:08.239
+repeated the most
+
+02:08.239 --> 02:10.640
+are then ingrained in the muscle memory,
+
+02:10.640 --> 02:12.879
+therefore reducing the lag
+
+02:12.879 --> 02:15.680
+between the thought that is occurring
+
+02:15.680 --> 02:17.520
+in your mind, and its reflection
+
+02:17.520 --> 02:21.280
+on your computer screen.
+
+02:21.280 --> 02:23.040
+And also, Emacs provides
+
+02:23.040 --> 02:25.360
+a huge number of packages
+
+02:25.360 --> 02:28.560
+that can all be inspected and modified,
+
+02:28.560 --> 02:30.640
+and extended, and recombined,
+
+02:30.640 --> 02:35.599
+and just provides the best-possible
+
+02:35.599 --> 02:37.840
+malleable system experience
+
+02:37.840 --> 02:42.080
+that can potentially lead to
+
+02:42.080 --> 02:44.080
+almost any desired setup
+
+02:44.080 --> 02:47.599
+for the end-user.
+
+02:47.599 --> 02:49.440
+So, Emacs is great,
+
+02:49.440 --> 02:52.239
+but I need to use a lot of
+
+02:52.239 --> 02:53.280
+different other tools
+
+02:53.280 --> 02:55.200
+to collaborate with my coworkers,
+
+02:55.200 --> 02:57.519
+with my clients and vendors.
+
+02:57.519 --> 03:00.080
+On a normal day, I would need to be
+
+03:00.080 --> 03:02.640
+switching between five to six
+
+03:02.640 --> 03:04.319
+different web applications
+
+03:04.319 --> 03:07.840
+and chat applications.
+
+03:07.840 --> 03:11.840
+They all have the same flaws.
+
+03:11.840 --> 03:14.879
+They all lack customizability,
+
+03:14.879 --> 03:16.560
+because it was never intended
+
+03:16.560 --> 03:19.280
+by the original developers of the app
+
+03:19.280 --> 03:21.120
+that the end user can tinker
+
+03:21.120 --> 03:24.239
+with the product they're creating.
+
+03:24.239 --> 03:29.120
+But also, those apps are cloud-based,
+
+03:29.120 --> 03:33.599
+and usually not very good for privacy,
+
+03:33.599 --> 03:36.480
+and this also creates limitations
+
+03:36.480 --> 03:40.080
+for offline-based workflows,
+
+03:40.080 --> 03:43.599
+or for in general not relying on
+
+03:43.599 --> 03:44.560
+the internet connection
+
+03:44.560 --> 03:46.959
+to use something.
+
+03:46.959 --> 03:49.440
+All these applications,
+
+03:49.440 --> 03:50.720
+they create a situation
+
+03:50.720 --> 03:53.040
+when there's a lot of context-switching
+
+03:53.040 --> 03:55.360
+between different apps,
+
+03:55.360 --> 03:56.959
+and this context-switching
+
+03:56.959 --> 03:59.920
+comes from different color schemes,
+
+03:59.920 --> 04:03.280
+different workflows in general
+
+04:03.280 --> 04:04.879
+for different apps.
+
+04:04.879 --> 04:06.400
+So, there is always
+
+04:06.400 --> 04:10.400
+this little frame of time
+
+04:10.400 --> 04:13.599
+where you need to orient yourself
+
+04:13.599 --> 04:15.280
+in this other application.
+
+04:15.280 --> 04:17.280
+Of course, over time,
+
+04:17.280 --> 04:18.799
+it gets more automated,
+
+04:18.799 --> 04:20.560
+but still, this context switching
+
+04:20.560 --> 04:26.720
+is very bad for productivity.
+
+04:26.720 --> 04:30.080
+These apps don't support very well
+
+04:30.080 --> 04:31.759
+the keyboard-driven workflows,
+
+04:31.759 --> 04:33.520
+because the default set of keybindings
+
+04:33.520 --> 04:34.479
+is always limited,
+
+04:34.479 --> 04:39.280
+and you always need to resort to
+
+04:39.280 --> 04:44.160
+mouse-driven workflows.
+
+04:44.160 --> 04:46.400
+But Emacs has some issues
+
+04:46.400 --> 04:48.320
+as a tool for work as well.
+
+04:48.320 --> 04:50.800
+First of all, it lacks integration
+
+04:50.800 --> 04:51.759
+with all these tools,
+
+04:51.759 --> 04:54.560
+so I constantly need to be switching
+
+04:54.560 --> 04:57.759
+between Emacs and these applications,
+
+04:57.759 --> 04:59.919
+or basically, my web browser.
+
+04:59.919 --> 05:03.039
+Emacs is very good for text input
+
+05:03.039 --> 05:04.720
+and for editing text,
+
+05:04.720 --> 05:07.039
+but it's not always perfect
+
+05:07.039 --> 05:09.440
+for reading information
+
+05:09.440 --> 05:11.199
+from an Emacs buffer,
+
+05:11.199 --> 05:12.080
+because it doesn't
+
+05:12.080 --> 05:16.560
+render images and HTML properly.
+
+05:16.560 --> 05:18.800
+Also, Emacs lacks performance
+
+05:18.800 --> 05:19.919
+under heavy load,
+
+05:19.919 --> 05:21.840
+so when you try to run
+
+05:21.840 --> 05:23.280
+too many things in parallel,
+
+05:23.280 --> 05:26.560
+the single-threaded nature of Emacs
+
+05:26.560 --> 05:28.880
+just makes it hang.
+
+05:28.880 --> 05:30.960
+For this reason,
+
+05:30.960 --> 05:32.560
+I wouldn't rely on Emacs
+
+05:32.560 --> 05:38.320
+to take care of all my system processes.
+
+05:38.320 --> 05:40.400
+And of course, it has some
+
+05:40.400 --> 05:42.240
+legacy UI limitations
+
+05:42.240 --> 05:46.400
+being a software that was written
+
+05:46.400 --> 05:49.039
+40 years ago.
+
+05:49.039 --> 05:53.759
+This results in a very limited usability
+
+05:53.759 --> 05:59.680
+on mobile and other touch devices.
+
+05:59.680 --> 06:01.759
+I've been thinking
+
+06:01.759 --> 06:03.840
+about a hybrid approach
+
+06:03.840 --> 06:05.840
+that you could still use Emacs
+
+06:05.840 --> 06:10.080
+as a core of your life,
+
+06:10.080 --> 06:11.840
+and then extend it
+
+06:11.840 --> 06:15.120
+with adjacent web applications
+
+06:15.120 --> 06:16.960
+where Emacs can be used
+
+06:16.960 --> 06:21.600
+as a text processing backend
+
+06:21.600 --> 06:24.080
+and use Org mode files
+
+06:24.080 --> 06:25.600
+as a universal format
+
+06:25.600 --> 06:29.600
+for converting textual data,
+
+06:29.600 --> 06:33.199
+and then If emacs can be
+
+06:33.199 --> 06:36.639
+connected with those applications
+
+06:36.639 --> 06:37.520
+that I mentioned
+
+06:37.520 --> 06:39.520
+a couple of slides before
+
+06:39.520 --> 06:41.280
+through their API, and you can have
+
+06:41.280 --> 06:43.199
+a two-way communication between them,
+
+06:43.199 --> 06:46.000
+and just export in JSON, let's say,
+
+06:46.000 --> 06:47.440
+and then convert to Org mode,
+
+06:47.440 --> 06:49.039
+and then use the Org mode
+
+06:49.039 --> 06:52.960
+for these local web apps.
+
+06:52.960 --> 06:57.599
+Then you can use Emacs for editing,
+
+06:57.599 --> 07:00.800
+and Org mode, but then you can use
+
+07:00.800 --> 07:03.360
+this adjacent web application
+
+07:03.360 --> 07:05.039
+for viewing information,
+
+07:05.039 --> 07:08.720
+making small edits, and in general,
+
+07:08.720 --> 07:11.692
+possibly have an enhanced
+
+07:11.692 --> 07:14.639
+user-defined UI that is
+
+07:14.639 --> 07:17.039
+directly connected to Emacs.
+
+07:17.039 --> 07:19.759
+Emacs Application Framework
+
+07:19.759 --> 07:21.520
+is a project that tries to achieve
+
+07:21.520 --> 07:23.840
+a common goal, but it tries to
+
+07:23.840 --> 07:24.639
+achieve that through
+
+07:24.639 --> 07:25.520
+displaying everything
+
+07:25.520 --> 07:27.840
+in the Emacs buffer,
+
+07:27.840 --> 07:28.840
+whereas I'm thinking
+
+07:28.840 --> 07:30.800
+if it can be displayed
+
+07:30.800 --> 07:33.759
+in any web browser, but utilize
+
+07:33.759 --> 07:36.560
+Emacs Application Framework API
+
+07:36.560 --> 07:38.639
+as a bridge between Elisp
+
+07:38.639 --> 07:40.960
+and Python and Javascript,
+
+07:40.960 --> 07:41.759
+so you can use
+
+07:41.759 --> 07:44.879
+the modern front-end frameworks
+
+07:44.879 --> 07:48.560
+to create those web interfaces easier
+
+07:48.560 --> 07:49.280
+and connect them
+
+07:49.280 --> 07:53.919
+with Emacs functionality.
+
+07:53.919 --> 07:57.280
+These user-controlled web apps
+
+07:57.280 --> 08:04.126
+would basically result in
+
+08:04.126 --> 08:05.680
+the user connecting
+
+08:05.680 --> 08:10.319
+to this external cloud-based tool,
+
+08:10.319 --> 08:13.759
+let's say Asana, but then
+
+08:13.759 --> 08:16.400
+process everything through Org mode
+
+08:16.400 --> 08:19.840
+and then display in an Org mode file
+
+08:19.840 --> 08:24.720
+or display in this enhanced way
+
+08:24.720 --> 08:28.960
+through the adjacent local web app,
+
+08:28.960 --> 08:31.280
+a front-end for which
+
+08:31.280 --> 08:34.080
+could be written in any .js framework
+
+08:34.080 --> 08:37.440
+for front-end development.
+
+08:37.440 --> 08:42.159
+I encourage everyone in the community
+
+08:42.159 --> 08:45.279
+who is interested in similar questions
+
+08:45.279 --> 08:48.160
+to share their opinion
+
+08:48.160 --> 08:50.959
+about the potential risks and drawbacks,
+
+08:50.959 --> 08:53.120
+about any other ways
+
+08:53.120 --> 08:54.640
+to achieve a similar goal,
+
+08:54.640 --> 08:57.519
+if anyone else is doing this already
+
+08:57.519 --> 08:59.920
+that i might not know about,
+
+08:59.920 --> 09:02.399
+and in general, just share ideas
+
+09:02.399 --> 09:03.760
+about what else can be done
+
+09:03.760 --> 09:07.519
+to integrate Emacs with more stuff
+
+09:07.519 --> 09:10.640
+and how Emacs can become
+
+09:10.640 --> 09:14.080
+more approachable by non-technical users
+
+09:14.080 --> 09:16.160
+because I would love to see
+
+09:16.160 --> 09:20.080
+more people using Emacs, to be honest.
+
+09:20.080 --> 09:21.680
+Yeah. Thank you very much
+
+09:21.680 --> 09:23.440
+for listening to this talk.
+
+09:23.440 --> 09:26.080
+I will be taking questions
+
+09:26.080 --> 09:27.600
+and feedback in the pad
+
+09:27.600 --> 09:31.920
+after the conference.
+
+09:31.920 --> 09:33.920
+You can reach me through this email
+
+09:33.920 --> 09:36.720
+laszlo@laszlo.is .
+
+09:36.720 --> 09:39.600
+I'll be posting
+
+09:39.600 --> 09:41.760
+some more detailed articles
+
+09:41.760 --> 09:44.959
+and description of this idea
+
+09:44.959 --> 09:47.166
+that I was trying to present today.
+
+09:47.166 --> 09:49.040
+[captions by Laszlo]
diff --git a/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt b/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt
new file mode 100644
index 00000000..b1979ba0
--- /dev/null
+++ b/2021/captions/emacsconf-2021-mold--moldable-emacs-a-step-towards-sustainable-software--andrea--main.vtt
@@ -0,0 +1,796 @@
+WEBVTT
+
+00:00.000 --> 00:01.200
+Welcome to my talk,
+
+00:01.200 --> 00:02.680
+Moldable Emacs: A Step Towards
+
+00:02.680 --> 00:03.800
+Sustainable Software.
+
+00:03.800 --> 00:04.440
+Who am I?
+
+00:04.440 --> 00:05.280
+I am Andrea.
+
+00:05.280 --> 00:07.120
+I work as a Clojure software engineer
+
+00:07.120 --> 00:09.280
+somewhere in the middle of the UK.
+
+00:09.280 --> 00:10.880
+I inherited my passion for Emacs
+
+00:10.880 --> 00:12.480
+from my Ph.D. supervisor,
+
+00:12.480 --> 00:13.880
+and from that moment on,
+
+00:13.880 --> 00:14.960
+I got in synergy with it.
+
+00:14.960 --> 00:17.480
+You can learn more about my interests
+
+00:17.480 --> 00:19.200
+and my Emacs adventure
+
+00:19.200 --> 00:22.520
+at ag91.github.io.
+
+00:22.520 --> 00:24.360
+So let's get in the talk.
+
+00:24.360 --> 00:25.840
+Why moldable development?
+
+00:25.840 --> 00:28.400
+There is too much information to read it all.
+
+00:28.400 --> 00:30.640
+Reading is very difficult.
+
+00:30.640 --> 00:32.320
+It's a very slow activity.
+
+00:32.320 --> 00:33.960
+You need to go word by word
+
+00:33.960 --> 00:35.520
+or paragraph by paragraph,
+
+00:35.520 --> 00:36.400
+if you speedread.
+
+00:36.400 --> 00:39.320
+But anyway, you take a lot of time
+
+00:39.320 --> 00:40.720
+to absorb that information.
+
+00:40.720 --> 00:43.160
+And we urgently need
+
+00:43.160 --> 00:44.960
+to stand on the shoulders of giants,
+
+00:44.960 --> 00:46.880
+so the idea is we should stop
+
+00:46.880 --> 00:48.960
+doing always the same errors
+
+00:48.960 --> 00:50.920
+and we should be able to
+
+00:50.920 --> 00:53.640
+absorb as much of the good ideas
+
+00:53.640 --> 00:56.600
+that the bright people around us generate.
+
+00:56.600 --> 00:59.840
+For example, if I create
+
+00:59.840 --> 01:04.120
+a magnificent program in COBOL,
+
+01:04.120 --> 01:06.000
+and nobody knows any more
+
+01:06.000 --> 01:08.000
+how to learn or read COBOL,
+
+01:08.000 --> 01:09.120
+(and in order to read,
+
+01:09.120 --> 01:10.960
+you take a lot of time),
+
+01:10.960 --> 01:13.040
+well, that fantastic idea
+
+01:13.040 --> 01:15.360
+should be easily translatable
+
+01:15.360 --> 01:19.240
+to C, or to Clojure,
+
+01:19.240 --> 01:20.280
+or to Common Lisp,
+
+01:20.280 --> 01:22.240
+or to a language that will come after.
+
+01:22.240 --> 01:24.080
+The idea shouldn't be lost
+
+01:24.080 --> 01:28.400
+in a codebase somewhere in an old mainframe.
+
+01:28.400 --> 01:31.080
+It should be still accessible.
+
+01:31.080 --> 01:33.920
+Let's get in practice. What does it mean?
+
+01:33.920 --> 01:37.840
+It means that, for example,
+
+01:37.840 --> 01:40.400
+the proponents of moldable development
+
+01:40.400 --> 01:42.440
+prepare this slide to give a sense.
+
+01:42.440 --> 01:45.080
+So the idea is... Look at this.
+
+01:45.080 --> 01:46.640
+What is here? You will see
+
+01:46.640 --> 01:48.680
+that all these little things
+
+01:48.680 --> 01:49.680
+look like the same.
+
+01:49.680 --> 01:50.680
+The first time I looked at it,
+
+01:50.680 --> 01:52.840
+this was looking like a class diagram.
+
+01:52.840 --> 01:54.880
+This is actually code
+
+01:54.880 --> 01:57.800
+describing a little system.
+
+01:57.800 --> 01:59.520
+If you look and if you read,
+
+01:59.520 --> 02:01.320
+you can see that there is a numerator,
+
+02:01.320 --> 02:03.320
+a denominator... So this, you see,
+
+02:03.320 --> 02:05.720
+is interactive, because it's code.
+
+02:05.720 --> 02:06.520
+It's something that is running,
+
+02:06.520 --> 02:07.280
+and it's an object
+
+02:07.280 --> 02:08.560
+because this is Smalltalk --
+
+02:08.560 --> 02:11.440
+Pharo, a dialect of Smalltalk --
+
+02:11.440 --> 02:13.040
+but in the next slide,
+
+02:13.040 --> 02:15.160
+since this is a moldable tool,
+
+02:15.160 --> 02:16.760
+you can see that you can...
+
+02:16.760 --> 02:18.280
+there is a representation
+
+02:18.280 --> 02:20.000
+of the same software
+
+02:20.000 --> 02:23.520
+in a human way.
+
+02:23.520 --> 02:24.640
+So, for example,
+
+02:24.640 --> 02:25.880
+here you can see
+
+02:25.880 --> 02:27.280
+there is a mathematical formula.
+
+02:27.280 --> 02:29.080
+The other object, the second one,
+
+02:29.080 --> 02:30.440
+was a file system kind of thing.
+
+02:30.440 --> 02:33.880
+The third one was an image.
+
+02:33.880 --> 02:36.600
+And the last one was sort of a graph.
+
+02:36.600 --> 02:37.640
+So you can see that
+
+02:37.640 --> 02:40.840
+there is a better way to learn,
+
+02:40.840 --> 02:44.880
+to distinguish, to intuitively get a sense.
+
+02:44.880 --> 02:47.200
+And there is not only a single way.
+
+02:47.200 --> 02:49.480
+It's custom to what you need.
+
+02:49.480 --> 02:51.280
+For example, this is
+
+02:51.280 --> 02:52.680
+a very general way
+
+02:52.680 --> 02:54.040
+to understand what is this object about
+
+02:54.040 --> 02:55.560
+and maybe you want to see
+
+02:55.560 --> 02:56.760
+some other little things.
+
+02:56.760 --> 02:58.840
+For example, the documentation of the code,
+
+02:58.840 --> 03:00.240
+because you are interested
+
+03:00.240 --> 03:01.160
+in developing with it.
+
+03:01.160 --> 03:03.960
+For example, an image,
+
+03:03.960 --> 03:05.240
+you can see there's a path
+
+03:05.240 --> 03:06.840
+on the filesystem,
+
+03:06.840 --> 03:10.520
+or as a hexadecimal representation.
+
+03:10.520 --> 03:12.520
+In a sense, there is not only one view.
+
+03:12.520 --> 03:13.840
+You need to have the view
+
+03:13.840 --> 03:15.320
+that you need at the moment,
+
+03:15.320 --> 03:16.840
+and your tool needs to
+
+03:16.840 --> 03:19.680
+make this easy for you.
+
+03:19.680 --> 03:22.280
+So, why moldable Emacs?
+
+03:22.280 --> 03:24.680
+I wanted to bring that idea
+
+03:24.680 --> 03:26.760
+of having multiple view representations
+
+03:26.760 --> 03:29.520
+of what you need
+
+03:29.520 --> 03:33.280
+to understand better in Emacs.
+
+03:33.280 --> 03:36.280
+And so I want to create immediate story telling.
+
+03:36.280 --> 03:37.880
+Immediate, because it needs to be very quick,
+
+03:37.880 --> 03:38.840
+and story telling is
+
+03:38.840 --> 03:40.760
+because you want to allow connection
+
+03:40.760 --> 03:42.520
+from something that you needed
+
+03:42.520 --> 03:45.520
+to develop it into something new.
+
+03:45.520 --> 03:47.160
+So you are really telling a story:
+
+03:47.160 --> 03:49.040
+what is this mathematical formula
+
+03:49.040 --> 03:51.120
+I created because I need this,
+
+03:51.120 --> 03:54.440
+or this numerator and denominator
+
+03:54.440 --> 03:55.520
+produce this number.
+
+03:55.520 --> 03:58.760
+So this is a story that you are telling
+
+03:58.760 --> 03:59.880
+in my mind.
+
+03:59.880 --> 04:04.000
+And I want multiple views for buffers.
+
+04:04.000 --> 04:05.800
+Buffers is the main concept in Emacs,
+
+04:05.800 --> 04:09.160
+and so buffers are what I want to
+
+04:09.160 --> 04:11.000
+integrate in a story.
+
+04:11.000 --> 04:12.280
+I create a buffer
+
+04:12.280 --> 04:15.080
+and I start manipulating it,
+
+04:15.080 --> 04:16.920
+creating a view and then another view
+
+04:16.920 --> 04:19.520
+in order to tell something to myself,
+
+04:19.520 --> 04:20.720
+in order to learn,
+
+04:20.720 --> 04:21.880
+but also to tell something to others.
+
+04:21.880 --> 04:23.960
+So, for example, let's start
+
+04:23.960 --> 04:25.840
+from a use case: learning better.
+
+04:25.840 --> 04:29.640
+I had, at work, a list of changes
+
+04:29.640 --> 04:31.440
+for a pull request,
+
+04:31.440 --> 04:32.040
+so a code change,
+
+04:32.040 --> 04:33.920
+and I was very tired.
+
+04:33.920 --> 04:34.760
+I couldn't understand
+
+04:34.760 --> 04:37.520
+what this much text was about.
+
+04:37.520 --> 04:38.920
+So what I generate,
+
+04:38.920 --> 04:41.120
+I create a value for myself
+
+04:41.120 --> 04:42.720
+to understand it easily.
+
+04:42.720 --> 04:45.320
+And for me, understanding it easily,
+
+04:45.320 --> 04:49.240
+for example, was a little flow diagram.
+
+04:49.240 --> 04:50.963
+It showed me, okay, there is first
+
+04:50.963 --> 04:52.320
+this, this, and this,
+
+04:52.320 --> 04:54.960
+and so I could follow.
+
+04:54.960 --> 04:58.400
+having it next to the change.
+
+04:58.400 --> 05:00.600
+Having this image next to the change.
+
+05:00.600 --> 05:02.360
+And this is describing
+
+05:02.360 --> 05:05.640
+an Italian recipe for pasta with butter,
+
+05:05.640 --> 05:07.840
+so if you want to try, you're welcome.
+
+05:07.840 --> 05:11.720
+It's very tasty.
+
+05:11.720 --> 05:13.840
+Anyway, the other thing that we can do
+
+05:13.840 --> 05:17.280
+is query text -- structured text.
+
+05:17.280 --> 05:20.680
+So for example, this presentation
+
+05:20.680 --> 05:21.960
+is an Org Mode buffer.
+
+05:21.960 --> 05:24.040
+So when I call the Playground
+
+05:24.040 --> 05:24.960
+(that is one of the molds
+
+05:24.960 --> 05:27.640
+that lets me write some Elisp to query
+
+05:27.640 --> 05:29.680
+the original buffer,)
+
+05:29.680 --> 05:31.640
+if I evaluate this,
+
+05:31.640 --> 05:33.280
+you will see that
+
+05:33.280 --> 05:33.880
+I have just asked
+
+05:33.880 --> 05:35.200
+my Org Mode buffer
+
+05:35.200 --> 05:37.400
+to tell me the content length
+
+05:37.400 --> 05:38.280
+of the headings
+
+05:38.280 --> 05:40.240
+with some interesting content.
+
+05:40.240 --> 05:44.280
+So all the headings at third-level.
+
+05:44.280 --> 05:48.080
+Do you understand? I've just asked a file
+
+05:48.080 --> 05:50.240
+to tell me its contents
+
+05:50.240 --> 05:51.240
+without reading it.
+
+05:51.240 --> 05:56.320
+Or we can do something similar for code.
+
+05:56.320 --> 05:58.840
+We can do... I don't know...
+
+05:58.840 --> 06:00.920
+No idea what is written there,
+
+06:00.920 --> 06:02.000
+but I want to know
+
+06:02.000 --> 06:03.840
+which function is the most complex
+
+06:03.840 --> 06:06.800
+or is overcomplicated.
+
+06:06.800 --> 06:09.560
+I have defined in red,
+
+06:09.560 --> 06:11.600
+(so again, I don't need to read the number
+
+06:11.600 --> 06:13.800
+to know either what it is about!)
+
+06:13.800 --> 06:15.280
+So, I've written in red,
+
+06:15.280 --> 06:18.120
+I've shown in red
+
+06:18.120 --> 06:20.320
+the function with more complexity,
+
+06:20.320 --> 06:22.560
+and I can jump to it.
+
+06:22.560 --> 06:24.160
+So everything is very accessible
+
+06:24.160 --> 06:26.280
+to facilitate my operation
+
+06:26.280 --> 06:27.160
+and my understanding.
+
+06:27.160 --> 06:29.880
+Or I can take notes.
+
+06:29.880 --> 06:36.160
+For example, I can annotate something,
+
+06:36.160 --> 06:37.240
+and you see the note
+
+06:37.240 --> 06:38.920
+is again structured text,
+
+06:38.920 --> 06:40.120
+because you will know
+
+06:40.120 --> 06:42.320
+that I'm going to query my notes
+
+06:42.320 --> 06:43.480
+at some point.
+
+06:43.480 --> 06:46.680
+For example, I can show all my notes,
+
+06:46.680 --> 06:51.480
+for example, by mode, or I can show
+
+06:51.480 --> 06:53.600
+all the notes by mode in Org Mode.
+
+06:53.600 --> 06:56.440
+Because it's structured text,
+
+06:56.440 --> 06:57.840
+I can manipulate it very easily.
+
+06:57.840 --> 07:00.160
+So these are all my notes.
+
+07:00.160 --> 07:05.400
+Finally, the superpower
+
+07:05.400 --> 07:08.320
+of this moldable Emacs
+
+07:08.320 --> 07:10.400
+is the fact that you can compose molds.
+
+07:10.400 --> 07:13.000
+So, for example, let's go in
+
+07:13.000 --> 07:17.480
+showing all my notes.
+
+07:17.480 --> 07:19.040
+Let me show you all my notes.
+
+07:19.040 --> 07:21.520
+And then let's say that I want to know
+
+07:21.520 --> 07:26.720
+how they are... how many lines
+
+07:26.720 --> 07:27.400
+are these notes?
+
+07:27.400 --> 07:30.360
+Look, this is the answer.
+
+07:30.360 --> 07:31.800
+So of all the notes I take,
+
+07:31.800 --> 07:34.200
+I can actually query it and say
+
+07:34.200 --> 07:38.360
+"What are the lengths?"
+
+07:38.360 --> 07:40.040
+But let me show something more.
+
+07:40.040 --> 07:41.680
+Which one is the longest note?
+
+07:41.680 --> 07:44.000
+Now there are lots of notes in there
+
+07:44.000 --> 07:45.080
+so it's difficult to know
+
+07:45.080 --> 07:47.200
+but what if I can, in a click,
+
+07:47.200 --> 07:50.440
+generate a view that is very immediate?
+
+07:50.440 --> 07:52.240
+Look, there is a note that is very long.
+
+07:52.240 --> 07:54.040
+It's about 35 lines.
+
+07:54.040 --> 07:55.160
+Do you understand?
+
+07:55.160 --> 07:56.760
+I didn't read any note.
+
+07:56.760 --> 07:58.400
+This is all coming from
+
+07:58.400 --> 08:02.520
+being able to query your text
+
+08:02.520 --> 08:06.240
+and having multiple representations.
+
+08:06.240 --> 08:08.360
+My presentation is very short.
+
+08:08.360 --> 08:09.720
+What is next?
+
+08:09.720 --> 08:14.360
+Next is to integrate molds with other software
+
+08:14.360 --> 08:15.360
+like code-compass.
+
+08:15.360 --> 08:16.720
+I did a presentation last year
+
+08:16.720 --> 08:18.640
+and I want to make those nice diagrams
+
+08:18.640 --> 08:21.320
+available for small molds
+
+08:21.320 --> 08:22.880
+so that you can use them,
+
+08:22.880 --> 08:24.760
+for example, for notes
+
+08:24.760 --> 08:26.360
+or text that you have.
+
+08:26.360 --> 08:28.200
+To integrate better
+
+08:28.200 --> 08:30.360
+with Nyxt, the Common Lisp browser,
+
+08:30.360 --> 08:32.200
+because there's a lot of opportunity there
+
+08:32.200 --> 08:35.320
+to make funny things,
+
+08:35.320 --> 08:38.040
+a browser accessible for molding,
+
+08:38.040 --> 08:41.240
+and then having some interaction with Smalltalk
+
+08:41.240 --> 08:42.840
+through Glamorous Toolkit,
+
+08:42.840 --> 08:44.080
+so that we can have the best tools,
+
+08:44.080 --> 08:46.800
+Emacs and Glamorous Toolkit and Nyxt
+
+08:46.800 --> 08:49.000
+and others, to work together
+
+08:49.000 --> 08:50.520
+to make our learning easy.
+
+08:50.520 --> 08:52.480
+Then... You've seen the tool;
+
+08:52.480 --> 08:53.840
+my molds that I have shown
+
+08:53.840 --> 08:56.200
+were basically by buffer.
+
+08:56.200 --> 08:58.600
+I want project statistics.
+
+08:58.600 --> 09:00.480
+What about... Give me the complexity
+
+09:00.480 --> 09:01.800
+of all the functions
+
+09:01.800 --> 09:03.480
+in a project,
+
+09:03.480 --> 09:06.120
+of all the paragraphs, whatever.
+
+09:06.120 --> 09:08.120
+And then there is a nice issue on
+
+09:08.120 --> 09:10.880
+my issue-tracker for moldable Emacs
+
+09:10.880 --> 09:13.920
+is about: "Emacs: tell me how can I
+
+09:13.920 --> 09:15.080
+compose the molds that I have
+
+09:15.080 --> 09:17.480
+to make new things?"
+
+09:17.480 --> 09:19.400
+It is a sort of a research-y thing
+
+09:19.400 --> 09:20.680
+that is pretty cool.
+
+09:20.680 --> 09:22.400
+So if you want to learn more,
+
+09:22.400 --> 09:25.520
+just check out at ag91.github.io,
+
+09:25.520 --> 09:28.000
+check out moldable Emacs on GitHub,
+
+09:28.000 --> 09:30.840
+and enjoy the rest of the conference.
+
+09:30.840 --> 09:34.200
+Bye.
diff --git a/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt b/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt
new file mode 100644
index 00000000..06d92f3a
--- /dev/null
+++ b/2021/captions/emacsconf-2021-molecular--reproducible-molecular-graphics-with-org-mode--blaine-mooers--main.vtt
@@ -0,0 +1,628 @@
+WEBVTT
+
+00:00.880 --> 00:00:02.446
+Hi, I'm Blaine Mooers.
+
+00:00:02.446 --> 00:00:04.160
+I'm going to be talking about
+
+00:00:04.160 --> 00:00:07.919
+the use of molecular graphics in Org
+
+00:07.919 --> 00:00:08.880
+for the purpose of doing
+
+00:00:08.880 --> 00:00:11.840
+reproducible research in structural biology.
+
+00:00:11.840 --> 00:00:13.722
+I'm an associate professor of biochemistry
+
+00:00:13.722 --> 00:00:15.768
+and microbiology at the University of Oklahoma
+
+00:00:15.768 --> 00:00:17.760
+Health Sciences Center in Oklahoma City.
+
+00:00:17.760 --> 00:00:19.600
+My laboratory uses X-ray crystallography
+
+00:00:19.600 --> 00:00:21.920
+to determine the atomic structures
+
+00:00:21.920 --> 00:00:23.439
+of proteins like this one
+
+00:00:23.439 --> 00:00:26.080
+in the lower left, and of nucleic acids
+
+00:26.080 --> 00:27.840
+important in human health.
+
+00:27.840 --> 00:00:29.591
+This is a crystal of an RNA,
+
+00:00:29.591 --> 00:00:31.359
+which we have placed in this
+
+00:00:31.359 --> 00:00:33.200
+X-ray diffraction instrument.
+
+00:00:33.200 --> 00:00:35.600
+And after rotating the crystal
+
+00:00:35.600 --> 00:00:38.000
+in the X-ray beam for two degrees,
+
+00:00:38.000 --> 00:00:40.480
+we obtain this following diffraction pattern,
+
+00:00:40.480 --> 00:00:43.280
+which has thousands of spots on it.
+
+00:43.280 --> 00:00:47.840
+We rotate the crystal for over 180 degrees,
+
+00:47.840 --> 00:00:51.760
+collecting 90 images to obtain all the data.
+
+00:00:51.760 --> 00:00:56.000
+We then process those images
+
+00:56.000 --> 00:00:57.752
+and do an inverse Fourier transform
+
+00:00:57.752 --> 00:00:59.920
+to obtain the electron density.
+
+00:00:59.920 --> 00:01:01.888
+This electron density map has been
+
+00:01:01.888 --> 00:01:04.344
+contoured at the one-sigma level.
+
+00:01:04.344 --> 00:01:06.116
+That level's being shown by
+
+00:01:06.116 --> 00:01:08.640
+this blue chicken wire mesh.
+
+00:01:08.640 --> 00:01:10.152
+Atomic models have been fitted
+
+00:01:10.152 --> 00:01:11.119
+to this chicken wire.
+
+00:01:11.119 --> 00:01:14.240
+These lines represent bonds between atoms,
+
+00:01:14.240 --> 00:01:16.240
+atoms are being represented by points.
+
+00:01:16.240 --> 00:01:18.640
+And atoms are colored by atom type,
+
+00:01:18.640 --> 00:01:21.280
+red for oxygen, blue for nitrogen,
+
+00:01:21.280 --> 00:01:23.040
+and then in this case,
+
+01:23.040 --> 00:01:24.720
+carbon is colored cyan.
+
+00:01:24.720 --> 00:01:27.203
+We have fitted a drug molecule
+
+00:01:27.203 --> 00:01:29.360
+to the central blob of electron density
+
+00:01:29.360 --> 00:01:32.400
+which corresponds to that active site
+
+01:32.400 --> 00:01:35.759
+of this protein, which is RET Kinase.
+
+00:01:35.759 --> 00:01:37.439
+It's important in lung cancer.
+
+00:01:37.439 --> 00:01:40.079
+When we're finished with model building,
+
+00:01:40.079 --> 00:01:41.339
+we will then examine
+
+00:01:41.339 --> 00:01:43.006
+the result of the final structure
+
+00:01:43.006 --> 00:01:45.200
+to prepare images for publication
+
+00:01:45.200 --> 00:01:47.439
+using molecular graphics program.
+
+01:47.439 --> 00:01:48.108
+In this case,
+
+00:01:48.108 --> 00:01:50.000
+we've overlaid a number of structures,
+
+00:01:50.000 --> 00:01:53.600
+and we're examining the distance between
+
+01:53.600 --> 00:01:55.680
+the side chain of an alanine
+
+00:01:55.680 --> 00:01:58.880
+and one or two drug molecules.
+
+00:01:58.880 --> 00:02:00.719
+This alanine sidechain actually blocks
+
+00:02:00.719 --> 00:02:02.159
+the binding of one of these drugs.
+
+00:02:02.159 --> 00:02:03.439
+The most popular program
+
+02:03.439 --> 02:06.320
+for doing this kind of analysis
+
+02:06.320 --> 00:02:07.280
+and for preparing images
+
+00:02:07.280 --> 00:02:09.520
+for publication is PyMOL.
+
+02:09.520 --> 02:11.440
+PyMOL was used to prepare these images
+
+02:11.440 --> 02:14.720
+on the covers of these featured journals.
+
+02:14.720 --> 00:02:17.520
+PyMOL is favored because
+
+00:02:17.520 --> 00:02:19.520
+it has 500 commands
+
+00:02:19.520 --> 00:02:22.128
+and 600 parameter settings
+
+00:02:22.128 --> 00:02:23.360
+that provide exquisite control
+
+00:02:23.360 --> 00:02:24.959
+over the appearance of the output.
+
+00:02:24.959 --> 00:02:28.480
+PyMOL has over 100,000 users,
+
+02:28.480 --> 00:02:30.000
+reflecting its popularity.
+
+00:02:30.000 --> 00:02:31.599
+This is the GUI for PyMOL.
+
+00:02:31.599 --> 00:02:35.120
+It shows in white the viewport area
+
+00:02:35.120 --> 00:02:36.080
+where one interacts
+
+00:02:36.080 --> 00:02:37.840
+with the loaded molecular object.
+
+00:02:37.840 --> 00:02:41.920
+We have rendered the same RET kinase
+
+02:41.920 --> 00:02:49.788
+with a set of preset parameters
+
+00:02:49.788 --> 00:02:51.200
+that have been named "publication".
+
+00:02:51.200 --> 00:02:52.720
+The other way of applying
+
+02:52.720 --> 00:02:54.319
+parameter settings and commands
+
+00:02:54.319 --> 00:02:56.720
+is to enter them at the PyMOL prompt.
+
+00:02:56.720 --> 00:03:00.159
+Then the third way is to load and run scripts.
+
+00:03:00.159 --> 00:03:03.120
+PyMOL is actually written in C for speed,
+
+00:03:03.120 --> 00:03:06.159
+but it is wrapped in Python for extensibility.
+
+03:06.159 --> 03:09.680
+In fact, there are over 100 articles
+
+03:09.680 --> 00:03:11.599
+about various plugins and scripts
+
+00:03:11.599 --> 00:03:12.400
+that people have developed
+
+00:03:12.400 --> 00:03:15.120
+to extend PyMOL for years.
+
+03:15.120 --> 00:03:16.480
+Here's some examples
+
+00:03:16.480 --> 00:03:18.959
+from the snippet library that I developed.
+
+03:18.959 --> 03:21.280
+On the left is a default
+
+03:21.280 --> 03:24.640
+cartoon representation of a RNA hairpin.
+
+03:24.640 --> 03:27.040
+I find this reduced representation
+
+03:27.040 --> 00:03:30.799
+of the RNA hairpin to be too stark.
+
+03:30.799 --> 00:03:32.319
+I prefer these alternate ones
+
+00:03:32.319 --> 00:03:33.840
+that I developed.
+
+03:33.840 --> 03:37.519
+So, these three to the right of this one
+
+03:37.519 --> 00:03:39.519
+are not available through
+
+00:03:39.519 --> 00:03:40.720
+pull downs in PyMOL.
+
+00:03:40.720 --> 00:03:42.748
+So why developed a PyMOL
+
+00:03:42.748 --> 00:03:44.879
+snippet library for Org?
+
+03:44.879 --> 00:03:47.040
+Well, Org provides great support
+
+00:03:47.040 --> 00:03:48.560
+for literate programming,
+
+00:03:48.560 --> 00:03:49.840
+where you have code blocks
+
+00:03:49.840 --> 00:03:52.000
+that contain code that's executable,
+
+00:03:52.000 --> 00:03:53.040
+and the output is shown
+
+00:03:53.040 --> 00:03:54.959
+below that code block.
+
+03:54.959 --> 00:03:56.720
+And then you can fill
+
+00:03:56.720 --> 00:03:58.959
+the surrounding area in the document
+
+03:58.959 --> 00:04:00.799
+with the explanatory prose.
+
+00:04:00.799 --> 00:04:02.000
+Org has great support
+
+00:04:02.000 --> 00:04:04.480
+for editing that explanatory prose.
+
+00:04:04.480 --> 00:04:08.080
+Org can run PyMOL through PyMOL's Python API.
+
+04:08.080 --> 00:04:11.280
+One of the uses of such an Org document
+
+00:04:11.280 --> 00:04:14.487
+is to assemble a gallery of draft images.
+
+00:04:14.487 --> 00:04:16.563
+We often have to look at
+
+00:04:16.563 --> 00:04:19.840
+dozens of candidate images
+
+00:04:19.840 --> 00:04:22.000
+with the molecule in different orientations,
+
+00:04:22.000 --> 00:04:23.520
+different zoom settings,
+
+04:23.520 --> 00:04:25.032
+different representations,
+
+00:04:25.032 --> 00:04:27.280
+different colors, and so on.
+
+00:04:27.280 --> 00:04:30.639
+And to have those images along with…,
+
+00:04:30.639 --> 00:04:31.840
+adjacent to the code
+
+04:31.840 --> 00:04:33.680
+that was used to generate them,
+
+00:04:33.680 --> 00:04:37.199
+can be very effective for
+
+04:37.199 --> 00:04:39.680
+further editing the code
+
+00:04:39.680 --> 00:04:40.880
+and improving the images.
+
+00:04:40.880 --> 00:04:44.080
+Once the final images have been selected,
+
+04:44.080 --> 00:04:46.320
+one can submit the code
+
+00:04:46.320 --> 00:04:48.479
+as part of the supplemental material.
+
+00:04:48.479 --> 00:04:52.400
+Finally, one can use the journal package
+
+04:52.400 --> 00:04:54.608
+to use the Org files as
+
+00:04:54.608 --> 00:04:57.120
+an electronic laboratory notebook,
+
+00:04:57.120 --> 00:04:59.600
+which is illustrated with molecular images.
+
+00:04:59.600 --> 00:05:01.039
+This can be very useful
+
+00:05:01.039 --> 00:05:04.080
+when assembling manuscripts
+
+05:04.080 --> 00:05:05.440
+months or years later.
+
+00:05:05.440 --> 00:05:08.320
+This shows the YASnippet pull down
+
+05:08.320 --> 00:05:12.720
+after my library has been installed.
+
+00:05:12.720 --> 00:05:15.360
+I have an Org file open,
+
+00:05:15.360 --> 00:05:17.120
+so I'm in Org mode.
+
+05:17.120 --> 00:05:20.880
+We have the Org mode submenu,
+
+05:20.880 --> 00:05:23.919
+and under it, all my snippets
+
+00:05:23.919 --> 00:05:26.880
+are located in these sub-sub-menus
+
+05:26.880 --> 00:05:30.880
+that are prepended with pymolpy.
+
+00:05:30.880 --> 00:05:33.840
+Under the molecular representations menu,
+
+00:05:33.840 --> 00:05:36.479
+there is a listing of snippets.
+
+00:05:36.479 --> 00:05:38.563
+The top one is for the ambient occlusion effect,
+
+00:05:38.563 --> 00:05:39.840
+which we're going to apply
+
+00:05:39.840 --> 00:05:41.039
+in this Org file.
+
+00:05:41.039 --> 00:05:44.240
+So these lines of code were inserted after,
+
+00:05:44.240 --> 00:05:48.479
+as well as these flanking lines
+
+05:48.479 --> 00:05:50.240
+that define the source block,
+
+00:05:50.240 --> 00:05:53.280
+were inserted by clicking on that line.
+
+05:53.280 --> 00:05:55.120
+Then I've added some additional code.
+
+00:05:55.120 --> 00:05:56.880
+So, the first line defines
+
+00:05:56.880 --> 00:05:59.039
+the language that we're using.
+
+00:05:59.039 --> 00:05:59.768
+We're going to use
+
+00:05:59.768 --> 00:06:02.639
+the jupyter-python language.
+
+06:02.639 --> 00:06:04.560
+Then you can define the session,
+
+00:06:04.560 --> 00:06:06.400
+and the name of this is arbitrary.
+
+00:06:06.400 --> 00:06:09.680
+Then the kernel is our means
+
+00:06:09.680 --> 00:06:11.360
+by which we gain access
+
+00:06:11.360 --> 00:06:14.880
+to the Python API of PyMOL.
+
+06:14.880 --> 00:06:17.039
+The remaining settings apply to the output.
+
+00:06:17.039 --> 00:06:18.319
+To execute this code
+
+00:06:18.319 --> 00:06:21.199
+and to get the resulting image,
+
+00:06:21.199 --> 00:06:25.120
+you put the cursor inside this code block,
+
+00:06:25.120 --> 00:06:26.560
+or on the top line,
+
+00:06:26.560 --> 00:06:29.840
+and enter Control c Control c (C-c C-c).
+
+06:29.840 --> 00:06:32.240
+This shows the resulting image
+
+00:06:32.240 --> 00:06:33.600
+has been loaded up.
+
+00:06:33.600 --> 00:06:37.280
+It takes about 10 seconds for this to appear.
+
+06:37.280 --> 00:06:38.479
+So the downside of this is
+
+00:06:38.479 --> 00:06:40.729
+if you have a large number of these,
+
+00:06:40.729 --> 00:06:43.919
+the Org file can lag quite a bit
+
+00:06:43.919 --> 00:06:45.120
+when you try to scroll through it,
+
+00:06:45.120 --> 00:06:48.319
+so you need to close up these result drawers,
+
+00:06:48.319 --> 00:06:50.960
+and only open up the ones
+
+00:06:50.960 --> 00:06:53.199
+that you're currently examining.
+
+00:06:53.199 --> 00:06:54.319
+These are features I think
+
+06:54.319 --> 06:56.240
+are important in practical work.
+
+06:56.240 --> 00:06:59.840
+So, the plus is, a feature that's present,
+
+00:06:59.840 --> 00:07:01.120
+minus is absent.
+
+00:07:01.120 --> 00:07:03.199
+I think tab stops and tab triggers
+
+00:07:03.199 --> 00:07:04.800
+are really important.
+
+07:04.800 --> 00:07:05.680
+Triggers are important for
+
+00:07:05.680 --> 00:07:06.720
+the fast assertion code,
+
+00:07:06.720 --> 00:07:08.639
+tab stops are important for
+
+07:08.639 --> 00:07:10.560
+complete, accurate editing of code.
+
+00:07:10.560 --> 00:07:12.735
+I already addressed the rendering speed
+
+00:07:12.735 --> 00:07:14.560
+and scrolling issue.
+
+00:07:14.560 --> 00:07:15.759
+I think the way around this
+
+00:07:15.759 --> 00:07:19.199
+is just to export the Org document to a PDF file
+
+00:07:19.199 --> 00:07:23.360
+and do your evaluation of different images
+
+00:07:23.360 --> 00:07:25.199
+by examining them in the PDF
+
+00:07:25.199 --> 00:07:26.560
+rather than the Org file.
+
+00:07:26.560 --> 00:07:30.400
+The path to PDF is lightning fast in Emacs
+
+00:07:30.400 --> 00:07:32.240
+compared to Jupyter,
+
+00:07:32.240 --> 00:07:35.280
+where it's cumbersome in comparison.
+
+00:07:35.280 --> 00:07:38.400
+This is a snapshot of my initialization file.
+
+00:07:38.400 --> 00:07:41.840
+These parts are relevant to doing this work.
+
+00:07:41.840 --> 00:07:43.039
+A full description of them
+
+00:07:43.039 --> 00:07:46.319
+can be found in the README file
+
+07:46.319 --> 00:07:48.639
+of this repository on GitHub.
+
+00:07:48.639 --> 00:07:49.456
+I'd like to thank the
+
+00:07:49.456 --> 00:07:51.840
+Nathan Shock Data Science Workshop
+
+00:07:51.840 --> 00:07:54.319
+for feedback during presentations
+
+00:07:54.319 --> 00:07:56.160
+I've made about this work.
+
+00:07:56.160 --> 00:07:57.628
+And I would also like to thank
+
+00:07:57.628 --> 00:08:00.240
+the following funding sources for support.
+
+00:08:00.240 --> 00:08:03.879
+I will now take questions. Thank you.
+
+00:08:03.879 --> 00:08:03.986
+[captions by Blaine Mooers and Bhavin Gandhi]
diff --git a/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt b/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--chapters.vtt
new file mode 100644
index 00000000..3bc5cbff
--- /dev/null
+++ b/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--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-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-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt b/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt
new file mode 100644
index 00000000..1fd6f335
--- /dev/null
+++ b/2021/captions/emacsconf-2021-montessori--emacs-and-montessori-philosophy--grant-shangreaux--main.vtt
@@ -0,0 +1,826 @@
+WEBVTT
+
+00:04.960 --> 00:00:07.680
+Hello everyone. My name is Grant Shangreaux,
+
+00:07.680 --> 00:00:10.719
+and I'm happy to be back here at EmacsConf.
+
+00:00:10.719 --> 00:00:13.840
+So before I was a programmer professionally,
+
+00:00:13.840 --> 00:00:16.800
+I was a Montessori guide with young children,
+
+00:00:16.800 --> 00:00:18.960
+and now I'm a parent of a child
+
+00:00:18.960 --> 00:00:20.319
+in a Montessori classroom.
+
+00:00:20.320 --> 00:00:21.600
+I was thinking Emacs
+
+00:00:21.600 --> 00:00:22.960
+and Montessori philosophy
+
+00:00:22.960 --> 00:00:25.760
+are both fundamentally about respect.
+
+00:00:25.760 --> 00:00:27.840
+Respect children, for the child
+
+00:27.840 --> 00:00:29.760
+is the parent to the adult.
+
+00:00:29.760 --> 00:00:32.079
+And we should respect users.
+
+00:32.079 --> 00:00:33.440
+Maybe the user is the parent
+
+00:00:33.440 --> 00:00:35.839
+to the hacker. That was certainly my case.
+
+00:00:35.840 --> 00:00:37.680
+So this talk is about the similarities
+
+00:37.680 --> 00:00:39.440
+between the Emacs environment
+
+00:00:39.440 --> 00:00:41.040
+and the Montessori classroom,
+
+00:00:41.040 --> 00:00:43.760
+which is called a prepared environment,
+
+00:00:43.760 --> 00:00:45.760
+meaning that everything in the environment
+
+00:00:45.760 --> 00:00:48.559
+has been prepared for the child to come
+
+00:00:48.559 --> 00:00:51.119
+and interact with in a meaningful way.
+
+00:00:51.120 --> 00:00:52.399
+The child will be driven
+
+00:00:52.399 --> 00:00:54.399
+by natural human tendencies
+
+00:00:54.399 --> 00:00:56.399
+to interact with their environment
+
+00:00:56.399 --> 00:00:58.079
+and to construct and refine
+
+00:00:58.079 --> 00:00:59.920
+their understanding of the world
+
+00:00:59.920 --> 00:01:01.359
+and the things in it.
+
+00:01:01.359 --> 00:01:03.600
+What I hope you come away from this talk with
+
+00:01:03.600 --> 00:01:06.080
+is just a new perspective
+
+00:01:06.080 --> 00:01:08.479
+on Emacs and software,
+
+00:01:08.479 --> 00:01:10.240
+and how users interact
+
+00:01:10.240 --> 00:01:13.520
+in a prepared environment like Emacs
+
+00:01:13.520 --> 00:01:15.280
+following their human tendencies
+
+00:01:15.280 --> 00:01:17.200
+to gain understanding
+
+00:01:17.200 --> 00:01:19.118
+and reach toward perfection.
+
+00:01:19.119 --> 00:01:21.040
+Okay. So the human tendencies
+
+00:01:21.040 --> 00:01:24.000
+are innate drives present in everybody.
+
+00:01:24.000 --> 00:01:25.600
+They're what enable us to explore
+
+00:01:25.600 --> 00:01:27.520
+and make sense of our world.
+
+01:27.520 --> 00:01:29.360
+We use these human tendencies
+
+00:01:29.360 --> 00:01:32.960
+to construct and refine the world itself.
+
+01:32.960 --> 00:01:34.240
+You know, if you're an Emacs user,
+
+00:01:34.240 --> 00:01:35.920
+I hope that's ringing some bells for you
+
+00:01:35.920 --> 00:01:38.320
+right away, because what we do
+
+00:01:38.320 --> 00:01:40.960
+when we interact with Emacs as individuals
+
+00:01:40.960 --> 00:01:45.360
+is construct and refine our world in Emacs.
+
+01:45.360 --> 00:01:46.320
+So I'm going to go through
+
+00:01:46.320 --> 00:01:47.920
+the human tendencies one by one
+
+00:01:47.920 --> 00:01:48.960
+and bring up things
+
+00:01:48.960 --> 00:01:52.079
+that I have observed or noticed in Emacs.
+
+01:52.079 --> 00:01:53.840
+I'm sure there's plenty more.
+
+00:01:53.840 --> 00:01:56.559
+Feel free to share it in chat.
+
+01:56.560 --> 00:02:00.000
+So number one is orientation.
+
+00:02:00.000 --> 00:02:02.000
+Human beings want to know their relationship
+
+00:02:02.000 --> 00:02:04.320
+to the environment around them.
+
+02:04.320 --> 00:02:05.840
+With children, when they come into
+
+00:02:05.840 --> 00:02:07.520
+a new environment, they want to look at it,
+
+02:07.520 --> 00:02:09.360
+touch everything around them.
+
+02:09.360 --> 00:02:11.520
+They want to know where they fit in,
+
+02:11.520 --> 00:02:12.800
+things like that.
+
+02:12.800 --> 00:02:15.599
+In Emacs, the easiest thing to think of
+
+00:02:15.599 --> 00:02:18.560
+is the initial new Emacs buffer.
+
+00:02:18.560 --> 00:02:21.040
+Right away, that is giving you
+
+00:02:21.040 --> 00:02:23.440
+some guideposts to orient yourself.
+
+00:02:23.440 --> 00:02:25.920
+If you've used any of the other
+
+02:25.920 --> 00:02:28.720
+Emacs starter packages, different packages
+
+00:02:28.720 --> 00:02:30.239
+take different approaches to this.
+
+00:02:30.239 --> 00:02:33.519
+I think if you're trying to get people
+
+00:02:33.519 --> 00:02:36.080
+to use Emacs for some reason,
+
+00:02:36.080 --> 00:02:39.440
+thinking about how individuals
+
+00:02:39.440 --> 00:02:40.720
+might orient themselves
+
+02:40.720 --> 00:02:43.680
+to this new software world is important.
+
+00:02:43.680 --> 00:02:46.000
+I think that there are friendly ways
+
+02:46.000 --> 00:02:48.080
+to welcome people into the environment
+
+02:48.080 --> 00:02:50.879
+and to make it easier for people
+
+00:02:50.879 --> 00:02:53.120
+to orient themselves within Emacs.
+
+00:02:53.120 --> 00:02:56.080
+Of course we've also got the Info manuals,
+
+00:02:56.080 --> 00:02:57.760
+and one of my favorite examples
+
+02:57.760 --> 00:03:00.080
+is the which-key package, which,
+
+00:03:00.080 --> 00:03:01.519
+when you press a key,
+
+00:03:01.519 --> 00:03:04.000
+it'll pop up with all of the following
+
+00:03:04.000 --> 00:03:05.760
+key bindings that are available.
+
+00:03:05.760 --> 00:03:09.280
+That's a really important way for me
+
+03:09.280 --> 00:03:13.599
+to explore, which is another human tendency,
+
+00:03:13.599 --> 00:03:15.280
+or to orient myself;
+
+00:03:15.280 --> 00:03:17.599
+to think about when I press this key,
+
+00:03:17.599 --> 00:03:19.920
+now I've got these possibilities.
+
+00:03:19.920 --> 00:03:21.760
+You see that all over in Emacs
+
+00:03:21.760 --> 00:03:25.920
+with hydras or the Magit transient buffers.
+
+00:03:25.920 --> 00:03:27.280
+There's all sorts of ways
+
+00:03:27.280 --> 00:03:29.440
+that Emacs is trying to help us
+
+00:03:29.440 --> 00:03:30.719
+orient ourselves.
+
+00:03:30.720 --> 00:03:33.440
+The second tendency is order, which
+
+00:03:33.440 --> 00:03:35.120
+I probably should have talked about first,
+
+00:03:35.120 --> 00:03:38.480
+but here I am. I myself am not
+
+00:03:38.480 --> 00:03:40.799
+particularly attuned to order,
+
+00:03:40.799 --> 00:03:43.120
+but when I was in the Montessori classroom,
+
+00:03:43.120 --> 00:03:45.920
+I found that it wasn't necessarily myself
+
+00:03:45.920 --> 00:03:47.360
+imposing the order, it was...
+
+00:03:47.360 --> 00:03:48.480
+The environment itself
+
+00:03:48.480 --> 00:03:50.239
+has a certain order to it,
+
+00:03:50.239 --> 00:03:52.080
+and by creating an environment
+
+00:03:52.080 --> 00:03:54.239
+where everything has its place,
+
+03:54.239 --> 00:03:56.480
+and everything has its time,
+
+00:03:56.480 --> 00:03:59.840
+and you have a way of doing things,
+
+00:03:59.840 --> 00:04:02.480
+it makes it easier for the child
+
+00:04:02.480 --> 00:04:04.560
+to develop that internal sense of order
+
+00:04:04.560 --> 00:04:07.120
+and succeed at imposing order
+
+00:04:07.120 --> 00:04:09.360
+upon their work, which...
+
+00:04:09.360 --> 00:04:11.360
+We do that as programmers.
+
+04:11.360 --> 00:04:13.280
+If we're contributing to Emacs,
+
+00:04:13.280 --> 00:04:16.079
+we try to do so in an orderly way,
+
+00:04:16.079 --> 00:04:18.160
+use prefixes for namespacing,
+
+00:04:18.160 --> 00:04:19.919
+since we don't have that ability
+
+00:04:19.919 --> 00:04:20.959
+in Emacs Lisp,
+
+00:04:20.959 --> 00:04:22.600
+and by sharing well-ordered
+
+00:04:22.600 --> 00:04:25.999
+self-documenting programs with our community.
+
+04:26.000 --> 00:04:28.560
+Number three is exploration. I think
+
+00:04:28.560 --> 00:04:30.720
+exploration is what drew me into Emacs,
+
+04:30.720 --> 00:04:32.400
+personally. In the beginning,
+
+00:04:32.400 --> 00:04:35.759
+it was just this wondrous
+
+00:04:35.759 --> 00:04:36.800
+software environment
+
+00:04:36.800 --> 00:04:39.360
+that offered so many opportunities.
+
+00:04:39.360 --> 00:04:41.680
+I was curious. Like, you've got
+
+00:04:41.680 --> 00:04:42.880
+your scratch buffer.
+
+00:04:42.880 --> 00:04:45.040
+You can explore in there with expressions.
+
+00:04:45.040 --> 00:04:46.880
+You can start up IELM.
+
+00:04:46.880 --> 00:04:49.440
+You can explore your file system with Dired.
+
+00:04:49.440 --> 00:04:51.199
+You can explore different packages
+
+00:04:51.199 --> 00:04:54.560
+with list-packages. There's so many ways
+
+00:04:54.560 --> 00:04:56.880
+you can explore in Emacs.
+
+00:04:56.880 --> 00:04:59.040
+For me, that was very delightful.
+
+00:04:59.040 --> 00:05:01.919
+It really resonated with my bias
+
+00:05:01.919 --> 00:05:04.960
+of exploration and human tendencies.
+
+05:04.960 --> 00:05:07.280
+Places to explore in Emacs are wonderful,
+
+05:07.280 --> 00:05:08.720
+and eventually you get down
+
+00:05:08.720 --> 00:05:12.079
+into the source code, and it's great.
+
+05:12.080 --> 00:05:14.400
+And then we've got communication.
+
+00:05:14.400 --> 00:05:16.639
+I think communication kind of
+
+00:05:16.639 --> 00:05:17.919
+speaks for itself as well.
+
+00:05:17.919 --> 00:05:19.520
+Emacs is software.
+
+05:19.520 --> 00:05:22.080
+Software is a form of communication.
+
+05:22.080 --> 00:05:23.360
+We're all driven to communicate.
+
+00:05:23.360 --> 00:05:26.240
+That's why we're here at this conference.
+
+05:26.240 --> 00:05:28.320
+Within Emacs, you've got lots of ways
+
+00:05:28.320 --> 00:05:30.960
+to communicate. You've got IRC clients,
+
+00:05:30.960 --> 00:05:32.960
+mail, you've got news readers.
+
+00:05:32.960 --> 00:05:34.080
+You could use Org.
+
+00:05:34.080 --> 00:05:37.600
+I even started working on a magazine in Org
+
+00:05:37.600 --> 00:05:38.800
+that I was going to distribute
+
+00:05:38.800 --> 00:05:42.479
+via live Debian CDs back in the day.
+
+00:05:42.479 --> 00:05:45.120
+So I think Emacs for communication
+
+00:05:45.120 --> 00:05:46.159
+is pretty clear.
+
+00:05:46.160 --> 00:05:48.639
+Activity. So Activities is just
+
+00:05:48.639 --> 00:05:51.120
+a natural thing when you're...
+
+00:05:51.120 --> 00:05:52.479
+You see it in children. Right?
+
+00:05:52.479 --> 00:05:54.720
+Children always find something to do
+
+00:05:54.720 --> 00:05:57.120
+to keep busy, whether they're pretending,
+
+00:05:57.120 --> 00:05:59.039
+or running around, or moving.
+
+00:05:59.039 --> 00:06:00.240
+You don't have to have a goal
+
+00:06:00.240 --> 00:06:01.759
+or end-product in mind.
+
+00:06:01.759 --> 00:06:02.800
+People are just active.
+
+00:06:02.800 --> 00:06:06.160
+You do things. I find that in Emacs,
+
+00:06:06.160 --> 00:06:08.000
+all the time, when I don't know
+
+00:06:08.000 --> 00:06:09.919
+what to work on, sometimes I just go
+
+06:09.919 --> 00:06:12.479
+into Emacs and hack around and, like,
+
+06:12.479 --> 00:06:14.000
+change things in my config.
+
+00:06:14.000 --> 00:06:16.000
+I'm sure we've all been there.
+
+00:06:16.000 --> 00:06:19.120
+So Emacs encourages and enables
+
+00:06:19.120 --> 00:06:21.198
+that kind of activity as well.
+
+00:06:21.199 --> 00:06:23.120
+Manipulation is the next one.
+
+00:06:23.120 --> 00:06:27.120
+So Lisp. Anyone? The fact that Emacs is
+
+00:06:27.120 --> 00:06:29.919
+this live Lisp process that's running,
+
+06:29.919 --> 00:06:33.360
+that you can manipulate at your fingertips...
+
+00:06:33.360 --> 00:06:35.120
+You couldn't ask for something better.
+
+00:06:35.120 --> 00:06:37.360
+I think the malleability of Emacs
+
+00:06:37.360 --> 00:06:39.600
+is why people love it.
+
+06:39.600 --> 00:06:41.840
+Clearly, the environment of Emacs
+
+00:06:41.840 --> 00:06:44.240
+was prepared with manipulation in mind
+
+00:06:44.240 --> 00:06:45.280
+from the very start.
+
+00:06:45.280 --> 00:06:46.960
+We'll go through these next ones
+
+06:46.960 --> 00:06:48.318
+pretty quickly.
+
+00:06:48.319 --> 00:06:51.759
+We've got work or purposeful activity.
+
+06:51.759 --> 00:06:53.039
+Emacs would not exist
+
+00:06:53.039 --> 00:06:55.120
+without this human tendency.
+
+06:55.120 --> 00:06:56.319
+it's been worked on
+
+00:06:56.319 --> 00:06:58.240
+by free software volunteers
+
+00:06:58.240 --> 00:07:03.360
+for 40 years, and this is the kind of
+
+00:07:03.360 --> 00:07:06.000
+self-motivated work that inspired me
+
+00:07:06.000 --> 00:07:09.198
+to be a hacker.
+
+07:09.199 --> 00:07:11.919
+Repetition is another human tendency.
+
+00:07:11.919 --> 00:07:14.960
+I think that one kind of speaks for itself.
+
+07:14.960 --> 00:07:17.120
+It's this tendency that gave me
+
+00:07:17.120 --> 00:07:19.919
+Emacs pinky after learning all of those
+
+00:07:19.919 --> 00:07:23.360
+key bindings, and then that same tendency
+
+00:07:23.360 --> 00:07:26.639
+drove me to learn another modal key mapping
+
+00:07:26.639 --> 00:07:29.759
+ to deal with that. I've repeated myself,
+
+00:07:29.759 --> 00:07:32.400
+starting over new Emacs configs
+
+00:07:32.400 --> 00:07:35.120
+several times. I could give another example,
+
+00:07:35.120 --> 00:07:36.960
+but I'll just be repeating myself
+
+00:07:36.960 --> 00:07:38.959
+at this point.
+
+07:38.960 --> 00:07:42.880
+And then exactness. So we have a tendency,
+
+00:07:42.880 --> 00:07:45.840
+a human tendency toward exactness.
+
+07:45.840 --> 00:07:48.160
+That's not one that's very strong for me.
+
+07:48.160 --> 00:07:50.879
+I'm not a super exacting person.
+
+07:50.879 --> 00:07:53.520
+But I think you can see that in Emacs,
+
+00:07:53.520 --> 00:07:55.520
+like certain parts of it
+
+00:07:55.520 --> 00:07:59.599
+have been refined down to exactness.
+
+00:07:59.599 --> 00:08:01.759
+I know when I'm working,
+
+00:08:01.759 --> 00:08:04.560
+sometimes it's just the theme that I choose
+
+00:08:04.560 --> 00:08:06.319
+or making sure the mode line
+
+00:08:06.319 --> 00:08:07.840
+is exactly the way I want it...
+
+00:08:07.840 --> 00:08:10.160
+You know, getting that environment
+
+00:08:10.160 --> 00:08:14.240
+to feel conducive to thought and work
+
+00:08:14.240 --> 00:08:16.318
+is important to me.
+
+08:16.319 --> 00:08:18.560
+And then we have abstraction, which...
+
+00:08:18.560 --> 00:08:19.680
+That one goes pretty deep,
+
+00:08:19.680 --> 00:08:21.840
+but I think you can see
+
+00:08:21.840 --> 00:08:24.080
+how abstraction works in Emacs.
+
+08:24.080 --> 00:08:26.080
+A buffer is an abstraction.
+
+00:08:26.080 --> 00:08:27.840
+One of the great things about Emacs
+
+00:08:27.840 --> 00:08:29.199
+and about Montessori philosophy
+
+00:08:29.199 --> 00:08:32.080
+is that these abstractions
+
+00:08:32.080 --> 00:08:33.200
+might not be something
+
+00:08:33.200 --> 00:08:34.640
+you need to think about right away,
+
+00:08:34.640 --> 00:08:35.919
+but they're there, right,
+
+00:08:35.919 --> 00:08:39.200
+like the fact that a buffer abstracts
+
+00:08:39.200 --> 00:08:41.279
+over working with text.
+
+08:41.279 --> 00:08:43.519
+Once that becomes clear to you,
+
+00:08:43.519 --> 00:08:45.760
+once you have a reason to manipulate it,
+
+00:08:45.760 --> 00:08:48.320
+having the abstraction of the buffer there
+
+00:08:48.320 --> 00:08:51.440
+to work with makes a huge difference.
+
+00:08:51.440 --> 00:08:52.160
+And then of course,
+
+00:08:52.160 --> 00:08:54.560
+we can create our own abstractions:
+
+08:54.560 --> 00:08:57.519
+transients, pop-up buffers, hydras...
+
+08:57.519 --> 00:08:59.360
+I'm sure there's plenty of examples
+
+00:08:59.360 --> 00:09:01.999
+in chat that I can't come up with.
+
+09:02.000 --> 00:09:03.519
+And finally, perfection.
+
+00:09:03.519 --> 00:09:04.959
+All of the human tendencies
+
+00:09:04.959 --> 00:09:07.279
+culminate in this one.
+
+00:09:07.279 --> 00:09:08.320
+Perfection doesn't mean
+
+00:09:08.320 --> 00:09:10.240
+like you just have to make
+
+00:09:10.240 --> 00:09:13.040
+this perfect shining idealistic thing.
+
+09:13.040 --> 00:09:15.680
+It's about perfecting what we do.
+
+00:09:15.680 --> 00:09:18.800
+I think everybody who's worked with Emacs
+
+00:09:18.800 --> 00:09:19.680
+for a long time,
+
+00:09:19.680 --> 00:09:22.240
+you perfect your configuration.
+
+09:22.240 --> 00:09:25.120
+Sometimes you tear it down and start over.
+
+00:09:25.120 --> 00:09:26.399
+If you're working on a package,
+
+00:09:26.399 --> 00:09:27.760
+you perfect that,
+
+00:09:27.760 --> 00:09:29.760
+and it's an ongoing process.
+
+00:09:29.760 --> 00:09:31.600
+An example I can think of are
+
+00:09:31.600 --> 00:09:33.680
+like raxod502's packages.
+
+09:33.680 --> 00:09:36.720
+straight.el is an attempt at perfecting
+
+00:09:36.720 --> 00:09:40.480
+the package management system in Emacs,
+
+09:40.480 --> 00:09:41.920
+and he's taken a stab at
+
+00:09:41.920 --> 00:09:43.440
+several other common things,
+
+00:09:43.440 --> 00:09:46.320
+like incremental selection and so on.
+
+09:46.320 --> 00:09:50.959
+These aren't necessarily finished problems.
+
+09:50.959 --> 00:09:52.480
+There's room for perfection,
+
+00:09:52.480 --> 00:09:58.160
+and we have a human tendency to pursue that.
+
+09:58.160 --> 00:09:59.040
+I hope this talk
+
+00:09:59.040 --> 00:10:00.080
+has gotten you thinking about
+
+00:10:00.080 --> 00:10:02.880
+how Emacs and the Montessori classroom
+
+00:10:02.880 --> 00:10:04.480
+are similar--they're both
+
+00:10:04.480 --> 00:10:06.160
+prepared environments
+
+10:06.160 --> 00:10:08.800
+that call upon our human tendencies
+
+10:08.800 --> 00:10:12.240
+to construct and refine our world--
+
+10:12.240 --> 00:10:15.519
+and how Emacs respects us as users
+
+10:15.519 --> 00:10:18.480
+in the hopes that we will grow up into
+
+10:18.480 --> 00:10:21.200
+creative hackers.
+
+10:21.200 --> 00:10:22.240
+Thank you for listening.
+
+00:10:22.240 --> 00:10:23.680
+I'm happy to answer any questions
+
+00:10:23.680 --> 00:10:26.079
+after the talk.
+
+00:10:26.079 --> 00:10:27.079
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt b/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt
new file mode 100644
index 00000000..99d8802b
--- /dev/null
+++ b/2021/captions/emacsconf-2021-nangulator--introducing-n-angulator--kevin-haddock--main.vtt
@@ -0,0 +1,673 @@
+WEBVTT
+
+00:00.240 --> 00:00:02.800
+Hello. This is Kevin Haddock
+
+00:00:02.800 --> 00:00:05.839
+to announce the introduction of N-Angulator,
+
+00:00:05.839 --> 00:00:07.759
+hereafter called NA.
+
+00:07.759 --> 00:00:10.240
+NA allows you, the user, to supply
+
+00:00:10.240 --> 00:00:11.679
+the meaning to your data
+
+00:00:11.679 --> 00:00:13.599
+in a concise, efficient way.
+
+00:00:13.599 --> 00:00:14.880
+How does it work?
+
+00:14.880 --> 00:00:16.880
+Your files are stored on your hard disk
+
+00:00:16.880 --> 00:00:18.160
+in what technically is called
+
+00:00:18.160 --> 00:00:20.640
+a hierarchical file system.
+
+00:20.640 --> 00:00:22.240
+What this means is that
+
+00:00:22.240 --> 00:00:24.560
+the root of the directory tree can be
+
+00:00:24.560 --> 00:00:27.760
+not only files, or what we call leaves,
+
+00:00:27.760 --> 00:00:30.720
+but also other folders/branches
+
+00:00:30.720 --> 00:00:33.680
+that themselves contain other files, leaves,
+
+00:00:33.680 --> 00:00:36.000
+and/or branches.
+
+00:36.000 --> 00:00:37.680
+This structure is supposed to
+
+00:00:37.680 --> 00:00:40.079
+make it easy to locate your data,
+
+00:00:40.079 --> 00:00:42.079
+but as anyone knows who has worked with this
+
+00:00:42.079 --> 00:00:43.600
+single-dimensional file system
+
+00:00:43.600 --> 00:00:45.280
+for any length of time,
+
+00:45.280 --> 00:00:46.800
+it can get quite frustrating
+
+00:00:46.800 --> 00:00:48.960
+when your file would fit equally well
+
+00:00:48.960 --> 00:00:52.079
+on more than one branch of the tree.
+
+00:52.079 --> 00:00:53.920
+What are you to do?
+
+00:53.920 --> 00:00:55.920
+Create multiple copies everywhere
+
+00:00:55.920 --> 00:00:57.840
+it might appropriately fit.
+
+00:00:57.840 --> 00:00:59.039
+What if the file was something
+
+00:00:59.039 --> 00:01:01.120
+people would occasionally modify,
+
+00:01:01.120 --> 00:01:04.879
+like a spreadsheet or a computer source file?
+
+01:04.879 --> 00:01:07.760
+You would have to hunt it down in every place
+
+00:01:07.760 --> 00:01:11.840
+and apply those changes everywhere by hand.
+
+01:11.840 --> 00:01:14.720
+Also, let's say not only did you want
+
+00:01:14.720 --> 00:01:17.040
+to put the file in multiple places,
+
+00:01:17.040 --> 00:01:18.799
+but it was also more appropriate
+
+00:01:18.799 --> 00:01:21.280
+to give it different names?
+
+01:21.280 --> 00:01:23.280
+Plus, let's say in different areas
+
+00:01:23.280 --> 00:01:25.119
+of the tree, there were files
+
+00:01:25.119 --> 00:01:26.560
+with the same name
+
+01:26.560 --> 00:01:29.280
+that had totally different content?
+
+01:29.280 --> 00:01:31.280
+Then updating all the different instances
+
+00:01:31.280 --> 00:01:32.640
+of the file you need
+
+00:01:32.640 --> 00:01:35.200
+would become more and more of a nightmare.
+
+01:35.200 --> 00:01:37.920
+In addition, wouldn't it be great
+
+00:01:37.920 --> 00:01:39.520
+if we could all speed up
+
+00:01:39.520 --> 00:01:42.479
+the actual searching for a particular file
+
+01:42.479 --> 00:01:45.680
+by selecting multiple branches in the tree
+
+00:01:45.680 --> 00:01:47.200
+and simply asking the computer
+
+00:01:47.200 --> 00:01:49.680
+to tell us which branches under those
+
+01:49.680 --> 00:01:52.560
+contain the same file and which do not?
+
+01:52.560 --> 00:01:54.000
+This would be especially great
+
+00:01:54.000 --> 00:01:56.719
+if it were instantaneous.
+
+01:56.719 --> 00:01:58.640
+Well, believe it or not, this is what NA
+
+01:58.640 --> 00:02:00.079
+brings to the table.
+
+02:00.079 --> 00:02:03.040
+In fact, this is how NA got its name.
+
+02:03.040 --> 00:02:05.040
+Your data is located by a process
+
+00:02:05.040 --> 00:02:06.960
+very similar to the triangulation
+
+00:02:06.960 --> 00:02:09.119
+used to locate radio signals,
+
+00:02:09.119 --> 00:02:10.160
+only we are not limited
+
+00:02:10.160 --> 00:02:12.000
+to just two or three angles,
+
+00:02:12.000 --> 00:02:14.720
+but instead, many dozens can be used,
+
+02:14.720 --> 00:02:16.879
+this makes NA appear to be
+
+00:02:16.879 --> 00:02:18.640
+what is known in computer lingo
+
+00:02:18.640 --> 00:02:21.760
+as an n-dimensional sparse array.
+
+02:21.760 --> 00:02:23.599
+If that sounds complex, don't worry.
+
+00:02:23.599 --> 00:02:25.280
+It will become clear when you see it
+
+00:02:25.280 --> 00:02:28.720
+in operation in a couple of minutes.
+
+02:28.720 --> 00:02:32.560
+To start out, here we see the NA main screen.
+
+02:32.560 --> 00:02:36.080
+There are two vital aspects of mastering NA.
+
+00:02:36.080 --> 00:02:37.760
+First is the actual mechanics
+
+00:02:37.760 --> 00:02:39.120
+of using the program,
+
+00:02:39.120 --> 00:02:40.480
+which should be second nature
+
+00:02:40.480 --> 00:02:41.920
+for most anyone familiar with
+
+02:41.920 --> 00:02:46.160
+either a Windows or Unix/apple file system.
+
+02:46.160 --> 00:02:48.080
+We have the same operations
+
+00:02:48.080 --> 00:02:50.400
+as one might do with Windows Explorer
+
+02:50.400 --> 00:02:52.560
+or any number of other file tools,
+
+00:02:52.560 --> 00:02:54.560
+but what we also do
+
+00:02:54.560 --> 00:02:56.080
+that generally they do not
+
+00:02:56.080 --> 00:02:58.000
+is place a leaf on a branch,
+
+00:02:58.000 --> 00:03:00.560
+then cruise around adding links to that leaf
+
+03:00.560 --> 00:03:02.720
+on a multitude of other branches,
+
+00:03:02.720 --> 00:03:05.120
+which could include creating, renaming,
+
+00:03:05.120 --> 00:03:07.360
+or restructuring more branches on the fly
+
+03:07.360 --> 00:03:10.480
+as needed. Plus, when we find ourselves
+
+00:03:10.480 --> 00:03:12.319
+hunting for that file,
+
+00:03:12.319 --> 00:03:13.840
+we can incrementally select
+
+00:03:13.840 --> 00:03:15.120
+a stack of branches
+
+00:03:15.120 --> 00:03:17.200
+while seeking what the latter branches
+
+00:03:17.200 --> 00:03:19.920
+have in common with the earlier ones,
+
+03:19.920 --> 00:03:22.720
+to make putting one's finger on exactly
+
+00:03:22.720 --> 00:03:26.239
+the item they're looking for a snap.
+
+03:26.239 --> 00:03:28.319
+Secondly, you have the actual art
+
+00:03:28.319 --> 00:03:29.680
+of organizing your data,
+
+00:03:29.680 --> 00:03:31.120
+and NA doesn't really put
+
+00:03:31.120 --> 00:03:32.640
+any limitations on this,
+
+00:03:32.640 --> 00:03:34.799
+other than the underlying limitations
+
+00:03:34.799 --> 00:03:36.560
+of the file system.
+
+03:36.560 --> 00:03:39.760
+Let's get started, shall we?
+
+03:39.760 --> 00:03:41.920
+Right-clicking the mouse button here
+
+03:41.920 --> 00:03:43.760
+will bring up what we call
+
+00:03:43.760 --> 00:03:46.000
+a branch navigation menu,
+
+00:03:46.000 --> 00:03:46.959
+because it allows you
+
+00:03:46.959 --> 00:03:48.239
+to move around the tree
+
+00:03:48.239 --> 00:03:50.159
+or commence a new angle.
+
+03:50.159 --> 00:03:52.480
+We have chosen to organize our data
+
+00:03:52.480 --> 00:03:55.519
+with a hopper to put new items in,
+
+00:03:55.519 --> 00:03:57.360
+and the initial branches representing
+
+00:03:57.360 --> 00:03:59.519
+who, what, where, why, and how.
+
+00:03:59.519 --> 00:04:01.280
+We right-click on the root
+
+00:04:01.280 --> 00:04:03.439
+and select 0hopper,
+
+04:03.439 --> 00:04:06.000
+and that branch is added to the display.
+
+04:06.000 --> 00:04:08.080
+If we middle-click on the branch,
+
+04:08.080 --> 00:04:09.360
+we get what is called
+
+00:04:09.360 --> 00:04:11.280
+the branch command menu,
+
+00:04:11.280 --> 00:04:12.959
+which gives us many options,
+
+00:04:12.959 --> 00:04:13.920
+not the least of which
+
+00:04:13.920 --> 00:04:15.920
+is to create a leaf here.
+
+04:15.920 --> 00:04:18.000
+Remember this item as we progress,
+
+04:18.000 --> 00:04:20.320
+because it will become important.
+
+04:20.320 --> 00:04:22.960
+Next we pick what we know is a leaf item,
+
+04:22.960 --> 00:04:24.720
+due to the fact that it does not have
+
+00:04:24.720 --> 00:04:30.960
+a trailing slash.
+
+04:30.960 --> 00:04:32.960
+Now, when we right-click on it,
+
+04:32.960 --> 00:04:35.040
+notice the navigation menu is limited to
+
+00:04:35.040 --> 00:04:37.040
+the two items: New Angle
+
+00:04:37.040 --> 00:04:40.960
+and the leaf name itself.
+
+04:40.960 --> 00:04:43.680
+If we want to view or edit that leaf item,
+
+00:04:43.680 --> 00:04:45.440
+we can select that item.
+
+04:45.440 --> 00:04:47.280
+Now that we have selected a leaf,
+
+00:04:47.280 --> 00:04:48.560
+let's middle-click on it
+
+00:04:48.560 --> 00:04:49.520
+to bring up what we call
+
+00:04:49.520 --> 00:04:51.600
+the leaf command menu.
+
+04:51.600 --> 00:04:54.080
+This shows us a bunch of standard options
+
+00:04:54.080 --> 00:04:56.160
+one might do in a typical file tool
+
+00:04:56.160 --> 00:04:58.320
+like Microsoft Explorer.
+
+04:58.320 --> 00:05:00.479
+Since we want to do what they cannot do,
+
+05:00.479 --> 00:05:01.680
+let's right-click the leaf
+
+00:05:01.680 --> 00:05:04.639
+and select New Angle.
+
+05:04.639 --> 00:05:06.400
+Notice that another slash has appeared
+
+00:05:06.400 --> 00:05:09.840
+below the displayed path of the leaf.
+
+05:09.840 --> 00:05:11.520
+Right-click on it, and you will see
+
+00:05:11.520 --> 00:05:14.639
+the root branch navigation menu appears again,
+
+05:14.639 --> 00:05:19.039
+but now 0hopper entry has a line
+
+00:05:19.039 --> 00:05:20.960
+both above and below it.
+
+05:20.960 --> 00:05:23.199
+Items in between these two lines
+
+00:05:23.199 --> 00:05:24.560
+are called members,
+
+00:05:24.560 --> 00:05:27.520
+and items below them are called others.
+
+05:27.520 --> 00:05:29.680
+What this is saying is that
+
+00:05:29.680 --> 00:05:32.160
+the previously selected angle,
+
+05:32.160 --> 00:05:34.160
+which can be a single leaf
+
+05:34.160 --> 00:05:35.840
+as in this instance,
+
+05:35.840 --> 00:05:37.360
+or can be all of the leaves
+
+00:05:37.360 --> 00:05:38.960
+under a particular branch
+
+00:05:38.960 --> 00:05:43.039
+chosen to navigate new angle from,
+
+05:43.039 --> 00:05:44.880
+shares content with the items
+
+00:05:44.880 --> 00:05:47.680
+under the member area of the menu,
+
+00:05:47.680 --> 00:05:50.880
+but items in the others area do not.
+
+05:50.880 --> 00:05:53.600
+Since the first angle is 0hopper,
+
+05:53.600 --> 00:05:56.800
+of course it shares content with itself,
+
+05:56.800 --> 00:05:59.199
+and so it appears in members.
+
+05:59.199 --> 00:06:01.199
+Now let's click the middle button
+
+00:06:01.199 --> 00:06:02.960
+on the root branch, and see what
+
+00:06:02.960 --> 00:06:07.360
+the branch command menu has to say.
+
+06:07.360 --> 00:06:09.280
+Notice that the entry that used to say
+
+06:09.280 --> 00:06:13.120
+Create a New Leaf now says Add a Link.
+
+06:13.120 --> 00:06:15.039
+This is because we have already selected
+
+06:15.039 --> 00:06:17.360
+a leaf, and now we want to add links
+
+00:06:17.360 --> 00:06:20.479
+to it rather than create a new one.
+
+06:20.479 --> 00:06:21.840
+If you go back to the root
+
+00:06:21.840 --> 00:06:24.319
+and reselect 0hopper,
+
+06:24.319 --> 00:06:29.039
+that option will revert back again.
+
+06:29.039 --> 00:06:40.880
+So let's add a link under person.
+
+06:40.880 --> 00:06:42.720
+We right-click the root,
+
+00:06:42.720 --> 00:06:46.720
+select person, and let's add a link.
+
+06:46.720 --> 00:06:50.560
+Notice the bottom area (called the minibuffer)
+
+00:06:50.560 --> 00:06:53.360
+gives us the proposed name of the link,
+
+06:53.360 --> 00:06:55.680
+and we choose to accept it by hitting enter,
+
+00:06:55.680 --> 00:07:09.759
+or edit it to taste first.
+
+07:09.759 --> 00:07:10.960
+Now let's go back up to
+
+00:07:10.960 --> 00:07:13.120
+the end of the prior angle,
+
+07:13.120 --> 00:07:15.360
+select New Angle again,
+
+07:15.360 --> 00:07:18.319
+and then click the resultant /,
+
+00:07:18.319 --> 00:07:20.240
+and see what are members
+
+00:07:20.240 --> 00:07:21.840
+and what are others.
+
+07:21.840 --> 00:07:24.319
+Notice that the 0hopper and person
+
+07:24.319 --> 00:07:25.759
+are members.
+
+07:25.759 --> 00:07:28.319
+NA knows you added content to the person,
+
+00:07:28.319 --> 00:07:32.160
+so it moves to members.
+
+07:32.160 --> 00:07:33.599
+Now let's add some more links
+
+00:07:33.599 --> 00:07:35.360
+and perhaps a few subdirectories
+
+00:07:35.360 --> 00:08:06.960
+for this item.
+
+08:06.960 --> 00:08:08.960
+Notice how we can even eliminate
+
+00:08:08.960 --> 00:08:11.039
+the file name extension.
+
+08:11.039 --> 00:08:13.680
+It will still know how to display the item
+
+00:08:13.680 --> 00:08:15.440
+as it actually analyzes the file
+
+00:08:15.440 --> 00:08:17.120
+to determine its type.
+
+08:17.120 --> 00:08:19.120
+This greatly cleans up your metadata
+
+00:08:19.120 --> 00:08:40.719
+and makes it more human.
+
+08:40.719 --> 00:08:41.839
+Now let's pick a branch
+
+00:08:41.839 --> 00:08:43.519
+from one of the menus.
+
+08:43.519 --> 00:08:44.880
+For instance, let's look and see
+
+00:08:44.880 --> 00:08:54.880
+where any events broadcast were done from.
+
+08:54.880 --> 00:09:06.640
+We select event, broadcast, then New Angle,
+
+09:06.640 --> 00:09:09.600
+and we can see California is in members.
+
+09:09.600 --> 00:09:11.600
+Now we can also do New Angle
+
+00:09:11.600 --> 00:09:13.920
+and select person,
+
+09:13.920 --> 00:09:16.160
+and we can see who did them.
+
+09:16.160 --> 00:09:18.720
+Another thing we can do is pick a leaf
+
+09:18.720 --> 00:09:19.920
+and quickly display
+
+00:09:19.920 --> 00:09:21.920
+all angles or links for it,
+
+00:09:21.920 --> 00:09:24.160
+or if we are willing to wait a little longer,
+
+00:09:24.160 --> 00:09:26.720
+have NA construct all the display items
+
+00:09:26.720 --> 00:09:28.320
+with Edit All Angles,
+
+00:09:28.320 --> 00:09:30.160
+so we can manipulate them
+
+00:09:30.160 --> 00:09:31.440
+just as if we had entered
+
+00:09:31.440 --> 00:09:44.320
+or selected them by hand.
+
+09:44.320 --> 00:09:46.080
+There are many more tools in NA
+
+00:09:46.080 --> 00:09:47.440
+to handle sets of leaves
+
+00:09:47.440 --> 00:09:50.320
+such as scanned pages of a book,
+
+09:50.320 --> 00:09:53.040
+promoting /, demoting nodes,
+
+09:53.040 --> 00:09:54.560
+and so forth.
+
+09:54.560 --> 00:09:55.560
+Thanks for watching.
+
+00:09:55.560 --> 00:09:58.040
+[captions by sachac]
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--chapters.vtt b/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--chapters.vtt
new file mode 100644
index 00000000..7afd1e04
--- /dev/null
+++ b/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--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-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-news--emacs-news-highlights--sacha-chua--main.vtt b/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt
new file mode 100644
index 00000000..32533455
--- /dev/null
+++ b/2021/captions/emacsconf-2021-news--emacs-news-highlights--sacha-chua--main.vtt
@@ -0,0 +1,469 @@
+WEBVTT
+
+00:00.003 --> 00:01.519
+I'm Sacha Chua, and here are
+
+00:01.519 --> 00:03.754
+ten Emacs News highlights for 2021.
+
+00:03.754 --> 00:05.305
+If you want to follow the links,
+
+00:05.305 --> 00:06.846
+check out the wiki page at
+
+00:06.846 --> 00:11.024
+https://emacsconf.org/2021/talks/news/ .
+
+00:11.024 --> 00:13.442
+1. The Emacs developers are currently
+
+00:13.442 --> 00:15.346
+working on Emacs 28.1,
+
+00:15.346 --> 00:17.119
+which will be the next major release.
+
+00:17.119 --> 00:19.703
+John Wiegley will share more Emacs 28 details
+
+00:19.703 --> 00:21.483
+in his update, so check out his talk.
+
+00:21.483 --> 00:23.353
+Andrea Corallo's giving a talk
+
+00:23.353 --> 00:24.988
+on native compilation too.
+
+00:24.988 --> 00:25.776
+2.
+
+00:25.776 --> 00:28.302
+Org Mode is now at version 9.5.
+
+00:28.302 --> 00:29.656
+New features include
+
+00:29.656 --> 00:31.505
+a library for managing citations,
+
+00:31.505 --> 00:32.984
+asynchronous session support
+
+00:32.984 --> 00:33.945
+for code blocks,
+
+00:33.945 --> 00:34.912
+and better control
+
+00:34.912 --> 00:36.165
+of your agenda's appearance.
+
+00:36.165 --> 00:37.942
+If you've been getting your Org packages
+
+00:37.942 --> 00:39.076
+from Org ELPA,
+
+00:39.076 --> 00:40.698
+you can update your configuration
+
+00:40.698 --> 00:42.466
+to get Org from GNU ELPA
+
+00:42.466 --> 00:44.725
+and org-contrib from NonGNU ELPA.
+
+00:44.725 --> 00:46.848
+The new release of the Org Roam package
+
+00:46.848 --> 00:48.755
+should be a faster and more consistent way
+
+00:48.755 --> 00:50.630
+to use Org to manage a knowledgebase,
+
+00:50.630 --> 00:52.993
+and org-roam-ui looks pretty snazzy.
+
+00:52.993 --> 00:55.101
+The best way to keep up with Org changes
+
+00:55.101 --> 00:57.126
+is to check out the blog This Month in Org.
+
+00:57.126 --> 00:58.009
+3.
+
+00:58.009 --> 01:00.039
+New Magit major release!
+
+01:00.039 --> 01:02.351
+Jonas Bernoulli has split some functionality
+
+01:02.351 --> 01:04.127
+into other packages so that
+
+01:04.127 --> 01:06.289
+Emacs Lisp developers can use them, such as
+
+01:06.289 --> 01:08.619
+magit-section, transient, and forge.
+
+01:08.619 --> 01:11.072
+Here's an example of using magit-section
+
+01:11.072 --> 01:12.343
+to manage groups of buffers.
+
+01:12.343 --> 01:13.903
+You can learn more about Transient
+
+01:13.903 --> 01:15.412
+in the talk on self-describing
+
+01:15.412 --> 01:18.108
+smart domain-specific languages or DSLs.
+
+01:18.108 --> 01:18.890
+4.
+
+01:18.890 --> 01:21.115
+In terms of smaller packages, there's been
+
+01:21.115 --> 01:23.195
+a lot of activity around completion.
+
+01:23.195 --> 01:24.862
+Karthik has a great diagram,
+
+01:24.862 --> 01:27.029
+and Prot explains how things work together.
+
+01:27.029 --> 01:28.984
+I think the idea is that instead of having
+
+01:28.984 --> 01:30.636
+one large completion system
+
+01:30.636 --> 01:32.914
+like Helm or Icicles, you can choose
+
+01:32.914 --> 01:34.680
+a few different, smaller packages
+
+01:34.680 --> 01:36.439
+and configure them to work together.
+
+01:36.439 --> 01:37.699
+If you're curious about this,
+
+01:37.699 --> 01:39.729
+you might start with either selectrum
+
+01:39.729 --> 01:42.441
+or vertico, which are both completion interfaces,
+
+01:42.441 --> 01:45.013
+add marginalia for more information,
+
+01:45.013 --> 01:46.792
+and try consult for many useful
+
+01:46.792 --> 01:47.803
+completing commands.
+
+01:47.803 --> 01:48.849
+There are so many options,
+
+01:48.849 --> 01:50.437
+so it might be useful to check out
+
+01:50.437 --> 01:51.284
+some discussions.
+
+01:51.284 --> 01:52.047
+5.
+
+01:52.047 --> 01:54.101
+Embark is usually mentioned as part of
+
+01:54.101 --> 01:55.177
+that group of packages,
+
+01:55.177 --> 01:56.766
+but it's well worth looking into
+
+01:56.766 --> 01:58.465
+even if you use a different system.
+
+01:58.465 --> 02:00.987
+Embark lets you have context-sensitive shortcuts
+
+02:00.987 --> 02:03.366
+that work on things in buffers, minibuffers,
+
+02:03.366 --> 02:05.338
+and even collections of things.
+
+02:05.338 --> 02:06.307
+You can also use it
+
+02:06.307 --> 02:07.482
+when you start doing one command
+
+02:07.482 --> 02:09.582
+and then decide to do a different one instead.
+
+02:09.582 --> 02:10.841
+For more ideas, check out
+
+02:10.841 --> 00:02:12.064
+Fifteen Ways to Use Embark.
+
+02:12.065 --> 02:12.855
+6.
+
+02:12.855 --> 02:14.733
+Now that there are Emacs Lisp bindings
+
+02:14.733 --> 02:16.709
+for tree-sitter, we can work more easily
+
+02:16.709 --> 02:18.369
+with the structure of code instead of
+
+02:18.369 --> 02:20.031
+just using regular expressions.
+
+02:20.031 --> 02:20.779
+Check out the talk
+
+02:20.779 --> 02:22.374
+on Tree-edit and structural editing
+
+02:22.374 --> 02:23.163
+to learn more.
+
+02:23.163 --> 02:24.626
+You can use tree-sitter for
+
+02:24.626 --> 02:26.521
+intelligent snippets that get information
+
+02:26.521 --> 02:27.739
+from the code around them,
+
+02:27.739 --> 02:29.634
+editing Lisp expressions,
+
+02:29.634 --> 02:31.971
+and navigating text objects in Evil mode.
+
+02:31.971 --> 02:34.240
+(That's when Emacs is pretending to be Vi.)
+
+02:34.240 --> 02:37.133
+Dynamic modules help us add more to Emacs
+
+02:37.133 --> 02:38.958
+than Emacs Lisp easily offers,
+
+02:38.958 --> 02:41.374
+such as structural editing in OCaml
+
+02:41.374 --> 02:43.299
+and using Rust to figure out parentheses
+
+02:43.299 --> 00:02:44.655
+and indentation for Lisp.
+
+02:44.656 --> 02:45.559
+7.
+
+02:45.559 --> 02:47.614
+Collaborative editing is now much easier
+
+02:47.614 --> 02:50.210
+since the CRDT package is in GNU ELPA.
+
+02:50.210 --> 02:51.952
+It allows multiple people to edit
+
+02:51.952 --> 02:53.605
+the same file over the network,
+
+02:53.605 --> 02:55.345
+using their own Emacs.
+
+02:55.345 --> 02:57.170
+This means you can keep your own config
+
+02:57.170 --> 02:58.994
+and keybindings, yay!
+
+02:58.994 --> 03:00.720
+Watch the Emacs Research Group talk
+
+03:00.720 --> 03:02.505
+for an example of how several people
+
+03:02.505 --> 00:03:03.656
+used it to work together.
+
+03:03.657 --> 03:04.158
+8.
+
+03:04.158 --> 03:05.721
+In case you're still under the impression
+
+03:05.721 --> 03:07.369
+that Emacs is just a text editor,
+
+03:07.369 --> 03:08.880
+some folks have been working on
+
+03:08.880 --> 03:10.574
+pretty neat graphical experiments.
+
+03:10.574 --> 03:12.752
+These OpenGL bindings for Emacs Lisp
+
+03:12.752 --> 03:14.515
+use an embedded xwidget,
+
+03:14.515 --> 03:16.927
+while other prototypes use the SVG support
+
+03:16.927 --> 03:18.020
+that's built into Emacs
+
+03:18.020 --> 03:19.367
+for Gantt charts,
+
+03:19.367 --> 03:20.139
+scribbles,
+
+03:20.139 --> 03:21.640
+and even diagrams.
+
+03:21.640 --> 03:23.110
+The color-picker from that one
+
+03:23.110 --> 03:25.161
+looks particularly useful for CSS.
+
+03:25.161 --> 03:27.363
+If you want to play around with adding SVGs
+
+03:27.363 --> 03:29.042
+to your files and interfaces,
+
+03:29.042 --> 03:30.082
+svg-icon
+
+03:30.082 --> 03:30.999
+and svg-lib
+
+03:30.999 --> 03:33.053
+might be good places to start. (Reddit)
+
+03:33.053 --> 03:34.527
+Of course, there's always a place
+
+03:34.527 --> 03:35.529
+for ASCII art,
+
+03:35.529 --> 03:37.253
+especially with the new boxy package
+
+03:37.253 --> 03:38.753
+that you can use for org files,
+
+03:38.753 --> 03:40.073
+imenu navigation,
+
+03:40.073 --> 00:03:41.737
+and even things in real life.
+
+03:41.738 --> 03:42.528
+9.
+
+03:42.528 --> 03:44.731
+There have been a lot of great posts, videos,
+
+03:44.731 --> 03:46.632
+and livestreams about Emacs this year.
+
+03:46.632 --> 03:47.894
+In addition to the ones
+
+03:47.894 --> 03:49.293
+from System Crafters,
+
+03:49.293 --> 03:50.473
+Emacs Elements,
+
+03:50.473 --> 03:51.984
+and Protesilaos,
+
+03:51.984 --> 03:52.794
+John Kitchin
+
+03:52.794 --> 03:53.540
+and Mike Zamansky
+
+03:53.540 --> 03:54.575
+are back, hooray!
+
+03:54.575 --> 03:56.946
+And Marcin Borkowski has just finished
+
+03:56.946 --> 03:58.836
+writing an intermediate textbook
+
+03:58.836 --> 00:04:00.070
+Emacs Lisp, too!
+
+04:00.071 --> 04:00.742
+10.
+
+04:00.742 --> 04:02.249
+Lastly, if you want to chat
+
+04:02.249 --> 04:03.403
+with other Emacs folks
+
+04:03.403 --> 04:05.604
+and get help on Emacs, Org Mode,
+
+04:05.604 --> 04:06.531
+or other topics,
+
+04:06.531 --> 04:07.756
+the #emacs and #org-mode
+
+04:07.756 --> 04:10.181
+Internet Relay Chat or IRC channels
+
+04:10.181 --> 04:12.067
+are now on the libera.chat network
+
+04:12.067 --> 04:13.333
+instead of Freenode.
+
+04:13.333 --> 04:15.208
+If you'd like to add something I've missed,
+
+04:15.208 --> 04:16.903
+please add them to the wiki page,
+
+04:16.903 --> 04:19.354
+or e-mail me at sacha@sachachua.com .
+
+04:19.354 --> 04:20.874
+That's all for this quick review.
+
+04:20.874 --> 04:23.424
+Enjoy the rest of EmacsConf 2021!
diff --git a/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt b/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt
new file mode 100644
index 00000000..e8f36c16
--- /dev/null
+++ b/2021/captions/emacsconf-2021-nongnu--nongnu-elpa-update--philip-kaludercic--main.vtt
@@ -0,0 +1,535 @@
+WEBVTT
+
+00:00.000 --> 00:02.283
+Hello! My name is Philip,
+
+00:02.283 --> 00:04.363
+and I'll be giving a brief update on
+
+00:04.363 --> 00:05.963
+NonGNU ELPA.
+
+00:05.963 --> 00:07.403
+Before we begin,
+
+00:07.403 --> 00:08.283
+let's first make sure
+
+00:08.283 --> 00:09.563
+everyone's on the same page.
+
+00:09.563 --> 00:11.203
+What is NonGNU ELPA?
+
+00:11.203 --> 00:14.323
+Put simply, NonGNU ELPA
+
+00:14.323 --> 00:16.723
+is a new Emacs Lisp package archive.
+
+00:16.723 --> 00:19.323
+similar to its sister archive, GNU ELPA.
+
+00:19.323 --> 00:21.883
+The main difference is that
+
+00:21.883 --> 00:24.723
+GNU ELPA regards each package in the archive
+
+00:24.723 --> 00:26.643
+to be part of Emacs itself.
+
+00:26.643 --> 00:30.083
+This means each significant contributor
+
+00:30.083 --> 00:32.483
+has to have signed their copyrights
+
+00:32.483 --> 00:34.803
+to the Free Software Foundation.
+
+00:34.803 --> 00:37.203
+NonGNU ELPA is made for packages
+
+00:37.203 --> 00:39.363
+that cannot ensure this condition.
+
+00:39.363 --> 00:42.483
+The immediate consequence of all of this
+
+00:42.483 --> 00:44.243
+is that more packages can be installed
+
+00:44.243 --> 00:44.723
+out of the box.
+
+00:44.723 --> 00:46.803
+All you need to install,
+
+00:46.803 --> 00:49.443
+for example, magit, evil-mode, slime,
+
+00:49.443 --> 00:52.723
+is a simple M-x package-install.
+
+00:52.723 --> 00:56.083
+The more subtle consequence
+
+00:56.083 --> 00:58.083
+is that ELPA distributes
+
+00:58.083 --> 00:59.763
+stable packages by default.
+
+00:59.763 --> 01:01.563
+This differs from, for example,
+
+01:01.563 --> 01:04.163
+the community-maintained package archive MELPA,
+
+01:04.163 --> 01:08.483
+where each change in the respective package repository
+
+01:08.483 --> 01:12.803
+triggers a new package to be rebuilt.
+
+01:12.803 --> 01:15.123
+Of course, "stable" here has to be taken
+
+01:15.123 --> 01:16.843
+with a grain of salt because,
+
+01:16.843 --> 01:17.963
+on the one hand,
+
+01:17.963 --> 01:19.923
+a package maintainer can be very careful
+
+01:19.923 --> 01:22.403
+to avoid buggy code in their default branch,
+
+01:22.403 --> 01:23.923
+and on the other hand,
+
+01:23.923 --> 01:26.523
+a package maintainer can be too eager
+
+01:26.523 --> 01:28.083
+to tag a new release
+
+01:28.083 --> 01:29.483
+without properly checking
+
+01:29.483 --> 01:31.403
+that the code works as intended.
+
+01:31.403 --> 01:33.483
+My personal hope is that
+
+01:33.483 --> 01:35.603
+more people using NonGNU ELPA
+
+01:35.603 --> 01:37.683
+be incentive for increase
+
+01:37.683 --> 01:39.603
+for package development to shift away
+
+01:39.603 --> 01:41.083
+from the currently predominant
+
+01:41.083 --> 01:42.323
+rolling release model,
+
+01:42.323 --> 01:44.243
+improving the overall stability
+
+01:44.243 --> 01:45.523
+of Emacs configurations.
+
+01:45.523 --> 01:48.843
+Another side effect of the initiative
+
+01:48.843 --> 01:51.003
+is a chance to clean up
+
+01:51.003 --> 01:52.803
+the Emacs package space.
+
+01:52.803 --> 01:54.723
+Over the last few years,
+
+01:54.723 --> 01:56.363
+a lot of packages have been abandoned,
+
+01:56.363 --> 01:59.043
+have been broken, duplicated,
+
+01:59.043 --> 02:00.443
+or even in some cases,
+
+02:00.443 --> 02:03.483
+replaced by functionality in Emacs itself.
+
+02:03.483 --> 02:07.403
+When reviewing packages for NonGNU ELPA,
+
+02:07.403 --> 02:10.043
+the opportunity to avoid these problems
+
+02:10.043 --> 02:12.523
+will hopefully also improve the general quality
+
+02:12.523 --> 02:13.923
+of Emacs packages.
+
+02:13.923 --> 02:16.883
+So, what is this update about?
+
+02:16.883 --> 02:20.443
+I'm taking Richard Stallman's announcement
+
+02:20.443 --> 02:22.363
+at EmacsConf 2020
+
+02:22.363 --> 02:23.563
+as my reference point.
+
+02:23.563 --> 02:26.283
+There, the idea, the history,
+
+02:26.283 --> 02:28.283
+and the motivation was explained,
+
+02:28.283 --> 02:30.443
+and the call for contributions was made.
+
+02:30.443 --> 02:32.643
+I won't be going into these aspects
+
+02:32.643 --> 02:33.483
+again this year.
+
+02:33.483 --> 02:37.163
+As this implies, there was nothing concrete
+
+02:37.163 --> 02:38.683
+at that point.
+
+02:38.683 --> 02:41.883
+The first practical steps towards NonGNU ELPA
+
+02:41.883 --> 02:43.683
+were taken up by Stefan Monnier.
+
+02:43.683 --> 02:47.963
+This included updating GNU ELPA's build system
+
+02:47.963 --> 02:49.523
+to support the requirements
+
+02:49.523 --> 02:51.003
+of NonGNU ELPA as well.
+
+02:51.003 --> 02:53.283
+And so eventually,
+
+02:53.283 --> 02:55.323
+the idea became a Git repository,
+
+02:55.323 --> 02:57.203
+nongnu.git on savannah,
+
+02:57.203 --> 02:59.203
+then a website,
+
+02:59.203 --> 03:02.523
+elpa.nongnu.org,
+
+03:02.523 --> 03:04.643
+and then around late December of last year,
+
+03:04.643 --> 03:06.923
+NonGNU ELPA was also added
+
+03:06.923 --> 03:08.643
+to the package-archives list.
+
+03:08.643 --> 03:11.963
+Sadly, progress stalled from this point on,
+
+03:11.963 --> 03:14.123
+with the new archive consisting of only
+
+03:14.123 --> 03:16.203
+five or six packages.
+
+03:16.203 --> 03:18.083
+It took until August
+
+03:18.083 --> 03:20.123
+for more packages to be added,
+
+03:20.123 --> 03:22.003
+some by their respective authors,
+
+03:22.003 --> 03:23.963
+such as Magit and Projectile,
+
+03:23.963 --> 03:26.163
+but most by contributors such as myself.
+
+03:26.163 --> 03:27.923
+As of recording,
+
+03:27.923 --> 03:30.363
+the archive has around 70 packages,
+
+03:30.363 --> 03:32.803
+with more pending to be out soon.
+
+03:32.803 --> 03:34.803
+These include popular applications
+
+03:34.803 --> 03:36.483
+such as the previously-mentioned Magit,
+
+03:36.483 --> 03:38.083
+SLIME, or wgrep,
+
+03:38.083 --> 03:41.523
+major modes like php-mode, rust-mode,
+
+03:41.523 --> 03:43.723
+go-mode, clojure-mode, lua-mode,
+
+03:43.723 --> 03:45.923
+markdown-mode... You get my point.
+
+03:45.923 --> 03:47.883
+And a number of visual themes,
+
+03:47.883 --> 03:49.443
+among other things.
+
+03:49.443 --> 03:52.643
+If you are interested in using NonGNU ELPA,
+
+03:52.643 --> 03:53.603
+but you are still bound
+
+03:53.603 --> 03:55.203
+to an older version of Emacs,
+
+03:55.203 --> 03:56.683
+all you have to do is
+
+03:56.683 --> 03:57.483
+to add the snippet
+
+03:57.483 --> 03:59.003
+from the NonGNU ELPA home page
+
+03:59.003 --> 04:01.323
+updating the package-archives variable.
+
+04:01.323 --> 04:03.923
+For Emacs 28 and newer,
+
+04:03.923 --> 04:05.123
+one might have to watch out
+
+04:05.123 --> 04:07.563
+that you're not setting package-archives directly,
+
+04:07.563 --> 04:09.363
+and if you are doing so,
+
+04:09.363 --> 04:10.723
+to update the value.
+
+04:10.723 --> 04:14.003
+Emacs 28 only updates the default value
+
+04:14.003 --> 04:17.043
+and will not manipulate the user's configuration.
+
+04:17.043 --> 04:20.363
+Finally, a short note
+
+04:20.363 --> 04:22.163
+for package developers.
+
+04:22.163 --> 04:24.243
+Most packages up until now
+
+04:24.243 --> 04:26.243
+haven't been added by their maintainers.
+
+04:26.243 --> 04:28.083
+For the most part,
+
+04:28.083 --> 04:31.083
+I have been collecting and reviewing the packages
+
+04:31.083 --> 04:32.683
+which have been added,
+
+04:32.683 --> 04:33.923
+which takes time
+
+04:33.923 --> 04:36.043
+and is one of the main reasons
+
+04:36.043 --> 04:38.323
+why we're still at only 70 packages.
+
+04:38.323 --> 04:41.683
+This is of course not a permanent solution.
+
+04:41.683 --> 04:42.243
+The intention here is
+
+04:42.243 --> 04:44.803
+to bootstrap, so to say,
+
+04:44.803 --> 04:46.243
+the interest in NonGNU ELPA
+
+04:46.243 --> 04:48.083
+by making it more interesting to you
+
+04:48.083 --> 04:50.563
+and thus more interesting to contribute to.
+
+04:50.563 --> 04:53.563
+If you are interested in adding a package
+
+04:53.563 --> 04:56.643
+that already exists, or a new package
+
+04:56.643 --> 04:59.443
+to NonGNU ELPA, all you need to do is
+
+04:59.443 --> 05:00.843
+send an e-mail to the
+
+05:00.843 --> 05:02.483
+Emacs development mailing list,
+
+05:02.483 --> 05:05.523
+emacs-devel@gnu.org.
+
+05:05.523 --> 05:08.123
+This is an open mailing list
+
+05:08.123 --> 05:10.563
+and requires no special registration.
+
+05:10.563 --> 05:12.283
+Your message should
+
+05:12.283 --> 05:14.643
+mention NonGNU ELPA in the subject
+
+05:14.643 --> 05:17.483
+and contain a link to a public Git repository
+
+05:17.483 --> 05:20.643
+in the body. Ideally, a brief explanation
+
+05:20.643 --> 05:21.803
+on what your package does
+
+05:21.803 --> 05:23.243
+would be much appreciated.
+
+05:23.243 --> 05:25.603
+The proposal will be reviewed
+
+05:25.603 --> 05:28.043
+by the readers of the mailing list,
+
+05:28.043 --> 05:29.443
+and after a bit of back-and-forth
+
+05:29.443 --> 05:31.123
+on possible issues and improvements,
+
+05:31.123 --> 05:32.723
+the package will hopefully be added
+
+05:32.723 --> 05:34.443
+to NonGNU ELPA itself.
+
+05:34.443 --> 05:38.523
+The simplest mistake a lot of packages make
+
+05:38.523 --> 05:40.043
+is to either not have
+
+05:40.043 --> 05:41.843
+or maintain a version attribute
+
+05:41.843 --> 05:42.803
+in the package header.
+
+05:42.803 --> 05:46.323
+This is done despite actually being necessary
+
+05:46.323 --> 05:48.163
+for a well-formed Emacs package
+
+05:48.163 --> 05:50.083
+according to the Elisp manual.
+
+05:50.083 --> 05:52.443
+ELPA relies on this tag
+
+05:52.443 --> 05:54.323
+to detect new package versions
+
+05:54.323 --> 05:55.843
+that will be built and distributed.
+
+05:55.843 --> 05:58.483
+If the version isn't updated,
+
+05:58.483 --> 06:00.323
+no new package will be released,
+
+06:00.323 --> 06:03.043
+and any changes won't be made public.
+
+06:03.043 --> 06:07.683
+So, that's that on NonGNU ELPA.
+
+06:07.683 --> 06:09.883
+To summarize, NonGNU ELPA is an
+
+06:09.883 --> 06:11.683
+Emacs Lisp Package Archive for Emacs,
+
+06:11.683 --> 06:13.363
+without a need for copyright assignments.
+
+06:13.363 --> 06:17.203
+It works, it exists, and it's been used already.
+
+06:17.203 --> 06:18.403
+I'm looking forward to
+
+06:18.403 --> 06:20.403
+more packages being added to the archive
+
+06:20.403 --> 06:22.803
+and improving the overall experience
+
+06:22.803 --> 06:24.283
+of Emacs out of the box.
+
+00:06:24.283 --> 00:06:27.163
+Thank you for your interest, and goodbye.
+
+00:06:27.163 --> 00:06:27.163
+[captioned by sachac]
diff --git a/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt b/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt
new file mode 100644
index 00000000..d595fc1b
--- /dev/null
+++ b/2021/captions/emacsconf-2021-nyxt--emacs-with-nyxt-extend-your-editor-with-the-power-of-a-lisp-browser--andrea--main.vtt
@@ -0,0 +1,532 @@
+WEBVTT
+
+00:00.000 --> 00:01.783
+Welcome to my talk "Emacs with Nyxt:
+
+00:01.783 --> 00:02.823
+extend your editor with
+
+00:02.823 --> 00:04.623
+the power of a Lisp browser".
+
+00:04.623 --> 00:06.583
+Who am I? I'm Andrea. I work as
+
+00:06.583 --> 00:08.303
+a Clojure software engineer somewhere
+
+00:08.303 --> 00:09.743
+in the middle of the UK.
+
+00:09.743 --> 00:11.743
+And I inherited my passion for Emacs
+
+00:11.743 --> 00:13.703
+from my Ph.D. supervisor, and from that
+
+00:13.703 --> 00:15.943
+moment on Emacs became a core tool
+
+00:15.943 --> 00:17.863
+of my daily routine.
+
+00:17.863 --> 00:20.863
+You can find more about me and my interests
+
+00:20.863 --> 00:23.983
+at ag91.github.io, that is my blog.
+
+00:23.983 --> 00:25.183
+Let's get into the talk.
+
+00:25.183 --> 00:28.183
+So, why Nyxt? Nyxt is an extensible
+
+00:28.183 --> 00:29.543
+Common Lisp browser.
+
+00:29.543 --> 00:31.903
+Fundamentally, it's Emacs for web browsing.
+
+00:31.903 --> 00:34.063
+And why do I say that? I say that
+
+00:34.063 --> 00:36.063
+because is a…, this is Nyxt.
+
+00:36.063 --> 00:40.223
+You can see that is organized with buffers,
+
+00:40.223 --> 00:44.063
+and you can see that I can invoke command,
+
+00:44.063 --> 00:47.183
+like, I was in Emacs with this.
+
+00:47.183 --> 00:48.983
+So, I'm using even the same keybindings,
+
+00:48.983 --> 00:52.783
+so, for that I used M-x.
+
+00:52.783 --> 00:55.983
+And some of the features of Nyxt
+
+00:55.983 --> 01:00.103
+are just amazing. For example, say that
+
+01:00.103 --> 01:03.823
+you want to mark some text, this is the way,
+
+01:03.823 --> 01:08.703
+so, I just pressed Control space (C-SPC),
+
+01:08.703 --> 01:10.423
+and now I will start the marker,
+
+01:10.423 --> 01:13.223
+and now I can copy the text, and when
+
+01:13.223 --> 01:15.663
+I'm done, I can finish to use visual mode.
+
+01:15.663 --> 01:18.023
+Or, for example, what about…,
+
+01:18.023 --> 01:21.183
+I want to navigate without using my mouse.
+
+01:21.183 --> 01:25.183
+I can do something like follow-hint,
+
+01:25.183 --> 01:28.023
+and this opens the possibility to press
+
+01:28.023 --> 01:29.903
+AC to jump on the Articles,
+
+01:29.903 --> 01:33.063
+and all of a sudden I'm on the page
+
+01:33.063 --> 01:36.023
+with the blog posts of the Atlas team.
+
+01:36.023 --> 01:39.383
+Or, for example, I can extend my browser
+
+01:39.383 --> 01:40.783
+from within the browser.
+
+01:40.783 --> 01:43.223
+So, you can see I can evaluate a command,
+
+01:43.223 --> 01:48.663
+a Common Lisp code,
+
+01:48.663 --> 01:50.903
+and it produces the result.
+
+01:50.903 --> 01:56.183
+And then, for example, I can also auto….
+
+01:56.183 --> 01:58.663
+This browser comes by default with an
+
+01:58.663 --> 02:01.143
+integration with your password manager,
+
+02:01.143 --> 02:04.223
+in my case it's pass, and I can copy
+
+02:04.223 --> 02:08.783
+a password. This is just as easy as is,
+
+02:08.783 --> 02:10.543
+it comes by default.
+
+02:10.543 --> 02:13.583
+Another incredibly useful feature
+
+02:13.583 --> 02:18.023
+that I didn't find in other browsers is
+
+02:18.023 --> 02:20.503
+searching between multiple buffers.
+
+02:20.503 --> 02:23.503
+So, this function search-buffers,
+
+02:23.503 --> 02:25.823
+this command lets me select
+
+02:25.823 --> 02:29.503
+some of my open buffers,
+
+02:29.503 --> 02:32.503
+and I can look for a string in there.
+
+02:32.503 --> 02:34.623
+And you would see that the hits are
+
+02:34.623 --> 02:37.423
+from the buffers that I have open,
+
+02:37.423 --> 02:42.583
+for example, Clojure or
+
+02:42.583 --> 02:46.103
+the YouTube video about Clojure.
+
+02:46.103 --> 02:49.623
+Let me get into something very interesting.
+
+02:49.623 --> 02:52.783
+How can I make Emacs speak to Nyxt.
+
+02:52.783 --> 02:55.103
+And for that, let me show you something
+
+02:55.103 --> 02:57.143
+in the literate programming approach.
+
+02:57.143 --> 03:00.183
+So, this Org mode source block is
+
+03:00.183 --> 03:04.423
+linked to this Nyxt REPL.
+
+03:04.423 --> 03:06.983
+I can define a new command,
+
+03:06.983 --> 03:09.343
+and when I go in Nyxt,
+
+03:09.343 --> 03:10.863
+I can find this new command,
+
+03:10.863 --> 03:12.503
+and I can invoke it, and you can see
+
+03:12.503 --> 03:16.943
+there is something in the minibuffer.
+
+03:16.943 --> 03:21.543
+I can use it from Nyxt, but I can do it here.
+
+03:21.543 --> 03:24.703
+I can also use it directly from the REPL.
+
+03:24.703 --> 03:27.743
+You can see that the same thing is logged
+
+03:27.743 --> 03:30.423
+in the REPL.
+
+03:30.423 --> 03:32.663
+And then with something that I would speak
+
+03:32.663 --> 03:36.423
+about in another talk in the conference
+
+03:36.423 --> 03:39.143
+— Moldable Emacs. I can also just
+
+03:39.143 --> 03:42.823
+evaluate JavaScript outside. Let's create
+
+03:42.823 --> 03:46.703
+a playground that allows me to write some
+
+03:46.703 --> 03:49.903
+JavaScript code. And if I evaluate this code,
+
+03:49.903 --> 03:52.023
+I get the title of the webpage
+
+03:52.023 --> 03:54.583
+that is currently open in Nyxt.
+
+03:54.583 --> 03:58.343
+The cool thing is that I can do it also
+
+03:58.343 --> 04:02.263
+directly in Lisp, this is Parenscript
+
+04:02.263 --> 04:05.223
+that evaluates to the same thing,
+
+04:05.223 --> 04:07.823
+(it) is just the same, just document.title,
+
+04:07.823 --> 04:10.743
+only that is in Common Lisp.
+
+04:10.743 --> 04:14.343
+You see that Emacs can speak to Nyxt,
+
+04:14.343 --> 04:16.103
+but also the reverse is true.
+
+04:16.103 --> 04:19.023
+Nyxt can speak to Emacs. So, for example,
+
+04:19.023 --> 04:21.943
+if I'm in Nyxt, and for example,
+
+04:21.943 --> 04:26.623
+let me go to my blog, if I press here,
+
+04:26.623 --> 04:30.863
+this is an email link, automatically in Emacs
+
+04:30.863 --> 04:33.943
+it will let me compone a message
+
+04:33.943 --> 04:35.943
+using my email manager.
+
+04:35.943 --> 04:39.823
+Or, say that always in my blog I want
+
+04:39.823 --> 04:43.543
+to write something here in the searchbar,
+
+04:43.543 --> 04:46.303
+I think that I don't want to write it in
+
+04:46.303 --> 04:50.623
+the browser but in my Emacs because
+
+04:50.623 --> 04:52.903
+I have some template for search.
+
+04:52.903 --> 04:55.503
+If I do this, all of a sudden
+
+04:55.503 --> 04:59.103
+the text is added.
+
+04:59.103 --> 05:03.423
+Or say I'm watching that Clojure video,
+
+05:03.423 --> 05:06.343
+and I get to this point, and then I say
+
+05:06.343 --> 05:09.703
+"Yuu! This is a very interesting thing,
+
+05:09.703 --> 05:12.783
+let me take a note". So, I take some note
+
+05:12.783 --> 05:16.903
+with some text, and if I go back in Emacs,
+
+05:16.903 --> 05:19.023
+tadam! I found the note,
+
+05:19.023 --> 05:21.903
+and I found it with the duration,
+
+05:21.903 --> 05:25.063
+so I can just jump to the same point.
+
+05:25.063 --> 05:28.743
+And what else?
+
+05:28.743 --> 05:31.903
+There is something even bigger
+
+05:31.903 --> 05:32.663
+that we can do,
+
+05:32.663 --> 05:34.063
+this is a bit more advanced,
+
+05:34.063 --> 05:35.823
+and this is something that I do
+
+05:35.823 --> 05:39.023
+again with my Moldable Emacs.
+
+05:39.023 --> 05:41.183
+Say that you want to do some
+
+05:41.183 --> 05:43.223
+data visualization.
+
+05:43.223 --> 05:44.863
+If we use Vega-Lite…, for example,
+
+05:44.863 --> 05:47.823
+we want to visualize a scatter plot.
+
+05:47.823 --> 05:49.623
+Let me take some example data
+
+05:49.623 --> 05:52.423
+that could be interesting also to you.
+
+05:52.423 --> 05:55.063
+So, say that I have this playground
+
+05:55.063 --> 05:57.263
+that lets me evaluate
+
+05:57.263 --> 06:01.703
+some query on my Org-roam database.
+
+06:01.703 --> 06:03.663
+What I'm doing here is I'm gonna
+
+06:03.663 --> 06:05.703
+go through my first 100 notes
+
+06:05.703 --> 06:09.823
+and collect their backlinks,
+
+06:09.823 --> 06:13.183
+so some information that I find interesting.
+
+06:13.183 --> 06:16.343
+If I convert this to JSON,
+
+06:16.343 --> 06:18.903
+now, all of a sudden this is something
+
+06:18.903 --> 06:22.623
+that I can put in that Vega-Lite template
+
+06:22.623 --> 06:26.183
+that I showed you a moment ago.
+
+06:26.183 --> 06:28.343
+So, I'm gonna find out that file,
+
+06:28.343 --> 06:30.463
+you see that I left a question mark,
+
+06:30.463 --> 06:31.703
+(this is) something that I still
+
+06:31.703 --> 06:33.783
+didn't automate completely.
+
+06:33.783 --> 06:37.983
+By saving this file and opening it with Nyxt,
+
+06:37.983 --> 06:41.183
+you can see that now I have a scatter plot.
+
+06:41.183 --> 06:43.943
+And these are my actual notes,
+
+06:43.943 --> 06:48.343
+so you can see that if I stay on it,
+
+06:48.343 --> 06:53.063
+these are actually my notes.
+
+06:53.063 --> 06:55.343
+When I'm in Emacs, what I can do is
+
+06:55.343 --> 06:58.303
+I click here, and now in the background
+
+06:58.303 --> 07:00.903
+it opened my note,
+
+07:00.903 --> 07:04.303
+and it opened with all my backlinks.
+
+07:04.303 --> 07:07.703
+You can see that I have embedded in my
+
+07:07.703 --> 07:11.303
+browser some functionality of Emacs.
+
+07:11.303 --> 07:13.463
+You understand that this is the power of
+
+07:13.463 --> 07:16.983
+unifying, integrating these two experiences,
+
+07:16.983 --> 07:18.943
+and it opens the doors for
+
+07:18.943 --> 07:22.223
+a lot of interesting interactivity.
+
+07:22.223 --> 07:24.743
+Anyway, what is next?
+
+07:24.743 --> 07:29.023
+This was my talk, what is next is
+
+07:29.023 --> 07:32.143
+continue merging it with Moldable Emacs.
+
+07:32.143 --> 07:34.023
+(This) is something I will present in
+
+07:34.023 --> 07:37.463
+another talk in this conference with web,
+
+07:37.463 --> 07:39.263
+so that we can extract meaning from
+
+07:39.263 --> 07:41.103
+the web, and we can bring it in Emacs.
+
+07:41.103 --> 07:43.583
+And from Emacs bringing back stuff
+
+07:43.583 --> 07:46.543
+like a picture into a web page,
+
+07:46.543 --> 07:48.903
+so that we can do fancy visualization.
+
+07:48.903 --> 07:51.063
+Another thing I want to do is to
+
+07:51.063 --> 07:54.263
+automate the boring browser flows
+
+07:54.263 --> 07:55.543
+that I do, like, for example,
+
+07:55.543 --> 07:58.263
+if I periodically buy something,
+
+07:58.263 --> 08:00.863
+I could do it from within Emacs
+
+08:00.863 --> 08:05.263
+instead of always clicking around.
+
+08:05.263 --> 08:08.383
+And then I'm just gonna cross fingers,
+
+08:08.383 --> 08:10.023
+I hope that this browser will
+
+08:10.023 --> 08:11.783
+become mainstream.
+
+08:11.783 --> 08:13.263
+So, this was my talk,
+
+08:13.263 --> 08:14.663
+thank you for listening,
+
+08:14.663 --> 08:17.343
+and you can find more about it at
+
+08:17.343 --> 08:19.823
+ag91.github.io, my blog,
+
+08:19.823 --> 08:22.680
+and enjoy the rest of the conference, bye!
+
+08:22.680 --> 08:25.520
+[captions: bhavin192 (Bhavin Gandhi)]
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-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt
new file mode 100644
index 00000000..34cfbcad
--- /dev/null
+++ b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main.vtt
@@ -0,0 +1,892 @@
+WEBVTT
+
+00:01.280 --> 00:00:02.560
+Hello everybody.
+
+00:02.560 --> 00:00:04.400
+My name is Jean-Christophe Helary,
+
+00:00:04.400 --> 00:00:05.680
+and today I’m going to talk about
+
+00:00:05.680 --> 00:00:08.320
+Emacs manuals translation and OmegaT.
+
+00:00:08.320 --> 00:00:10.960
+Thank you for joining the session.
+
+00:10.960 --> 00:00:12.880
+Translation in the free software world
+
+00:12.880 --> 00:00:15.040
+is really a big thing. You already know
+
+00:15.040 --> 00:00:17.119
+that most of the Linux distributions,
+
+00:17.119 --> 00:00:18.720
+most of the software packages,
+
+00:00:18.720 --> 00:00:19.920
+most of the websites
+
+00:00:19.920 --> 00:00:22.320
+are translated by dozens of communities
+
+00:00:22.320 --> 00:00:23.439
+using different processes
+
+00:23.439 --> 00:00:24.880
+and file formats.
+
+00:24.880 --> 00:00:27.359
+Translation and localization
+
+00:27.359 --> 00:00:29.599
+are things we know very well.
+
+00:29.599 --> 00:00:30.400
+It’s a tad different
+
+00:00:30.400 --> 00:00:32.160
+for the Emacs community.
+
+00:32.160 --> 00:00:34.079
+We do not have a localization process
+
+00:34.079 --> 00:00:35.200
+because it’s quite complex
+
+00:00:35.200 --> 00:00:35.920
+and because we don’t
+
+00:00:35.920 --> 00:00:37.600
+have the resources yet.
+
+00:37.600 --> 00:00:39.920
+Still, we could translate the manuals,
+
+00:00:39.920 --> 00:00:41.200
+and translating the manuals
+
+00:00:41.200 --> 00:00:42.399
+would probably bring a lot of good
+
+00:00:42.399 --> 00:00:45.600
+to the Emacs community at large.
+
+00:45.600 --> 00:00:47.920
+So what’s the state of the manuals?
+
+00:47.920 --> 00:00:51.199
+As of today, we have 182 files
+
+00:51.199 --> 00:00:54.160
+coming in .texi and .org format.
+
+00:54.160 --> 00:00:56.559
+We’ve got more than 2 million words.
+
+00:56.559 --> 00:00:57.360
+We’ve got more than
+
+00:00:57.360 --> 00:00:59.039
+50 million characters.
+
+00:00:59.039 --> 00:01:00.559
+So that’s quite a lot of work,
+
+01:00.559 --> 00:01:04.559
+and obviously, it’s not a one person job.
+
+01:04.559 --> 00:01:06.159
+When we open .texi files,
+
+00:01:06.159 --> 00:01:07.760
+what do we have?
+
+01:07.760 --> 00:01:09.439
+Well, we actually have a lot of things
+
+01:09.439 --> 00:01:10.560
+that the translators
+
+00:01:10.560 --> 00:01:12.400
+shouldn’t have to translate.
+
+01:12.400 --> 00:01:13.680
+Here we can see that only
+
+00:01:13.680 --> 00:01:15.040
+the very last segment,
+
+00:01:15.040 --> 00:01:16.400
+the very last sentence
+
+00:01:16.400 --> 00:01:18.080
+should be translated.
+
+01:18.080 --> 00:01:19.360
+All those meta things
+
+00:01:19.360 --> 00:01:20.240
+should not be under
+
+00:01:20.240 --> 00:01:24.479
+the translator’s eyes.
+
+01:24.479 --> 00:01:26.720
+How do we deal with this situation?
+
+01:26.720 --> 00:01:27.680
+For code files, we have
+
+00:01:27.680 --> 00:01:29.360
+the gettext utility that converts
+
+00:01:29.360 --> 00:01:30.640
+all the translatable strings
+
+00:01:30.640 --> 00:01:32.079
+into a translatable format,
+
+00:01:32.079 --> 00:01:33.840
+which is the .po format.
+
+01:33.840 --> 00:01:35.520
+And that .po format is ubiquitous,
+
+00:01:35.520 --> 00:01:36.400
+even in the non-free
+
+00:01:36.400 --> 00:01:38.720
+software translation industry.
+
+01:38.720 --> 00:01:39.520
+For documentation,
+
+00:01:39.520 --> 00:01:40.720
+we have something different.
+
+00:01:40.720 --> 00:01:42.000
+It’s called po4a,
+
+00:01:42.000 --> 00:01:45.119
+which is short for ‘po for all’.
+
+01:45.119 --> 00:01:46.399
+When we use po4a
+
+00:01:46.399 --> 00:01:49.200
+on those 182 .texi and .org files,
+
+00:01:49.200 --> 00:01:50.479
+what do we get?
+
+01:50.479 --> 00:01:52.640
+We get something that’s much better.
+
+01:52.640 --> 00:01:54.799
+Now we have three segments.
+
+01:54.799 --> 00:01:55.759
+It’s not perfect because,
+
+00:01:55.759 --> 00:01:56.399
+as you can see,
+
+00:01:56.399 --> 00:01:57.280
+the two first segments
+
+00:01:57.280 --> 00:01:58.880
+should not be translated.
+
+01:58.880 --> 00:01:59.520
+So there’s still
+
+00:01:59.520 --> 00:02:02.479
+room for improvement.
+
+02:02.479 --> 00:02:04.960
+Now, when we put that file set
+
+00:02:04.960 --> 00:02:07.119
+into OmegaT, we considerably reduce
+
+00:02:07.119 --> 00:02:08.800
+the words total.
+
+02:08.800 --> 00:02:11.360
+We now have 50% fewer words
+
+00:02:11.360 --> 00:02:14.239
+and 23% fewer characters to type,
+
+02:14.239 --> 00:02:15.680
+but that’s still a lot of work.
+
+00:02:15.680 --> 00:02:17.599
+So let’s talk about OmegaT now
+
+00:02:17.599 --> 00:02:22.239
+and see where it can help.
+
+02:22.239 --> 00:02:25.440
+OmegaT is a GPL3+ Java8+
+
+02:25.440 --> 00:02:27.599
+Computer Aided Translation tool.
+
+02:27.599 --> 00:02:29.440
+We call them CATs.
+
+02:29.440 --> 00:02:30.720
+CATs are to translators
+
+00:02:30.720 --> 00:02:33.280
+what IDEs are to programmers.
+
+02:33.280 --> 00:02:35.040
+They leverage the power of computers
+
+00:02:35.040 --> 00:02:36.480
+to automate our work,
+
+00:02:36.480 --> 00:02:38.400
+which is, reference searches,
+
+00:02:38.400 --> 00:02:40.800
+fuzzy matching, automatic insertions,
+
+00:02:40.800 --> 00:02:44.080
+and things like that.
+
+02:44.080 --> 00:02:46.319
+OmegaT is not really recent.
+
+02:46.319 --> 00:02:48.319
+It will turn 20 next year,
+
+02:48.319 --> 00:02:48.959
+and at this point,
+
+00:02:48.959 --> 00:02:51.440
+we have about 1.5 million downloads
+
+00:02:51.440 --> 00:02:53.200
+from the SourceForge site,
+
+00:02:53.200 --> 00:02:54.080
+which doesn’t mean much
+
+00:02:54.080 --> 00:02:55.040
+because that includes
+
+00:02:55.040 --> 00:02:56.480
+files used for localization
+
+00:02:56.480 --> 00:02:57.920
+and manuals, but still
+
+00:02:57.920 --> 00:02:59.599
+it’s a pretty big number.
+
+02:59.599 --> 00:03:00.720
+OmegaT is included in
+
+00:03:00.720 --> 00:03:02.400
+a lot of Linux distributions,
+
+00:03:02.400 --> 00:03:03.680
+but as you can see here,
+
+03:03.680 --> 00:03:05.920
+it’s mostly downloaded on Windows systems
+
+00:03:05.920 --> 00:03:06.800
+because translators
+
+00:03:06.800 --> 00:03:09.680
+mostly work on Windows.
+
+03:09.680 --> 00:03:11.120
+OmegaT comes with a cool logo
+
+00:03:11.120 --> 00:03:12.080
+and a cool site too,
+
+00:03:12.080 --> 00:03:13.920
+and I really invite you to visit it.
+
+00:03:13.920 --> 00:03:16.159
+It’s omegat.org, and you’ll see
+
+03:16.159 --> 00:03:17.280
+all the information you need,
+
+00:03:17.280 --> 00:03:19.040
+plus downloads to Linux versions,
+
+00:03:19.040 --> 00:03:22.080
+with or without Java included.
+
+03:22.080 --> 00:03:24.799
+So what does OmegaT bring to the game?
+
+03:24.799 --> 00:03:26.560
+Professional translators have to deliver
+
+03:26.560 --> 00:03:27.680
+fast, consistent,
+
+00:03:27.680 --> 00:03:29.519
+and quality translations,
+
+03:29.519 --> 00:03:30.720
+and we need to have proper tools
+
+00:03:30.720 --> 00:03:32.159
+to achieve that.
+
+00:03:32.159 --> 00:03:34.239
+I wish po-mode was part of the toolbox,
+
+00:03:34.239 --> 00:03:35.120
+but that’s not the case,
+
+03:35.120 --> 00:03:36.560
+and it’s a pity.
+
+03:36.560 --> 00:03:39.760
+So we have to use those CAT tools.
+
+03:39.760 --> 00:03:41.440
+Let me show you what OmegaT looks like
+
+03:41.440 --> 00:03:43.120
+when I open this project that I created
+
+03:43.120 --> 00:03:45.200
+for this demonstration.
+
+03:45.200 --> 00:03:46.640
+The display is quite a mouthful,
+
+00:03:46.640 --> 00:03:47.760
+but you can actually modify
+
+00:03:47.760 --> 00:03:49.519
+all windows as needed.
+
+03:49.519 --> 00:03:50.400
+I just want to show you
+
+00:03:50.400 --> 00:03:51.120
+everything at once
+
+00:03:51.120 --> 00:03:53.680
+to give you a quick idea of the thing.
+
+03:53.680 --> 00:03:55.200
+You have various colors, windows,
+
+00:03:55.200 --> 00:03:55.920
+and all those spaces
+
+00:03:55.920 --> 00:03:57.120
+have different functions
+
+03:57.120 --> 00:03:58.560
+that help the translator,
+
+00:03:58.560 --> 00:03:59.360
+and that you’re probably
+
+00:03:59.360 --> 00:04:02.879
+not familiar with.
+
+04:02.879 --> 00:04:04.080
+I’m going to introduce you
+
+00:04:04.080 --> 00:04:05.680
+to the interface now.
+
+04:05.680 --> 00:04:07.519
+So first, we have the editor.
+
+04:07.519 --> 00:04:09.439
+The editor comes in two parts:
+
+04:09.439 --> 00:04:10.480
+the current segment,
+
+00:04:10.480 --> 00:04:12.319
+which is associated to a number,
+
+00:04:12.319 --> 00:04:13.519
+and all the other segments,
+
+00:04:13.519 --> 00:04:15.840
+above or below.
+
+04:15.840 --> 00:04:16.720
+At the top of the window,
+
+00:04:16.720 --> 00:04:18.720
+you can see the first three segments
+
+00:04:18.720 --> 00:04:20.799
+that were in the .po file.
+
+04:20.799 --> 00:04:22.880
+The last one here, the fourth one, comes
+
+00:04:22.880 --> 00:04:28.720
+with an automatic fuzzy match insertion.
+
+04:28.720 --> 00:04:30.880
+Such legacy translations are what we
+
+04:30.880 --> 00:04:32.720
+call ‘translation memories’.
+
+04:32.720 --> 00:04:35.280
+OmegaT has inserted this one automatically
+
+00:04:35.280 --> 00:04:37.120
+because I told it to do so,
+
+04:37.120 --> 00:04:38.560
+and for my security, it comes with
+
+00:04:38.560 --> 00:04:40.639
+the predefined fuzzy prefix
+
+00:04:40.639 --> 00:04:41.919
+that I will have to remove
+
+00:04:41.919 --> 00:04:44.880
+to validate the translation.
+
+04:44.880 --> 00:04:47.919
+Our next feature is the glossary feature.
+
+04:47.919 --> 00:04:48.479
+In this project,
+
+00:04:48.479 --> 00:04:50.160
+we have a lot of glossary data.
+
+00:04:50.160 --> 00:04:52.560
+Some is relevant and some is not.
+
+04:52.560 --> 00:04:53.919
+In the segment that I’m translating
+
+00:04:53.919 --> 00:04:55.199
+at the moment, you can see
+
+00:04:55.199 --> 00:04:57.520
+underlined items.
+
+04:57.520 --> 00:04:59.040
+This pop-up menu on the right
+
+00:04:59.040 --> 00:05:02.240
+allows me to enter the terms as I type.
+
+05:02.240 --> 00:05:04.639
+It’s kind of an auto insertion system
+
+00:05:04.639 --> 00:05:07.039
+that also supports history predictions,
+
+00:05:07.039 --> 00:05:14.479
+predefined strings, and things like that.
+
+05:14.479 --> 00:05:15.440
+In the part on the right,
+
+00:05:15.440 --> 00:05:17.120
+we have reference information
+
+00:05:17.120 --> 00:05:18.240
+that comes directly from
+
+00:05:18.240 --> 00:05:21.440
+the .po and .texi files.
+
+05:21.440 --> 00:05:23.440
+We also have notes that I can share
+
+00:05:23.440 --> 00:05:25.759
+with fellow translators,
+
+05:25.759 --> 00:05:28.080
+and we have numbers that tell me
+
+00:05:28.080 --> 00:05:31.199
+that I still have 143 000 segments more to go
+
+00:05:31.199 --> 00:05:35.280
+before I complete this translation.
+
+05:35.280 --> 00:05:37.120
+As we see, there are plenty of strings
+
+05:37.120 --> 00:05:40.000
+that we really don’t want to have to type.
+
+05:40.000 --> 00:05:42.160
+For example, those strings
+
+00:05:42.160 --> 00:05:43.840
+are typical .texi strings
+
+00:05:43.840 --> 00:05:45.039
+that the translator
+
+00:05:45.039 --> 00:05:46.479
+should really not have to type.
+
+00:05:46.479 --> 00:05:47.360
+So we’re going to have to
+
+00:05:47.360 --> 00:05:50.400
+do something about that.
+
+05:50.400 --> 00:05:51.600
+we’re going to have to create
+
+00:05:51.600 --> 00:05:52.479
+protected strings
+
+00:05:52.479 --> 00:05:54.400
+with regular expressions,
+
+05:54.400 --> 00:05:56.800
+so that the strings can be visualized
+
+00:05:56.800 --> 00:05:59.120
+right away in the source segment,
+
+05:59.120 --> 00:06:00.479
+entered semi-automatically
+
+00:06:00.479 --> 00:06:01.680
+in the target segment,
+
+00:06:01.680 --> 00:06:04.479
+and checked for integrity.
+
+06:04.479 --> 00:06:06.479
+The regular expression I came up with
+
+06:06.479 --> 00:06:08.160
+for defining most of the strings
+
+00:06:08.160 --> 00:06:09.600
+is this one,
+
+06:09.600 --> 00:06:11.120
+and I’m not a regular expression pro
+
+00:06:11.120 --> 00:06:13.360
+so I’m sure some of you will correct me.
+
+00:06:13.360 --> 00:06:14.560
+But this expression gives me
+
+00:06:14.560 --> 00:06:15.919
+a good enough definition
+
+00:06:15.919 --> 00:06:17.919
+even though it does not yet include
+
+00:06:17.919 --> 00:06:20.960
+Org mode syntax.
+
+06:20.960 --> 00:06:22.344
+So now we have all those
+
+00:06:22.344 --> 00:06:23.440
+.texi specific things
+
+00:06:23.440 --> 00:06:24.960
+that we don’t want to touch
+
+06:24.960 --> 00:06:26.100
+displayed in gray.
+
+00:06:26.100 --> 00:06:27.680
+Actually, you may have noticed
+
+00:06:27.680 --> 00:06:28.479
+that I cheated a bit,
+
+06:28.479 --> 00:06:30.319
+because here I added the years
+
+00:06:30.319 --> 00:06:32.000
+and the Free Software Foundation name
+
+00:06:32.000 --> 00:06:34.000
+to the previous regular expression
+
+00:06:34.000 --> 00:06:35.520
+to show you that you can protect
+
+00:06:35.520 --> 00:06:38.560
+any kind of string, really.
+
+06:38.560 --> 00:06:39.520
+So what we have now
+
+00:06:39.520 --> 00:06:41.360
+is a way to visualize the strings
+
+00:06:41.360 --> 00:06:43.440
+that we do not want to touch,
+
+06:43.440 --> 00:06:45.440
+but we still have to enter all of them
+
+00:06:45.440 --> 00:06:46.880
+in the translation.
+
+06:46.880 --> 00:06:48.319
+For that, we have the pop-up menu
+
+00:06:48.319 --> 00:06:50.400
+that I used earlier with the glossary,
+
+00:06:50.400 --> 00:06:51.520
+and we also have items
+
+00:06:51.520 --> 00:06:52.400
+in the edit menu
+
+00:06:52.400 --> 00:06:53.919
+that come with shortcuts
+
+00:06:53.919 --> 00:06:57.199
+for easy insertion of missing tags.
+
+06:57.199 --> 00:06:58.800
+Last, but certainly not least,
+
+00:06:58.800 --> 00:07:00.800
+we can now validate our input.
+
+00:07:00.800 --> 00:07:02.479
+Here, OmegaT properly tells me
+
+00:07:02.479 --> 00:07:05.759
+that I missed 7 protected strings,
+
+07:05.759 --> 00:07:07.599
+I entered only 1998,
+
+00:07:07.599 --> 00:07:09.280
+but there were five different years,
+
+00:07:09.280 --> 00:07:10.479
+the copyright string,
+
+00:07:10.479 --> 00:07:14.240
+and the FSF name string.
+
+07:14.240 --> 00:07:15.970
+With all this almost native
+
+00:07:15.970 --> 00:07:16.960
+Texinfo support,
+
+00:07:16.960 --> 00:07:18.880
+we have much less things to type,
+
+07:18.880 --> 00:07:19.919
+and there is a much lower
+
+00:07:19.919 --> 00:07:21.120
+potential for errors.
+
+00:07:21.120 --> 00:07:25.199
+But we agree, it’s still a lot of work.
+
+07:25.199 --> 00:07:26.319
+What we’d like now
+
+00:07:26.319 --> 00:07:27.840
+is to work with fellow translators,
+
+00:07:27.840 --> 00:07:28.720
+and here we need to know
+
+00:07:28.720 --> 00:07:29.840
+that OmegaT is actually
+
+00:07:29.840 --> 00:07:32.080
+a hidden svn/git client,
+
+00:07:32.080 --> 00:07:34.240
+and team projects can be hosted
+
+07:34.240 --> 00:07:36.319
+on svn/git platforms.
+
+07:36.319 --> 00:07:37.199
+Translators don’t need to
+
+00:07:37.199 --> 00:07:38.880
+know anything about VCS.
+
+00:07:38.880 --> 00:07:40.720
+They just need access credentials,
+
+00:07:40.720 --> 00:07:42.400
+and OmegaT commits for them.
+
+00:07:42.400 --> 00:07:44.080
+This way we do not have to use
+
+00:07:44.080 --> 00:07:45.759
+ugly and clumsy web-based
+
+00:07:45.759 --> 00:07:47.199
+translation interfaces,
+
+00:07:47.199 --> 00:07:48.800
+and we can use a powerful
+
+00:07:48.800 --> 00:07:51.440
+offline professional tool.
+
+07:51.440 --> 00:07:52.479
+So this is how it looks
+
+00:07:52.479 --> 00:07:54.160
+when you look at the platform
+
+00:07:54.160 --> 00:07:55.919
+where I hosted this project.
+
+07:55.919 --> 00:07:57.199
+The last updates are from
+
+00:07:57.199 --> 00:07:58.639
+20 days and 30 seconds ago
+
+00:07:58.639 --> 00:08:00.720
+when I created this slide,
+
+08:00.720 --> 00:08:02.479
+and you can see that I had a partner
+
+00:08:02.479 --> 00:08:04.639
+who worked with me on the same file set.
+
+08:04.639 --> 00:08:05.520
+Although it looks like
+
+00:08:05.520 --> 00:08:06.879
+we actually committed the translation
+
+00:08:06.879 --> 00:08:07.680
+to the platform,
+
+00:08:07.680 --> 00:08:11.039
+it was not us, but OmegaT.
+
+00:08:11.039 --> 00:08:13.599
+OmegaT does all the heavy-duty work.
+
+08:13.599 --> 00:08:15.039
+It regularly saves to
+
+00:08:15.039 --> 00:08:16.879
+and syncs from the servers.
+
+08:16.879 --> 00:08:18.720
+Translators are regularly kept updated
+
+08:18.720 --> 00:08:20.479
+with work from fellow translators,
+
+00:08:20.479 --> 00:08:21.680
+and when necessary,
+
+00:08:21.680 --> 00:08:23.360
+OmegaT offers a simple
+
+00:08:23.360 --> 00:08:25.440
+conflict-resolution dialogue.
+
+08:25.440 --> 00:08:27.039
+Translators never have to do anything
+
+08:27.039 --> 00:08:29.360
+with svn or git ever.
+
+08:29.360 --> 00:08:30.800
+And now we can envision a future
+
+00:08:30.800 --> 00:08:31.599
+not so far away
+
+00:08:31.599 --> 00:08:33.120
+where the manuals will be translated
+
+00:08:33.120 --> 00:08:34.159
+and eventually included
+
+00:08:34.159 --> 00:08:35.279
+in the distribution,
+
+00:08:35.279 --> 00:08:36.080
+but that’s a topic
+
+00:08:36.080 --> 00:08:39.760
+for a different presentation.
+
+08:39.760 --> 00:08:42.080
+So we’ve reached the end of this session.
+
+08:42.080 --> 00:08:44.240
+Thank you very much again for joining it.
+
+08:44.240 --> 00:08:45.600
+There are plenty of topics
+
+00:08:45.600 --> 00:08:46.880
+I promised I would not address,
+
+00:08:46.880 --> 00:08:50.000
+and I think I kept my promise.
+
+08:50.000 --> 00:08:51.600
+There will be a Q&A now,
+
+00:08:51.600 --> 00:08:52.517
+and I also started
+
+00:08:52.517 --> 00:08:53.600
+a thread about this talk
+
+00:08:53.600 --> 00:08:55.519
+on Reddit last Saturday.
+
+08:55.519 --> 00:08:57.279
+You can find me on the emacs-help
+
+00:08:57.279 --> 00:08:59.200
+and emacs-devel lists as well,
+
+00:08:59.200 --> 00:09:00.480
+so don’t hesitate to send me
+
+00:09:00.480 --> 00:09:02.080
+questions and remarks.
+
+09:02.080 --> 09:06.760
+Thank you again, and see you around.
diff --git a/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt
new file mode 100644
index 00000000..69369c4e
--- /dev/null
+++ b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_fr.vtt
@@ -0,0 +1,892 @@
+WEBVTT
+
+00:01.280 --> 00:00:02.560
+Bonjour tout le monde.
+
+00:02.560 --> 00:00:04.400
+Je m’appelle Jean-Christophe Helary,
+
+00:00:04.400 --> 00:00:05.680
+et aujourd’hui je vais vous parler
+
+00:00:05.680 --> 00:00:08.320
+de la traduction des manuels Emacs avec OmegaT.
+
+00:00:08.320 --> 00:00:10.960
+Merci de vous joindre à moi aujourd’hui.
+
+00:10.960 --> 00:00:12.880
+La traduction dans le monde du logiciel libre
+
+00:12.880 --> 00:00:15.040
+est un phénomène très important. Vous savez déjà
+
+00:15.040 --> 00:00:17.119
+que la plupart des distributions Linux,
+
+00:17.119 --> 00:00:18.720
+la plupart des logiciels,
+
+00:00:18.720 --> 00:00:19.920
+la plupart des sites web
+
+00:00:19.920 --> 00:00:22.320
+sont traduits par des dizaines de communautés
+
+00:00:22.320 --> 00:00:23.439
+à l’aide de processus
+
+00:23.439 --> 00:00:24.880
+et de formats de fichiers tous différents.
+
+00:24.880 --> 00:00:27.359
+La traduction et la localisation
+
+00:27.359 --> 00:00:29.599
+sont des choses que nous connaissons bien.
+
+00:29.599 --> 00:00:30.400
+C’est un peu différent
+
+00:00:30.400 --> 00:00:32.160
+pour la communauté Emacs.
+
+00:32.160 --> 00:00:34.079
+Nous n’avons pas de processus de localisation
+
+00:34.079 --> 00:00:35.200
+parce que c’est encore trop complexe
+
+00:00:35.200 --> 00:00:35.920
+et parce que nous n’avons pas
+
+00:00:35.920 --> 00:00:37.600
+encore les ressources nécessaires.
+
+00:37.600 --> 00:00:39.920
+Néanmoins, nous pourrions traduire les manuels,
+
+00:00:39.920 --> 00:00:41.200
+et traduire les manuels
+
+00:00:41.200 --> 00:00:42.399
+apporterait probablement beaucoup
+
+00:00:42.399 --> 00:00:45.600
+à la communauté Emacs dans son ensemble.
+
+00:45.600 --> 00:00:47.920
+Quel est donc l’état des manuels ?
+
+00:47.920 --> 00:00:51.199
+À ce jour, nous avons 182 fichiers
+
+00:51.199 --> 00:00:54.160
+aux formats .texi et .org.
+
+00:54.160 --> 00:00:56.559
+Nous avons plus de 2 millions de mots.
+
+00:56.559 --> 00:00:57.360
+Nous avons plus de
+
+00:00:57.360 --> 00:00:59.039
+50 millions de caractères.
+
+00:00:59.039 --> 00:01:00.559
+C’est donc beaucoup de travail,
+
+01:00.559 --> 00:01:04.559
+et il est clair qu’une personne ne suffira pas.
+
+01:04.559 --> 00:01:06.159
+Quand on ouvre un fichier .texi
+
+00:01:06.159 --> 00:01:07.760
+qu’est-ce qu’on y trouve ?
+
+01:07.760 --> 00:01:09.439
+Eh bien, beaucoup de choses en fait
+
+01:09.439 --> 00:01:10.560
+que les traducteurs
+
+00:01:10.560 --> 00:01:12.400
+ne devraient pas avoir à traduire.
+
+01:12.400 --> 00:01:13.680
+Ici, on peut voir que seul
+
+00:01:13.680 --> 00:01:15.040
+le tout dernier segment,
+
+00:01:15.040 --> 00:01:16.400
+la toute dernière phrase
+
+00:01:16.400 --> 00:01:18.080
+doit être traduite.
+
+01:18.080 --> 00:01:19.360
+Toutes ces choses « méta »
+
+00:01:19.360 --> 00:01:20.240
+ne devraient pas être sous
+
+00:01:20.240 --> 00:01:24.479
+les yeux du traducteur.
+
+01:24.479 --> 00:01:26.720
+Comment faire face à cette situation ?
+
+01:26.720 --> 00:01:27.680
+Pour les fichiers de code, nous avons
+
+00:01:27.680 --> 00:01:29.360
+l’utilitaire gettext qui convertit
+
+00:01:29.360 --> 00:01:30.640
+toutes les chaînes de traduisibles
+
+00:01:30.640 --> 00:01:32.079
+dans un format traduisible,
+
+00:01:32.079 --> 00:01:33.840
+qui est le format .po.
+
+01:33.840 --> 00:01:35.520
+Ce format .po est omniprésent,
+
+00:01:35.520 --> 00:01:36.400
+même dans l’industrie de la traduction
+
+00:01:36.400 --> 00:01:38.720
+des logiciels non-libres.
+
+01:38.720 --> 00:01:39.520
+Pour la documentation,
+
+00:01:39.520 --> 00:01:40.720
+nous avons quelque chose de différent
+
+00:01:40.720 --> 00:01:42.000
+qui s’appelle po4a,
+
+00:01:42.000 --> 00:01:45.119
+l’abréviation de « po for all » (po pour tous).
+
+01:45.119 --> 00:01:46.399
+Quand on utilise po4a
+
+00:01:46.399 --> 00:01:49.200
+sur ces 182 fichiers .texi et .org,
+
+00:01:49.200 --> 00:01:50.479
+qu’est-ce qu’on obtient ?
+
+01:50.479 --> 00:01:52.640
+On obtient quelque chose de bien mieux.
+
+01:52.640 --> 00:01:54.799
+Maintenant on a trois segments.
+
+01:54.799 --> 00:01:55.759
+Ce n’est pas parfait, car,
+
+00:01:55.759 --> 00:01:56.399
+comme vous pouvez le voir,
+
+00:01:56.399 --> 00:01:57.280
+les deux premiers segments
+
+00:01:57.280 --> 00:01:58.880
+ne sont pas à traduire.
+
+01:58.880 --> 00:01:59.520
+Donc on peut encore
+
+00:01:59.520 --> 00:02:02.479
+améliorer les choses.
+
+02:02.479 --> 00:02:04.960
+Quand on met ces fichiers
+
+00:02:04.960 --> 00:02:07.119
+dans OmegaT, on réduit considérablement
+
+00:02:07.119 --> 00:02:08.800
+le nombre total de mots.
+
+02:08.800 --> 00:02:11.360
+On a maintenant 50 % de mots en moins
+
+00:02:11.360 --> 00:02:14.239
+et 23 % de caractères en moins à taper,
+
+02:14.239 --> 00:02:15.680
+mais c’est toujours encore beaucoup de travail.
+
+00:02:15.680 --> 00:02:17.599
+Je vais donc vous parler d’OmegaT maintenant
+
+00:02:17.599 --> 00:02:22.239
+pour voir où il peut nous être utile.
+
+02:22.239 --> 00:02:25.440
+OmegaT est un logiciel GPL3+, Java8+.
+
+02:25.440 --> 00:02:27.599
+C’est un outil de Traduction Assistée par Ordinateur.
+
+02:27.599 --> 00:02:29.440
+On abrège ça TAO.
+
+02:29.440 --> 00:02:30.720
+La TAO est aux traducteurs
+
+00:02:30.720 --> 00:02:33.280
+ce que les EDI sont aux programmeurs.
+
+02:33.280 --> 00:02:35.040
+Elle exploite la puissance de l’ordinateur
+
+00:02:35.040 --> 00:02:36.480
+pour automatiser notre travail,
+
+00:02:36.480 --> 00:02:38.400
+qui consiste en recherche de références,
+
+00:02:38.400 --> 00:02:40.800
+de correspondances, insertions automatiques,
+
+00:02:40.800 --> 00:02:44.080
+et d’autres choses comme ça.
+
+02:44.080 --> 00:02:46.319
+OmegaT n’est plus si jeune.
+
+02:46.319 --> 00:02:48.319
+Il aura 20 ans l’année prochaine,
+
+02:48.319 --> 00:02:48.959
+et à ce stade
+
+00:02:48.959 --> 00:02:51.440
+nous avons environ 1,5 million de téléchargements
+
+00:02:51.440 --> 00:02:53.200
+sur le site SourceForge
+
+00:02:53.200 --> 00:02:54.080
+ce qui ne veut pas dire grand-chose
+
+00:02:54.080 --> 00:02:55.040
+parce que cela inclut
+
+00:02:55.040 --> 00:02:56.480
+les fichiers utilisés pour la localisation
+
+00:02:56.480 --> 00:02:57.920
+les manuels, mais quand même
+
+00:02:57.920 --> 00:02:59.599
+c’est un chiffre quand même important.
+
+02:59.599 --> 00:03:00.720
+OmegaT est inclus dans
+
+00:03:00.720 --> 00:03:02.400
+beaucoup de distributions Linux,
+
+00:03:02.400 --> 00:03:03.680
+mais comme vous pouvez le voir ici,
+
+03:03.680 --> 00:03:05.920
+il est surtout téléchargé sur Windows
+
+00:03:05.920 --> 00:03:06.800
+car les traducteurs
+
+00:03:06.800 --> 00:03:09.680
+travaillent principalement sous Windows.
+
+03:09.680 --> 00:03:11.120
+OmegaT a un logo sympa
+
+00:03:11.120 --> 00:03:12.080
+et un site sympa aussi,
+
+00:03:12.080 --> 00:03:13.920
+et je vous invite vraiment à le visiter.
+
+00:03:13.920 --> 00:03:16.159
+L’URL est omegat.org et vous y trouverez
+
+03:16.159 --> 00:03:17.280
+toutes les informations dont vous avez besoin
+
+00:03:17.280 --> 00:03:19.040
+ainsi que les téléchargements des versions Linux,
+
+00:03:19.040 --> 00:03:22.080
+avec ou sans Java inclus.
+
+03:22.080 --> 00:03:24.799
+Alors, qu’est-ce qu’OmegaT nous apporte ?
+
+03:24.799 --> 00:03:26.560
+Les traducteurs professionnels doivent fournir
+
+03:26.560 --> 00:03:27.680
+des traductions rapides, cohérentes,
+
+00:03:27.680 --> 00:03:29.519
+et de qualité,
+
+03:29.519 --> 00:03:30.720
+et nous devons disposer d’outils appropriés
+
+00:03:30.720 --> 00:03:32.159
+pour y parvenir.
+
+00:03:32.159 --> 00:03:34.239
+J’aimerais que po-mode fasse partie de nos outils,
+
+00:03:34.239 --> 00:03:35.120
+mais ce n’est pas le cas,
+
+03:35.120 --> 00:03:36.560
+et c’est bien dommage.
+
+03:36.560 --> 00:03:39.760
+Nous devons donc utiliser ces outils de TAO.
+
+03:39.760 --> 00:03:41.440
+Laissez-moi vous montrer à quoi ressemble OmegaT
+
+03:41.440 --> 00:03:43.120
+quand j’ouvre ce projet que j’ai créé
+
+03:43.120 --> 00:03:45.200
+pour cette présentation.
+
+03:45.200 --> 00:03:46.640
+La fenêtre est assez impressionnante,
+
+00:03:46.640 --> 00:03:47.760
+mais vous pouvez en fait modifier
+
+00:03:47.760 --> 00:03:49.519
+toutes les parties selon vos besoins.
+
+03:49.519 --> 00:03:50.400
+Je veux juste vous montrer
+
+00:03:50.400 --> 00:03:51.120
+tout en même temps
+
+00:03:51.120 --> 00:03:53.680
+pour vous donner une idée rapide de l’ensemble.
+
+03:53.680 --> 00:03:55.200
+Vous avez différentes couleurs, fenêtres,
+
+00:03:55.200 --> 00:03:55.920
+et tous ces espaces
+
+00:03:55.920 --> 00:03:57.120
+ont des fonctions différentes
+
+03:57.120 --> 00:03:58.560
+qui aident le traducteur,
+
+00:03:58.560 --> 00:03:59.360
+et qui probablement ne vous sont
+
+00:03:59.360 --> 00:04:02.879
+pas familières.
+
+04:02.879 --> 00:04:04.080
+Je vais vous présenter
+
+00:04:04.080 --> 00:04:05.680
+l’interface maintenant.
+
+04:05.680 --> 00:04:07.519
+Tout d’abord, nous avons l’éditeur.
+
+04:07.519 --> 00:04:09.439
+L’éditeur est composé de deux parties :
+
+04:09.439 --> 00:04:10.480
+le segment courant,
+
+00:04:10.480 --> 00:04:12.319
+qui est associé à un numéro,
+
+00:04:12.319 --> 00:04:13.519
+et tous les autres segments,
+
+00:04:13.519 --> 00:04:15.840
+au-dessus ou en dessous.
+
+04:15.840 --> 00:04:16.720
+En haut de la fenêtre,
+
+00:04:16.720 --> 00:04:18.720
+vous pouvez voir les trois premiers segments
+
+00:04:18.720 --> 00:04:20.799
+qui étaient dans le fichier .po.
+
+04:20.799 --> 00:04:22.880
+Le dernier ici, le quatrième, inclut
+
+00:04:22.880 --> 00:04:28.720
+une insertion automatique de correspondance.
+
+04:28.720 --> 00:04:30.880
+On appelle ce type de traductions
+
+04:30.880 --> 00:04:32.720
+des « mémoires de traduction ».
+
+04:32.720 --> 00:04:35.280
+OmegaT a inséré celle-ci automatiquement
+
+00:04:35.280 --> 00:04:37.120
+parce que j’ai paramétré comme ça,
+
+04:37.120 --> 00:04:38.560
+et pour ma sécurité, elle est insérée avec
+
+00:04:38.560 --> 00:04:40.639
+le préfixe prédéfini « fuzzy »
+
+00:04:40.639 --> 00:04:41.919
+que je devrai retirer
+
+00:04:41.919 --> 00:04:44.880
+pour valider la traduction.
+
+04:44.880 --> 00:04:47.919
+La fonctionnalité suivante est le glossaire.
+
+04:47.919 --> 00:04:48.479
+Dans ce projet,
+
+00:04:48.479 --> 00:04:50.160
+on a beaucoup de glossaires.
+
+00:04:50.160 --> 00:04:52.560
+Certains sont pertinents, d’autres non.
+
+04:52.560 --> 00:04:53.919
+Dans le segment que je suis en train de traduire
+
+00:04:53.919 --> 00:04:55.199
+en ce moment, vous pouvez voir
+
+00:04:55.199 --> 00:04:57.520
+des éléments soulignés.
+
+04:57.520 --> 00:04:59.040
+Ce menu contextuel à droite
+
+00:04:59.040 --> 00:05:02.240
+me permet d’entrer les termes au fur et à mesure que j’écris.
+
+05:02.240 --> 00:05:04.639
+C’est une sorte de système d’insertion automatique
+
+00:05:04.639 --> 00:05:07.039
+qui propose aussi des prédictions de l’historique,
+
+00:05:07.039 --> 00:05:14.479
+des chaînes prédéfinies et d’autres choses comme ça.
+
+05:14.479 --> 00:05:15.440
+Dans la partie à droite,
+
+00:05:15.440 --> 00:05:17.120
+on a des informations de référence
+
+00:05:17.120 --> 00:05:18.240
+qui viennent directement
+
+00:05:18.240 --> 00:05:21.440
+des fichiers .po et .texi.
+
+05:21.440 --> 00:05:23.440
+On a également des notes à partager
+
+00:05:23.440 --> 00:05:25.759
+avec des collègues traducteurs,
+
+05:25.759 --> 00:05:28.080
+et nous avons des chiffres qui me disent
+
+00:05:28.080 --> 00:05:31.199
+qu’il me reste encore 143 000 segments à traduire
+
+00:05:31.199 --> 00:05:35.280
+avant de terminer cette traduction.
+
+05:35.280 --> 00:05:37.120
+Comme on le voit, il y a beaucoup de chaînes
+
+05:37.120 --> 00:05:40.000
+que nous ne voulons vraiment pas avoir à saisir.
+
+05:40.000 --> 00:05:42.160
+Par exemple, ces chaînes
+
+00:05:42.160 --> 00:05:43.840
+sont des chaînes .texi typiques
+
+00:05:43.840 --> 00:05:45.039
+que le traducteur
+
+00:05:45.039 --> 00:05:46.479
+ne devrait vraiment pas avoir à saisir.
+
+00:05:46.479 --> 00:05:47.360
+Nous allons donc devoir
+
+00:05:47.360 --> 00:05:50.400
+faire quelque chose pour gérer ça.
+
+05:50.400 --> 00:05:51.600
+On va devoir créer des
+
+00:05:51.600 --> 00:05:52.479
+chaînes protégées
+
+00:05:52.479 --> 00:05:54.400
+à l’aide d’expressions régulières,
+
+05:54.400 --> 00:05:56.800
+afin que les chaînes puissent être visualisées
+
+00:05:56.800 --> 00:05:59.120
+immédiatement dans le segment source,
+
+05:59.120 --> 00:06:00.479
+saisies de manière semi-automatique
+
+00:06:00.479 --> 00:06:01.680
+dans le segment cible,
+
+00:06:01.680 --> 00:06:04.479
+et validables.
+
+06:04.479 --> 00:06:06.479
+L’expression régulière que j’ai trouvée
+
+06:06.479 --> 00:06:08.160
+pour définir la plupart des chaînes
+
+00:06:08.160 --> 00:06:09.600
+est celle-ci,
+
+06:09.600 --> 00:06:11.120
+et je ne suis pas un pro des regex
+
+00:06:11.120 --> 00:06:13.360
+donc certains d’entre vous pourront me corriger.
+
+00:06:13.360 --> 00:06:14.560
+Mais cette expression me donne
+
+00:06:14.560 --> 00:06:15.919
+une définition suffisante
+
+00:06:15.919 --> 00:06:17.919
+même si elle n’inclut pas encore
+
+00:06:17.919 --> 00:06:20.960
+la syntaxe org-mode.
+
+06:20.960 --> 00:06:22.344
+Donc maintenant on a toutes ces
+
+00:06:22.344 --> 00:06:23.440
+chaînes spécifiques à .texi
+
+00:06:23.440 --> 00:06:24.960
+que nous ne voulons pas toucher
+
+06:24.960 --> 00:06:26.100
+affichées en gris.
+
+00:06:26.100 --> 00:06:27.680
+En fait, vous avez peut-être remarqué
+
+00:06:27.680 --> 00:06:28.479
+que j’ai un peu triché,
+
+06:28.479 --> 00:06:30.319
+car ici j’ai ajouté les années
+
+00:06:30.319 --> 00:06:32.000
+et le nom de la Free Software Foundation
+
+00:06:32.000 --> 00:06:34.000
+à la regex précédente
+
+00:06:34.000 --> 00:06:35.520
+pour vous montrer que vous pouvez protéger
+
+00:06:35.520 --> 00:06:38.560
+vraiment n’importe quel type de chaîne.
+
+06:38.560 --> 00:06:39.520
+On obtient maintenant
+
+00:06:39.520 --> 00:06:41.360
+une visualisation des chaînes de caractères
+
+00:06:41.360 --> 00:06:43.440
+que nous ne voulons pas toucher,
+
+06:43.440 --> 00:06:45.440
+mais on doit encore les saisir toutes
+
+00:06:45.440 --> 00:06:46.880
+dans la traduction.
+
+06:46.880 --> 00:06:48.319
+Pour ça, on a le menu contextuel
+
+00:06:48.319 --> 00:06:50.400
+que j’ai utilisé plus tôt avec le glossaire,
+
+00:06:50.400 --> 00:06:51.520
+et on a également des rubriques
+
+00:06:51.520 --> 00:06:52.400
+dans le menu d’édition
+
+00:06:52.400 --> 00:06:53.919
+qui sont accompagnés de raccourcis
+
+00:06:53.919 --> 00:06:57.199
+pour faciliter l’insertion des balises manquantes.
+
+06:57.199 --> 00:06:58.800
+Enfin, et ce n’est pas le moins important,
+
+00:06:58.800 --> 00:07:00.800
+nous pouvons maintenant valider nos entrées.
+
+00:07:00.800 --> 00:07:02.479
+Ici, OmegaT me dit correctement
+
+00:07:02.479 --> 00:07:05.759
+que j’ai raté 7 chaînes protégées.
+
+07:05.759 --> 00:07:07.599
+Je n’ai entré que 1998,
+
+00:07:07.599 --> 00:07:09.280
+mais il y avait cinq autres années,
+
+00:07:09.280 --> 00:07:10.479
+la chaîne de copyright,
+
+00:07:10.479 --> 00:07:14.240
+et le nom de la FSF.
+
+07:14.240 --> 00:07:15.970
+Avec ce support presque natif
+
+00:07:15.970 --> 00:07:16.960
+du format Texinfo,
+
+00:07:16.960 --> 00:07:18.880
+on a beaucoup moins de choses à saisir,
+
+07:18.880 --> 00:07:19.919
+et il y a beaucoup moins
+
+00:07:19.919 --> 00:07:21.120
+d’erreurs potentielles.
+
+00:07:21.120 --> 00:07:25.199
+Mais on est d’accord, c’est encore beaucoup de travail.
+
+07:25.199 --> 00:07:26.319
+Ce qu’on aimerait maintenant
+
+00:07:26.319 --> 00:07:27.840
+c’est de collaborer avec des collègues traducteurs,
+
+00:07:27.840 --> 00:07:28.720
+et là, on doit savoir
+
+00:07:28.720 --> 00:07:29.840
+qu’OmegaT est en fait
+
+00:07:29.840 --> 00:07:32.080
+un client svn/git dissimulé,
+
+00:07:32.080 --> 00:07:34.240
+et que les projets en équipe peuvent être hébergés
+
+07:34.240 --> 00:07:36.319
+sur des plates-formes svn/git.
+
+07:36.319 --> 00:07:37.199
+Les traducteurs n’ont pas besoin
+
+00:07:37.199 --> 00:07:38.880
+de connaître le contrôle de version.
+
+00:07:38.880 --> 00:07:40.720
+Ils ont juste besoin d’identifiants d’accès,
+
+00:07:40.720 --> 00:07:42.400
+et OmegaT va commiter pour eux.
+
+00:07:42.400 --> 00:07:44.080
+De cette façon, nous n’avons pas besoin d’utiliser
+
+00:07:44.080 --> 00:07:45.759
+d’interfaces de traduction web laides
+
+00:07:45.759 --> 00:07:47.199
+et peu ergonomiques
+
+00:07:47.199 --> 00:07:48.800
+puisqu’on peut utiliser un outil
+
+00:07:48.800 --> 00:07:51.440
+hors ligne professionnel.
+
+07:51.440 --> 00:07:52.479
+Voici donc à quoi ressemble
+
+00:07:52.479 --> 00:07:54.160
+la plateforme
+
+00:07:54.160 --> 00:07:55.919
+où j’héberge ce projet.
+
+07:55.919 --> 00:07:57.199
+Les dernières mises à jour datent d’il y a
+
+00:07:57.199 --> 00:07:58.639
+20 jours et 30 secondes
+
+00:07:58.639 --> 00:08:00.720
+quand j’ai créé cette présentation,
+
+08:00.720 --> 00:08:02.479
+et vous pouvez voir que j’ai un partenaire
+
+00:08:02.479 --> 00:08:04.639
+qui a travaillé avec moi sur le même ensemble de fichiers.
+
+08:04.639 --> 00:08:05.520
+Bien qu’il semble que
+
+00:08:05.520 --> 00:08:06.879
+que nous avons effectivement commité la traduction
+
+00:08:06.879 --> 00:08:07.680
+sur la plateforme,
+
+00:08:07.680 --> 00:08:11.039
+ce n’était pas nous, mais OmegaT.
+
+00:08:11.039 --> 00:08:13.599
+OmegaT fait le gros du travail.
+
+08:13.599 --> 00:08:15.039
+Il effectue régulièrement des sauvegardes et
+
+00:08:15.039 --> 00:08:16.879
+se synchronise avec les serveurs.
+
+08:16.879 --> 00:08:18.720
+Les traducteurs reçoivent régulièrement
+
+08:18.720 --> 00:08:20.479
+les mises à jour de leurs collègues,
+
+00:08:20.479 --> 00:08:21.680
+et quand il le faut,
+
+00:08:21.680 --> 00:08:23.360
+OmegaT affiche un simple
+
+00:08:23.360 --> 00:08:25.440
+dialogue de résolution des conflits.
+
+08:25.440 --> 00:08:27.039
+Les traducteurs n’ont jamais à manipuler
+
+08:27.039 --> 00:08:29.360
+svn ou git, jamais.
+
+08:29.360 --> 00:08:30.800
+Et maintenant, nous pouvons envisager un avenir
+
+00:08:30.800 --> 00:08:31.599
+pas si lointain
+
+00:08:31.599 --> 00:08:33.120
+où les manuels seraient traduits
+
+00:08:33.120 --> 00:08:34.159
+et éventuellement inclus
+
+00:08:34.159 --> 00:08:35.279
+dans la distribution,
+
+00:08:35.279 --> 00:08:36.080
+mais c’est un sujet
+
+00:08:36.080 --> 00:08:39.760
+pour une autre présentation.
+
+08:39.760 --> 00:08:42.080
+J’ai atteint la fin de cette session.
+
+08:42.080 --> 00:08:44.240
+Merci encore d’y avoir participé.
+
+08:44.240 --> 00:08:45.600
+Il y a beaucoup de sujets
+
+00:08:45.600 --> 00:08:46.880
+que j’avais promis de ne pas aborder,
+
+00:08:46.880 --> 00:08:50.000
+et je pense avoir tenu ma promesse.
+
+08:50.000 --> 00:08:51.600
+Il va y avoir des questions-réponses maintenant
+
+00:08:51.600 --> 00:08:52.517
+et j’ai aussi commencé
+
+00:08:52.517 --> 00:08:53.600
+un fil de discussion sur cette session
+
+00:08:53.600 --> 00:08:55.519
+samedi dernier, sur Reddit.
+
+08:55.519 --> 00:08:57.279
+Vous pouvez me trouver sur les listes emacs-help
+
+00:08:57.279 --> 00:08:59.200
+et emacs-devel,
+
+00:08:59.200 --> 00:09:00.480
+alors n’hésitez pas à m’envoyer
+
+00:09:00.480 --> 00:09:02.080
+vos questions et remarques.
+
+09:02.080 --> 09:06.760
+Merci encore, et à bientôt !
diff --git a/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt
new file mode 100644
index 00000000..8d159336
--- /dev/null
+++ b/2021/captions/emacsconf-2021-omegat--emacs-manuals-translation-and-omegat--jean-christophe-helary--main_ja.vtt
@@ -0,0 +1,892 @@
+WEBVTT
+
+00:01.280 --> 00:00:02.560
+皆さん、こんにちは。
+
+00:02.560 --> 00:00:04.400
+エラリー ジャンクリストフといいます。
+
+00:00:04.400 --> 00:00:05.680
+今日はEmacsのマニュアルの翻訳と
+
+00:00:05.680 --> 00:00:08.320
+OmegaTについてお話しします。
+
+00:00:08.320 --> 00:00:10.960
+セッションに参加いただき、ありがとうございます。
+
+00:10.960 --> 00:00:12.880
+自由ソフトウェアの世界では
+
+00:12.880 --> 00:00:15.040
+翻訳は本当に大きな意味を持ちます。
+
+00:15.040 --> 00:00:17.119
+ほとんどのLinuxディストリビューション、
+
+00:17.119 --> 00:00:18.720
+ソフトウェアパッケージ
+
+00:00:18.720 --> 00:00:19.920
+ウェブサイトが
+
+00:00:19.920 --> 00:00:22.320
+異なるプロセスやファイル形式を使い、
+
+00:00:22.320 --> 00:00:23.439
+多くのコミュニティによって
+
+00:23.439 --> 00:00:24.880
+翻訳されていることをすでにご存知でしょう。
+
+00:24.880 --> 00:00:27.359
+翻訳とローカライゼーションについては
+
+00:27.359 --> 00:00:29.599
+ノウハウと経験がかなり蓄積されています。
+
+00:29.599 --> 00:00:30.400
+しかし、Emacsコミュニティについては
+
+00:00:30.400 --> 00:00:32.160
+必ずしもそうではありません。
+
+00:32.160 --> 00:00:34.079
+色々と複雑で、
+
+00:34.079 --> 00:00:35.200
+またリソースがないため、
+
+00:00:35.200 --> 00:00:35.920
+ローカライゼーションプロセスが
+
+00:00:35.920 --> 00:00:37.600
+まだ確立していません。
+
+00:37.600 --> 00:00:39.920
+しかし、マニュアルの翻訳は可能ですし、
+
+00:00:39.920 --> 00:00:41.200
+マニュアルの翻訳によって、
+
+00:00:41.200 --> 00:00:42.399
+Emacsコミュニティ全体に
+
+00:00:42.399 --> 00:00:45.600
+多くの利益がもたらされるでしょう。
+
+00:45.600 --> 00:00:47.920
+では、マニュアルはどうなっているのでしょうか?
+
+00:47.920 --> 00:00:51.199
+今日現在、182のファイルが
+
+00:51.199 --> 00:00:54.160
+.texi や.org 形式で作成されています。
+
+00:54.160 --> 00:00:56.559
+単語数は200万以上です。
+
+00:56.559 --> 00:00:57.360
+文字数は、
+
+00:00:57.360 --> 00:00:59.039
+5000万以上です。
+
+00:00:59.039 --> 00:01:00.559
+これはかなりの量ですし、
+
+01:00.559 --> 00:01:04.559
+当然ながら、一人でできる仕事ではありません。
+
+01:04.559 --> 00:01:06.159
+.texi ファイルを開くと、
+
+00:01:06.159 --> 00:01:07.760
+何が出てくるのでしょうか?
+
+01:07.760 --> 00:01:09.439
+実は、翻訳者が翻訳する必要が
+
+01:09.439 --> 00:01:10.560
+ないものが
+
+00:01:10.560 --> 00:01:12.400
+たくさんあるのです。
+
+01:12.400 --> 00:01:13.680
+ここでは、一番最後の
+
+00:01:13.680 --> 00:01:15.040
+セグメント、一番最後の
+
+00:01:15.040 --> 00:01:16.400
+文だけが翻訳する
+
+00:01:16.400 --> 00:01:18.080
+必要があります。
+
+01:18.080 --> 00:01:19.360
+このようなメタ的なものは
+
+00:01:19.360 --> 00:01:20.240
+すべて翻訳者の目に
+
+00:01:20.240 --> 00:01:24.479
+触れる必要はありません。
+
+01:24.479 --> 00:01:26.720
+このような場合はどう対処すればいいのでしょうか?
+
+01:26.720 --> 00:01:27.680
+ソースファイルの場合、
+
+00:01:27.680 --> 00:01:29.360
+gettext というユーティリティーがあり、
+
+00:01:29.360 --> 00:01:30.640
+翻訳可能な文字列を
+
+00:01:30.640 --> 00:01:32.079
+翻訳可能な形式に変換します。
+
+00:01:32.079 --> 00:01:33.840
+それが .po 形式になります。
+
+01:33.840 --> 00:01:35.520
+この .po 形式はどこにでもあり、
+
+00:01:35.520 --> 00:01:36.400
+自由ではないソフトウェア
+
+00:01:36.400 --> 00:01:38.720
+翻訳業界でも広く使われています。
+
+01:38.720 --> 00:01:39.520
+ドキュメントについては
+
+00:01:39.520 --> 00:01:40.720
+別のツールがあります。
+
+00:01:40.720 --> 00:01:42.000
+po4a と呼ばれるもので、
+
+00:01:42.000 --> 00:01:45.119
+これは「po for all」の略です。
+
+01:45.119 --> 00:01:46.399
+po4aを182.texiと
+
+00:01:46.399 --> 00:01:49.200
+.org ファイルに用いると
+
+00:01:49.200 --> 00:01:50.479
+どうなるでしょうか?
+
+01:50.479 --> 00:01:52.640
+先ほどよりずっといいものができました。
+
+01:52.640 --> 00:01:54.799
+これで分節が3つができました。
+
+01:54.799 --> 00:01:55.759
+ご覧の通り、
+
+00:01:55.759 --> 00:01:56.399
+最初の2つの分節は
+
+00:01:56.399 --> 00:01:57.280
+翻訳の必要がないので、
+
+00:01:57.280 --> 00:01:58.880
+完璧ではありません。
+
+01:58.880 --> 00:01:59.520
+ですから、まだ
+
+00:01:59.520 --> 00:02:02.479
+改善の余地があります。
+
+02:02.479 --> 00:02:04.960
+さて、このファイルセットを
+
+00:02:04.960 --> 00:02:07.119
+OmegaTに入れると翻訳対象単語数が
+
+00:02:07.119 --> 00:02:08.800
+かなり減ります。
+
+02:08.800 --> 00:02:11.360
+単語数が50%、
+
+00:02:11.360 --> 00:02:14.239
+文字数が23%減りましたが、
+
+02:14.239 --> 00:02:15.680
+まだかなりの仕事量です。
+
+00:02:15.680 --> 00:02:17.599
+では、ここでOmegaTについて、
+
+00:02:17.599 --> 00:02:22.239
+そして、OmegaTがどこに役立つかを見てみましょう。
+
+02:22.239 --> 00:02:25.440
+OmegaTは、GPL3+ Java8+ のソフトで
+
+02:25.440 --> 00:02:27.599
+コンピューター支援翻訳ツールです。
+
+02:27.599 --> 00:02:29.440
+Computer Aided Translationと呼ばれます。
+
+02:29.440 --> 00:02:30.720
+CATは翻訳者にとって、
+
+00:02:30.720 --> 00:02:33.280
+プログラマーにとってのIDEのようなものです。
+
+02:33.280 --> 00:02:35.040
+CATは、コンピュータの力を利用して
+
+00:02:35.040 --> 00:02:36.480
+翻訳者の仕事を自動化します。
+
+00:02:36.480 --> 00:02:38.400
+例えば、参考翻訳の検索や
+
+00:02:38.400 --> 00:02:40.800
+ファジーマッチ、自動入力
+
+00:02:40.800 --> 00:02:44.080
+などのようなものです。
+
+02:44.080 --> 00:02:46.319
+OmegaTは最近のものありません。
+
+02:46.319 --> 00:02:48.319
+来年で20年になり、
+
+02:48.319 --> 00:02:48.959
+現時点では
+
+00:02:48.959 --> 00:02:51.440
+SourceForgeのサイトから
+
+00:02:51.440 --> 00:02:53.200
+150万件前後のダウンロードがあります。
+
+00:02:53.200 --> 00:02:54.080
+これにはローカライズや
+
+00:02:54.080 --> 00:02:55.040
+マニュアルに使用されるファイルが
+
+00:02:55.040 --> 00:02:56.480
+多少含まれるので、
+
+00:02:56.480 --> 00:02:57.920
+それほど意味はありませんが、
+
+00:02:57.920 --> 00:02:59.599
+それでもかなり大きな数字です。
+
+02:59.599 --> 00:03:00.720
+OmegaTは、多くのLinux
+
+00:03:00.720 --> 00:03:02.400
+ディストリビューションに含まれますが、
+
+00:03:02.400 --> 00:03:03.680
+ここで見られるように
+
+03:03.680 --> 00:03:05.920
+ほとんどがWindowsでダウンロードされています。
+
+00:03:05.920 --> 00:03:06.800
+なぜなら、翻訳者は
+
+00:03:06.800 --> 00:03:09.680
+ほとんどWindows上で作業しているからです。
+
+03:09.680 --> 00:03:11.120
+OmegaTにもかっこいいロゴと
+
+00:03:11.120 --> 00:03:12.080
+かっこいいサイトがあります。
+
+00:03:12.080 --> 00:03:13.920
+ぜひ一度ご覧ください。
+
+00:03:13.920 --> 00:03:16.159
+サイトはomegat.orgで、
+
+03:16.159 --> 00:03:17.280
+すべての必要な情報が見られます。
+
+00:03:17.280 --> 00:03:19.040
+また、Javaの有無の関わらず、
+
+00:03:19.040 --> 00:03:22.080
+Linuxバージョンもダウンロードできます。
+
+03:22.080 --> 00:03:24.799
+では、OmegaTによって何が変わるのでしょうか?
+
+03:24.799 --> 00:03:26.560
+プロの翻訳者が提供しなければいけないのは、
+
+03:26.560 --> 00:03:27.680
+速く、一貫性があり
+
+00:03:27.680 --> 00:03:29.519
+品質の高い翻訳です。
+
+03:29.519 --> 00:03:30.720
+それを実現するためには、
+
+00:03:30.720 --> 00:03:32.159
+適切なツールが必要です。
+
+00:03:32.159 --> 00:03:34.239
+po-modeがツールボックスの一部であればいいのですが、
+
+00:03:34.239 --> 00:03:35.120
+そうはなっていません。
+
+03:35.120 --> 00:03:36.560
+残念ながら。
+
+03:36.560 --> 00:03:39.760
+ですから、そのようなCATツールを使わなければなりません。
+
+03:39.760 --> 00:03:41.440
+このデモのために作成したプロジェクトを
+
+03:41.440 --> 00:03:43.120
+開くと、OmegaTがどのように表示されるか
+
+03:43.120 --> 00:03:45.200
+お見せしましょう。
+
+03:45.200 --> 00:03:46.640
+表示はかなりややこしいですが、
+
+00:03:46.640 --> 00:03:47.760
+実際には、必要に応じてすべての
+
+00:03:47.760 --> 00:03:49.519
+ウィンドウを変更できます。
+
+03:49.519 --> 00:03:50.400
+OmegaTがどんなものなのか
+
+00:03:50.400 --> 00:03:51.120
+理解していただくために
+
+00:03:51.120 --> 00:03:53.680
+一度にすべてをお見せしたいと思います。
+
+03:53.680 --> 00:03:55.200
+さまざまな色やウィンドウがあり、
+
+00:03:55.200 --> 00:03:55.920
+それらスペースには
+
+00:03:55.920 --> 00:03:57.120
+翻訳者を支援する
+
+03:57.120 --> 00:03:58.560
+さまざまな機能がありますが、
+
+00:03:58.560 --> 00:03:59.360
+皆さんにはあまり
+
+00:03:59.360 --> 00:04:02.879
+馴染みがないかもしれません。
+
+04:02.879 --> 00:04:04.080
+今からそのインターフェースを
+
+00:04:04.080 --> 00:04:05.680
+ご紹介します。
+
+04:05.680 --> 00:04:07.519
+まずは、エディターですね。
+
+04:07.519 --> 00:04:09.439
+エディターは2つの部分から成ります。
+
+04:09.439 --> 00:04:10.480
+番号に関連づけられた
+
+00:04:10.480 --> 00:04:12.319
+現在の分節と、
+
+00:04:12.319 --> 00:04:13.519
+もうひとつは上下にあるすべての
+
+00:04:13.519 --> 00:04:15.840
+分節です。
+
+04:15.840 --> 00:04:16.720
+ウィンドウの一番上には
+
+00:04:16.720 --> 00:04:18.720
+.poファイルにあった最初の3つの分節が
+
+00:04:18.720 --> 00:04:20.799
+表示されています。
+
+04:20.799 --> 00:04:22.880
+ここの最後の4つ目の分節には
+
+00:04:22.880 --> 00:04:28.720
+ファジーマッチが自動挿入されています。
+
+04:28.720 --> 00:04:30.880
+このようなレガシー翻訳は
+
+04:30.880 --> 00:04:32.720
+「翻訳メモリ」と呼ばれます。
+
+04:32.720 --> 00:04:35.280
+OmegaTがこれを自動挿入したのは、
+
+00:04:35.280 --> 00:04:37.120
+私がそうするように設定したからです。
+
+04:37.120 --> 00:04:38.560
+また、私自身のセキュリティのために、
+
+00:04:38.560 --> 00:04:40.639
+翻訳の検証のために
+
+00:04:40.639 --> 00:04:41.919
+削除しなければならない規定の
+
+00:04:41.919 --> 00:04:44.880
+[fuzzy] がついています。
+
+04:44.880 --> 00:04:47.919
+次の機能は、用語集機能です。
+
+04:47.919 --> 00:04:48.479
+今回のプロジェクトには
+
+00:04:48.479 --> 00:04:50.160
+たくさんの用語集データがあります。
+
+00:04:50.160 --> 00:04:52.560
+関連のあるものもあれば、そうでないものもあります。
+
+04:52.560 --> 00:04:53.919
+今翻訳している分節では
+
+00:04:53.919 --> 00:04:55.199
+下線が引かれた項目が
+
+00:04:55.199 --> 00:04:57.520
+あります。
+
+04:57.520 --> 00:04:59.040
+右側のポップアップメニューでは
+
+00:04:59.040 --> 00:05:02.240
+入力中に用語を入れることができます。
+
+05:02.240 --> 00:05:04.639
+これは自動挿入システムのようなもので、
+
+00:05:04.639 --> 00:05:07.039
+履歴予測や定型文などと
+
+00:05:07.039 --> 00:05:14.479
+いったような入力補完に対応しています。
+
+05:14.479 --> 00:05:15.440
+右側の部分には、
+
+00:05:15.440 --> 00:05:17.120
+.poと.texiのファイルから
+
+00:05:17.120 --> 00:05:18.240
+直接得られた
+
+00:05:18.240 --> 00:05:21.440
+参照情報があります。
+
+05:21.440 --> 00:05:23.440
+また、パートナーの翻訳者と
+
+00:05:23.440 --> 00:05:25.759
+共有できるメモもあり、
+
+05:25.759 --> 00:05:28.080
+翻訳完了までに
+
+00:05:28.080 --> 00:05:31.199
+あと143,000分節あることを示す
+
+00:05:31.199 --> 00:05:35.280
+数字も表示されています。
+
+05:35.280 --> 00:05:37.120
+しかし、どうしても
+
+05:37.120 --> 00:05:40.000
+入力したくない文字列がたくさんあります。
+
+05:40.000 --> 00:05:42.160
+例えば、これらの文字列は
+
+00:05:42.160 --> 00:05:43.840
+典型的な .texi の文字列で、
+
+00:05:43.840 --> 00:05:45.039
+翻訳者が入力する
+
+00:05:45.039 --> 00:05:46.479
+必要はありません。
+
+00:05:46.479 --> 00:05:47.360
+これについて
+
+00:05:47.360 --> 00:05:50.400
+どうにかしなければなりません。
+
+05:50.400 --> 00:05:51.600
+そのためには、正規表現を使い
+
+00:05:51.600 --> 00:05:52.479
+保護された文字列を作成し、
+
+00:05:52.479 --> 00:05:54.400
+ソース分節では
+
+05:54.400 --> 00:05:56.800
+文字列をすぐに視覚化し、
+
+00:05:56.800 --> 00:05:59.120
+ターゲット分節で
+
+05:59.120 --> 00:06:00.479
+半自動的に入力し、
+
+00:06:00.479 --> 00:06:01.680
+整合性を
+
+00:06:01.680 --> 00:06:04.479
+チェックできるようにしましょう。
+
+06:04.479 --> 00:06:06.479
+処理したい文字列を定義するのに
+
+06:06.479 --> 00:06:08.160
+考えた正規表現は
+
+00:06:08.160 --> 00:06:09.600
+このようなものです。
+
+06:09.600 --> 00:06:11.120
+正規表現のプロではないので、
+
+00:06:11.120 --> 00:06:13.360
+皆さんからのご指摘もあると思います。
+
+00:06:13.360 --> 00:06:14.560
+しかし、この表現は
+
+00:06:14.560 --> 00:06:15.919
+Orgモードの構文を
+
+00:06:15.919 --> 00:06:17.919
+まだ含んでいないにもかかわらず
+
+00:06:17.919 --> 00:06:20.960
+十分な定義になっています。
+
+06:20.960 --> 00:06:22.344
+これで、触ってはいけない
+
+00:06:22.344 --> 00:06:23.440
+.texi 特有のものが
+
+00:06:23.440 --> 00:06:24.960
+すべてグレーで
+
+06:24.960 --> 00:06:26.100
+表示されるようになりました。
+
+00:06:26.100 --> 00:06:27.680
+実は、お気づきかもしれませんが
+
+00:06:27.680 --> 00:06:28.479
+少しズルをしました。
+
+06:28.479 --> 00:06:30.319
+先ほどの正規表現に「年」と
+
+00:06:30.319 --> 00:06:32.000
+「Free Software Foundation」の名前を追加しました。
+
+00:06:32.000 --> 00:06:34.000
+なぜなら、どんな種類の文字列でも
+
+00:06:34.000 --> 00:06:35.520
+保護できることを
+
+00:06:35.520 --> 00:06:38.560
+示したかったからです。
+
+06:38.560 --> 00:06:39.520
+これで、
+
+00:06:39.520 --> 00:06:41.360
+触れたくない文字列を
+
+00:06:41.360 --> 00:06:43.440
+可視化することができましたが、
+
+06:43.440 --> 00:06:45.440
+それでもすべての文字列を翻訳に
+
+00:06:45.440 --> 00:06:46.880
+入力しなければなりません。
+
+06:46.880 --> 00:06:48.319
+そのために、先ほどの用語集で使った
+
+00:06:48.319 --> 00:06:50.400
+ポップアップメニューがあれば、
+
+00:06:50.400 --> 00:06:51.520
+編集メニューの中にも
+
+00:06:51.520 --> 00:06:52.400
+不足しているタグを
+
+00:06:52.400 --> 00:06:53.919
+簡単に挿入するための
+
+00:06:53.919 --> 00:06:57.199
+ショートカットも用意されています。
+
+06:57.199 --> 00:06:58.800
+最後に忘れてはならないのが
+
+00:06:58.800 --> 00:07:00.800
+入力の検証が可能なことです。
+
+00:07:00.800 --> 00:07:02.479
+ここで、OmegaTは7つの保護された文字列を
+
+00:07:02.479 --> 00:07:05.759
+見逃したことをきちんと見せてくれます。
+
+07:05.759 --> 00:07:07.599
+私は1998年だけを入力しましたが、
+
+00:07:07.599 --> 00:07:09.280
+5つの異なる年があり、
+
+00:07:09.280 --> 00:07:10.479
+著作権の文字列と
+
+00:07:10.479 --> 00:07:14.240
+FSF名の文字列がありました。
+
+07:14.240 --> 00:07:15.970
+この極めてネイティブに近い
+
+00:07:15.970 --> 00:07:16.960
+Texinfo対応により、
+
+00:07:16.960 --> 00:07:18.880
+入力するものがずっと少なくなり、
+
+07:18.880 --> 00:07:19.919
+エラーの可能性も
+
+00:07:19.919 --> 00:07:21.120
+ずっと低くなりました。
+
+00:07:21.120 --> 00:07:25.199
+とはいえ、まだまだ大変な作業であることは間違いありません。
+
+07:25.199 --> 00:07:26.319
+今、私たちが望んでいるのは、
+
+00:07:26.319 --> 00:07:27.840
+仲間の翻訳者と一緒に仕事をすることです。
+
+00:07:27.840 --> 00:07:28.720
+ここでわからないければならないのは、
+
+00:07:28.720 --> 00:07:29.840
+OmegaTが実際に隠れ
+
+00:07:29.840 --> 00:07:32.080
+svn/gitクライアントであり、
+
+00:07:32.080 --> 00:07:34.240
+チームプロジェクトがsvn/gitプラットフォームで
+
+07:34.240 --> 00:07:36.319
+ホスト可能であることです。
+
+07:36.319 --> 00:07:37.199
+翻訳者は、VCSについて
+
+00:07:37.199 --> 00:07:38.880
+何も知る必要はありません。
+
+00:07:38.880 --> 00:07:40.720
+ただ、アクセス認証を必要とし、
+
+00:07:40.720 --> 00:07:42.400
+OmegaTは翻訳者の代わりにコミットします。
+
+00:07:42.400 --> 00:07:44.080
+このようにして、
+
+00:07:44.080 --> 00:07:45.759
+醜くて不十分なウェブベースの
+
+00:07:45.759 --> 00:07:47.199
+翻訳システムを使う必要なく、
+
+00:07:47.199 --> 00:07:48.800
+強力なオフラインのプロフェッショナルツールを
+
+00:07:48.800 --> 00:07:51.440
+使うことができるのです。
+
+07:51.440 --> 00:07:52.479
+この翻訳プロジェクトを
+
+00:07:52.479 --> 00:07:54.160
+ホストしているプラットフォームを見ると、
+
+00:07:54.160 --> 00:07:55.919
+このように見えます。
+
+07:55.919 --> 00:07:57.199
+最後の更新は、このスライドを作成した
+
+00:07:57.199 --> 00:07:58.639
+20日と30秒前のもので、
+
+00:07:58.639 --> 00:08:00.720
+同じファイルセットで
+
+08:00.720 --> 00:08:02.479
+一緒に作業したパートナーが
+
+00:08:02.479 --> 00:08:04.639
+いたことがわかります。
+
+08:04.639 --> 00:08:05.520
+私たちは翻訳をプラットフォームに
+
+00:08:05.520 --> 00:08:06.879
+コミットしたように見えますが、
+
+00:08:06.879 --> 00:08:07.680
+それは私たちでなく、
+
+00:08:07.680 --> 00:08:11.039
+OmegaTでした。
+
+00:08:11.039 --> 00:08:13.599
+すべての面倒臭い仕事はOmegaTが行います。
+
+08:13.599 --> 00:08:15.039
+定期的にサーバーに保存し、
+
+00:08:15.039 --> 00:08:16.879
+サーバーから同期します。
+
+08:16.879 --> 00:08:18.720
+翻訳者は、仲間の翻訳した内容を
+
+08:18.720 --> 00:08:20.479
+定期的に得られます。
+
+00:08:20.479 --> 00:08:21.680
+そして必要に応じて
+
+00:08:21.680 --> 00:08:23.360
+OmegaTは、簡単な
+
+00:08:23.360 --> 00:08:25.440
+コンフリクト解決のためのウインドーを表示します。
+
+08:25.440 --> 00:08:27.039
+翻訳者は、svnやgitを使って
+
+08:27.039 --> 00:08:29.360
+何かをする必要はありません。
+
+08:29.360 --> 00:08:30.800
+そして今、私たちは、
+
+00:08:30.800 --> 00:08:31.599
+マニュアルが翻訳され、
+
+00:08:31.599 --> 00:08:33.120
+最終的にはEmacsに含まれるという
+
+00:08:33.120 --> 00:08:34.159
+そう遠くはない未来を
+
+00:08:34.159 --> 00:08:35.279
+思い描くことができますが、
+
+00:08:35.279 --> 00:08:36.080
+それはこのプレゼンテーションとは
+
+00:08:36.080 --> 00:08:39.760
+別の話になります。
+
+08:39.760 --> 00:08:42.080
+というわけで、セッションの終わりになりました。
+
+08:42.080 --> 00:08:44.240
+ご参加いただいた皆様、本当にありがとうございました。
+
+08:44.240 --> 00:08:45.600
+たくさんのトピックについて
+
+00:08:45.600 --> 00:08:46.880
+触れないと約束しましたが、
+
+00:08:46.880 --> 00:08:50.000
+約束は守れたのではないでしょうか。
+
+08:50.000 --> 00:08:51.600
+Q&Aもありますが、
+
+00:08:51.600 --> 00:08:52.517
+実は、先週の土曜日に
+
+00:08:52.517 --> 00:08:53.600
+Redditでこのセッションに関するスレッドも
+
+00:08:53.600 --> 00:08:55.519
+立ち上げました。
+
+08:55.519 --> 00:08:57.279
+emacs-helpやemacs-develのメーリングリストでも
+
+00:08:57.279 --> 00:08:59.200
+私の名前を見つけることができますので、
+
+00:08:59.200 --> 00:09:00.480
+ご質問やご意見がありましたら、
+
+00:09:00.480 --> 00:09:02.080
+遠慮なくお寄せください。
+
+09:02.080 --> 09:06.760
+それでは、またお会いしましょう。
diff --git a/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt b/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt
new file mode 100644
index 00000000..2884b0c8
--- /dev/null
+++ b/2021/captions/emacsconf-2021-org-outside--the-use-of-org-mode-syntax-outside-of-gnu-emacs--karl-voit--main.vtt
@@ -0,0 +1,770 @@
+WEBVTT
+
+00:05.520 --> 00:08.170
+Hello. My name is Karl Voit,
+
+00:08.170 --> 00:11.360
+and I've spent the last decade
+
+00:11.360 --> 00:13.040
+working with Emacs Org Mode
+
+00:13.040 --> 00:15.280
+as my main organization system
+
+00:15.280 --> 00:16.880
+for my use cases,
+
+00:16.880 --> 00:19.760
+and I would like to take this opportunity
+
+00:19.760 --> 00:22.480
+and point out a subtle issue we've had
+
+00:22.480 --> 00:25.359
+in many different discussions around Org Mode,
+
+00:25.359 --> 00:27.519
+which itself stands for
+
+00:27.519 --> 00:29.679
+quite different kind of things.
+
+00:29.679 --> 00:31.760
+On the one hand side,
+
+00:31.760 --> 00:34.640
+Org Mode is an implementation in Elisp
+
+00:34.640 --> 00:36.559
+on the Emacs platform,
+
+00:36.559 --> 00:38.480
+and on the other hand side,
+
+00:38.480 --> 00:42.960
+Org Mode is also a lightweight markup language
+
+00:42.960 --> 00:45.760
+which we use to express things:
+
+00:45.760 --> 00:47.440
+how headings are marked,
+
+00:47.440 --> 00:49.840
+how text is made boldface,
+
+00:49.840 --> 00:51.680
+how external links are written,
+
+00:51.680 --> 01:01.920
+and so forth, in text documents.
+
+01:01.920 --> 01:03.920
+From my own experience,
+
+01:03.920 --> 01:05.920
+from many different online discussions,
+
+01:05.920 --> 01:09.600
+I once wrote a blog article on my web page
+
+01:09.600 --> 01:11.760
+that summarizes why I do think
+
+01:11.760 --> 01:13.200
+that Org Mode is superior
+
+01:13.200 --> 01:16.000
+to other well-known lightweight markup languages
+
+01:16.000 --> 01:21.040
+such as Markdown, AsciiDoc, reStructuredText and more.
+
+01:21.040 --> 01:23.360
+My main points in this article were that
+
+01:23.360 --> 01:25.040
+Org Mode is an intuitive
+
+01:25.040 --> 01:28.000
+and easy to learn and remember markup.
+
+01:28.000 --> 01:29.360
+It is standardized,
+
+01:29.360 --> 01:31.439
+as in the Emacs implementation
+
+01:31.439 --> 01:32.799
+defines the current standard,
+
+01:32.799 --> 01:35.360
+and there is no different Org mode version
+
+01:35.360 --> 01:38.159
+out there which conflicts with that.
+
+01:38.159 --> 01:41.040
+Org Mode is consistent
+
+01:41.040 --> 01:44.159
+within its markup language design.
+
+01:44.159 --> 01:48.640
+Org Mode can be easily typed in any text-based tool,
+
+01:48.640 --> 01:53.280
+and Org Mode makes much sense outside of Emacs,
+
+01:53.280 --> 01:55.360
+so that you can use it, for example,
+
+01:55.360 --> 01:58.719
+in email clients or in other text documents
+
+01:58.719 --> 02:01.040
+not interpreting the markup at all.
+
+02:01.040 --> 02:03.280
+And of course, if you want,
+
+02:03.280 --> 02:06.640
+you can have the perfect tool support within Emacs
+
+02:06.640 --> 02:13.760
+and other software tools.
+
+02:13.760 --> 02:15.440
+This naming issue,
+
+02:15.440 --> 02:18.560
+using one name for two different kind of things,
+
+02:18.560 --> 02:22.239
+arises in discussions about the markup's support
+
+02:22.239 --> 02:24.560
+in non-Emacs tools and services,
+
+02:24.560 --> 02:27.440
+in questions on levels of compatibility
+
+02:27.440 --> 02:30.080
+in comparison to the large and huge
+
+02:30.080 --> 02:32.959
+amount of functionality within Emacs,
+
+02:32.959 --> 02:36.319
+and so forth.
+
+02:36.319 --> 02:38.000
+In order to find a solution
+
+02:38.000 --> 02:40.160
+to some of those issues,
+
+02:40.160 --> 02:44.480
+I propose a different name. A new idea.
+
+02:44.480 --> 02:47.360
+A definition for the lightweight markup language,
+
+02:47.360 --> 02:51.200
+and the lightweight markup language alone.
+
+02:51.200 --> 02:54.000
+A new standard, which, by the way,
+
+02:54.000 --> 02:57.680
+reminds me on something here...
+
+02:57.680 --> 03:05.200
+Anyway...
+
+03:05.200 --> 03:06.640
+So we need a different name
+
+03:06.640 --> 03:08.159
+for this new thing,
+
+03:08.159 --> 03:09.840
+and its feature set needs to be
+
+03:09.840 --> 03:11.760
+something good enough
+
+03:11.760 --> 03:14.000
+to help adapting Org Mode syntax
+
+03:14.000 --> 03:16.560
+outside of the Emacs universe.
+
+03:16.560 --> 03:19.760
+It can't be the whole set of Org Mode features.
+
+03:19.760 --> 03:21.680
+This would kill the idea instantly,
+
+03:21.680 --> 03:23.519
+because everything that is going
+
+03:23.519 --> 03:24.720
+into that direction
+
+03:24.720 --> 03:26.959
+would be compared to our golden standards,
+
+03:26.959 --> 03:29.280
+the Emacs implementation of Org Mode,
+
+03:29.280 --> 03:31.120
+which cannot be compared
+
+03:31.120 --> 03:33.599
+to anything else at this time.
+
+03:33.599 --> 03:37.040
+So it needs to be somehow less than Org Mode.
+
+03:37.040 --> 03:41.040
+It needs to be recognizable in non-Emacs circles,
+
+03:41.040 --> 03:42.720
+and it should remind people
+
+03:42.720 --> 03:43.920
+on similar things
+
+03:43.920 --> 03:45.760
+in order to be something
+
+03:45.760 --> 03:49.760
+somewhat self-explanatory as a term.
+
+03:49.760 --> 03:54.000
+Hereby, I propose the name Orgdown
+
+03:54.000 --> 03:56.000
+for this thing, and it's launched
+
+03:56.000 --> 04:06.239
+with my Emacs Conference talk 2021.
+
+04:06.239 --> 04:09.360
+So what should Orgdown be?
+
+04:09.360 --> 04:11.439
+It should be a subset of Org Mode
+
+04:11.439 --> 04:14.400
+lightweight markup language syntax.
+
+04:14.400 --> 04:17.120
+It should be a definition of
+
+04:17.120 --> 04:18.880
+Org-Mode-based entities
+
+04:18.880 --> 04:20.880
+that do make sense on their own
+
+04:20.880 --> 04:22.720
+which is, in any case,
+
+04:22.720 --> 04:26.320
+always a compromise of some sort, of course.
+
+04:26.320 --> 04:29.919
+It needs to be extensible for different purposes
+
+04:29.919 --> 04:32.560
+to ensure future-proofness,
+
+04:32.560 --> 04:33.600
+and it needs to have
+
+04:33.600 --> 04:35.919
+a formal definition of Org Mode,
+
+04:35.919 --> 04:39.680
+which helps in becoming a new standard.
+
+04:39.680 --> 04:42.160
+it needs to be a self-sustaining community
+
+04:42.160 --> 04:45.040
+that supports the process by documentation
+
+04:45.040 --> 04:48.320
+and connecting people to other people,
+
+04:48.320 --> 04:52.080
+to the documentation, and to tools.
+
+04:52.080 --> 04:54.800
+What Orgdown should never be
+
+04:54.800 --> 04:57.280
+is something that's incompatible
+
+04:57.280 --> 04:59.759
+with Org Mode within Emacs,
+
+04:59.759 --> 05:08.560
+and some kind of Org Mode replacement, of course.
+
+05:08.560 --> 05:12.160
+The advantages of Orgdown for everybody
+
+05:12.160 --> 05:16.800
+includes better Org support in non-Emacs tools;
+
+05:16.800 --> 05:19.759
+to promote the beautifully crafted Org Mode syntax
+
+05:19.759 --> 05:21.520
+to a larger set of people,
+
+05:21.520 --> 05:23.759
+even outside of Emacs, of course;
+
+05:23.759 --> 05:26.560
+to push better support for the collaboration
+
+05:26.560 --> 05:28.800
+for Emacs and non-Emacs users
+
+05:28.800 --> 05:31.759
+for using text-based documents;
+
+05:31.759 --> 05:34.880
+finally, fix the irritating mix-up of
+
+05:35.919 --> 05:37.600
+markup language support
+
+05:37.600 --> 05:41.680
+and its Elisp implementation.
+
+05:41.680 --> 05:44.000
+I already mentioned briefly the need for
+
+05:44.000 --> 05:47.039
+a definition and extensibility.
+
+05:47.039 --> 05:48.960
+Therefore I came up with the idea
+
+05:48.960 --> 05:52.320
+of having different levels of Orgdown,
+
+05:52.320 --> 05:56.400
+and the first and most basic level of Orgdown
+
+05:56.400 --> 06:05.600
+is called Orgdown1.
+
+06:05.600 --> 06:09.759
+Orgdown1, or in short, OD1, consists of
+
+06:09.759 --> 06:11.759
+a small set of Org-Mode-based features
+
+06:11.759 --> 06:15.759
+such as simple text formatting, headings, lists,
+
+06:15.759 --> 06:19.520
+and checkboxes, example, quote, and source blocks,
+
+06:19.520 --> 06:22.479
+comments, external web links,
+
+06:22.479 --> 06:25.280
+tables without calculations.
+
+06:25.280 --> 06:27.120
+I tried to find a compromise
+
+06:27.120 --> 06:29.199
+that should work with most people
+
+06:29.199 --> 06:31.600
+starting with any lightweight markup
+
+06:31.600 --> 06:39.759
+that is based on Emacs Org Mode.
+
+06:39.759 --> 06:41.199
+In order to get a measure
+
+06:41.199 --> 06:43.759
+on how well Orgdown1 is supported
+
+06:43.759 --> 06:45.919
+by one specific tool,
+
+06:45.919 --> 06:47.759
+I came up with an OD1
+
+06:47.759 --> 06:51.199
+compatibility percentage index.
+
+06:51.199 --> 06:54.080
+43 easy-to-check features such as:
+
+06:54.080 --> 06:56.800
+does it support highlighting of bold text
+
+06:56.800 --> 06:59.039
+using single asterisks?
+
+06:59.039 --> 07:00.800
+Each feature can be supported
+
+07:00.800 --> 07:02.880
+in a basic way (one point)
+
+07:02.880 --> 07:06.319
+or in an advanced way (two points).
+
+07:06.319 --> 07:08.319
+One point means it basically
+
+07:08.319 --> 07:10.080
+doesn't interfere with the tool
+
+07:10.080 --> 07:12.000
+in any negative way.
+
+07:12.000 --> 07:14.479
+Two points means that it provides
+
+07:14.479 --> 07:16.720
+active syntax highlighting, for example,
+
+07:16.720 --> 07:18.479
+or even tool-supported features
+
+07:18.479 --> 07:22.960
+like shortcuts to insert elements and such.
+
+07:22.960 --> 07:24.880
+Summing up those two levels
+
+07:24.880 --> 07:27.280
+for all those 43 features
+
+07:27.280 --> 07:28.479
+result in a number
+
+07:28.479 --> 07:29.919
+that can be compared
+
+07:29.919 --> 07:32.319
+to the maximum level there is,
+
+07:32.319 --> 07:36.319
+which results in a given percentage.
+
+07:36.319 --> 07:37.919
+By definition,
+
+07:37.919 --> 07:40.479
+Emacs provides full support
+
+07:40.479 --> 07:43.360
+of all Orgdown levels,
+
+07:43.360 --> 07:45.360
+and most tools support
+
+07:45.360 --> 07:48.240
+at least fifty percent of Orgdown1
+
+07:48.240 --> 07:50.400
+as long as Orgdown1 syntax
+
+07:50.400 --> 07:52.720
+doesn't result in some markup conflict
+
+07:52.720 --> 07:57.039
+or tooling conflict or whatever.
+
+07:57.039 --> 07:58.560
+This emphasizes the idea
+
+07:58.560 --> 08:01.360
+that Orgdown can and should be used
+
+08:01.360 --> 08:04.879
+for personal notes anywhere and in general domains,
+
+08:04.879 --> 08:07.919
+just like writing emails, for example.
+
+08:07.919 --> 08:10.000
+I guess the majority of tools
+
+08:10.000 --> 08:12.720
+with a certain support for Orgdown1
+
+08:12.720 --> 08:18.080
+will be in the area of 80s and 90s, percentwise.
+
+08:18.080 --> 08:20.639
+If Orgdown1 is not enough,
+
+08:20.639 --> 08:22.400
+there will be future definitions
+
+08:22.400 --> 08:24.960
+of Orgdown2, 3, or higher
+
+08:24.960 --> 08:27.599
+which will take more and more syntax elements
+
+08:27.599 --> 08:29.039
+from the Org Mode syntax
+
+08:29.039 --> 08:30.479
+and integrate it into
+
+08:30.479 --> 08:39.519
+the domain of Orgdown.
+
+08:39.519 --> 08:42.000
+So far, Orgdown1 is described
+
+08:42.000 --> 08:43.599
+on a public GitLab page
+
+08:43.599 --> 08:45.920
+which has already documentation
+
+08:45.920 --> 08:48.399
+on how to learn Orgdown,
+
+08:48.399 --> 08:50.560
+some syntax examples,
+
+08:50.560 --> 08:51.839
+frequently asked questions,
+
+08:51.839 --> 08:54.240
+and of course, with their answers,
+
+08:54.240 --> 08:55.920
+a collection of tools
+
+08:55.920 --> 08:59.279
+that already do support Orgdown in some way,
+
+08:59.279 --> 09:01.040
+and a few of them did already
+
+09:01.040 --> 09:02.640
+get evaluated by me
+
+09:02.640 --> 09:05.920
+and got their OD1 compatibility percentage
+
+09:05.920 --> 09:07.279
+in a table.
+
+09:07.279 --> 09:09.839
+Some ideas on how people can contribute
+
+09:09.839 --> 09:11.040
+to this new standard
+
+09:11.040 --> 09:13.839
+is also part of this new site.
+
+09:13.839 --> 09:17.200
+And of course, now I need your help
+
+09:17.200 --> 09:19.519
+in order to make this a success story
+
+09:19.519 --> 09:28.880
+for Org Mode and of course Orgdown.
+
+09:28.880 --> 09:31.360
+So please do contribute
+
+09:31.360 --> 09:33.279
+to the GitLab project pages
+
+09:33.279 --> 09:38.000
+and add tools and their Orgdown1-compatible percentages.
+
+09:38.000 --> 09:40.800
+For example, a template file is provided,
+
+09:40.800 --> 09:41.839
+of course.
+
+09:41.839 --> 09:43.680
+Please do add more parsers.
+
+09:43.680 --> 09:46.320
+Please use the term Orgdown1
+
+09:46.320 --> 09:48.080
+to label tool properties
+
+09:48.080 --> 09:49.440
+for your own stuff
+
+09:49.440 --> 09:51.760
+and so that people do realize
+
+09:51.760 --> 09:53.839
+that your tools are already supporting
+
+09:53.839 --> 09:56.800
+this general use case of Org Mode.
+
+09:56.800 --> 09:58.640
+And there is no need to support
+
+09:58.640 --> 09:59.680
+all the Org Mode
+
+09:59.680 --> 10:02.160
+in order to profit from Org Mode syntax
+
+10:02.160 --> 10:04.320
+with Orgdown.
+
+10:04.320 --> 10:05.839
+You can spread the idea
+
+10:05.839 --> 10:07.279
+by promoting Orgdown
+
+10:07.279 --> 10:08.480
+as a separate term
+
+10:08.480 --> 10:09.680
+compared to Org Mode
+
+10:09.680 --> 10:11.279
+and its mixed up definition
+
+10:11.279 --> 10:21.279
+with the Org Mode Elisp implementation.
+
+10:21.279 --> 10:23.120
+And in case that Orgdown
+
+10:23.120 --> 10:24.880
+really resonates with you,
+
+10:24.880 --> 10:26.959
+you can add a formal specification
+
+10:26.959 --> 10:29.279
+to the GitLab project of Orgdown.
+
+10:29.279 --> 10:30.480
+I guess that some of the
+
+10:30.480 --> 10:33.040
+existing formal definitions of Org Mode
+
+10:33.040 --> 10:35.760
+already do qualify for Orgdown1
+
+10:35.760 --> 10:37.920
+by stripping down to the few things
+
+10:37.920 --> 10:41.279
+Orgdown1 is concentrating on.
+
+10:41.279 --> 10:42.720
+You can create, for example,
+
+10:42.720 --> 10:45.760
+a language server protocol for Orgdown1
+
+10:45.760 --> 10:48.000
+which would multiply the possibilities
+
+10:48.000 --> 10:50.000
+for adapting Orgdown1
+
+10:50.000 --> 10:51.760
+in all kinds of editors
+
+10:51.760 --> 11:00.880
+by giving syntax highlighting, for example.
+
+11:00.880 --> 11:03.200
+And you may find the idea intriguing
+
+11:03.200 --> 11:07.440
+that Orgdown1 is a perfect markup language candidate
+
+11:07.440 --> 11:09.920
+for the Gemini project,
+
+11:09.920 --> 11:11.200
+which would be, in short,
+
+11:11.200 --> 11:14.240
+a linked web of plain Orgdown1 files
+
+11:14.240 --> 11:16.160
+that form a parallel internet
+
+11:16.160 --> 11:17.839
+without advertisements,
+
+11:17.839 --> 11:20.880
+malware-bloated web pages, and so forth.
+
+11:20.880 --> 11:22.160
+It's concentrating
+
+11:22.160 --> 11:23.920
+on the essential value of information
+
+11:23.920 --> 11:26.399
+in form of simple text files
+
+11:26.399 --> 11:29.279
+and links to other simple text files.
+
+11:29.279 --> 11:39.760
+I would love to see this.
+happen someday
+
+11:39.760 --> 11:42.560
+In the meantime, let's kick-start Orgdown
+
+11:42.560 --> 11:45.120
+with Orgdown1 as the first level.
+
+11:45.120 --> 11:46.880
+Visit the GitLab page,
+
+11:46.880 --> 11:49.600
+hand in improvements for the linked tool sections,
+
+11:49.600 --> 11:52.240
+and spread the brilliant markup design
+
+11:52.240 --> 11:52.880
+of Org Mode,
+
+11:52.880 --> 11:56.000
+using Orgdown as a well-defined
+
+11:56.000 --> 11:57.839
+new standard.
+
+11:57.839 --> 12:01.079
+Thank you.
diff --git a/2021/captions/emacsconf-2021-pattern--edit--main.vtt b/2021/captions/emacsconf-2021-pattern--edit--main.vtt
new file mode 100644
index 00000000..ecff1823
--- /dev/null
+++ b/2021/captions/emacsconf-2021-pattern--edit--main.vtt
@@ -0,0 +1,13 @@
+WEBVTT
+
+00:00.000 --> 06:13.400
+#+START: 00:00:00.000
+#+END: 00:06:13.400
+#+VIDEO_SUBTITLES: 1
+[[file:emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.webm]]
+
+06:55.120 --> 23:43.480
+#+START: 00:06:55.120
+#+END: 00:23:43.480
+#+VIDEO_SUBTITLES: 1
+[[file:emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz.webm]]
diff --git a/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt b/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--chapters.vtt
new file mode 100644
index 00000000..33525c96
--- /dev/null
+++ b/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--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-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-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt b/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt
new file mode 100644
index 00000000..831895e5
--- /dev/null
+++ b/2021/captions/emacsconf-2021-pattern--emacs-as-design-pattern-learning--greta-goetz--main.vtt
@@ -0,0 +1,1876 @@
+WEBVTT
+
+00:01.040 --> 00:03.520
+Welcome to this EmacsConf 2021 talk
+
+00:03.520 --> 00:06.160
+on Emacs as Design Pattern Learning.
+
+00:06.160 --> 00:08.400
+I'm Greta Goetz, and this talk
+
+00:08.400 --> 00:10.080
+is for people who are interested
+
+00:10.080 --> 00:11.679
+in thinking about Emacs
+
+00:11.679 --> 00:13.840
+as a tool that's sophisticated enough
+
+00:13.840 --> 00:17.680
+not only to cope with activities and tasks,
+
+00:17.680 --> 00:19.760
+but also sophisticated enough
+
+00:19.760 --> 00:22.560
+to cater to a complex assemblage
+
+00:22.560 --> 00:24.000
+of [not just] tasks and activities,
+
+00:24.000 --> 00:26.160
+but also people, outcomes,
+
+00:26.160 --> 00:27.760
+as well as tools.
+
+00:27.760 --> 00:31.039
+This is a definition of epistemic fluency
+
+00:31.039 --> 00:33.440
+from a work by Markauskaite and Goodyear
+
+00:33.440 --> 00:35.040
+that is relevant to us
+
+00:35.040 --> 00:36.320
+if we're interested in
+
+00:36.320 --> 00:37.600
+learning how to learn [and]
+
+00:37.600 --> 00:39.840
+how to continuously iterate knowledge
+
+00:39.840 --> 00:44.480
+to fit changing complex specific contexts.
+
+00:44.480 --> 00:46.719
+Some software oversimplifies.
+
+00:46.719 --> 00:49.039
+Emacs both helps users
+
+00:49.039 --> 00:50.559
+implement design pattern learning
+
+00:50.559 --> 00:53.360
+that can cope with complexity,
+
+00:53.360 --> 00:57.360
+and it models complex design pattern learning.
+
+00:57.360 --> 00:59.920
+So, what do we mean by design patterns?
+
+00:59.920 --> 01:03.120
+The term comes from design theorist and
+
+01:03.120 --> 01:05.199
+architect Christopher Alexander,
+
+01:05.199 --> 01:06.400
+whose work influenced
+
+01:06.400 --> 01:08.479
+a broad variety of disciplines.
+
+01:08.479 --> 01:11.680
+I'll be drawing on a work in programming
+
+01:11.680 --> 01:14.240
+by Richard Gabriel, and in pedagogy,
+
+01:14.240 --> 01:16.239
+by Peter Goodyear.
+
+01:16.240 --> 01:17.920
+What are design patterns?
+
+01:17.920 --> 01:20.159
+They are patterns of micro solutions
+
+01:20.159 --> 01:22.560
+combining method and artifact,
+
+01:22.560 --> 01:24.080
+and macro solutions
+
+01:24.080 --> 01:25.680
+of these micro patterns
+
+01:25.680 --> 01:27.680
+when viewed together.
+
+01:27.680 --> 01:29.280
+This approach allows for the
+
+01:29.280 --> 01:31.840
+specialization, customization,
+
+01:31.840 --> 01:35.600
+extension, and reuse of patterns.
+
+01:35.600 --> 01:37.360
+This is useful if we're seeking to
+
+01:37.360 --> 01:40.079
+deal with complexity. It helps extend
+
+01:40.079 --> 01:42.560
+the assemblage of learning components
+
+01:42.560 --> 01:45.040
+that we have, without having to build
+
+01:45.040 --> 01:46.640
+from scratch.
+
+01:46.640 --> 01:48.320
+Another important feature
+
+01:48.320 --> 01:49.520
+of design patterns
+
+01:49.520 --> 01:51.759
+and their relevance to Emacs
+
+01:51.759 --> 01:54.799
+is the human-centeredness.
+
+01:54.799 --> 01:57.360
+Christopher Alexander critiqued
+
+01:57.360 --> 01:58.320
+the mechanical
+
+01:58.320 --> 02:00.880
+and championed the human place.
+
+02:00.880 --> 02:03.439
+Emacs, too, champions the human place.
+
+02:03.439 --> 02:06.079
+So why Emacs and design learning?
+
+02:06.079 --> 02:09.679
+One reason is indeed this extensibility
+
+02:09.679 --> 02:13.360
+through Emacs, which allows a person
+
+02:13.360 --> 02:16.720
+to extend their learning and use of Emacs
+
+02:16.720 --> 02:18.800
+as far as they wish to take it.
+
+02:18.800 --> 02:22.959
+This is thanks to its free software core,
+
+02:22.959 --> 02:24.720
+and this permits what we call
+
+02:24.720 --> 02:25.843
+in networked learning
+
+02:25.843 --> 02:27.040
+'e-quality' [cf. Beaty et al.],
+
+02:27.040 --> 02:28.160
+which is to say,
+
+02:28.160 --> 02:31.120
+the opportunity to co-create knowledge.
+
+02:31.120 --> 02:32.959
+So if one wishes to extend
+
+02:32.959 --> 02:35.120
+their learning trajectory with Emacs
+
+02:35.120 --> 02:37.120
+such that they're able to
+
+02:37.120 --> 02:38.560
+write packages for Emacs,
+
+02:38.560 --> 02:41.040
+if these packages become part of the core,
+
+02:41.040 --> 02:43.440
+they're really co-creating knowledge
+
+02:43.440 --> 02:44.879
+within the community
+
+02:44.879 --> 02:48.800
+and extending the capabilities of Emacs.
+
+02:48.800 --> 02:50.480
+Emacs can also be considered
+
+02:50.480 --> 02:52.319
+in terms of design pattern learning,
+
+02:52.319 --> 02:53.440
+because it can be used
+
+02:53.440 --> 02:54.800
+for different purposes.
+
+02:54.800 --> 02:57.280
+This is true even at the very basic level
+
+02:57.280 --> 02:58.959
+of Emacs functionalities,
+
+02:58.959 --> 02:59.920
+which is a point
+
+02:59.920 --> 03:01.280
+that should really be stressed.
+
+03:01.280 --> 03:03.680
+So even newcomers coming to Emacs
+
+03:03.680 --> 03:04.879
+who don't know programming
+
+03:04.879 --> 03:07.040
+can do a very broad variety
+
+03:07.040 --> 03:09.040
+of different things with their Emacs,
+
+03:09.040 --> 03:11.760
+using these basic functionalities:
+
+03:11.760 --> 03:14.800
+for example, simply by customizing
+
+03:14.800 --> 03:15.840
+the language variable
+
+03:15.840 --> 03:17.923
+in the initialization file.
+
+03:17.923 --> 03:20.879
+This, thanks to the powerful Emacs Lisp
+
+03:20.879 --> 03:22.640
+interpreter, makes it possible for one
+
+03:22.640 --> 03:24.640
+to do a wide variety of different things
+
+03:24.640 --> 03:26.560
+within Emacs: from making graphs
+
+03:26.560 --> 03:29.360
+to exporting in LaTeX.
+
+03:29.360 --> 03:32.000
+And also part of the Emacs basic
+
+03:32.000 --> 03:34.239
+functionalities are
+
+03:34.239 --> 03:36.159
+how we can cycle through
+
+03:36.159 --> 03:38.400
+different tasks and texts very easily
+
+03:38.400 --> 03:40.000
+through buffer cycling,
+
+03:40.000 --> 03:44.640
+or how within Org we can use tree outlines
+
+03:44.640 --> 03:48.159
+that can hierarchize the material
+
+03:48.159 --> 03:49.519
+that we're working with
+
+03:49.519 --> 03:52.080
+and even change a headline
+
+03:52.080 --> 03:54.799
+into a to-do. So we see this extensibility,
+
+03:54.799 --> 03:57.280
+this flexibility. Also, within Org,
+
+03:57.280 --> 03:58.799
+we can see how by writing
+
+03:58.799 --> 04:00.159
+just a few lines of code
+
+04:00.159 --> 04:02.239
+such as through header arguments
+
+04:02.239 --> 04:04.879
+or code blocks, we can change the way
+
+04:04.879 --> 04:06.159
+in which a file,
+
+04:06.159 --> 04:08.480
+or part of a file, is executed.
+
+04:08.480 --> 04:10.239
+An illustration of what this means
+
+04:10.239 --> 04:12.720
+to the beginner would be how easy it is
+
+04:12.720 --> 04:15.280
+to export a LaTeX file,
+
+04:15.280 --> 04:17.040
+so one doesn't even need to know
+
+04:17.040 --> 04:19.199
+all of LaTeX to be able to implement
+
+04:19.199 --> 04:23.360
+parts of LaTeX within Org. So this
+
+04:23.360 --> 04:25.280
+variety of different purposes, then,
+
+04:25.280 --> 04:27.600
+can be experienced by the beginner.
+
+04:27.600 --> 04:30.400
+Emacs is also an example
+
+04:30.400 --> 04:32.080
+of design pattern learning
+
+04:32.080 --> 04:34.320
+because it is a design pattern
+
+04:34.320 --> 04:35.919
+of learning itself.
+
+04:35.919 --> 04:39.040
+Here we're thinking about design patterns
+
+04:39.040 --> 04:41.919
+as a visual representation.
+
+04:41.919 --> 04:44.320
+We can think of how systems of systems,
+
+04:44.320 --> 04:47.680
+which Emacs is an example of,
+
+04:47.680 --> 04:50.560
+stem from a successful center,
+
+04:50.560 --> 04:53.280
+and 'this center is surrounded
+
+04:53.280 --> 04:55.440
+by a boundary which is itself
+
+04:55.440 --> 04:57.040
+made up of centers' [Gabriel].
+
+04:57.040 --> 04:59.440
+So, where we have Emacs at the center,
+
+04:59.440 --> 05:02.720
+we also have packages such as Magit.
+
+05:02.720 --> 05:04.800
+Magit can be viewed as a center
+
+05:04.800 --> 05:07.120
+unto itself. However, this center
+
+05:07.120 --> 05:09.520
+only exists thanks to the center
+
+05:09.520 --> 05:11.759
+of the center, which is Emacs.
+
+05:11.759 --> 05:14.320
+And thus we speak of Emacs
+
+05:14.320 --> 05:17.039
+as being a successful design pattern
+
+05:17.039 --> 00:05:18.799
+implementation [cf. Gabriel].
+
+00:05:18.800 --> 00:05:20.880
+And why do we care about
+
+05:20.880 --> 05:25.500
+design pattern approaches? Here, well,
+
+05:25.520 --> 05:28.560
+what I'm trying to say is that
+
+05:28.560 --> 05:30.080
+this is useful to the person
+
+05:30.080 --> 05:32.240
+who is interested in being able to
+
+05:32.240 --> 05:34.000
+more efficiently cope with
+
+05:34.000 --> 05:36.639
+complex and specific situations,
+
+05:36.639 --> 05:40.240
+and this design pattern allows for this
+
+05:40.240 --> 05:43.039
+because of its extensibility,
+
+05:43.039 --> 05:46.400
+because we can find these specializations
+
+05:46.400 --> 05:50.000
+or customizations that are able to reach
+
+05:50.000 --> 05:52.880
+these changing contexts [that we seek to interact with].
+
+05:52.880 --> 05:55.039
+This can be compared with
+
+05:55.039 --> 05:56.479
+other software applications
+
+05:56.479 --> 05:58.000
+that are prefabricated
+
+05:58.000 --> 05:59.680
+so they already decide
+
+05:59.680 --> 06:01.600
+what it is a person is going to do
+
+06:01.600 --> 06:02.800
+when they use them.
+
+06:02.800 --> 06:04.319
+This also means that what they're doing
+
+06:04.319 --> 06:05.520
+within these applications
+
+06:05.520 --> 06:06.639
+can get stranded there,
+
+06:06.639 --> 06:08.479
+that it's harder to integrate
+
+06:08.479 --> 06:10.319
+their knowledge or their texts
+
+06:10.319 --> 06:12.240
+or their activities
+
+06:12.240 --> 06:13.440
+with each other.
+
+06:13.440 --> 06:15.759
+A lot of software also makes assumptions
+
+06:15.759 --> 06:18.240
+on who their users are. We know that
+
+06:18.240 --> 06:20.160
+we speak in user experience design
+
+06:20.160 --> 06:23.120
+of the 'customer journey' or of 'personas',
+
+06:23.120 --> 06:24.720
+and very often, then,
+
+06:24.720 --> 06:27.840
+the customer journey is pre-designed.
+
+06:27.840 --> 06:29.680
+But within Emacs, we can be
+
+06:29.680 --> 06:32.079
+our own persona.
+
+06:32.079 --> 06:33.440
+Practical use of Emacs
+
+06:33.440 --> 06:35.680
+can also make non-programmers
+
+06:35.680 --> 06:36.720
+into programmers.
+
+06:36.720 --> 06:38.400
+So this is to say that
+
+06:38.400 --> 06:40.240
+as we are using Emacs,
+
+06:40.240 --> 06:41.840
+we can continue to develop
+
+06:41.840 --> 06:44.479
+as far as we wish.
+
+06:44.479 --> 06:46.240
+Therefore we are not only users
+
+06:46.240 --> 06:48.720
+within Emacs, but we are also
+
+06:48.720 --> 06:51.280
+creative persons and producers.
+
+06:51.280 --> 06:54.400
+So here I am citing work by ivan Illich.
+
+06:54.400 --> 06:56.079
+We can further contribute
+
+06:56.079 --> 06:58.880
+to the evolution of the rules of Emacs.
+
+06:58.880 --> 07:01.680
+To draw on Bernard Stiegler,
+
+07:01.680 --> 07:04.880
+if I may also make an analogy,
+
+07:04.880 --> 07:07.520
+within our inits, we contribute to
+
+07:07.520 --> 07:08.800
+the evolution of the rules
+
+07:08.800 --> 07:11.759
+according to which our Emacs works for us.
+
+07:11.759 --> 07:13.120
+But again, if we're extending
+
+07:13.120 --> 07:14.560
+our learning trajectory,
+
+07:14.560 --> 07:16.319
+and if we write a package,
+
+07:16.319 --> 07:18.400
+and the package becomes part of the core,
+
+07:18.400 --> 07:21.440
+we do indeed contribute to the evolution
+
+07:21.440 --> 07:23.840
+of the rules of Emacs.
+
+07:23.840 --> 07:25.359
+But because it stems
+
+07:25.359 --> 07:26.560
+from our personal use
+
+07:26.560 --> 07:28.479
+and our personal customizations,
+
+07:28.479 --> 07:30.000
+we can think of it as being
+
+07:30.000 --> 07:31.600
+a personal toolkit [cf. Stallman].
+
+07:31.600 --> 07:35.840
+So this design pattern iteration approach
+
+07:35.840 --> 07:39.680
+to Emacs is the very reason
+
+07:39.680 --> 07:41.840
+why it is that we can customize it
+
+07:41.840 --> 07:43.440
+to our own liking,
+
+07:43.440 --> 07:46.160
+and using Emacs to extend our freedom
+
+07:46.160 --> 07:48.720
+then helps us to develop heuristics.
+
+07:48.720 --> 07:51.919
+It helps us develop our decision-making,
+
+07:51.919 --> 07:54.719
+our problem-solving
+
+07:54.719 --> 07:57.839
+and responsibility for what it is
+
+07:57.839 --> 07:58.880
+that we're doing,
+
+07:58.880 --> 08:00.640
+and these skill sets
+
+08:00.640 --> 08:02.480
+are extensible beyond Emacs.
+
+08:02.480 --> 08:04.240
+These can be considered as life skills
+
+08:04.240 --> 08:05.839
+that have relevance beyond.
+
+08:05.839 --> 08:07.520
+This is a very good example
+
+08:07.520 --> 08:10.560
+of why it is that being exposed
+
+08:10.560 --> 08:12.480
+to complex assemblages
+
+08:12.480 --> 08:14.320
+matter to us as human beings.
+
+08:14.320 --> 08:17.120
+It's good training ground for life.
+
+08:17.120 --> 08:19.680
+But it's also important
+
+08:19.680 --> 08:22.719
+for a very basic pedagogical point.
+
+08:22.719 --> 08:24.160
+So now I'm going to draw on work
+
+08:24.160 --> 08:26.560
+by Hélène Trocmé-Fabre,
+
+08:26.560 --> 08:27.839
+who explains that
+
+08:27.839 --> 08:30.719
+reduced and poor contextualizations
+
+08:30.719 --> 08:32.800
+flatten communication.
+
+08:32.800 --> 08:33.760
+So, for example,
+
+08:33.760 --> 08:35.279
+within the field of software,
+
+08:35.279 --> 08:37.680
+if we are using an application
+
+08:37.680 --> 08:40.640
+that only asks us to swipe left or right,
+
+08:40.640 --> 08:42.880
+this deprives us of our ability
+
+08:42.880 --> 08:45.600
+to respond in a more sophisticated way.
+
+08:45.600 --> 08:48.640
+By contrast, by being exposed
+
+08:48.640 --> 08:51.600
+to a rich contextualization within Emacs,
+
+08:51.600 --> 08:53.839
+we are learning to contextualize,
+
+08:53.839 --> 08:57.040
+which Trocmé-Fabre says is the first step
+
+08:57.040 --> 08:58.719
+in learning how to learn.
+
+08:58.719 --> 08:59.920
+So we can understand
+
+08:59.920 --> 09:01.760
+just how important it is
+
+09:01.760 --> 09:03.520
+to be exposed to complexity.
+
+09:03.520 --> 09:05.440
+It's not just a mere
+
+09:05.440 --> 09:06.719
+intellectual exercise,
+
+09:06.719 --> 09:08.719
+but it is indeed how it is
+
+09:08.719 --> 09:12.239
+that we begin to learn.
+
+09:12.240 --> 09:13.760
+If this sounds too abstract,
+
+09:13.760 --> 09:15.520
+maybe we can step back for a moment
+
+09:15.520 --> 09:17.520
+and think about visualizing Emacs
+
+09:17.520 --> 09:19.600
+as a mental map. So here, too,
+
+09:19.600 --> 09:21.839
+I'm going to draw on Trocmé-Fabre,
+
+09:21.839 --> 09:24.560
+and she is building her ideas
+
+09:24.560 --> 09:26.240
+on those of Tony Buzan,
+
+09:26.240 --> 09:29.120
+who was the popularizer of the mind map.
+
+09:29.120 --> 09:31.519
+So mind maps begin with a core,
+
+09:31.519 --> 09:33.760
+which with Emacs is the Emacs core,
+
+09:33.760 --> 09:36.320
+which now includes Org.
+
+09:36.320 --> 09:38.719
+They extend outwards from the core
+
+09:38.719 --> 09:40.800
+through relational codes.
+
+09:40.800 --> 09:44.399
+And then through keywords and cycling,
+
+09:44.399 --> 09:46.240
+mind maps function to bring out
+
+09:46.240 --> 09:48.320
+further ideas, and this may be
+
+09:48.320 --> 09:49.760
+the experience you've already had
+
+09:49.760 --> 09:52.640
+with your Emacs. Then finally,
+
+09:52.640 --> 09:54.800
+these mind maps extend outwards
+
+09:54.800 --> 09:56.480
+at the periphery.
+
+09:56.480 --> 10:00.240
+In thinking about how this applies to Emacs,
+
+10:00.240 --> 10:02.320
+we can think about how yes, indeed,
+
+10:02.320 --> 10:04.240
+we all share the same core,
+
+10:04.240 --> 10:07.360
+but then we extend this core outwards
+
+10:07.360 --> 10:09.680
+into our personal configurations.
+
+10:09.680 --> 10:11.360
+So this is the social moment,
+
+10:11.360 --> 10:12.480
+but this social moment
+
+10:12.480 --> 10:13.839
+is integral to Emacs
+
+10:13.839 --> 10:16.800
+because Emacs fully achieves its meaning
+
+10:16.800 --> 10:18.959
+when it is being applied, extended,
+
+10:18.959 --> 10:20.880
+and customized in this way.
+
+10:20.880 --> 10:23.279
+Further, these social branches
+
+10:23.279 --> 10:25.839
+are relevant to the continuation
+
+10:25.839 --> 10:28.560
+of learning how to learn how to use Emacs.
+
+10:28.560 --> 10:30.800
+So for example, we may have
+
+10:30.800 --> 10:33.279
+our first configuration file,
+
+10:33.279 --> 10:35.040
+and then we might want to compare it
+
+10:35.040 --> 10:37.440
+with other people's configuration files,
+
+10:37.440 --> 10:40.240
+not only to see what code they're using,
+
+10:40.240 --> 10:42.480
+but also to see how it is that they are
+
+10:42.480 --> 10:44.240
+implementing certain functionalities
+
+10:44.240 --> 10:46.000
+within their workflow.
+
+10:46.000 --> 10:48.080
+So along these lines, then,
+
+10:48.080 --> 10:50.160
+descriptive configuration files
+
+10:50.160 --> 10:53.360
+are extremely helpful.
+
+10:53.360 --> 10:56.160
+This map, then, of Emacs
+
+10:56.160 --> 10:57.519
+can be considered as a
+
+10:57.519 --> 11:00.399
+frontierless heuristic schema,
+
+11:00.399 --> 11:02.000
+borrowing from Trocmé-Fabre.
+
+11:02.000 --> 11:04.080
+Frontierless, because we can extend
+
+11:04.080 --> 11:06.320
+our use of Emacs as far as we want.
+
+11:06.320 --> 11:08.399
+Heuristic, again, because we're using it
+
+11:08.399 --> 11:10.640
+to solve problems, etc.
+
+11:10.640 --> 11:13.360
+This is a free system that extends
+
+11:13.360 --> 11:15.920
+following our own 'paths of desire',
+
+11:15.920 --> 11:18.640
+if I can use that phrase from design.
+
+11:18.640 --> 11:20.640
+So it's following our own 'paths of desire',
+
+11:20.640 --> 11:22.480
+but yet it is a shared tool,
+
+11:22.480 --> 11:26.880
+so this is an idea of the convivial tool
+
+11:26.880 --> 11:29.999
+to draw on Ivan Illich.
+
+11:30.000 --> 11:31.760
+Emacs is itself
+
+11:31.760 --> 11:33.440
+a design pattern framework,
+
+11:33.440 --> 11:35.279
+so we can visualize this
+
+11:35.279 --> 11:36.640
+through the mind map,
+
+11:36.640 --> 11:40.160
+but we can also go back to thinking about
+
+11:40.160 --> 11:42.399
+how Christopher Alexander's work
+
+11:42.399 --> 11:44.240
+inspired Richard Gabriel
+
+11:44.240 --> 11:46.640
+to think about systems of systems
+
+11:46.640 --> 11:49.040
+within software. And he,
+
+11:49.040 --> 11:50.240
+drawing on Alexander,
+
+11:50.240 --> 11:52.240
+says, well, there is such a thing
+
+11:52.240 --> 11:55.600
+as a "being" of successful software,
+
+11:55.600 --> 11:59.519
+if it succeeds in being
+
+11:59.519 --> 12:00.640
+a center of centers,
+
+12:00.640 --> 12:02.240
+as we saw before.
+
+12:02.240 --> 12:04.480
+So in Emacs, then, we have a system
+
+12:04.480 --> 12:06.880
+that's made up of other systems
+
+12:06.880 --> 12:08.719
+of 'communicating components
+
+12:08.719 --> 12:09.839
+that work together
+
+12:09.839 --> 12:11.600
+to provide a comprehensive set
+
+12:11.600 --> 12:14.399
+of capabilities that can be customized,
+
+12:14.399 --> 12:16.000
+specialized, and extended
+
+12:16.000 --> 12:16.959
+to provide more
+
+12:16.959 --> 12:18.959
+or slightly different capabilities' [Gabriel].
+
+12:18.959 --> 12:21.200
+So if we're not finding what we need
+
+12:21.200 --> 12:25.120
+within the core, we can look for packages
+
+12:25.120 --> 12:27.519
+that allow us to extend in a certain way,
+
+12:27.519 --> 12:28.560
+or we write our own,
+
+12:28.560 --> 12:31.680
+or we begin to write in Emacs Lisp.
+
+12:31.680 --> 12:34.800
+And speaking of personal customizations,
+
+12:34.800 --> 12:37.839
+Emacs can be considered as an extension
+
+12:37.839 --> 12:40.079
+of the as yet unfulfilled promise of
+
+12:40.079 --> 12:41.600
+general computing.
+
+12:41.600 --> 12:44.000
+In the 1980s, Michael Crichton wrote
+
+12:44.000 --> 12:46.320
+that it's easy to use computers, which is
+
+12:46.320 --> 12:48.000
+fortunate because everyone's going to
+
+12:48.000 --> 12:49.040
+have to learn.
+
+12:49.040 --> 12:51.440
+It's not easy to use computers wisely,
+
+12:51.440 --> 12:52.880
+which is unfortunate because
+
+12:52.880 --> 12:54.719
+everyone's going to have to learn.
+
+12:54.719 --> 12:56.639
+Emacs is wise computing
+
+12:56.639 --> 12:59.600
+because everyone's Emacs is their own.
+
+12:59.600 --> 13:01.680
+We see that it is an exercise
+
+13:01.680 --> 13:05.760
+in heuristics, but while it is complex,
+
+13:05.760 --> 13:08.000
+at on some level, we want to remember
+
+13:08.000 --> 13:10.240
+that it can be used easily by anybody,
+
+13:10.240 --> 13:12.560
+as often or as seldom as they want,
+
+13:12.560 --> 13:15.200
+for the purpose that they are choosing,
+
+13:15.200 --> 13:17.519
+and shaped according to their own taste.
+
+13:17.519 --> 13:20.480
+So again I'm drawing on Ivan Illich here.
+
+13:20.480 --> 13:24.880
+Emacs then champions the human place
+
+13:24.880 --> 13:28.800
+and is a support in our learning
+
+13:28.800 --> 00:13:30.638
+how to learn.
+
+00:13:30.639 --> 00:13:32.000
+So now I want to think about
+
+13:32.000 --> 13:34.959
+being inspired by the Emacs design pattern
+
+13:34.959 --> 13:37.040
+and comparing what I think
+
+13:37.040 --> 13:40.480
+I've learned about how Emacs works
+
+13:40.480 --> 13:43.600
+with some research that has been done
+
+13:43.600 --> 13:46.240
+by Philip Guo and his colleagues
+
+13:46.240 --> 13:47.920
+about how technology is being used
+
+13:47.920 --> 13:51.120
+in certain online teaching contexts.
+
+13:51.120 --> 13:52.800
+Researchers continue to note
+
+13:52.800 --> 13:55.200
+how the modes of delivery of content
+
+13:55.200 --> 13:56.880
+continue to change in terms of
+
+13:56.880 --> 13:58.240
+what is considered effective
+
+13:58.240 --> 13:59.600
+and what is not.
+
+13:59.600 --> 14:02.000
+The talking head was considered effective,
+
+14:02.000 --> 14:05.360
+for example. Lectures needed to be
+
+14:05.360 --> 14:07.760
+broken down into shorter segments.
+
+14:07.760 --> 14:11.360
+But I would say that by using Emacs
+
+14:11.360 --> 14:14.320
+and by working within the Emacs ecosystem,
+
+14:14.320 --> 14:16.519
+one is already used to
+
+14:16.519 --> 14:18.959
+'re-presenting' one's knowledge
+
+14:18.959 --> 14:20.800
+in a variety of different ways.
+
+14:20.800 --> 14:22.320
+So if we are called tomorrow
+
+14:22.320 --> 14:24.240
+to deliver in a different way,
+
+14:24.240 --> 14:26.240
+we're already used to
+
+14:26.240 --> 14:28.399
+thinking about this within Emacs.
+
+14:28.399 --> 14:30.639
+So, for example,
+
+14:30.639 --> 14:32.399
+merely by changing a header argument,
+
+14:32.399 --> 14:34.880
+one can change the way in which
+
+14:34.880 --> 14:36.480
+text in a file is executed,
+
+14:36.480 --> 14:39.600
+so we see then this easy iteration
+
+14:39.600 --> 14:42.160
+within Emacs. We can also think about
+
+14:42.160 --> 14:45.760
+how Emacs can be considered in terms of
+
+14:45.760 --> 14:49.839
+a help for developing rhetorical 'topoi',
+
+14:49.839 --> 14:52.240
+'topoi' being places where we find things,
+
+14:52.240 --> 14:54.480
+places where we find ideas,
+
+14:54.480 --> 14:56.320
+because we can circulate
+
+14:56.320 --> 14:58.959
+among the different tasks and texts
+
+14:58.959 --> 14:59.920
+that we are working on
+
+14:59.920 --> 15:01.920
+within Emacs seamlessly.
+
+15:01.920 --> 15:04.000
+This increases the likelihood
+
+15:04.000 --> 15:07.519
+that we can gain inspiration
+
+15:07.519 --> 15:11.440
+from the collage of different ideas
+
+15:11.440 --> 15:14.079
+that bring out new ideas.
+
+15:14.079 --> 15:14.959
+At least this is how
+
+15:14.959 --> 15:16.160
+I've experienced Emacs,
+
+15:16.160 --> 15:19.279
+if I may add that anecdotal observation.
+
+15:19.279 --> 15:22.480
+And speaking of bringing out ideas,
+
+15:22.480 --> 15:26.079
+we see how changing Emacs functionalities
+
+15:26.079 --> 15:27.680
+can help us bring out ideas
+
+15:27.680 --> 15:30.079
+for example, through how we can
+
+15:30.079 --> 15:32.000
+use PlantUML easier today
+
+15:32.000 --> 15:35.519
+than ever before, so we can now include
+
+15:35.519 --> 15:38.880
+mental maps within our Emacs files
+
+15:38.880 --> 15:40.800
+if we want to, but also
+
+15:40.800 --> 15:45.120
+if we're thinking about Emacs helping us
+
+15:45.120 --> 15:47.600
+both remember the material
+
+15:47.600 --> 15:48.719
+that we're working with
+
+15:48.719 --> 15:50.000
+and 're-present' it,
+
+15:50.000 --> 15:51.040
+we can think of it
+
+15:51.040 --> 15:53.120
+in terms of its archival functions,
+
+15:53.120 --> 15:54.880
+So we can see an example of this
+
+15:54.880 --> 15:57.040
+in Sacha Chua's init,
+
+15:57.040 --> 15:59.120
+where she is using Emacs
+
+15:59.120 --> 16:02.399
+to manage her recent sketches.
+
+16:02.399 --> 16:03.839
+This would be really useful
+
+16:03.839 --> 16:06.000
+for implementation
+
+16:06.000 --> 16:08.160
+in terms of what the researchers
+
+16:08.160 --> 16:10.480
+(Philip Guo and his colleagues) discovered
+
+16:10.480 --> 16:12.656
+with regards to how today
+
+16:12.656 --> 16:14.880
+Khan-style slides are considered
+
+16:14.880 --> 16:17.920
+more effective than traditional slides,
+
+16:17.920 --> 16:20.160
+because if one is able to integrate
+
+16:20.160 --> 16:21.519
+the other kinds of sketches
+
+16:21.519 --> 16:23.680
+that one has been doing within Emacs -
+
+16:23.680 --> 16:25.999
+and therefore have them at hand
+
+16:25.999 --> 16:27.999
+more easily, it would be easier to
+
+16:27.999 --> 16:30.800
+'re-present' this material as needed
+
+16:30.800 --> 16:33.600
+in the ever-changing context of the classroom.
+
+16:33.600 --> 16:35.519
+We can see from this example
+
+16:35.519 --> 16:38.320
+of Sacha Chua's init that we learn
+
+16:38.320 --> 16:39.999
+by following the traces
+
+16:39.999 --> 16:41.998
+left by others in the community.
+
+16:41.999 --> 16:43.279
+So we were saying then that
+
+16:43.279 --> 16:45.040
+Emacs extends outwards
+
+16:45.040 --> 16:46.479
+through these social branches,
+
+16:46.479 --> 16:48.560
+and indeed we can speak
+
+16:48.560 --> 16:50.640
+of the grammar of interaction,
+
+16:50.640 --> 16:52.320
+that we benefit from by being
+
+16:52.320 --> 16:54.720
+a member of the Emacs community.
+
+16:54.720 --> 16:56.960
+And this wonderful phrase comes to us
+
+16:56.960 --> 16:58.880
+from a book that was co-edited
+
+16:58.880 --> 17:01.736
+by our very own former Org father,
+
+17:01.736 --> 17:03.680
+Bastien Guerry, in an interview
+
+17:03.680 --> 17:05.359
+that he led with Nicolas Gaume [Andler & Guerry].
+
+17:05.359 --> 17:07.040
+Nicolas Gaume was explaining
+
+17:07.040 --> 17:10.640
+how in video games, we see our character
+
+17:10.640 --> 17:12.160
+and compare our character
+
+17:12.160 --> 17:14.160
+to other characters,
+
+17:14.160 --> 17:16.080
+and we watch how other characters
+
+17:16.080 --> 17:17.040
+make decisions,
+
+17:17.040 --> 17:19.040
+and the outcomes of these decisions,
+
+17:19.040 --> 17:21.440
+and their trajectories in the game,
+
+17:21.440 --> 17:23.119
+and then we compare where we are
+
+17:23.119 --> 17:24.720
+with respect to this,
+
+17:24.720 --> 17:27.119
+and by having this comparison,
+
+17:27.119 --> 17:29.840
+it helps us chart out our own path.
+
+17:29.840 --> 17:31.280
+So we can experience
+
+17:31.280 --> 17:32.800
+this grammar of interaction
+
+17:32.800 --> 17:35.200
+within Emacs every time we compare
+
+17:35.200 --> 17:38.720
+our config with that of others.
+
+17:38.720 --> 17:41.760
+Emacs further champions the social element
+
+17:41.760 --> 17:43.920
+through co-individuation, which is
+
+17:43.920 --> 17:46.880
+a term coined by Bernard Stiegler.
+
+17:46.880 --> 17:48.720
+This means the meaning that is known
+
+17:48.720 --> 17:50.960
+and shared by other individuals.
+
+17:50.960 --> 17:52.560
+What is it that we know and share
+
+17:52.560 --> 17:54.560
+within Emacs? It is how to
+
+17:54.560 --> 17:55.600
+improve our lives
+
+17:55.600 --> 17:57.280
+through customizing Emacs
+
+17:57.280 --> 18:00.479
+in specific ways. So if one person
+
+18:00.479 --> 18:03.040
+reaches the apotheosis
+
+18:03.040 --> 18:04.239
+of individuation,
+
+18:04.239 --> 18:05.920
+and they're living the life
+
+18:05.920 --> 18:07.760
+they dreamed of
+
+18:07.760 --> 18:08.960
+through their Emacs use,
+
+18:08.960 --> 18:10.720
+they can share this information
+
+18:10.720 --> 18:11.680
+with somebody else
+
+18:11.680 --> 18:14.320
+who too can come to realize themselves
+
+18:14.320 --> 18:15.920
+in this way.
+
+18:15.920 --> 18:17.280
+Without the social milieu,
+
+18:17.280 --> 18:18.880
+without this attention
+
+18:18.880 --> 18:21.040
+to the human element,
+
+18:21.040 --> 18:23.600
+the technical milieu inevitably becomes
+
+18:23.600 --> 18:24.414
+a negative externality
+
+18:24.414 --> 18:25.760
+[which is a philosophical problem].
+
+18:25.760 --> 18:27.840
+Here I'm drawing on Bernard Stiegler.
+
+18:27.840 --> 18:29.680
+What does this mean? This means
+
+18:29.680 --> 18:32.400
+where knowledge becomes automaticized,
+
+18:32.400 --> 18:33.760
+it becomes a closed
+
+18:33.760 --> 18:36.560
+and self-referential system.
+
+18:36.560 --> 18:39.520
+Because it's self-referential and closed,
+
+18:39.520 --> 18:41.999
+there is no need for any human input,
+
+18:41.999 --> 18:43.600
+so the human within this system
+
+18:43.600 --> 18:46.080
+turns into a servant.
+
+18:46.080 --> 18:50.800
+By contrast, by using human-centered Emacs,
+
+18:50.800 --> 18:53.520
+we are able to take care of our neighbors.
+
+18:53.520 --> 18:55.840
+We can write extensions for them.
+
+18:55.840 --> 18:58.560
+We can help each other on the forums.
+
+18:58.560 --> 19:00.800
+We can even teach just one more person
+
+19:00.800 --> 19:02.640
+how to use Emacs.
+
+19:02.640 --> 19:04.880
+And this idea comes from Ivan Illich
+
+19:04.880 --> 19:06.800
+who extends it to say
+
+19:06.800 --> 19:08.880
+that by taking care of our neighbors
+
+19:08.880 --> 19:09.680
+in this way,
+
+19:09.680 --> 19:11.840
+this enables us to excel
+
+19:11.840 --> 19:13.999
+at using the best available tools.
+
+19:13.999 --> 19:16.239
+The tool here being Emacs.
+
+19:16.239 --> 19:19.200
+The community aspect of Emacs
+
+19:19.200 --> 19:20.320
+can also be seen
+
+19:20.320 --> 19:22.720
+in how the core of Emacs itself
+
+19:22.720 --> 19:25.040
+is evolving. So just like we are
+
+19:25.040 --> 19:27.119
+configuring and programming Emacs
+
+19:27.119 --> 19:28.720
+while we are using it,
+
+19:28.720 --> 19:32.239
+Emacs, too, continues to develop
+
+19:32.239 --> 19:34.560
+as the core expands.
+
+19:34.560 --> 19:36.880
+So in this, too, we see how Emacs
+
+19:36.880 --> 19:39.680
+is a model of design pattern learning
+
+19:39.680 --> 19:42.320
+that we can be inspired from,
+
+19:42.320 --> 19:44.960
+and the fact that people
+
+19:44.960 --> 19:46.320
+from the Emacs community
+
+19:46.320 --> 19:49.280
+are able to contribute to the core
+
+19:49.280 --> 19:52.720
+brings emphasis to the community role
+
+19:52.720 --> 19:53.999
+in this design pattern.
+
+19:53.999 --> 19:55.440
+So at the beginning, we were saying
+
+19:55.440 --> 19:56.239
+we're interested
+
+19:56.239 --> 19:57.680
+in the complex assemblage,
+
+19:57.680 --> 19:59.520
+not just of activities and tools,
+
+19:59.520 --> 20:00.960
+but also of people.
+
+20:00.960 --> 20:03.119
+So here we are talking about
+
+20:03.119 --> 20:04.720
+an 'Emacs community'.
+
+20:04.720 --> 20:06.880
+This is also thanks to
+
+20:06.880 --> 20:08.560
+the selfless work of people
+
+20:08.560 --> 20:11.999
+like Sacha Chua, or blog rings
+
+20:11.999 --> 20:13.760
+such as Planet Emacs Life
+
+20:13.760 --> 20:14.960
+that bring us together
+
+20:14.960 --> 20:16.880
+so that we truly can say
+
+20:16.880 --> 20:18.479
+that there is a community.
+
+20:18.479 --> 20:20.080
+This conference is an example of this:
+
+20:20.080 --> 20:23.440
+and thank you to the conference organizers.
+
+20:23.440 --> 20:24.880
+But this community,
+
+20:24.880 --> 20:28.640
+because of the free core,
+
+20:28.640 --> 20:30.160
+allows for there to be
+
+20:30.160 --> 20:31.119
+different viewpoints
+
+20:31.119 --> 20:32.320
+within the community.
+
+20:32.320 --> 20:33.440
+One thing that I've noticed
+
+20:33.440 --> 20:34.880
+about the Emacs community
+
+20:34.880 --> 20:36.320
+is that there are sometimes even
+
+20:36.320 --> 20:38.880
+competing views within the community.
+
+20:38.880 --> 20:40.160
+This can be considered
+
+20:40.160 --> 20:42.239
+proof of concept of systems thinker
+
+20:42.239 --> 20:44.479
+and philosopher Edgar Morin's idea
+
+20:44.479 --> 20:46.720
+of a 'cognitive democracy',
+
+20:46.720 --> 20:48.160
+which is to say,
+
+20:48.160 --> 20:50.880
+a community that is nourished
+
+20:50.880 --> 20:52.320
+by antagonisms
+
+20:52.320 --> 20:55.840
+while also regulating them.
+
+20:55.840 --> 20:57.280
+The "being" of this
+
+20:57.280 --> 20:58.560
+very special community,
+
+20:58.560 --> 21:01.119
+then, very importantly,
+
+21:01.119 --> 21:03.920
+stems from how at the center,
+
+21:03.920 --> 21:05.999
+we have free software
+
+21:05.999 --> 21:08.720
+that allows for this range of difference
+
+21:08.720 --> 21:11.440
+and range of extensibility to exist
+
+21:11.440 --> 21:13.599
+even within the community.
+
+21:13.599 --> 21:16.880
+So, by way of a conclusion,
+
+21:16.880 --> 21:18.080
+we can think of Emacs
+
+21:18.080 --> 21:21.359
+as the center of centers that expands,
+
+21:21.359 --> 21:24.160
+that is relational and free.
+
+21:24.160 --> 21:27.280
+Only in some systems, we should add,
+
+21:27.280 --> 21:28.720
+does this "being" emerge.
+
+21:28.720 --> 21:31.040
+So going back to Richard Gabriel,
+
+21:31.040 --> 21:32.960
+just to champion Emacs one more time
+
+21:32.960 --> 21:34.400
+before we say goodbye:
+
+21:34.400 --> 21:35.599
+only in some systems,
+
+21:35.599 --> 21:36.640
+some software systems,
+
+21:36.640 --> 21:38.960
+does a system succeed
+
+21:38.960 --> 21:40.080
+in becoming the center
+
+21:40.080 --> 21:41.680
+of all of the other centers
+
+21:41.680 --> 21:43.920
+and become a framework
+
+21:43.920 --> 21:45.520
+that can be used and reused,
+
+21:45.520 --> 21:47.840
+which gives systems and objects
+
+21:47.840 --> 21:48.720
+their spirit.
+
+21:48.720 --> 21:51.520
+So Emacs is being used and reused
+
+21:51.520 --> 21:53.599
+through these packages,
+
+21:53.599 --> 21:55.119
+and it gives to them their spirit.
+
+21:55.119 --> 21:56.320
+The spirit, I would argue,
+
+21:56.320 --> 21:59.040
+is in part this extensibility,
+
+21:59.040 --> 22:01.520
+and sometimes even difference.
+
+22:01.520 --> 22:03.120
+Emacs values the value [cf. Stiegler]
+
+22:03.120 --> 22:04.240
+of the freedom to create,
+
+22:04.240 --> 22:05.680
+use, and share [cf. Illich],
+
+22:05.680 --> 22:06.960
+so we can be inspired
+
+22:06.960 --> 22:09.119
+by this design pattern.
+
+22:09.119 --> 22:11.359
+It is... It rallies
+
+22:11.359 --> 22:14.320
+an autonomous designer mindset
+
+22:14.320 --> 22:16.800
+and encourages and supports us
+
+22:16.800 --> 22:18.400
+on our path towards
+
+22:18.400 --> 22:20.960
+design pattern iteration.
+
+22:20.960 --> 22:23.359
+It is not a 'flattened' contextualization.
+
+22:23.359 --> 22:25.359
+It permits ongoing learning,
+
+22:25.359 --> 22:27.040
+reassembling contexts,
+
+22:27.040 --> 22:29.520
+and an adaptable design pattern
+
+22:29.520 --> 22:31.520
+extensibility.
+
+22:31.520 --> 22:33.200
+Ultimately, it helps us create
+
+22:33.200 --> 22:35.520
+circumstances where learning is coherent
+
+22:35.520 --> 22:37.920
+with what is valued in the rest of life:
+
+22:37.920 --> 22:41.520
+pleasure, growth, and transformation.
+
+22:41.520 --> 22:43.200
+So thank you, on that note,
+
+22:43.200 --> 22:45.280
+to all of the developers, maintainers,
+
+22:45.280 --> 22:47.119
+contributors, and community
+
+22:47.119 --> 22:48.560
+for championing our freedom
+
+22:48.560 --> 22:51.760
+to co-individuate complex design patterns
+
+22:51.760 --> 22:54.320
+the way we want to, so we, too,
+
+22:54.320 --> 22:57.359
+can leave original traces, if we want to.
+
+22:57.359 --> 23:00.003
+Thank you very much.
+
+23:00.003 --> 23:00.920
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt b/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt
new file mode 100644
index 00000000..4b7765ef
--- /dev/null
+++ b/2021/captions/emacsconf-2021-professional--using-org-mode-for-recording-continuous-professional-development--philip-beadling--main.vtt
@@ -0,0 +1,871 @@
+WEBVTT
+
+00:02.879 --> 00:05.424
+Hello everyone! My name is Philip Beadling.
+
+00:05.424 --> 00:06.944
+Just to give you a bit of background,
+
+00:06.944 --> 00:08.400
+I'm the enterprise architect
+
+00:08.400 --> 00:10.384
+in a company called Quantile Technologies.
+
+00:10.384 --> 00:12.799
+I've been using Emacs
+
+00:12.799 --> 00:14.560
+certainly for the last four or five years
+
+00:14.560 --> 00:16.800
+as part of my day-to-day workflow,
+
+00:16.800 --> 00:18.080
+but I've used it on and off
+
+00:18.080 --> 00:19.000
+for the last 20 years
+
+00:19.000 --> 00:21.320
+depending on the jobs
+
+00:21.320 --> 00:22.423
+or the task at hand.
+
+00:22.423 --> 00:24.800
+Now, today I'm here in a personal capacity
+
+00:24.800 --> 00:27.360
+to talk about a use I had
+
+00:27.360 --> 00:28.440
+for Emacs last year
+
+00:28.440 --> 00:31.000
+where I had to record
+
+00:31.000 --> 00:32.800
+my continuous professional development,
+
+00:32.800 --> 00:35.320
+and I was required to be audited
+
+00:35.320 --> 00:37.280
+by my professional body on it.
+
+00:37.280 --> 00:40.240
+My CPD record is a bit of a mess,
+
+00:40.240 --> 00:42.640
+or certainly was. It was over
+
+00:42.640 --> 00:44.640
+various different services and systems
+
+00:44.640 --> 00:46.160
+that have been provided to me
+
+00:46.160 --> 00:47.920
+by previous employers.
+
+00:47.920 --> 00:51.824
+And, I had bits of it in Excel spreadsheets,
+
+00:51.824 --> 00:52.640
+and I was looking for like
+
+00:52.640 --> 00:54.200
+a one single golden source
+
+00:54.200 --> 00:55.320
+where I could store it all
+
+00:55.320 --> 00:56.719
+and use in the future.
+
+00:56.719 --> 00:59.024
+So, I had a look online.
+
+00:59.024 --> 00:59.824
+I didn't find anything I'd like,
+
+00:59.824 --> 01:01.885
+so I decided I would use Emacs,
+
+01:01.885 --> 01:03.840
+and I quickly came to the conclusion
+
+01:03.840 --> 01:05.480
+that using Org mode
+
+01:05.480 --> 01:07.040
+was a nice fit for this,
+
+01:07.040 --> 01:08.160
+you know, both the TODO lists
+
+01:08.160 --> 01:09.080
+and the properties
+
+01:09.080 --> 01:10.920
+seem to fit nicely
+
+01:10.920 --> 01:12.890
+with building a very basic database,
+
+01:12.890 --> 01:14.159
+which is what in effect this is,
+
+01:14.159 --> 01:16.159
+what this is.
+
+01:16.159 --> 01:18.000
+Without further ado,
+
+01:18.000 --> 01:22.640
+I will start by just downloading.
+
+01:22.640 --> 01:24.640
+This is available on my public Git,
+
+01:24.640 --> 01:26.160
+handle is falloutfill,
+
+01:26.160 --> 01:28.146
+and it's under a project called Misc.
+
+01:28.146 --> 01:33.200
+It's just a single file called cpd.org,
+
+01:33.200 --> 01:35.080
+I can stick that in the chat
+
+01:35.080 --> 01:36.280
+when we actually do this live,
+
+01:36.280 --> 01:38.532
+so that people will have a link to it.
+
+01:38.532 --> 01:41.119
+So, I'll start this up.
+
+01:41.119 --> 01:44.560
+Okay. To start with, I am just going to
+
+01:44.560 --> 01:46.826
+close down various Lisp stuff,
+
+01:46.826 --> 01:48.566
+and just give you a demo of
+
+01:48.566 --> 01:50.560
+how it actually works.
+
+01:50.560 --> 01:55.040
+Let's go up here.
+
+01:55.040 --> 01:57.205
+Okay, so, basically to make this work,
+
+01:57.205 --> 01:58.640
+the way I subdivide it
+
+01:58.640 --> 01:59.200
+is that I would have
+
+01:59.200 --> 02:00.200
+professional goals,
+
+02:00.200 --> 02:01.040
+and professional goals
+
+02:01.040 --> 02:02.703
+would be made up of activities,
+
+02:02.703 --> 02:03.741
+and each of those activities
+
+02:03.741 --> 02:05.917
+would contribute to the goal.
+
+02:05.917 --> 02:07.713
+So, in order to represent this,
+
+02:07.713 --> 02:10.000
+this is just a nested TODO list
+
+02:10.000 --> 02:12.800
+in Emacs Org mode.
+
+02:12.800 --> 02:16.068
+I sort of change things like the naming,
+
+02:16.068 --> 02:18.247
+Pending, In-Progress and Complete
+
+02:18.247 --> 02:19.440
+rather than TODO, DONE because
+
+02:19.440 --> 02:21.360
+that's more like what my professional
+
+02:21.360 --> 02:23.244
+body likes to categorize things,
+
+02:23.244 --> 02:25.315
+but essentially it's the same thing.
+
+02:25.315 --> 02:28.212
+So, I've got an Org capture template
+
+02:28.212 --> 02:29.499
+or two Org capture templates
+
+02:29.499 --> 02:31.843
+in order to grab this information,
+
+02:31.843 --> 02:33.645
+and then stick it in the TODO list,
+
+02:33.645 --> 02:36.540
+and also tabulate it using column view.
+
+02:36.540 --> 02:39.304
+I'll start off just by showing you
+
+02:39.304 --> 02:40.090
+an example here.
+
+02:40.090 --> 02:40.879
+So, what I'm going to do is
+
+02:40.879 --> 02:41.965
+create a new goal,
+
+02:41.965 --> 02:42.849
+and then under it,
+
+02:42.849 --> 02:44.959
+I will create a couple of activities
+
+02:44.959 --> 02:46.511
+relevant to that goal.
+
+02:46.511 --> 02:49.360
+For the goal I'm going to have, let's say,
+
+02:49.360 --> 02:50.342
+something relevant,
+
+02:50.342 --> 02:54.000
+so, 'Improve Public Speaking',
+
+02:54.000 --> 02:55.680
+and then I'm going to say, the type
+
+02:55.680 --> 02:58.000
+of that goal is, well, it's a 'Presentation'
+
+02:58.000 --> 03:01.200
+I suppose. The outcome of that goal is,
+
+03:01.200 --> 03:02.560
+well, I don't want to go into too much
+
+03:02.560 --> 03:06.069
+detail here, but it would be, you know,
+
+03:06.069 --> 03:09.140
+'Get feedback from colleagues', and so forth.
+
+03:09.140 --> 03:11.200
+I won't fully and completely [inaudible]
+
+03:11.200 --> 03:12.538
+about what the goal was.
+
+03:12.538 --> 03:14.067
+Now, the retrospective value,
+
+03:14.067 --> 03:15.318
+my understanding is that
+
+03:15.318 --> 03:17.028
+you fill that in afterwards,
+
+03:17.028 --> 03:18.800
+so you want to talk after completing the
+
+03:18.800 --> 03:21.213
+action, so this is not relevant for the day.
+
+03:21.213 --> 03:23.120
+I'm just going to leave it blank,
+
+03:23.120 --> 03:24.541
+although I'm sure you can imagine
+
+03:24.541 --> 03:26.428
+I could say: having completed this action
+
+03:26.428 --> 03:28.959
+I felt that, blah blah blah, and so forth.
+
+03:28.959 --> 03:31.360
+Okay, so I will add that, and then you
+
+03:31.360 --> 03:33.760
+will see that I now have a new goal,
+
+03:33.760 --> 03:36.048
+both in my column view and in my TODO list,
+
+03:36.048 --> 03:38.159
+and just to make it a little bit
+
+03:38.159 --> 03:39.920
+realistic, I'm going to then add two
+
+03:39.920 --> 03:41.332
+activities to that.
+
+03:41.332 --> 03:43.433
+When I come in to add an activity,
+
+03:43.433 --> 03:44.560
+I have to select a goal.
+
+03:44.560 --> 03:49.120
+I'm going to select 'Improve Public Speaking'.
+
+03:49.120 --> 03:52.963
+Yeah, so, the activity I'm going to say is,
+
+03:52.963 --> 03:57.427
+well, let's say, 'Speak at EmacsConf 2021',
+
+03:57.427 --> 04:01.200
+that we can use a type of 'Presentation',
+
+04:01.200 --> 04:04.352
+outcome of that is, stating the obvious,
+
+04:04.352 --> 04:08.080
+'Present on an Emacs idea'.
+
+04:08.080 --> 04:09.680
+Right, something along the lines of that.
+
+04:09.680 --> 04:11.519
+And, then retrospective, again I'm not
+
+04:11.519 --> 04:14.135
+going to fill that in at the moment.
+
+04:14.135 --> 04:19.060
+Then, last but not least,
+
+04:19.060 --> 04:20.799
+I will come up with a slightly different
+
+04:20.799 --> 04:23.215
+activity. So, again selecting
+
+04:23.215 --> 04:24.889
+'Improve Public Speaking',
+
+04:24.889 --> 04:27.440
+the activity would be
+
+04:27.440 --> 04:31.257
+'Watch lecture series on public speaking',
+
+04:31.257 --> 04:33.426
+you know, blah blah blah, so forth.
+
+04:33.426 --> 04:34.720
+Type value would be
+
+04:34.720 --> 04:37.600
+Lecture, for this outcome would maybe be
+
+04:37.600 --> 04:43.252
+'Use new knowledge in EmacsConf presentation'.
+
+04:43.252 --> 04:45.350
+Right, might be a good one there.
+
+04:45.350 --> 04:46.720
+Again, retrospective value,
+
+04:46.720 --> 04:48.518
+I'm just going to leave that blank,
+
+04:48.518 --> 04:51.440
+and I'm going to save that.
+
+04:51.440 --> 04:52.960
+Now, we're in a position where we've got
+
+04:52.960 --> 04:54.960
+a goal and two activities, which are
+
+04:54.960 --> 04:57.520
+represented here, you can see here that I
+
+04:57.520 --> 05:00.160
+can move an activity, cycle it forward to
+
+05:00.160 --> 05:02.322
+In-Progress. When I do that,
+
+05:02.322 --> 05:05.104
+I get a STARTED timestamp here.
+
+05:05.104 --> 05:06.737
+If I then cycle it again,
+
+05:06.737 --> 05:09.869
+I get the more familiar CLOSED timestamp here.
+
+05:09.869 --> 05:11.635
+The STARTED timestamp is a bit of
+
+05:11.635 --> 05:13.918
+custom code, I'll show you that in a moment.
+
+05:13.918 --> 05:17.120
+And then likewise, let's say that…,
+
+05:17.120 --> 05:20.166
+we'll move this one from PENDING to STARTED.
+
+05:20.166 --> 05:22.960
+Okay. Now, if I save the document,
+
+05:22.960 --> 05:24.560
+that will trigger the updating
+
+05:24.560 --> 05:27.520
+of the column view, you can see now
+
+05:27.520 --> 05:29.360
+that we have the various started and
+
+05:29.360 --> 05:31.600
+completed statuses, this is up to date.
+
+05:31.600 --> 05:32.937
+So, that's pretty much.
+
+05:32.937 --> 05:34.211
+You can imagine that we could add
+
+05:34.211 --> 05:35.469
+lots of goals and lots of activities,
+
+05:35.469 --> 05:37.474
+and this would grow into, you know,
+
+05:37.474 --> 05:41.704
+several sheets worth of a work,
+
+05:41.704 --> 05:43.748
+and then last but not least,
+
+05:43.748 --> 00:05:45.440
+is obviously the most important thing.
+
+00:05:45.440 --> 00:05:46.720
+How do you submit it?
+
+05:46.720 --> 05:48.479
+We could just use the standard
+
+05:48.479 --> 05:50.856
+export facility in Org mode for doing that.
+
+05:50.856 --> 05:55.039
+That's just Control c Control e l o (C-c C-e l o).
+
+05:55.039 --> 00:06:03.440
+And there you can see,
+
+00:06:03.440 --> 00:06:06.586
+there you've got the goals and activities.
+
+06:06.586 --> 06:08.319
+I spent a bit of time, I won't go too much
+
+06:08.319 --> 06:10.000
+in the LaTeX formatting, but coming up
+
+06:10.000 --> 06:12.319
+with something that I felt and got as
+
+06:12.319 --> 06:14.720
+much information compactly on a page
+
+06:14.720 --> 06:17.840
+without making it difficult to read,
+
+06:17.840 --> 00:06:19.039
+should we say, and it's always
+
+00:06:19.039 --> 00:06:20.080
+a find-the-balance thing.
+
+00:06:20.080 --> 00:06:22.560
+I'm not saying I'm an expert on it,
+
+00:06:22.560 --> 00:06:24.400
+but I thought what I came up with here
+
+00:06:24.400 --> 00:06:25.905
+was reasonably clear
+
+06:25.905 --> 06:28.960
+but allowed you to write enough information.
+
+06:28.960 --> 06:31.039
+The goals and activities were reasonably
+
+06:31.039 --> 06:32.419
+well explained.
+
+06:32.419 --> 06:35.039
+Okay, we can just kill that.
+
+06:35.039 --> 06:37.402
+So, how does all of that work?
+
+06:37.402 --> 06:40.180
+Well, underneath is config tab here,
+
+06:40.180 --> 06:41.210
+we have a bunch of Lisp
+
+06:41.210 --> 06:43.276
+that I'm going to sort of fly through here.
+
+06:43.276 --> 06:45.898
+You can ask me any questions afterwards.
+
+06:45.898 --> 06:46.639
+First thing is,
+
+06:46.639 --> 06:48.371
+we have the org-capture templates,
+
+06:48.371 --> 06:50.101
+which are here.
+
+06:50.101 --> 06:53.178
+The goal one is not doing anything special.
+
+06:53.178 --> 06:55.605
+It's just writing it back to this file,
+
+06:55.605 --> 06:57.125
+so there is a limitation there
+
+06:57.125 --> 06:58.718
+that you must have this file open
+
+06:58.718 --> 06:59.840
+when you add them, which is
+
+06:59.840 --> 07:02.000
+something I'd like to improve in future.
+
+07:02.000 --> 07:04.952
+For the activities, it specifies the file,
+
+07:04.952 --> 07:06.560
+but it also specifies this function
+
+07:06.560 --> 07:09.926
+set-activity-pos-from-goal, which (is) above here.
+
+07:09.926 --> 07:12.720
+What this does is, it iterates through the
+
+07:12.720 --> 07:17.360
+various Org entries looking for goals,
+
+07:17.360 --> 00:07:20.720
+and once it has a list of goals,
+
+00:07:20.720 --> 00:07:21.919
+it presents them to you
+
+00:07:21.919 --> 00:07:23.599
+using ido-completing-read,
+
+07:23.599 --> 00:07:25.120
+so that you can select the goal
+
+00:07:25.120 --> 00:07:27.610
+that you want the activity to live underneath,
+
+07:27.610 --> 07:29.520
+and it then searches forward, and it finds
+
+07:29.520 --> 00:07:31.599
+the appropriate spot in that goal
+
+00:07:31.599 --> 00:07:33.919
+that the Emacs can then dump
+
+00:07:33.919 --> 00:07:36.000
+the captured activity.
+
+07:36.000 --> 07:39.210
+Okay, the next one is pretty straightforward.
+
+07:39.210 --> 00:07:40.479
+Because I changed the names
+
+00:07:40.479 --> 00:07:42.240
+of the TODO, DONE,
+
+00:07:42.240 --> 00:07:44.720
+I now need a new way of aggregating
+
+00:07:44.720 --> 00:07:46.691
+the summary completion statuses.
+
+07:46.691 --> 00:07:48.400
+So, for this I'm just looking
+
+00:07:48.400 --> 00:07:51.440
+at the number of completed activities
+
+07:51.440 --> 07:53.627
+over the total number of activities,
+
+07:53.627 --> 07:57.665
+and I make that available on the C+ here,
+
+07:57.665 --> 08:00.859
+which we will see when I go and show you
+
+08:00.859 --> 08:03.960
+the top configuration in the Org document
+
+08:03.960 --> 08:05.199
+in two minutes.
+
+08:05.199 --> 08:08.080
+I mentioned that we needed to have our
+
+08:08.080 --> 00:08:10.400
+own start date. The way this works is
+
+00:08:10.400 --> 00:08:11.870
+we add a hook to
+
+00:08:11.870 --> 00:08:14.996
+org-after-todo-state-change-hook,
+
+08:14.996 --> 00:08:17.199
+which means that we test
+
+00:08:17.199 --> 00:08:19.680
+the state change results in
+
+00:08:19.680 --> 00:08:21.599
+one of the items being In-Progress,
+
+00:08:21.599 --> 00:08:23.199
+and if that's true
+
+00:08:23.199 --> 00:08:25.360
+and it already doesn't have a time stamp,
+
+08:25.360 --> 00:08:26.639
+then it creates a timestamp
+
+00:08:26.639 --> 00:08:29.049
+with the current time and date.
+
+08:29.049 --> 00:08:31.199
+The second hook here is just ensuring that
+
+00:08:31.199 --> 00:08:32.663
+when we save the document,
+
+08:32.663 --> 08:34.898
+that the column view is dynamically updated,
+
+08:34.898 --> 08:36.578
+so that everything is up to date.
+
+08:36.578 --> 08:39.444
+And then last but not least here,
+
+08:39.444 --> 08:43.590
+the tmp-f-timestamp, what this does is,
+
+08:43.590 --> 08:46.690
+on the export, it modifies the timestamps,
+
+08:46.690 --> 08:48.336
+so that it removes the angle brackets,
+
+08:48.336 --> 08:50.367
+and it removes the hours and minutes.
+
+08:50.367 --> 00:08:51.839
+That is a space-saving thing
+
+00:08:51.839 --> 00:08:54.080
+and a tidiness thing in the PDF.
+
+00:08:54.080 --> 00:08:56.187
+I'll show you in a second how that's used.
+
+08:56.187 --> 08:58.121
+We then allow bind-keywords.
+
+08:58.121 --> 08:59.839
+We use them above.
+
+08:59.839 --> 00:09:01.200
+Then we just have a simple key
+
+00:09:01.200 --> 00:09:05.258
+that allows us to hotkey for org-capture.
+
+09:05.258 --> 00:09:06.800
+And then at the start,
+
+00:09:06.800 --> 00:09:07.327
+when we evaluate the startup block
+
+00:09:07.327 --> 00:09:10.160
+that I have of Lisp,
+
+00:09:10.160 --> 00:09:11.360
+just so it's already there,
+
+00:09:11.360 --> 00:09:13.519
+and set the number of sublevels to one
+
+00:09:13.519 --> 00:09:16.080
+so only the top levels exist.
+
+09:16.080 --> 00:09:19.360
+Coming back over the top
+
+00:09:19.360 --> 00:09:21.576
+to put that all back together again.
+
+09:21.576 --> 00:09:22.720
+The startup just tells you
+
+00:09:22.720 --> 00:09:24.926
+that you want log times.
+
+09:24.926 --> 09:27.023
+The title, author, description, and…,
+
+09:27.023 --> 09:28.536
+they should be obvious, right,
+
+09:28.536 --> 09:29.920
+that's just text for the PDF.
+
+09:29.920 --> 09:33.049
+Options, we disable the table of contents,
+
+09:33.049 --> 09:34.320
+we do not want that.
+
+09:34.320 --> 00:09:35.680
+Now, the output config here,
+
+00:09:35.680 --> 00:09:37.519
+the first two are resulting
+
+00:09:37.519 --> 00:09:40.160
+in the timestamp formats, so, that was
+
+00:09:40.160 --> 00:09:41.920
+the tmp-f-timestamp function
+
+00:09:41.920 --> 00:09:43.468
+I showed you below.
+
+09:43.468 --> 09:45.310
+And, we got a better LaTeX stuff here,
+
+09:45.310 --> 09:47.134
+just saying that we want a landscape,
+
+09:47.134 --> 09:49.150
+and we want to use A4 paper size,
+
+09:49.150 --> 09:50.560
+and then the columns here.
+
+09:50.560 --> 00:09:51.839
+What we want is just to
+
+00:09:51.839 --> 00:09:52.880
+rename the properties
+
+00:09:52.880 --> 00:09:54.160
+to something which just looks
+
+09:54.160 --> 09:55.572
+a little bit nicer in the table.
+
+09:55.572 --> 09:58.320
+So you can see that: goals, activities,
+
+09:58.320 --> 10:00.979
+status, completed, and so forth.
+
+10:00.979 --> 00:10:03.760
+Then last but not least,
+
+00:10:03.760 --> 00:10:04.640
+on the actual thing,
+
+00:10:04.640 --> 00:10:06.487
+we use a longtable in LaTeX.
+
+10:06.487 --> 00:10:09.360
+We align, so we specify very exactly
+
+00:10:09.360 --> 00:10:11.040
+that we want five centimeters
+
+10:11.040 --> 10:13.364
+for the first and last two columns,
+
+10:13.364 --> 00:10:15.680
+and that we want all the other columns
+
+00:10:15.680 --> 00:10:17.196
+to use the remaining space.
+
+10:17.196 --> 10:19.040
+And that's it.
+
+10:19.040 --> 00:10:21.440
+Appreciate, I've absolutely whirlwinded
+
+00:10:21.440 --> 00:10:24.160
+through that, but please do feel free
+
+00:10:24.160 --> 00:10:26.144
+to ask me any questions,
+
+10:26.144 --> 10:28.786
+or speak to me offline.
+
+10:28.786 --> 10:32.839
+Thank you very much.
diff --git a/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--chapters.vtt b/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--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--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-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-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt b/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt
new file mode 100644
index 00000000..600577d8
--- /dev/null
+++ b/2021/captions/emacsconf-2021-project--budgeting-project-monitoring-and-invoicing-with-org-mode--adolfo-villafiorita--main.vtt
@@ -0,0 +1,565 @@
+WEBVTT
+
+00:01.040 --> 00:00:02.800
+Hi, I am Adolfo Villafiorita.
+
+00:00:02.800 --> 00:00:04.799
+I am the co-founder of Shair.Tech,
+
+00:00:04.799 --> 00:00:07.200
+an innovative-- a socially-vocated
+
+00:00:07.200 --> 00:00:10.558
+innovative startup in Italy.
+
+00:00:10.559 --> 00:00:13.280
+Today I'm gonna talk about the way in which
+
+00:00:13.280 --> 00:00:17.680
+we use Org mode to budget our projects.
+
+00:00:17.680 --> 00:00:19.039
+First, I need to introduce the way
+
+00:00:19.039 --> 00:00:21.279
+in which we build our project budget.
+
+00:21.279 --> 00:00:22.480
+We start from the goals
+
+00:00:22.480 --> 00:00:24.720
+and the work to be performed,
+
+00:24.720 --> 00:00:29.840
+and we split it into different tasks
+
+00:29.840 --> 00:00:31.920
+which may be grouped in different ways,
+
+00:31.920 --> 00:00:33.440
+according to our needs.
+
+00:00:33.440 --> 00:00:36.800
+It could be user stories or functional groups
+
+00:00:36.800 --> 00:00:40.719
+or packages, and then for each task,
+
+00:00:40.719 --> 00:00:44.000
+we compute the effort.
+
+00:44.000 --> 00:00:45.440
+Then from the effort,
+
+00:00:45.440 --> 00:00:49.840
+we derive the project cost and price
+
+00:49.840 --> 00:00:52.239
+according to two different approaches.
+
+00:52.239 --> 00:00:53.280
+The first approach:
+
+00:00:53.280 --> 00:00:56.320
+we allocate the effort to each resource
+
+00:56.320 --> 00:00:59.680
+and we multiply the effort of the resource
+
+00:00:59.680 --> 00:01:01.359
+by the price of the results.
+
+00:01:01.359 --> 00:01:04.320
+We sum all the efforts together,
+
+00:01:04.320 --> 00:01:07.280
+and then we sum all the tasks together,
+
+00:01:07.280 --> 00:01:09.600
+the prices of all the tasks together.
+
+00:01:09.600 --> 00:01:11.200
+In the second approach,
+
+00:01:11.200 --> 00:01:16.400
+we use a generic effort estimation
+
+00:01:16.400 --> 00:01:20.799
+for each task, without allocating the effort
+
+00:01:20.799 --> 00:01:22.560
+to any specific person,
+
+00:01:22.560 --> 00:01:25.119
+and we multiply this effort
+
+00:01:25.119 --> 00:01:29.040
+by the average price of the resource.
+
+01:29.040 --> 00:01:34.720
+In both cases, the price is computed
+
+01:34.720 --> 00:01:40.079
+by summing cost to overheads and profit.
+
+00:01:40.079 --> 00:01:41.040
+We're a small company.
+
+00:01:41.040 --> 00:01:42.719
+We can choose our toolchain.
+
+00:01:42.720 --> 00:01:44.960
+So we decided to use Org mode
+
+00:01:44.960 --> 00:01:47.360
+for writing our proposals.
+
+01:47.360 --> 00:01:49.200
+We built a template.
+
+00:01:49.200 --> 00:01:54.159
+The template has got a fixed structure
+
+01:54.159 --> 00:01:56.880
+which allows us to do a lot of reuse,
+
+01:56.880 --> 00:01:59.600
+and some Emacs Lisp code
+
+00:01:59.600 --> 00:02:01.040
+and Org mode features
+
+00:02:01.040 --> 00:02:04.079
+to build the project tables.
+
+00:02:04.079 --> 00:02:07.600
+Let me show you, without further ado,
+
+00:02:07.600 --> 00:02:11.760
+the template which is shown here.
+
+02:11.760 --> 00:02:15.520
+Basically it is a fairly standard
+
+02:15.520 --> 00:02:17.750
+Org mode document.
+
+02:20.800 --> 00:02:23.760
+There are some sections here.
+
+02:23.760 --> 00:02:28.879
+Let me show you the structure here.
+
+02:28.879 --> 00:02:30.000
+There are some sections,
+
+00:02:30.000 --> 00:02:34.959
+some of which are not exported /
+
+00:02:34.959 --> 00:02:36.640
+shown to the client,
+
+02:36.640 --> 00:02:39.519
+because they are of no interest to them,
+
+02:39.519 --> 00:02:41.040
+such as, for instance,
+
+00:02:41.040 --> 00:02:43.280
+the plaintext of each
+
+00:02:43.280 --> 00:02:45.440
+ledger accounting entries
+
+02:45.440 --> 00:02:47.440
+we generate for the project
+
+02:47.440 --> 00:02:53.680
+or some info about the detailed budget data,
+
+00:02:53.680 --> 00:02:56.319
+while others are shared with the clients
+
+00:02:56.319 --> 00:02:58.399
+to form a project proposal.
+
+00:02:58.400 --> 00:03:00.400
+Now the structure is not really important
+
+00:03:00.400 --> 00:03:02.720
+in the sense that the only constraint
+
+00:03:02.720 --> 00:03:05.360
+and requirement we set
+
+00:03:05.360 --> 00:03:07.599
+is that there has to be a section
+
+03:07.599 --> 00:03:10.800
+with an ID named plan,
+
+03:10.800 --> 00:03:15.840
+which will contain the project plan.
+
+03:15.840 --> 00:03:21.040
+Here, for instance, we have a project plan
+
+00:03:21.040 --> 00:03:23.599
+made of a user story
+
+03:23.599 --> 00:03:25.360
+whose development is split into
+
+00:03:25.360 --> 00:03:27.360
+three different tasks.
+
+03:27.360 --> 00:03:30.080
+For each task, let me show you
+
+00:03:30.080 --> 00:03:33.200
+just the structure
+
+00:03:33.200 --> 00:03:37.279
+before the application of the template.
+
+03:37.280 --> 00:03:45.200
+For each task, you need to define the effort.
+
+00:03:45.200 --> 00:03:47.360
+Here, for instance, we have an effort,
+
+00:03:47.360 --> 00:03:50.480
+a generic effort not allocated to any person.
+
+03:50.480 --> 00:03:52.400
+We use Org mode duration,
+
+00:03:52.400 --> 00:03:54.799
+60 stands for 60 minutes,
+
+03:54.799 --> 00:03:57.680
+and here we have an effort profile.
+
+00:03:57.680 --> 00:04:02.000
+So in task 1.2, Adolfo will work 10 days
+
+00:04:02.000 --> 00:04:04.159
+and Michele 20 days.
+
+04:04.159 --> 00:04:06.000
+These are working days,
+
+00:04:06.000 --> 00:04:07.439
+so one working day
+
+00:04:07.439 --> 00:04:09.760
+corresponds to eight hours.
+
+04:09.760 --> 00:04:13.519
+This is standard. We might revise these
+
+04:13.519 --> 00:04:15.040
+to become more compliant
+
+00:04:15.040 --> 00:04:19.759
+with the definition given by Org mode.
+
+00:04:19.759 --> 00:04:23.040
+Notice that you can or cannot,
+
+00:04:23.040 --> 00:04:26.720
+you may or may not use TODO keywords here,
+
+00:04:26.720 --> 00:04:29.199
+if you want. We don't usually use them
+
+00:04:29.199 --> 00:04:31.360
+because the final document
+
+00:04:31.360 --> 00:04:34.720
+looks nice to the customer without TODO.
+
+00:04:34.720 --> 00:04:38.479
+We then add them when we move to
+
+00:04:38.479 --> 00:04:40.719
+a later stage.
+
+04:40.720 --> 00:04:43.040
+So once you define the plan
+
+00:04:43.040 --> 00:04:45.600
+with the effort allocation,
+
+04:45.600 --> 00:04:51.440
+you can go back to the Emacs Lisp part
+
+00:04:51.440 --> 00:04:55.680
+where you can set three different variables
+
+04:55.680 --> 00:04:59.680
+to define the hourly rates of your team.
+
+04:59.680 --> 00:05:02.880
+So for instance, here I am taking
+
+00:05:02.880 --> 00:05:06.160
+10 euros per hour
+
+00:05:06.160 --> 00:05:09.680
+(not real rate, actually), and Michele at 20.
+
+05:09.680 --> 00:05:11.360
+And then you can set the profit
+
+00:05:11.360 --> 00:05:14.560
+as a percentage on top of the hourly rate
+
+00:05:14.560 --> 00:05:16.160
+and profit as a percentage
+
+00:05:16.160 --> 00:05:19.360
+on top of hourly rates.
+
+05:19.360 --> 00:05:24.000
+The ballpark effort allocation here
+
+00:05:24.000 --> 00:05:28.880
+is used to compute the average tariff,
+
+05:28.880 --> 00:05:32.160
+our average hourly rate,
+
+05:32.160 --> 00:05:33.600
+as a weighted average.
+
+00:05:33.600 --> 00:05:36.320
+So here I'm saying that on average,
+
+00:05:36.320 --> 00:05:40.639
+I will work 30% of the effort of each task,
+
+00:05:40.639 --> 00:05:42.400
+while Michele will take care of
+
+00:05:42.400 --> 00:05:47.280
+the remaining 70%, and the hourly rate
+
+00:05:47.280 --> 00:05:48.720
+is computed by multiplying
+
+00:05:48.720 --> 00:05:57.120
+30% by 10 + 70% by 20.
+
+05:57.120 --> 00:06:00.880
+If I do a C-c C-c here, I execute
+
+00:06:00.880 --> 00:06:05.440
+the Emacs Lisp code
+
+00:06:05.440 --> 00:06:07.439
+in the source code block.
+
+00:06:07.440 --> 00:06:08.880
+As you can see,
+
+00:06:08.880 --> 00:06:15.759
+Emacs put back the properties
+
+06:15.759 --> 00:06:17.840
+that transform the effort
+
+00:06:17.840 --> 00:06:19.600
+into a total amount:
+
+00:06:19.600 --> 00:06:22.800
+namely, the effort is first transformed
+
+00:06:22.800 --> 00:06:24.479
+into working hours,
+
+06:24.479 --> 00:06:27.280
+the rates and costs are computed,
+
+06:27.280 --> 00:06:28.880
+overhead computed,
+
+00:06:28.880 --> 00:06:32.160
+and everything contributes
+
+00:06:32.160 --> 00:06:34.639
+to the total amount.
+
+06:34.639 --> 00:06:37.600
+Same thing here.
+
+00:06:37.600 --> 00:06:41.440
+The cost is slightly more complex
+
+00:06:41.440 --> 00:06:45.360
+because we use profiled effort,
+
+06:45.360 --> 00:06:47.199
+and so on and so forth.
+
+00:06:47.199 --> 00:06:49.680
+This information here
+
+00:06:49.680 --> 00:06:56.960
+can be then grouped up
+
+06:56.960 --> 00:06:59.759
+to form the project plan
+
+00:06:59.759 --> 00:07:01.599
+and project budget.
+
+00:07:01.599 --> 00:07:03.039
+As you can see,
+
+07:03.039 --> 00:07:06.880
+this is something we do not export
+
+07:06.880 --> 00:07:09.440
+in the project proposal to the client,
+
+07:09.440 --> 00:07:10.880
+because we prefer to do
+
+00:07:10.880 --> 00:07:13.199
+some rounding by hand
+
+07:13.199 --> 00:07:14.880
+in order to build a budget
+
+00:07:14.880 --> 00:07:20.880
+which is, let's say, more reasonable.
+
+07:20.880 --> 00:07:24.639
+This table here computes VAT
+
+00:07:24.639 --> 00:07:28.159
+on total amounts by C-c C-c once again.
+
+00:07:28.160 --> 00:07:31.120
+Then this table here, the payment structure
+
+00:07:31.120 --> 00:07:36.080
+is used to compute the amount to be paid
+
+00:07:36.080 --> 00:07:39.280
+according to the different payments
+
+00:07:39.280 --> 00:07:40.800
+we want to set in the project.
+
+00:07:40.800 --> 00:07:42.160
+Here, for instance, we are setting
+
+00:07:42.160 --> 00:07:45.919
+three payments with the following percentages,
+
+00:07:45.919 --> 00:07:49.199
+and the table, you set the dates and amounts,
+
+00:07:49.199 --> 00:07:53.440
+and the table keeps track of the rest
+
+00:07:53.440 --> 00:07:56.479
+by looking at the total amount
+
+07:56.479 --> 00:08:00.800
+it finds here in the budget table,
+
+00:08:00.800 --> 00:08:03.280
+so the payment structure and budget
+
+00:08:03.280 --> 00:08:07.280
+are then used by this piece of code here
+
+08:07.280 --> 00:08:12.000
+to build the entries
+
+00:08:12.000 --> 00:08:16.720
+used for our internal accounting,
+
+08:16.720 --> 00:08:21.038
+which is based on hledger.
+
+08:21.039 --> 00:08:23.759
+We did everything here by hand,
+
+08:23.759 --> 00:08:26.400
+but it is not necessary, of course,
+
+08:26.400 --> 00:08:31.280
+because if you export the document
+
+00:08:31.280 --> 00:08:34.880
+using C-c C-e and then, for instance,
+
+00:08:34.880 --> 00:08:39.760
+l for LaTeX and p for PDF,
+
+08:39.760 --> 00:08:43.279
+Org mode takes care of evaluating
+
+00:08:43.279 --> 00:08:46.480
+each piece of code in the document
+
+00:08:46.480 --> 00:08:50.720
+and generate the updated documents.
+
+00:08:50.720 --> 00:08:52.000
+Here, for instance, you can see
+
+00:08:52.000 --> 00:08:55.680
+that the PDF generated from the template
+
+00:08:55.680 --> 00:08:57.440
+which contains all the tables, budget,
+
+00:08:57.440 --> 00:08:59.920
+and payment schema, everything,
+
+00:08:59.920 --> 00:09:02.240
+which we use to make an offer
+
+00:09:02.240 --> 00:09:07.999
+to our clients.
+
+09:08.000 --> 00:09:10.000
+There are various advantages,
+
+00:09:10.000 --> 00:09:12.640
+the first, the main one being that
+
+00:09:12.640 --> 00:09:15.600
+we keep all the information in one place,
+
+09:15.600 --> 00:09:17.920
+and that we can version
+
+00:09:17.920 --> 00:09:20.399
+the different versions.
+
+00:09:20.399 --> 00:09:21.680
+You can use source control
+
+00:09:21.680 --> 00:09:24.640
+to version different iterations
+
+00:09:24.640 --> 00:09:26.080
+on the document.
+
+09:26.080 --> 00:09:28.000
+If you want, you can find the document here.
+
+00:09:28.000 --> 00:09:33.120
+Thank you for your attention,
+
+00:09:33.120 --> 00:09:34.120
+and I'm open to questions.
+
+00:09:34.120 --> 00:09:37.279
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--chapters.vtt b/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--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--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-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-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt b/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt
new file mode 100644
index 00000000..8686153d
--- /dev/null
+++ b/2021/captions/emacsconf-2021-research--managing-a-research-workflow-bibliographies-note-taking-and-arxiv--ahmed-khaled--main.vtt
@@ -0,0 +1,520 @@
+WEBVTT
+
+00:00.480 --> 00:00:02.639
+Hello, everyone. My name is Ahmed
+
+00:00:02.639 --> 00:00:05.279
+and I am very happy to be here.
+
+00:05.279 --> 00:00:07.359
+Today I'll talk about
+
+00:00:07.359 --> 00:00:12.160
+my academic workflow inside Emacs.
+
+00:12.160 --> 00:00:14.880
+So the main needs that I have
+
+00:00:14.880 --> 00:00:16.880
+is to keep up with the current research
+
+00:00:16.880 --> 00:00:19.760
+in my field, and to be able
+
+00:00:19.760 --> 00:00:23.920
+to take notes, and write,
+
+00:00:23.920 --> 00:00:25.359
+and use these notes later
+
+00:00:25.359 --> 00:00:29.439
+in writing my papers inside Emacs.
+
+00:00:29.439 --> 00:00:31.119
+Emacs is a great program for this
+
+00:00:31.119 --> 00:00:32.880
+because it is very extendable
+
+00:00:32.880 --> 00:00:36.960
+and we can basically write
+
+00:00:36.960 --> 00:00:39.440
+whatever we are missing.
+
+00:39.440 --> 00:00:41.360
+It replaced my earlier
+
+00:00:41.360 --> 00:00:42.559
+proprietary workflow
+
+00:00:42.559 --> 00:00:44.320
+that involved using Mendeley
+
+00:44.320 --> 00:00:46.320
+and Visual Studio Code
+
+00:00:46.320 --> 00:00:47.760
+and many other tools
+
+00:00:47.760 --> 00:00:49.760
+in order to do the things
+
+00:00:49.760 --> 00:00:51.759
+that I'll show today.
+
+00:51.760 --> 00:00:54.480
+So the first concern that I have
+
+00:00:54.480 --> 00:00:57.280
+is to keep up with new papers.
+
+00:00:57.280 --> 00:01:02.399
+To do that, I use this package called elfeed.
+
+01:02.399 --> 00:01:05.760
+Elfeed is basically just an RSS reader,
+
+01:05.760 --> 00:01:09.600
+and here I fetch all the papers that I need
+
+00:01:09.600 --> 00:01:12.159
+from arXiv, which is the main source
+
+00:01:12.159 --> 00:01:14.080
+of papers in my field
+
+00:01:14.080 --> 00:01:16.720
+and many other scientific fields.
+
+01:16.720 --> 00:01:22.640
+It allows me to view these papers
+
+00:01:22.640 --> 00:01:27.680
+with the abstracts and so on.
+
+01:27.680 --> 00:01:32.159
+In order to simplify viewing
+
+00:01:32.159 --> 00:01:34.799
+and searching for relevant papers,
+
+00:01:34.799 --> 00:01:36.400
+I used this other package called
+
+00:01:36.400 --> 00:01:41.600
+elfeed-score, and elfeed-score enables me
+
+00:01:41.600 --> 00:01:44.560
+to assign a numerical score like this
+
+00:01:44.560 --> 00:01:47.600
+to each of the arXiv entries.
+
+00:01:47.600 --> 00:01:49.200
+This numerical score is very simple.
+
+00:01:49.200 --> 00:01:52.560
+It's just based on matching things.
+
+00:01:52.560 --> 00:01:59.200
+So, for example, we can ask elfeed
+
+01:59.200 --> 00:02:05.040
+to explain this. So if we say = x,
+
+02:05.040 --> 00:02:08.720
+then this just says that
+
+00:02:08.720 --> 00:02:10.000
+this matches three rules
+
+00:02:10.000 --> 00:02:12.720
+for a score of 76. This paper.
+
+00:02:12.720 --> 00:02:14.959
+This is simply because I am searching
+
+00:02:14.959 --> 00:02:16.800
+for these keywords
+
+00:02:16.800 --> 00:02:19.040
+that are very interesting to me,
+
+00:02:19.040 --> 00:02:20.879
+such as neural networks
+
+00:02:20.879 --> 00:02:22.879
+or federated learning.
+
+00:02:22.879 --> 00:02:28.959
+And now, if I see a paper here
+
+00:02:28.959 --> 00:02:30.238
+that I am interested in...
+
+00:02:30.239 --> 00:02:32.720
+Let's say I'm interested in this paper
+
+00:02:32.720 --> 00:02:35.040
+about Gaussian Process Inference,
+
+02:35.040 --> 00:02:36.640
+then I want to store it
+
+00:02:36.640 --> 00:02:40.160
+in my local library. So I want the PDF
+
+00:02:40.160 --> 00:02:41.920
+and I want to be able to cite it
+
+00:02:41.920 --> 00:02:44.000
+in the future. To do that,
+
+00:02:44.000 --> 00:02:46.080
+I use a package called org-ref
+
+00:02:46.080 --> 00:02:54.640
+that allows me to fetch papers from arXiv.
+
+00:02:54.640 --> 00:02:56.720
+So here I wrote a helper function,
+
+00:02:56.720 --> 00:02:59.200
+this elfeed-entry-to-arxiv
+
+02:59.200 --> 00:03:02.480
+that automatically gets this paper.
+
+00:03:02.480 --> 00:03:03.840
+It asks me where to put it,
+
+00:03:03.840 --> 00:03:07.840
+it completes with my default libraries,
+
+03:07.840 --> 00:03:13.360
+and then it fetches the paper from arXiv
+
+03:13.360 --> 00:03:16.159
+and places it in this folder,
+
+00:03:16.159 --> 00:03:20.000
+and also places it in my bibliography file
+
+00:03:20.000 --> 00:03:23.280
+which is written in BibLaTex.
+
+03:23.280 --> 00:03:30.239
+So here, if we search for this paper now,
+
+03:30.239 --> 00:03:35.200
+we find that it is in our library.
+
+03:35.200 --> 00:03:38.000
+This library interface
+
+00:03:38.000 --> 00:03:41.280
+is from a package called citar,
+
+00:03:41.280 --> 00:03:44.000
+and I have customized it quite a bit
+
+00:03:44.000 --> 00:03:48.879
+to display all of the papers in my library
+
+03:48.879 --> 00:03:50.559
+in this format.
+
+03:50.560 --> 00:03:55.439
+This just reads from a BibLaTeX file.
+
+00:03:55.439 --> 00:03:59.519
+So if we open it like this,
+
+03:59.519 --> 00:04:02.879
+you'll see that this is the
+
+04:02.879 --> 00:04:06.640
+the entry that it placed.
+
+04:06.640 --> 00:04:10.959
+One of the interesting things here is that
+
+04:10.959 --> 00:04:13.519
+org-ref actually doesn't really fetch
+
+00:04:13.519 --> 00:04:16.079
+all of the entries in this format.
+
+00:04:16.079 --> 00:04:18.639
+Moreover, I want all the entries in my file
+
+00:04:18.639 --> 00:04:20.160
+to look quite similar,
+
+04:20.160 --> 00:04:23.520
+and to have this very similar look,
+
+04:23.520 --> 00:04:25.440
+and the way I accomplish that is by
+
+00:04:25.440 --> 00:04:28.960
+using several tools and chaining them.
+
+04:28.960 --> 00:04:37.280
+So in order to see this...
+
+04:37.280 --> 00:04:39.600
+So here, this is the function
+
+04:39.600 --> 00:04:41.680
+that I used to...
+
+04:41.680 --> 00:04:46.720
+This is basically run as a hook after each time
+
+04:46.720 --> 00:04:49.680
+Emacs modifies the bibliography file,
+
+04:49.680 --> 00:04:52.320
+and it runs rebiber
+
+00:04:52.320 --> 00:04:56.479
+which gets the conference versions
+
+00:04:56.479 --> 00:04:58.320
+of papers that I fetch from arXiv,
+
+00:04:58.320 --> 00:05:00.800
+because arXiv is a preprint directory,
+
+05:00.800 --> 00:05:05.360
+and then biber normalizes the arXiv file
+
+05:05.360 --> 00:05:07.919
+to have a consistent look,
+
+00:05:07.919 --> 00:05:10.320
+and then I apply just some substitutions
+
+00:05:10.320 --> 00:05:12.960
+which I like more.
+
+05:12.960 --> 00:05:14.560
+Finally, I have the whole thing
+
+00:05:14.560 --> 00:05:16.639
+under version control.
+
+05:16.639 --> 00:05:20.000
+This function, reformat-bib-library,
+
+00:05:20.000 --> 00:05:21.840
+I make it into a hook
+
+00:05:21.840 --> 00:05:24.720
+and I run it every time after I save.
+
+05:24.720 --> 00:05:27.039
+It just checks if the current buffer
+
+05:27.039 --> 00:05:29.039
+is the main bib library.
+
+00:05:29.039 --> 00:05:31.840
+We will just reformat the library.
+
+00:05:31.840 --> 00:05:33.680
+This allows me to keep the library
+
+00:05:33.680 --> 00:05:37.199
+looking all consistent like this.
+
+05:37.199 --> 00:05:39.120
+By the way, all of the code is available.
+
+05:39.120 --> 00:05:40.880
+You don't have to get it from the video.
+
+05:40.880 --> 00:05:44.479
+I will attach it as a GitHub gist.
+
+05:48.720 --> 00:05:49.919
+One of the things
+
+00:05:49.919 --> 00:05:51.520
+that are really important
+
+00:05:51.520 --> 00:05:54.080
+is that I want to be able to keep notes
+
+00:05:54.080 --> 00:05:56.160
+on papers that I read.
+
+05:56.160 --> 00:05:58.479
+For example, here are some of
+
+00:05:58.479 --> 00:06:00.319
+my existing notes.
+
+06:00.319 --> 00:06:04.720
+Now, let's add a note to the paper
+
+00:06:04.720 --> 00:06:06.080
+that we just got.
+
+00:06:06.080 --> 00:06:08.800
+So the the pipeline here is that
+
+00:06:08.800 --> 00:06:12.080
+I use citar with embark,
+
+06:12.080 --> 00:06:13.199
+which is another library,
+
+00:06:13.199 --> 00:06:15.600
+but you can use any other library
+
+00:06:15.600 --> 00:06:17.039
+just for completion
+
+00:06:17.039 --> 00:06:19.600
+and acting upon completion, like ivy,
+
+06:19.600 --> 00:06:21.360
+and I ask it to open notes
+
+00:06:21.360 --> 00:06:23.680
+and then it asks me how to capture it.
+
+00:06:23.680 --> 00:06:25.120
+So these capture templates
+
+00:06:25.120 --> 00:06:27.440
+are handled by the org-roam package,
+
+00:06:27.440 --> 00:06:30.400
+which is a very, very interesting package
+
+00:06:30.400 --> 00:06:32.560
+for note-taking.
+
+06:32.560 --> 00:06:36.160
+org-roam, among other things, allows us
+
+00:06:36.160 --> 00:06:38.800
+to write linkable notes in Org mode,
+
+06:38.800 --> 00:06:42.400
+and moreover, it is very extensible.
+
+06:42.400 --> 00:06:45.600
+There is another package called org-roam-bibtex
+
+00:06:45.600 --> 00:06:47.840
+that allows us to attach these nodes
+
+00:06:47.840 --> 00:06:50.000
+to bibliography files,
+
+00:06:50.000 --> 00:06:51.919
+which is what I'm doing right now.
+
+06:51.919 --> 00:06:54.800
+For example, I set up the capture template
+
+00:06:54.800 --> 00:06:57.680
+such that when I press s
+
+00:06:57.680 --> 00:07:01.440
+for short bibliography reference,
+
+07:01.440 --> 00:07:04.800
+it will make a new headline
+
+07:04.800 --> 00:07:08.479
+in my "Reference Notes" note,
+
+07:08.479 --> 00:07:10.479
+and I can write things here
+
+00:07:10.479 --> 00:07:14.960
+(so, for example, "seems interesting")
+
+07:14.960 --> 00:07:18.000
+and then note here that it added this paper
+
+00:07:18.000 --> 00:07:24.319
+to ROAM_REFS, so this means that
+
+07:24.319 --> 00:07:26.720
+when I look at these papers using citar,
+
+07:26.720 --> 00:07:30.319
+it will be able to find this note.
+
+07:30.319 --> 00:07:34.000
+Similarly, we can also add long-form notes.
+
+00:07:34.000 --> 00:07:37.199
+For example, if I do this and I add r,
+
+07:37.199 --> 00:07:39.840
+it will create an entirely new file
+
+00:07:39.840 --> 00:07:48.000
+that I can take detailed notes in.
+
+07:48.000 --> 00:07:50.639
+The strengths of org-roam is that
+
+00:07:50.639 --> 00:07:53.520
+I can do things like linking papers.
+
+07:53.520 --> 00:07:55.360
+For example, here are several books
+
+07:55.360 --> 00:08:00.000
+that I am reading. This file just collects
+
+00:08:00.000 --> 00:08:02.319
+these books so that I can find them
+
+00:08:02.319 --> 00:08:03.919
+for easy reference.
+
+08:03.919 --> 00:08:07.599
+Of course, I can link these files from inside.
+
+08:07.599 --> 00:08:13.759
+You can see here that I also use org-cite
+
+08:13.759 --> 00:08:18.720
+to cite other files, and I can act upon this
+
+08:18.720 --> 00:08:21.199
+and open the notes corresponding to
+
+00:08:21.199 --> 00:08:28.240
+this other book.
+
+08:28.240 --> 00:08:30.319
+So I'm a little short on time.
+
+00:08:30.319 --> 00:08:32.719
+I cannot go into detail on everything,
+
+00:08:32.719 --> 00:08:34.560
+but I will share my configuration,
+
+00:08:34.560 --> 00:08:37.919
+and I hope that this will inspire other people
+
+00:08:37.919 --> 00:08:43.919
+to also use Emacs for their academic workflows.
+
+08:43.919 --> 00:08:44.919
+Thank you so much.
+
+00:08:44.919 --> 00:08:47.279
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt b/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt
new file mode 100644
index 00000000..9bba8336
--- /dev/null
+++ b/2021/captions/emacsconf-2021-structural--tree-edit-structural-editing-for-java-python-c-and-beyond--ethan-leba--main.vtt
@@ -0,0 +1,817 @@
+WEBVTT
+
+00:00.080 --> 00:01.360
+Hi. My name is Ethan,
+
+00:01.360 --> 00:02.320
+and today I'm going to be speaking
+
+00:02.320 --> 00:04.240
+about tree-edit, which is a package
+
+00:04.240 --> 00:06.160
+which aims to bring structural editing
+
+00:06.160 --> 00:08.320
+to everyday languages.
+
+00:08.320 --> 00:10.559
+So what is structural editing?
+
+00:10.559 --> 00:11.657
+The way that we typically
+
+00:11.657 --> 00:12.578
+write code today
+
+00:12.578 --> 00:14.480
+is working with characters, words,
+
+00:14.480 --> 00:16.206
+lines, paragraphs, and so on,
+
+00:16.206 --> 00:18.600
+and these objects have no real relation
+
+00:18.600 --> 00:21.520
+to the structure of programming languages.
+
+00:21.520 --> 00:24.667
+In contrast, tree-edit's editing operations
+
+00:24.667 --> 00:26.897
+map exactly to the structure
+
+00:26.897 --> 00:28.411
+of the programming language,
+
+00:28.411 --> 00:30.303
+which is typically in a tree form
+
+00:30.303 --> 00:32.053
+with different types of nodes
+
+00:32.053 --> 00:33.920
+such as identifiers, expressions,
+
+00:33.920 --> 00:35.957
+and statements. Using this structure
+
+00:35.957 --> 00:37.548
+can enable much more powerful
+
+00:37.548 --> 00:39.200
+editing operations,
+
+00:39.200 --> 00:40.769
+and crucially editing operations
+
+00:40.769 --> 00:42.081
+that map much more closely
+
+00:42.081 --> 00:44.960
+to the way that we think about code.
+
+00:44.960 --> 00:46.140
+tree-edit was inspired by
+
+00:46.140 --> 00:47.386
+paredit and lispy,
+
+00:47.386 --> 00:48.320
+which are two great
+
+00:48.320 --> 00:50.271
+Lisp structural editors.
+
+00:50.271 --> 00:52.383
+However, what makes tree-edit unique
+
+00:52.383 --> 00:54.480
+is that it can work with many languages,
+
+00:54.480 --> 00:55.759
+such as some of the
+
+00:55.759 --> 00:59.826
+more mainstream languages like C, Java,
+
+00:59.826 --> 01:01.600
+Python, and so on.
+
+01:01.600 --> 01:03.273
+So now I'm going to show off tree-edit
+
+01:03.273 --> 01:05.705
+in action, working with a Java program.
+
+01:05.705 --> 01:07.237
+So we can see on the left,
+
+01:07.237 --> 01:09.119
+we have a syntax tree,
+
+01:09.119 --> 01:11.560
+and the node in bold is what I call
+
+01:11.560 --> 01:13.780
+the current node. So instead of
+
+01:13.780 --> 01:15.100
+the concept of a cursor,
+
+01:15.100 --> 01:17.600
+where we have a point in 2D space,
+
+01:17.600 --> 01:20.285
+we instead work with a current node
+
+01:20.285 --> 01:22.729
+which all our editing operations
+
+01:22.729 --> 01:23.840
+take place upon.
+
+01:23.840 --> 01:26.479
+So we can move up and down,
+
+01:26.479 --> 01:28.720
+or rather side to side,
+
+01:28.720 --> 01:31.160
+move inwards down to the children
+
+01:31.160 --> 01:33.920
+of the tree, back up to the parents.
+
+01:33.920 --> 01:36.799
+We can also jump to a node by its type.
+
+01:36.799 --> 01:38.768
+So we're going to jump to
+
+01:38.768 --> 01:40.880
+a variable declaration.
+
+01:40.880 --> 01:44.399
+We can jump to an if statement.
+
+01:44.399 --> 01:46.880
+And as you might have noticed,
+
+01:46.880 --> 01:48.360
+tree-edit by default
+
+01:48.360 --> 01:51.337
+uses a vim-style mode of editing,
+
+01:51.337 --> 01:55.119
+so it's a verb, which would be jump,
+
+01:55.119 --> 01:56.874
+and then a type,
+
+01:56.874 --> 02:00.799
+which would be if statement.
+
+02:00.799 --> 02:03.346
+So now I'll show off
+
+02:03.346 --> 02:06.144
+the syntax tree modification in action.
+
+02:06.144 --> 02:08.000
+So if I delete this deleteme node,
+
+02:08.000 --> 02:10.112
+we can see the node is deleted,
+
+02:10.112 --> 02:12.049
+and also the comma is removed
+
+02:12.049 --> 02:13.920
+since it's no longer needed.
+
+02:13.920 --> 02:16.720
+We can add some nodes back in.
+
+02:16.720 --> 02:18.160
+Here we just have a placeholder node
+
+02:18.160 --> 02:20.391
+called tree, which we can swap out
+
+02:20.391 --> 02:21.875
+with whatever we like.
+
+02:21.875 --> 02:24.560
+So if we want to put in, for example,
+
+02:24.560 --> 02:29.280
+a plus or minus operator,
+
+02:29.280 --> 02:30.879
+it'll put these two TREE things here
+
+02:30.879 --> 02:32.634
+since there needs to be something there,
+
+02:32.634 --> 02:37.360
+but we can go fill them out as we like.
+
+02:37.360 --> 02:38.595
+So that's what that is.
+
+02:38.595 --> 02:41.920
+Then I'll delete these again.
+
+02:41.920 --> 02:43.709
+Next we can see raising.
+
+02:43.709 --> 02:45.280
+So if I raise reader,
+
+02:45.280 --> 02:46.160
+then it will replace
+
+02:46.160 --> 02:47.342
+the outer function call
+
+02:47.342 --> 02:48.583
+with the node itself.
+
+02:48.583 --> 02:50.948
+I could raise it again.
+
+02:50.948 --> 02:53.363
+The opposite operation to that
+
+02:53.363 --> 02:57.200
+is wrapping. So I can wrap reader
+
+02:57.200 --> 02:59.519
+back into function call,
+
+02:59.519 --> 03:03.009
+and I could wrap this again
+
+03:03.009 --> 03:08.480
+if I wanted to. So that is wrapping.
+
+03:08.480 --> 03:12.640
+We can also do it on a statement level,
+
+03:12.640 --> 03:13.760
+so if I want to wrap this
+
+03:13.760 --> 03:14.480
+in an if statement,
+
+03:14.480 --> 03:17.034
+I can wrap the statement,
+
+03:17.034 --> 03:18.400
+and there we go.
+
+03:18.400 --> 03:21.280
+And let's just raise it back up,
+
+03:21.280 --> 03:23.200
+raise it again.
+
+03:23.200 --> 03:25.760
+There we go. Finally, I'll show off
+
+03:26.959 --> 03:28.720
+slurping and barfing,
+
+03:28.720 --> 03:32.256
+which... a little bit gross words,
+
+03:32.256 --> 03:34.879
+but I think it accurately describes
+
+03:34.879 --> 03:37.519
+the action, so let me just add
+
+03:37.519 --> 03:41.120
+a couple breaks here.
+
+03:41.120 --> 03:44.748
+So let's say we want
+
+03:44.748 --> 03:46.779
+this if statement and a couple of breaks
+
+03:46.779 --> 03:48.319
+to be inside of the while,
+
+03:48.319 --> 03:50.959
+so we can just slurp this up,
+
+03:50.959 --> 03:52.433
+and if we don't actually want them,
+
+03:52.433 --> 03:54.528
+we can barf them back out.
+
+03:54.528 --> 03:56.736
+So that's where those words
+
+03:56.736 --> 03:57.840
+have come from.
+
+03:57.840 --> 04:01.120
+And we can just... delete as we please.
+
+04:01.120 --> 04:03.826
+So yeah, that's a quick overview
+
+04:03.826 --> 04:07.360
+of the tree editing plugin in action.
+
+04:07.360 --> 04:08.900
+So now I want to talk a little bit
+
+04:08.900 --> 04:12.080
+about the implementation of tree-edit.
+
+04:12.080 --> 04:14.400
+Tree-edit uses the tree-sitter parser
+
+04:14.400 --> 04:17.919
+to convert text into a syntax tree.
+
+04:17.919 --> 04:21.501
+Tree-sitter is used by GitHub
+
+04:21.501 --> 04:22.752
+for its syntax highlighting,
+
+04:22.752 --> 04:25.280
+and it's available in a bunch of editors,
+
+04:25.280 --> 04:27.120
+including Emacs, so it's
+
+04:27.120 --> 04:28.960
+a fairly standard tool.
+
+04:28.960 --> 04:30.960
+However, the unique part about tree-edit
+
+04:30.960 --> 04:32.479
+is how it performs
+
+04:32.479 --> 04:34.479
+correct editing operations
+
+04:34.479 --> 04:35.919
+on the syntax tree
+
+04:35.919 --> 04:38.320
+and then converts that back into text.
+
+04:38.320 --> 04:41.759
+So to do that, we use miniKanren,
+
+04:41.759 --> 04:43.759
+and miniKanren is an embedded
+
+04:43.759 --> 04:45.120
+domain-specific language
+
+04:45.120 --> 04:47.440
+for logic programming.
+
+04:47.440 --> 04:50.080
+So what exactly does that mean?
+
+04:50.080 --> 04:51.280
+In our case, it's just
+
+04:51.280 --> 04:54.240
+an Emacs Lisp library called reazon,
+
+04:54.240 --> 04:56.720
+which exposes a set of macros
+
+04:56.720 --> 04:58.320
+which enables us to program
+
+04:58.320 --> 05:01.360
+in this logic programming style.
+
+05:01.360 --> 05:03.280
+I'm not going to get into the details
+
+05:03.280 --> 05:05.520
+of how logic programming works.
+
+05:05.520 --> 05:07.520
+However, one of the most unique aspects
+
+05:07.520 --> 05:09.919
+about it is that we can define
+
+05:09.919 --> 05:13.600
+a predicate and then figure out
+
+05:13.600 --> 05:15.280
+all the inputs to the predicate
+
+05:15.280 --> 05:17.759
+that would hold to be true.
+
+05:17.759 --> 05:19.360
+So in this case,
+
+05:19.360 --> 05:21.520
+we have our query variable q,
+
+05:21.520 --> 05:24.479
+which will be what the output is,
+
+05:24.479 --> 05:29.120
+and we are asking for all the values of q
+
+05:29.120 --> 05:32.080
+that pass this predicate of
+
+05:32.080 --> 05:34.479
+being set-equal to 1 2 3 4.
+
+05:34.479 --> 05:36.880
+So if we execute this,
+
+05:36.880 --> 05:40.080
+it will take a little time...
+
+05:40.080 --> 05:41.520
+It shouldn't be taking this long.
+
+05:41.520 --> 05:43.280
+Oh, there it goes.
+
+05:43.280 --> 05:45.919
+We can see that it's generated
+
+05:45.919 --> 05:47.520
+a bunch of different answers
+
+05:47.520 --> 05:51.199
+that are all set-equal to 1 2 3 4.
+
+05:51.199 --> 05:52.880
+So it's just a bunch of
+
+05:52.880 --> 05:57.280
+different permutations of that.
+
+05:57.280 --> 05:59.120
+We can extend this notion
+
+05:59.120 --> 06:03.600
+to a parser. In tree-edit, we've defined
+
+06:03.600 --> 06:05.360
+a parser in reazon,
+
+06:05.360 --> 06:10.800
+and we can use that parser to figure out
+
+06:10.800 --> 06:15.919
+any tokens that match the type of node
+
+06:15.919 --> 06:16.880
+that we're trying to generate.
+
+06:16.880 --> 06:19.600
+If I execute this, we can see
+
+06:19.600 --> 06:21.199
+that reazon has generated
+
+06:21.199 --> 06:23.440
+these five answers that match
+
+06:23.440 --> 06:26.960
+what a try statement is in Java.
+
+06:26.960 --> 06:29.680
+Here we can see we can have
+
+06:29.680 --> 06:31.919
+an infinite amount of catches
+
+06:31.919 --> 06:34.720
+optionally ending with a finally,
+
+06:34.720 --> 06:36.160
+and we always have to start
+
+06:36.160 --> 06:39.039
+with a try and a block.
+
+06:39.039 --> 06:40.000
+We can see this again
+
+06:40.000 --> 06:42.400
+with an argument list.
+
+06:42.400 --> 06:43.520
+We have the opening and closing
+
+06:43.520 --> 06:45.759
+parentheses, and expressions
+
+06:45.759 --> 06:49.120
+which are comma delimited.
+
+06:49.120 --> 06:51.759
+Now, for a more complex example, and
+
+06:51.759 --> 06:53.680
+something that is along the lines
+
+06:53.680 --> 06:55.199
+of what's in tree-edit,
+
+06:55.199 --> 06:57.919
+is if we have this x here
+
+06:57.919 --> 07:01.599
+and we want to insert another expression,
+
+07:01.599 --> 07:05.759
+so x, y. We can assert
+
+07:05.759 --> 07:07.680
+that there's some new tokens,
+
+07:07.680 --> 07:10.160
+and we want an expression
+
+07:10.160 --> 07:11.840
+to be in those new tokens,
+
+07:11.840 --> 07:13.280
+and we can essentially state
+
+07:13.280 --> 07:15.039
+where we want these new tokens to go
+
+07:15.039 --> 07:19.759
+within the old list of tokens,
+
+07:19.759 --> 07:21.599
+so replacing it
+
+07:21.599 --> 07:23.360
+after the previous expression,
+
+07:23.360 --> 07:26.000
+before the closed parentheses,
+
+07:26.000 --> 07:26.880
+and then we can state
+
+07:26.880 --> 07:28.560
+that the whole thing parses.
+
+07:28.560 --> 07:30.080
+If we run that, we can see that
+
+07:30.080 --> 07:32.479
+as we wanted earlier,
+
+07:32.479 --> 07:37.120
+which was a comma and then expression,
+
+07:37.120 --> 07:39.120
+we have that here as well.
+
+07:39.120 --> 07:41.759
+We can see this again.
+
+07:41.759 --> 07:42.720
+Here, the only change is that
+
+07:42.720 --> 07:45.280
+we've moved the tokens to be
+
+07:45.280 --> 07:46.240
+before the expression.
+
+07:46.240 --> 07:48.800
+So we want to put an expression
+
+07:48.800 --> 07:50.560
+before this x, so we want something
+
+07:50.560 --> 07:52.560
+like y, x,
+
+07:52.560 --> 07:54.240
+and if we execute that,
+
+07:54.240 --> 07:57.919
+we can see that it is correctly asserted
+
+07:57.919 --> 07:59.039
+that it would be an expression
+
+07:59.039 --> 08:01.520
+and then a comma afterwards.
+
+08:01.520 --> 08:02.960
+One last example is
+
+08:02.960 --> 08:04.400
+if we have an if statement
+
+08:04.400 --> 08:07.759
+and we want to add an extra block,
+
+08:07.759 --> 08:11.599
+we can see that it correctly figures out
+
+08:11.599 --> 08:12.400
+that we need an else
+
+08:12.400 --> 08:13.840
+in order to have another statement
+
+08:13.840 --> 08:16.720
+in an if statement.
+
+08:16.720 --> 08:19.759
+So, next steps for tree-edit.
+
+08:19.759 --> 08:21.039
+The core of tree-edit is in place
+
+08:21.039 --> 08:23.120
+but there's a lot of usability features
+
+08:23.120 --> 08:25.360
+to add, and a lot of testing
+
+08:25.360 --> 08:26.400
+that needs to be done
+
+08:26.400 --> 08:29.599
+in order to iron out any bugs that exist.
+
+08:29.599 --> 08:30.960
+I'd like to add support
+
+08:30.960 --> 08:35.200
+for as many languages as is possible.
+
+08:35.200 --> 08:36.240
+I think my next step
+
+08:36.240 --> 08:38.490
+will probably be Python.
+
+08:38.490 --> 08:41.279
+There's some performance improvements
+
+08:41.279 --> 08:44.080
+that need to be made, since using this
+
+08:44.080 --> 08:45.519
+logic programming language
+
+08:45.519 --> 08:47.600
+is fairly intensive.
+
+08:47.600 --> 08:48.800
+There's some optimizations
+
+08:48.800 --> 08:50.560
+both on the library side
+
+08:50.560 --> 08:51.519
+and on tree-edit side
+
+08:51.519 --> 08:53.360
+that can be made.
+
+08:53.360 --> 08:55.519
+Contributors are of course welcome,
+
+08:55.519 --> 09:00.000
+as tree-edit is an open source project.
+
+09:00.000 --> 09:03.360
+For future work, I think the prospect
+
+09:03.360 --> 09:04.480
+of voice controlled development
+
+09:04.480 --> 09:06.240
+with tree-edit is actually something
+
+09:06.240 --> 09:07.920
+that's really exciting,
+
+09:07.920 --> 09:11.120
+since syntax can be very cumbersome
+
+09:11.120 --> 09:12.320
+when you're working with
+
+09:12.320 --> 09:14.240
+voice control software.
+
+09:14.240 --> 09:16.320
+I can envision something like
+
+09:16.320 --> 09:19.440
+saying, "Jump to identifier,
+
+09:19.440 --> 09:26.640
+add plus operator, jump to if statement,
+
+09:26.640 --> 09:30.480
+wrap if statement in while."
+
+09:30.480 --> 09:31.519
+So that's something
+
+09:31.519 --> 09:33.519
+I'd like to investigate.
+
+09:33.519 --> 09:35.040
+I also would just like to
+
+09:35.040 --> 09:37.279
+provide the core functionality
+
+09:37.279 --> 09:39.120
+of [tree-edit] as something
+
+09:39.120 --> 09:40.399
+that can be used as a library
+
+09:40.399 --> 09:41.920
+for other projects,
+
+09:41.920 --> 09:43.839
+such as refactoring packages,
+
+09:43.839 --> 09:46.240
+or other non-Vim-style approaches,
+
+09:46.240 --> 09:49.200
+and just making the syntax generation
+
+09:49.200 --> 09:52.080
+available for reuse.
+
+09:52.080 --> 09:53.760
+Finally, I'd like to thank
+
+09:53.760 --> 09:56.399
+the authors of reazon
+
+09:56.399 --> 09:58.399
+and elisp-tree-sitter,
+
+09:58.399 --> 10:00.185
+which in turn packages
+
+10:00.185 --> 10:02.079
+tree-sitter itself,
+
+10:02.079 --> 10:05.440
+since tree-edit relies very heavily
+
+10:05.440 --> 10:07.680
+on these two packages.
+
+10:07.680 --> 10:08.959
+I'd also like to thank
+
+10:08.959 --> 10:10.480
+the author of lispy,
+
+10:10.480 --> 10:12.720
+since a lot of the design decisions
+
+10:12.720 --> 10:14.800
+when it comes to the editing operations
+
+10:14.800 --> 10:18.560
+are based very heavily on lispy.
+
+10:18.560 --> 10:20.320
+So that's the end of my talk.
+
+10:20.320 --> 10:22.959
+Thank you for watching.
+
+10:22.959 --> 10:23.959
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt b/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt
new file mode 100644
index 00000000..aee8f7ba
--- /dev/null
+++ b/2021/captions/emacsconf-2021-teach--using-org-mode-to-teach-programming--daniel-german--main.vtt
@@ -0,0 +1,1663 @@
+WEBVTT
+
+00:01.040 --> 00:03.520
+Hello, everybody. My name is Daniel German.
+
+00:03.520 --> 00:00:04.799
+I'm a professor of computer science
+
+00:00:04.799 --> 00:00:06.080
+at the University of Victoria,
+
+00:00:06.080 --> 00:00:07.680
+and I have been teaching programming
+
+00:00:07.680 --> 00:00:12.080
+for more than 10 years.
+
+00:12.080 --> 00:00:14.639
+I want to tell you today
+
+00:00:14.639 --> 00:00:15.759
+about how I have been
+
+00:00:15.759 --> 00:00:17.680
+using Emacs effectively
+
+00:00:17.680 --> 00:00:20.000
+during the last 10 years,
+
+00:00:20.000 --> 00:00:22.880
+and to try to improve how I not only
+
+00:00:22.880 --> 00:00:24.720
+create content for my students,
+
+00:24.720 --> 00:00:26.480
+but also how I deliver it,
+
+00:00:26.480 --> 00:00:27.680
+and particularly how,
+
+00:00:27.680 --> 00:00:29.119
+within the last five years,
+
+00:00:29.119 --> 00:00:31.599
+I have been using Org mode
+
+00:00:31.599 --> 00:00:33.200
+in a very effective way
+
+00:33.200 --> 00:00:35.600
+that benefits both
+
+00:00:35.600 --> 00:00:38.239
+my students and myself
+
+00:38.239 --> 00:00:40.480
+in the creation and the delivery
+
+00:00:40.480 --> 00:00:42.399
+of content.
+
+00:42.399 --> 00:00:45.200
+Let me switch to my computer.
+
+00:00:45.200 --> 00:00:46.480
+I'm going to remove myself
+
+00:00:46.480 --> 00:00:47.840
+because I can use
+
+00:00:47.840 --> 00:00:50.800
+all the real-estate screen.
+
+00:51.840 --> 00:54.079
+The goal of my presentation today
+
+00:54.079 --> 00:00:55.600
+is really to give you
+
+00:00:55.600 --> 00:00:59.280
+a little bit of an overview
+
+00:00:59.280 --> 00:01:03.440
+of how I have been able to
+
+01:03.440 --> 00:01:06.240
+combine the use of Org mode
+
+00:01:06.240 --> 00:01:08.560
+and with some other tools.
+
+00:01:08.560 --> 00:01:10.880
+I'll talk about specifically about them
+
+00:01:10.880 --> 00:01:13.680
+and then also offer some suggestions
+
+00:01:13.680 --> 00:01:14.640
+and recommendations
+
+00:01:14.640 --> 00:01:16.240
+in how to get it started.
+
+01:16.240 --> 00:01:18.799
+I have created a configuration,
+
+00:01:18.799 --> 00:01:20.080
+a set of configuration files
+
+00:01:20.080 --> 00:01:20.799
+that you can use.
+
+00:01:20.799 --> 00:01:22.880
+I will describe them towards the end.
+
+01:22.880 --> 00:01:28.240
+Hopefully, it will make it easy
+
+00:01:28.240 --> 00:01:31.439
+for all of you to get started on using it.
+
+01:31.439 --> 01:33.200
+So we start talking a little bit
+
+01:33.200 --> 00:01:34.079
+about the challenges
+
+00:01:34.079 --> 00:01:35.119
+of teaching programming.
+
+00:01:35.119 --> 00:01:37.200
+I think that the fundamental one
+
+00:01:37.200 --> 00:01:41.680
+is that keeping the content
+
+00:01:41.680 --> 00:01:45.280
+and the slides up to date is hard,
+
+00:01:45.280 --> 00:01:46.960
+because the content is programs.
+
+00:01:46.960 --> 00:01:47.840
+There are programs
+
+00:01:47.840 --> 00:01:50.399
+that sometimes have errors,
+
+00:01:50.399 --> 00:01:53.759
+and sometimes the slides are
+
+00:01:53.759 --> 00:01:58.079
+incomplete snippets of code, and that
+
+00:01:58.079 --> 00:02:00.240
+once they go into the slides software,
+
+00:02:00.240 --> 00:02:01.840
+like Google Slides or PowerPoint,
+
+00:02:01.840 --> 00:02:04.159
+they're essentially static objects.
+
+02:05.520 --> 00:02:07.439
+If we need to update them,
+
+00:02:07.439 --> 00:02:09.920
+we basically don't know
+
+00:02:09.920 --> 00:02:12.160
+whether the update code actually works,
+
+00:02:12.160 --> 00:02:13.440
+or does it work?
+
+00:02:13.440 --> 00:02:16.000
+Also, we cannot insert automatically
+
+00:02:16.000 --> 00:02:16.400
+the output.
+
+00:02:16.400 --> 00:02:18.480
+We'll have to run the snippet outside,
+
+00:02:18.480 --> 00:02:20.560
+and run it, and then insert that code.
+
+00:02:20.560 --> 00:02:22.080
+So that's very cumbersome.
+
+00:02:22.080 --> 00:02:23.200
+It's really, really one of the
+
+00:02:23.200 --> 00:02:26.080
+major challenges of using a slide software
+
+00:02:26.080 --> 00:02:29.360
+to teach programming.
+
+02:29.360 --> 00:02:30.879
+The other thing is that
+
+00:02:30.879 --> 00:02:32.000
+during the presentation,
+
+00:02:32.000 --> 00:02:33.440
+there's nothing you can do with the code.
+
+00:02:33.440 --> 00:02:34.480
+You might be able to edit it,
+
+00:02:34.480 --> 00:02:35.440
+but you cannot run it.
+
+00:02:35.440 --> 00:02:37.360
+You have to move outside of the
+
+00:02:37.360 --> 00:02:38.640
+presentation software
+
+00:02:38.640 --> 00:02:41.200
+to be able to execute the code.
+
+02:42.800 --> 00:02:44.640
+The last one is kind of related to
+
+00:02:44.640 --> 00:02:46.959
+the previous two.
+
+02:46.959 --> 00:02:48.800
+You don't have a single file
+
+00:02:48.800 --> 00:02:51.121
+and your information is spread across
+
+00:02:51.121 --> 00:02:52.879
+many, many different files,
+
+00:02:52.879 --> 00:02:54.080
+especially if you have lots of
+
+00:02:54.080 --> 00:02:55.760
+different snippets in your slides.
+
+00:02:55.760 --> 00:02:56.959
+You probably have a lot of
+
+00:02:56.959 --> 00:02:59.440
+different small files, each of them
+
+02:59.440 --> 03:01.599
+contributing something to your slides,
+
+03:01.599 --> 03:06.239
+and so it becomes a pain to manage.
+
+03:07.280 --> 00:03:10.080
+All of this is where Org mode
+
+00:03:10.080 --> 00:03:12.640
+really excels. Org mode is capable of
+
+00:03:12.640 --> 00:03:15.840
+doing everything, and it needs
+
+00:03:15.840 --> 00:03:18.400
+a little bit of help from some friends.
+
+00:03:18.400 --> 00:03:22.159
+I will describe what I mean by that.
+
+00:03:22.159 --> 00:03:23.040
+But the other thing
+
+00:03:23.040 --> 00:03:24.480
+that is also very valuable
+
+03:24.480 --> 00:03:27.440
+is that it's within the magic of Emacs.
+
+00:03:27.440 --> 00:03:30.480
+I absolutely love to be able to
+
+03:30.480 --> 00:03:32.879
+work with text within Emacs.
+
+00:03:32.879 --> 00:03:34.799
+I enjoy actually creating my notes
+
+00:03:34.799 --> 00:03:36.640
+in Org mode way more than if I was
+
+00:03:36.640 --> 00:03:39.360
+making them in Google Slides.
+
+03:39.360 --> 00:03:42.400
+Let me start by giving you a short demo.
+
+00:03:42.400 --> 00:03:46.400
+I have been teaching programming in C++
+
+00:03:46.400 --> 00:03:47.519
+for around five years,
+
+00:03:47.519 --> 00:03:50.159
+and this was really the trigger towards
+
+03:50.159 --> 00:03:53.280
+trying to do everything within Org mode.
+
+00:03:53.280 --> 00:03:58.159
+So I have a repository in GitHub,
+
+00:03:58.159 --> 00:03:59.439
+and I think that GitHub
+
+00:03:59.439 --> 00:04:00.560
+is an excellent tool
+
+00:04:00.560 --> 00:04:04.480
+that works collaboration with Org mode.
+
+04:04.480 --> 00:04:05.439
+I'll describe actually
+
+00:04:05.439 --> 00:04:07.680
+what I mean by that.
+
+00:04:07.680 --> 00:04:09.680
+My lectures are essentially Org files.
+
+00:04:09.680 --> 00:04:12.480
+So, for example, let's go into
+
+00:04:12.480 --> 00:04:15.040
+one of these files.
+
+04:15.040 --> 00:04:16.799
+This is a an Org file.
+
+00:04:16.799 --> 00:04:21.199
+You can actually see it in the extension.
+
+04:21.199 --> 04:26.160
+I get a table of contents.
+
+04:26.160 --> 00:04:28.000
+GitHub creates or give us actually
+
+00:04:28.000 --> 00:04:31.280
+the ability to quickly jump, and it creates
+
+00:04:31.280 --> 00:04:32.880
+a dynamic table of contents,
+
+00:04:32.880 --> 00:04:33.759
+but I also can actually
+
+00:04:33.759 --> 00:04:35.280
+create it automatically,
+
+00:04:35.280 --> 00:04:36.800
+and then here it goes.
+
+00:04:36.800 --> 00:04:38.479
+This is the code that i have.
+
+00:04:38.479 --> 00:04:41.440
+This is a snippet
+
+00:04:41.440 --> 00:04:44.240
+that I present in the class.
+
+04:44.240 --> 00:04:45.680
+Let me actually show you
+
+00:04:45.680 --> 00:04:48.400
+how I do it within Emacs.
+
+04:48.400 --> 00:04:52.160
+So what I will do is the following.
+
+00:04:52.160 --> 00:04:55.440
+Let me try to open that file.
+
+04:57.919 --> 04:59.440
+Here's the file,
+
+04:59.440 --> 00:05:00.880
+and it's exactly the same
+
+00:05:00.880 --> 00:05:03.759
+that we were browsing in GitHub.
+
+00:05:03.759 --> 00:05:08.720
+What I do is I simply just scroll through
+
+05:08.720 --> 00:05:10.160
+the document. It's almost like
+
+00:05:10.160 --> 00:05:13.440
+movie credits at the end of the movie.
+
+00:05:13.440 --> 00:05:15.360
+I don't break them into chunks
+
+00:05:15.360 --> 00:05:16.639
+that I show in the screen.
+
+00:05:16.639 --> 00:05:18.320
+I see no point in doing that.
+
+00:05:18.320 --> 00:05:20.880
+What I do is I simply scroll through
+
+00:05:20.880 --> 00:05:24.160
+the text. The students are able to see
+
+00:05:24.160 --> 00:05:26.560
+the same information in GitHub
+
+00:05:26.560 --> 00:05:27.759
+on their computer,
+
+05:27.759 --> 00:05:29.680
+or they can print it if they want,
+
+00:05:29.680 --> 00:05:31.039
+and they are able to actually
+
+00:05:31.039 --> 00:05:32.560
+follow with me, and then having
+
+00:05:32.560 --> 00:05:33.759
+a much bigger picture
+
+05:33.759 --> 05:36.320
+than if i just show a very small snippet.
+
+05:36.320 --> 00:05:38.800
+In the case that the snippet is too big,
+
+00:05:38.800 --> 00:05:40.800
+for example, let's say this one
+
+00:05:40.800 --> 00:05:42.240
+actually doesn't cover the...
+
+00:05:42.240 --> 00:05:43.759
+covers more than full screen,
+
+00:05:43.759 --> 00:05:45.360
+I actually reduce the size
+
+00:05:45.360 --> 00:05:48.000
+and then give a little bit of
+
+00:05:48.000 --> 00:05:49.759
+an explanation of the whole thing,
+
+00:05:49.759 --> 00:05:51.600
+and then focus and say this is the line
+
+00:05:51.600 --> 00:05:53.600
+where we have to pay attention.
+
+05:53.600 --> 00:05:55.600
+Notice actually how I use color for that.
+
+00:05:55.600 --> 00:05:57.759
+I think that the ability to use color
+
+00:05:57.759 --> 00:05:59.759
+and typesetting is fundamental
+
+00:05:59.759 --> 00:06:01.520
+to be able to do this effectively,
+
+00:06:01.520 --> 00:06:02.720
+and the nice thing is that
+
+00:06:02.720 --> 00:06:04.160
+we can configure Org mode
+
+00:06:04.160 --> 00:06:05.840
+to be able to do most of this
+
+06:05.840 --> 06:08.160
+automatically.
+
+06:08.160 --> 00:06:09.360
+As I said before,
+
+00:06:09.360 --> 00:06:10.960
+one of the great advantages is that
+
+00:06:10.960 --> 00:06:13.600
+I can actually run the code dynamically.
+
+00:06:13.600 --> 00:06:15.360
+So let's say that the student says,
+
+00:06:15.360 --> 00:06:17.360
+"But what if I change that value to 10?"
+
+00:06:17.360 --> 00:06:18.560
+Well, let's try it.
+
+00:06:18.560 --> 00:06:20.560
+Let's change it, run it,
+
+06:20.560 --> 00:06:21.840
+and then you can see here
+
+00:06:21.840 --> 00:06:24.720
+that it has a 10.
+
+00:06:24.720 --> 00:06:26.960
+That's really powerful because
+
+00:06:26.960 --> 00:06:29.280
+you're not tied to
+
+00:06:29.280 --> 00:06:30.560
+what is the content you have
+
+00:06:30.560 --> 00:06:33.120
+on the slides. If you find an error
+
+00:06:33.120 --> 00:06:34.880
+or an omission, or you want to talk about
+
+06:34.880 --> 00:06:36.880
+something else, you can very quickly
+
+00:06:36.880 --> 00:06:40.720
+do it. You can add comments
+
+00:06:40.720 --> 00:06:42.080
+and then make some suggestions
+
+00:06:42.080 --> 00:06:43.840
+specifically to that,
+
+06:43.840 --> 00:06:45.680
+or worst-case scenario,
+
+00:06:45.680 --> 00:06:48.880
+if you really, really, need it,
+
+06:48.880 --> 00:06:55.440
+you can say, "Let's load it into..."
+
+00:06:55.440 --> 00:06:58.400
+Let's actually do some hand annotation.
+
+00:06:58.400 --> 00:07:00.319
+Let's actually say, "look at this thing,
+
+00:07:00.319 --> 00:07:01.840
+this is the value that I want you to
+
+07:01.840 --> 00:07:02.800
+concentrate on."
+
+00:07:02.800 --> 00:07:03.599
+It's not perfect.
+
+00:07:03.599 --> 00:07:04.960
+I'm not doing it with an Emacs.
+
+00:07:04.960 --> 00:07:06.960
+I wish there was a way to do it,
+
+00:07:06.960 --> 00:07:09.120
+but it is absolutely effective
+
+00:07:09.120 --> 00:07:10.720
+because I'm actually able to
+
+00:07:10.720 --> 00:07:12.800
+use the power. Notice that all that is
+
+07:12.800 --> 07:15.520
+exported is just the block, and also
+
+07:15.520 --> 07:22.400
+the color and typesetting,
+
+07:22.400 --> 00:07:24.560
+the typesetting of the content.
+
+00:07:24.560 --> 00:07:25.759
+So this is actually great.
+
+00:07:25.759 --> 00:07:30.639
+I have the colors red, purple, etc. etc.
+
+00:07:30.639 --> 00:07:34.160
+I love being able to do that.
+
+07:34.160 --> 00:07:35.919
+This is just a temporary file.
+
+00:07:35.919 --> 00:07:36.880
+I can actually discard it,
+
+00:07:36.880 --> 00:07:39.680
+and it doesn't really matter.
+
+07:39.680 --> 07:41.919
+Let me go back to the presentation.
+
+07:41.919 --> 00:07:43.360
+So that's the delivery.
+
+00:07:43.360 --> 00:07:44.639
+So the delivery is great,
+
+00:07:44.639 --> 00:07:46.400
+and I can tell the students
+
+00:07:46.400 --> 00:07:48.080
+now you're actually in GitHub,
+
+00:07:48.080 --> 00:07:50.160
+if you want to test the code,
+
+07:50.160 --> 00:07:51.360
+just cut and paste.
+
+00:07:51.360 --> 00:07:54.240
+Notice that I clicked on the little icon.
+
+00:07:54.240 --> 00:07:56.639
+Now it's copied. It's now part of
+
+00:07:56.639 --> 00:07:57.440
+the kill buffer ([kill-ring]),
+
+00:07:57.440 --> 00:07:59.520
+so if I want to actually create a file
+
+00:07:59.520 --> 00:08:00.560
+that has that content,
+
+00:08:00.560 --> 00:08:02.560
+I can very quickly do it.
+
+08:02.560 --> 00:08:05.840
+Try that with PowerPoint.
+
+00:08:05.840 --> 00:08:08.160
+You will have to have the text
+
+00:08:08.160 --> 00:08:10.000
+without any nice typesetting,
+
+00:08:10.000 --> 00:08:11.280
+or you will have to have a picture
+
+00:08:11.280 --> 00:08:13.120
+that is impossible to cut and paste.
+
+00:08:13.120 --> 00:08:14.400
+So that's something that the students
+
+00:08:14.400 --> 00:08:17.440
+really, really appreciate of this.
+
+00:08:17.440 --> 00:08:18.879
+They can try it on the computer.
+
+00:08:18.879 --> 00:08:19.919
+They can load it into
+
+00:08:19.919 --> 00:08:22.319
+their favorite editor.
+
+00:08:22.319 --> 00:08:24.720
+I don't force them to use Emacs,
+
+00:08:24.720 --> 00:08:26.879
+but I have to say that some of them
+
+00:08:26.879 --> 00:08:28.479
+really get intrigued by this power
+
+00:08:28.479 --> 00:08:30.000
+that they want to try Emacs
+
+08:30.000 --> 08:31.440
+because they see that they can do things,
+
+08:31.440 --> 08:33.760
+that I can do things that they cannot do
+
+08:33.760 --> 08:35.919
+with other tools.
+
+08:35.919 --> 08:39.039
+Okay, so let's go back to presentation.
+
+08:39.039 --> 00:08:40.080
+The other half of it is
+
+00:08:40.080 --> 00:08:41.039
+preparing the notes.
+
+00:08:41.039 --> 00:08:44.640
+I think the preparatory notes
+
+08:44.640 --> 00:08:46.320
+is something that I want to do
+
+00:08:46.320 --> 00:08:48.240
+as easy as possible.
+
+00:08:48.240 --> 00:08:52.560
+I want to be able to reduce the time
+
+00:08:52.560 --> 00:08:53.760
+that I waste on things,
+
+00:08:53.760 --> 00:08:55.120
+that they are done.
+
+08:55.120 --> 08:57.519
+They're not part of the actual thinking
+
+08:57.519 --> 00:09:01.760
+or the delivery of the presentation.
+
+00:09:01.760 --> 00:09:03.440
+So let me create a file.
+
+09:03.440 --> 00:09:05.720
+Let's call it rip2.org.
+
+00:09:05.720 --> 00:09:07.839
+Well, I have this one,
+
+00:09:07.839 --> 00:09:09.519
+so let's call it rip.org.
+
+00:09:09.519 --> 00:09:10.480
+Oh, I have this one too,
+
+00:09:10.480 --> 00:09:12.800
+so let's call it rip4.org.
+
+09:12.800 --> 09:15.040
+So it's empty.
+
+09:15.040 --> 00:09:17.200
+I use yasnippets. I think yasnippets
+
+00:09:17.200 --> 00:09:17.920
+are very important,
+
+00:09:17.920 --> 00:09:19.040
+and I'll go through this
+
+00:09:19.040 --> 00:09:19.760
+in a little bit later.
+
+00:09:19.760 --> 00:09:21.200
+It's important to set up
+
+00:09:21.200 --> 00:09:23.440
+the properties for each language
+
+00:09:23.440 --> 00:09:24.399
+that I use properly.
+
+09:24.399 --> 09:26.320
+I'll describe this a little bit later.
+
+09:26.320 --> 00:09:28.000
+Unfortunately, the properties
+
+00:09:28.000 --> 00:09:30.080
+have to be evaluated one at a time,
+
+00:09:30.080 --> 00:09:33.839
+and so I'm just going to
+
+00:09:33.839 --> 00:09:35.040
+kill the buffer and open it again.
+
+00:09:35.040 --> 00:09:36.480
+So now all of these properties
+
+00:09:36.480 --> 00:09:38.000
+are properly set.
+
+09:40.560 --> 00:09:43.760
+As I said before, I have some yasnippets,
+
+00:09:43.760 --> 00:09:46.560
+so I can actually do very quickly...
+
+00:09:46.560 --> 00:09:55.200
+This is C++, cout &lt;&lt; "hello world",
+
+09:55.200 --> 09:58.080
+std::endl.
+
+09:58.080 --> 00:10:00.080
+And then I run it,
+
+00:10:00.080 --> 00:10:02.720
+and then it's inserted down here,
+
+00:10:02.720 --> 00:10:04.000
+so nothing special.
+
+10:04.000 --> 10:06.160
+Let's assume that I make a mistake
+
+10:06.160 --> 00:10:08.480
+and I type a double l here.
+
+00:10:08.480 --> 00:10:10.720
+I will get an error.
+
+10:10.720 --> 00:10:12.399
+These line numbers unfortunately
+
+00:10:12.399 --> 00:10:13.600
+don't perfectly match
+
+00:10:13.600 --> 00:10:15.040
+with the line numbers
+
+10:15.040 --> 10:17.839
+in the little snippet
+
+10:17.839 --> 00:10:18.959
+because there's some code
+
+00:10:18.959 --> 00:10:22.160
+that org-babel inserts,
+
+00:10:22.160 --> 00:10:23.040
+so that shifts them.
+
+00:10:23.040 --> 00:10:25.440
+So that's something to be aware of.
+
+10:25.440 --> 00:10:27.680
+I can correct it, run it,
+
+00:10:27.680 --> 00:10:30.160
+and then it inserts the result.
+
+10:30.160 --> 00:10:36.079
+Let's do one in C.
+
+10:36.079 --> 00:10:37.680
+I'll explain the exports both
+
+00:10:37.680 --> 00:10:38.640
+a little bit.
+
+00:10:38.640 --> 00:10:40.079
+So let's assume that I don't want to
+
+10:40.079 --> 00:10:41.519
+have a full main program.
+
+00:10:41.519 --> 00:10:42.560
+Let's assume that i just want to
+
+00:10:42.560 --> 00:10:45.200
+demonstrate how to use a printf
+
+00:10:45.200 --> 00:10:54.959
+"hello world %s\n", "my friend".
+
+10:54.959 --> 10:56.800
+Let's run it.
+
+10:56.800 --> 00:10:58.800
+I get a bunch of errors. Why?
+
+00:10:58.800 --> 00:11:00.480
+Because I don't have a main program,
+
+00:11:00.480 --> 00:11:03.279
+so I have to actually tell org-babel
+
+00:11:03.279 --> 00:11:05.200
+that I want a main product,
+
+00:11:05.200 --> 00:11:07.360
+so yes put a main around it.
+
+00:11:07.360 --> 00:11:09.040
+So now I run it and it says, oh,
+
+11:09.040 --> 00:11:09.760
+in the function main,
+
+00:11:09.760 --> 00:11:10.959
+we have an implicit declaration
+
+00:11:10.959 --> 00:11:12.640
+for function printf.
+
+00:11:12.640 --> 00:11:14.000
+I'm very, very stringent
+
+00:11:14.000 --> 00:11:16.959
+on my compilation options,
+
+00:11:16.959 --> 00:11:18.959
+so I want to have every single
+
+11:18.959 --> 00:11:21.279
+potential error displayed ,
+
+00:11:21.279 --> 00:11:22.959
+so that's actually why.
+
+00:11:22.959 --> 00:11:24.640
+In this case, I actually need include,
+
+00:11:24.640 --> 00:11:29.040
+so I can say :includes &lt;stdio.h&gt;,
+
+11:29.040 --> 00:11:31.040
+and I'll run it and it runs perfectly.
+
+00:11:31.040 --> 00:11:32.480
+So why is this important?
+
+00:11:32.480 --> 00:11:35.440
+Well, it allows me to just have
+
+00:11:35.440 --> 00:11:37.600
+the snippet that I'm concerned about.
+
+00:11:37.600 --> 00:11:39.920
+I don't have to have all the overhead
+
+00:11:39.920 --> 00:11:43.279
+of having to have the include, main, etc.,
+
+00:11:43.279 --> 00:11:44.000
+if I want to show
+
+00:11:44.000 --> 00:11:45.440
+just one specific concept
+
+00:11:45.440 --> 00:11:46.560
+and I can do it
+
+00:11:46.560 --> 00:11:48.079
+in very few lines of code.
+
+00:11:48.079 --> 00:11:50.240
+I can do that immediately, of course.
+
+00:11:50.240 --> 00:11:51.279
+The students will not be able to
+
+00:11:51.279 --> 00:11:53.600
+cut and paste it without the main file,
+
+00:11:53.600 --> 00:11:54.320
+but that's something
+
+00:11:54.320 --> 00:11:56.800
+that we can explain to them.
+
+11:57.600 --> 00:11:59.440
+We can do all the languages.
+
+00:11:59.440 --> 00:12:02.079
+So I can say print,
+
+12:02.079 --> 12:07.680
+let's print just a list,
+
+12:07.680 --> 12:10.000
+or let's actually keep updating it,
+
+12:10.000 --> 00:12:16.000
+and let's do a map of a lambda x,
+
+00:12:16.000 --> 00:12:19.279
+x multiplied by x,
+
+12:19.279 --> 00:12:22.079
+and then we run it. Okay.
+
+00:12:22.079 --> 00:12:23.200
+The thing that is important
+
+00:12:23.200 --> 00:12:25.120
+is that if we also have
+
+00:12:25.120 --> 00:12:26.720
+the full power of the environment,
+
+00:12:26.720 --> 00:12:28.320
+right, so we can actually edit it
+
+00:12:28.320 --> 00:12:31.519
+in the native mode of the language,
+
+00:12:31.519 --> 00:12:34.560
+and wherever we actually want to use
+
+00:12:34.560 --> 00:12:36.720
+specific features, that they are available
+
+00:12:36.720 --> 00:12:38.800
+in the particular mode.
+
+12:38.800 --> 00:12:40.720
+But for most of the cases,
+
+00:12:40.720 --> 00:12:41.519
+I don't need that,
+
+00:12:41.519 --> 00:12:44.160
+because my examples are relatively simple.
+
+12:44.160 --> 12:46.720
+Let's do one more.
+
+12:46.720 --> 00:12:48.399
+This is a little bit different: SQLite.
+
+00:12:48.399 --> 00:12:49.760
+In the previous examples,
+
+00:12:49.760 --> 00:12:51.200
+the output that is inserted
+
+00:12:51.200 --> 00:12:52.720
+is a standard output.
+
+00:12:52.720 --> 00:12:54.320
+In SQLite, I want to actually see
+
+00:12:54.320 --> 00:12:55.279
+the tables. I want to see
+
+00:12:55.279 --> 00:12:56.720
+how the tables are,
+
+00:12:56.720 --> 00:12:58.880
+what the results are.
+
+00:12:58.880 --> 00:13:04.000
+So let's create table s.
+
+13:04.000 --> 00:13:08.399
+Let's call it r, a int, b int,
+
+13:08.399 --> 00:13:09.200
+and let's run it.
+
+00:13:09.200 --> 00:13:10.639
+This is-- oh, the table already exists.
+
+00:13:10.639 --> 00:13:16.240
+Okay. So drop table if exists r,
+
+13:16.240 --> 00:13:17.440
+and then we run it. Okay.
+
+00:13:17.440 --> 00:13:21.120
+So now it's created. sqlite...
+
+00:13:21.120 --> 00:13:25.920
+So we can say create a table,
+
+00:13:25.920 --> 00:13:27.760
+and let's actually add SQL,
+
+00:13:27.760 --> 00:13:32.079
+and here we're actually going to add...
+
+13:32.079 --> 00:13:34.240
+This is an example in C,
+
+00:13:34.240 --> 00:13:38.240
+and here we're going to have C++.
+
+00:13:38.240 --> 00:13:42.160
+Okay. So, SQL,
+
+00:13:42.160 --> 00:13:43.920
+and then we create a table,
+
+00:13:43.920 --> 00:13:47.839
+and then we populate
+
+00:13:47.839 --> 00:13:51.360
+and then insert into R
+
+00:13:51.360 --> 00:13:57.839
+values 1,2 2,3 3,4.
+
+13:57.839 --> 00:13:59.519
+Okay. So now I have a table,
+
+00:13:59.519 --> 00:14:01.600
+I have values,
+
+00:14:01.600 --> 00:14:04.560
+and I can do "select * from here,"
+
+14:04.560 --> 14:07.040
+and then I get the result. Okay.
+
+14:07.040 --> 00:14:07.920
+It's almost magic
+
+00:14:07.920 --> 00:14:10.399
+because I can actually get, formatted,
+
+00:14:10.399 --> 00:14:13.040
+the output in the way that I expected.
+
+14:13.040 --> 14:15.279
+Obviously, if my result is too big,
+
+14:15.279 --> 00:14:18.399
+then it will basically just create
+
+00:14:18.399 --> 00:14:20.880
+a huge, huge buffer, or Org will say
+
+00:14:20.880 --> 00:14:21.920
+the output is too big.
+
+00:14:21.920 --> 00:14:24.079
+So often with databases,
+
+00:14:24.079 --> 00:14:26.480
+I actually narrow my output, right,
+
+00:14:26.480 --> 00:14:28.639
+or I might do it with a clause,
+
+00:14:28.639 --> 00:14:32.800
+"where a > 1".
+
+14:34.959 --> 00:14:36.959
+If the language is supported by Org Babel,
+
+00:14:36.959 --> 00:14:39.920
+then you can do all of this.
+
+14:39.920 --> 00:14:42.079
+Let me go back to the presentation.
+
+00:14:42.079 --> 00:14:43.760
+I'm running out of time.
+
+00:14:43.760 --> 00:14:45.680
+Let me give you a short tour
+
+00:14:45.680 --> 00:14:47.279
+of how this is done.
+
+14:47.279 --> 00:14:53.279
+I have created a repository that has
+
+00:14:53.279 --> 00:14:54.800
+all the configuration that I have.
+
+00:14:54.800 --> 00:14:56.639
+Everything is self-contained.
+
+14:56.639 --> 14:59.600
+You can just download it and run it.
+
+14:59.600 --> 00:15:01.360
+You will have to replace
+
+00:15:01.360 --> 00:15:03.760
+your ~/.emacs.d directory,
+
+00:15:03.760 --> 00:15:07.440
+and then you can explore it, test it,
+
+00:15:07.440 --> 00:15:11.039
+and then pick things out of it,
+
+00:15:11.039 --> 00:15:14.639
+choose, etc.
+
+15:14.639 --> 00:15:16.800
+Let me go through the README.
+
+00:15:16.800 --> 00:15:17.920
+I think that the README
+
+00:15:17.920 --> 00:15:19.600
+is actually useful.
+
+00:15:19.600 --> 00:15:21.760
+I have a function called actually start.
+
+00:15:21.760 --> 00:15:22.480
+That is the one
+
+00:15:22.480 --> 00:15:24.000
+that creates indentation
+
+00:15:24.000 --> 00:15:28.399
+and sets up the mode, etc.
+
+15:28.399 --> 00:15:29.440
+Let me talk about GitHub.
+
+00:15:29.440 --> 00:15:31.839
+So GitHub is a great resource. Why?
+
+00:15:31.839 --> 00:15:32.880
+Well its publishing,
+
+00:15:32.880 --> 00:15:34.240
+as i mentioned before,
+
+00:15:34.240 --> 00:15:35.519
+is very simple.
+
+00:15:35.519 --> 00:15:37.120
+To publish, you basically just
+
+00:15:37.120 --> 00:15:37.920
+push your changes
+
+00:15:37.920 --> 00:15:43.199
+and it automatically renders the code.
+
+15:43.199 --> 00:15:46.800
+It's something that is quite useful.
+
+15:46.800 --> 00:15:48.720
+But it is not perfect,
+
+00:15:48.720 --> 00:15:50.399
+and it's not able to understand
+
+00:15:50.399 --> 00:15:52.880
+the full Org. But for most of the things
+
+00:15:52.880 --> 00:15:53.680
+that I use for teaching,
+
+00:15:53.680 --> 00:15:55.600
+it's sufficiently good.
+
+00:15:55.600 --> 00:15:57.360
+It would be better if it was full
+
+00:15:57.360 --> 00:16:00.720
+at compliance, but it's not bad as it is.
+
+16:00.720 --> 00:16:02.463
+Version control. I think
+
+00:16:02.463 --> 00:16:03.839
+it's extremely valuable
+
+00:16:03.839 --> 00:16:05.199
+to have version control.
+
+00:16:05.199 --> 00:16:08.079
+It allows to actually use
+
+00:16:08.079 --> 00:16:08.959
+different computers
+
+00:16:08.959 --> 00:16:10.560
+or keep track of my changes,
+
+00:16:10.560 --> 00:16:11.920
+collaborate with authors,
+
+00:16:11.920 --> 00:16:13.040
+even have pull requests
+
+00:16:13.040 --> 00:16:13.759
+from the students.
+
+16:13.759 --> 16:16.320
+Actually it's very empowering
+
+16:16.320 --> 16:18.800
+for the students.
+
+16:18.800 --> 00:16:20.480
+Navigation, links, cut and paste
+
+00:16:20.480 --> 00:16:21.920
+between code blocks,
+
+00:16:21.920 --> 00:16:23.199
+you can even edit in place
+
+16:23.199 --> 16:26.160
+if you want to.
+
+16:26.160 --> 16:27.920
+In a pinch, you can actually use GitHub
+
+16:27.920 --> 00:16:30.000
+to do the editing of your file.
+
+00:16:30.000 --> 00:16:33.199
+Of course, it will not update your buffers.
+
+16:33.199 --> 00:16:35.199
+:exports both. This is very important.
+
+00:16:35.199 --> 00:16:40.160
+If we have a block, by default,
+
+16:40.160 --> 16:43.199
+GitHub will not typeset
+
+16:43.199 --> 00:16:44.399
+the output of that block.
+
+00:16:44.399 --> 00:16:45.839
+It will only put the source code,
+
+00:16:45.839 --> 00:16:47.199
+but not its output.
+
+16:47.199 --> 00:16:50.079
+In this case, if I actually showed this
+
+00:16:50.079 --> 00:16:52.720
+in GitHub, "hello world" will not appear.
+
+00:16:52.720 --> 00:16:55.120
+So what we need to do is for every block,
+
+00:16:55.120 --> 00:16:57.040
+we have to do :exports both.
+
+16:57.040 --> 00:16:58.720
+okay that's unfortunate,
+
+00:16:58.720 --> 00:17:01.120
+but we can deal with that.
+
+17:01.120 --> 00:17:03.920
+Once it's done, then the output
+
+00:17:03.920 --> 00:17:06.079
+is actually typeset.
+
+17:06.079 --> 00:17:07.520
+I mentioned that header args
+
+00:17:07.520 --> 00:17:09.039
+are very important,
+
+00:17:09.039 --> 00:17:10.079
+because those are the ones
+
+00:17:10.079 --> 00:17:12.799
+that set the parameters
+
+00:17:12.799 --> 00:17:14.640
+for each one of the blocks that you have.
+
+17:14.640 --> 17:16.000
+You don't want to have to type every
+
+17:16.000 --> 00:17:19.120
+single one of them at once.
+
+00:17:19.120 --> 00:17:20.880
+For example, let me go back to
+
+00:17:20.880 --> 00:17:22.880
+my presentation.
+
+17:23.839 --> 17:26.160
+Here's actually the parameters for C.
+
+17:26.160 --> 00:17:28.880
+C, I say, I don't want you to
+
+00:17:28.880 --> 00:17:30.000
+automatically add a main.
+
+00:17:30.000 --> 00:17:31.120
+I want to provide my main,
+
+00:17:31.120 --> 00:17:34.160
+and these are the flags to the compiler.
+
+17:34.160 --> 00:17:37.280
+With C++, similar. With SQLite,
+
+00:17:37.280 --> 00:17:38.720
+I said this is my database,
+
+17:38.720 --> 00:17:39.600
+this is the data,
+
+00:17:39.600 --> 00:17:41.360
+the file where the database lives,
+
+00:17:41.360 --> 00:17:44.559
+and for the results, I want you to insert
+
+17:44.559 --> 00:17:46.160
+the column names. I want to see
+
+00:17:46.160 --> 00:17:48.400
+the names of the columns in the result.
+
+17:48.400 --> 17:50.960
+So those are actually why
+
+17:50.960 --> 17:53.840
+the headers are important.
+
+17:53.840 --> 00:17:55.520
+There's one in general.
+
+00:17:55.520 --> 00:17:56.880
+That's :results output.
+
+00:17:56.880 --> 00:17:59.039
+If you're interested on showing
+
+00:17:59.039 --> 00:18:01.760
+the standard output of your snippet,
+
+00:18:01.760 --> 00:18:03.600
+then you have to use :results output.
+
+00:18:03.600 --> 00:18:04.799
+Otherwise, it will insert
+
+00:18:04.799 --> 00:18:06.720
+the result of the last expression.
+
+00:18:06.720 --> 00:18:08.000
+It just depends on what you want to show,
+
+18:08.000 --> 00:18:08.720
+but it's important
+
+00:18:08.720 --> 00:18:11.200
+that you are aware of that.
+
+18:11.200 --> 18:13.440
+I'm almost running out of time.
+
+18:13.440 --> 00:18:15.919
+There are some things that are C-specific
+
+00:18:15.919 --> 00:18:18.400
+and that I sort of covered
+
+00:18:18.400 --> 00:18:23.919
+during the demo.
+
+18:23.919 --> 00:18:26.000
+You can use advanced Org features,
+
+00:18:26.000 --> 00:18:29.039
+and you can actually use noweb.
+
+00:18:29.039 --> 00:18:30.640
+Now that's confusing for students,
+
+00:18:30.640 --> 00:18:33.600
+so i will suggest that you actually do it
+
+18:33.600 --> 00:18:34.880
+but then inform the students
+
+00:18:34.880 --> 00:18:37.760
+very clearly of that.
+
+18:37.760 --> 00:18:39.280
+Some potential issues:
+
+00:18:39.280 --> 00:18:42.400
+_ (underscore). _ is used everywhere.
+
+00:18:42.400 --> 00:18:44.640
+By default, it will try to export it--
+
+00:18:44.640 --> 00:18:46.960
+Org will try to export it as circumflex,
+
+00:18:46.960 --> 00:18:48.400
+the same as with GitHub.
+
+00:18:48.400 --> 00:18:52.480
+So we want to inform Org and GitHub
+
+00:18:52.480 --> 00:18:53.840
+not to do anything with them,
+
+00:18:53.840 --> 00:18:55.520
+and this is via the circumflex.
+
+00:18:55.520 --> 00:18:57.440
+So we said in #+OPTIONS: ^:nil ,
+
+00:18:57.440 --> 00:18:58.720
+and that actually takes care
+
+00:18:58.720 --> 00:19:01.679
+of the circumflex and also the underscore.
+
+00:19:01.679 --> 00:19:02.720
+It's kind of confusing
+
+00:19:02.720 --> 00:19:04.080
+because it's both,
+
+00:19:04.080 --> 00:19:05.120
+but it's actually named
+
+00:19:05.120 --> 00:19:06.720
+after the circumflex.
+
+19:06.720 --> 00:19:07.840
+The pipe character
+
+00:19:07.840 --> 00:19:08.880
+is one of those characters
+
+00:19:08.880 --> 00:19:10.640
+that is actually very, very common
+
+00:19:10.640 --> 00:19:12.799
+in programming, but if you put in a table,
+
+00:19:12.799 --> 00:19:14.480
+there's no way to do it. Like, okay,
+
+00:19:14.480 --> 00:19:16.559
+I wish I had this table nicely
+
+19:16.559 --> 00:19:19.520
+where I can say || here,
+
+00:19:19.520 --> 00:19:21.280
+but if I put this ||,
+
+00:19:21.280 --> 00:19:22.799
+it will actually interpret it
+
+00:19:22.799 --> 00:19:23.919
+as the separator.
+
+00:19:23.919 --> 00:19:25.760
+So that's one of the few things
+
+00:19:25.760 --> 00:19:27.679
+that's kind of annoying.
+
+19:27.679 --> 00:19:31.679
+Final words. See my configuration file,
+
+19:31.679 --> 00:19:35.520
+and try to typeset the code,
+
+00:19:35.520 --> 00:19:37.520
+the buffer as close as possible
+
+00:19:37.520 --> 00:19:38.720
+to what you want to present.
+
+00:19:38.720 --> 00:19:40.000
+As you can see here,
+
+00:19:40.000 --> 00:19:42.240
+I'm actually using colors to highlight
+
+00:19:42.240 --> 00:19:44.320
+by using the current line.
+
+19:44.320 --> 19:46.960
+Use yasnippets.
+
+19:46.960 --> 19:48.480
+They're amazing, and they will actually
+
+19:48.480 --> 19:51.440
+make your life much more useful.
+
+19:51.440 --> 19:53.280
+Experiment.
+
+19:53.280 --> 19:56.720
+Just a conclusion.
+
+19:56.720 --> 00:19:58.400
+Org mode and Emacs really make
+
+00:19:58.400 --> 00:20:01.039
+a wonderful, amazing environment
+
+00:20:01.039 --> 00:20:03.360
+for teaching programming.
+
+20:03.360 --> 20:06.640
+I just want to end by saying that
+
+20:06.640 --> 00:20:10.320
+I'm very grateful to all the Emacs community
+
+20:10.320 --> 00:20:14.159
+because I have benefited tremendously
+
+00:20:14.159 --> 00:20:16.080
+over the years. I have been using Emacs
+
+00:20:16.080 --> 00:20:18.960
+since 1991, so this is essentially
+
+00:20:18.960 --> 00:20:22.240
+my 30th year that have been using Emacs.
+
+00:20:22.240 --> 00:20:24.640
+I think that is the most important,
+
+00:20:24.640 --> 00:20:26.980
+most fundamental tool that I use
+
+00:20:26.980 --> 00:20:29.760
+day-to-day, from reading email,
+
+00:20:29.760 --> 00:20:32.480
+to doing my teaching, doing my papers,
+
+00:20:32.480 --> 00:20:34.960
+my research... it's everything.
+
+00:20:34.960 --> 00:20:37.039
+So thank you all
+
+20:37.039 --> 20:40.799
+and I hope that you find this useful.
+
+20:40.799 --> 00:20:42.799
+Bye.
+
+00:20:42.799 --> 00:20:43.799
+[captions by sachac]
diff --git a/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt b/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt
new file mode 100644
index 00000000..8e5b49fb
--- /dev/null
+++ b/2021/captions/emacsconf-2021-tech--creating-technical-documentation-and-presentations-using-org-babel-restclient-and-org-treeslide--jan-ypma--main.vtt
@@ -0,0 +1,829 @@
+WEBVTT
+
+00:02.560 --> 00:05.040
+Hi! My name is Jan, and I'll be talking
+
+00:05.040 --> 00:07.680
+about using Emacs for technical writing.
+
+00:07.680 --> 00:09.519
+Let's first define what we mean by
+
+00:09.519 --> 00:12.080
+technical writing.
+
+00:12.080 --> 00:13.679
+At least, I mean with that, any kind of
+
+00:13.679 --> 00:15.759
+writing that involves computer systems.
+
+00:15.759 --> 00:19.700
+So, maybe a developer guide for a system,
+
+00:19.700 --> 00:21.680
+or a library you've been creating,
+
+00:21.680 --> 00:23.433
+maybe reference documentation
+
+00:23.433 --> 00:25.833
+or a user guide for a REST API
+
+00:25.833 --> 00:27.934
+that you offer as a cloud service,
+
+00:27.934 --> 00:29.767
+or doing a technical presentation
+
+00:29.767 --> 00:30.700
+exactly like this one
+
+00:30.700 --> 00:32.239
+that may actually include some live
+
+00:32.239 --> 00:34.000
+coding as well that you may want to do
+
+00:34.000 --> 00:36.000
+while you're showing the presentation
+
+00:36.000 --> 00:39.040
+without too much context switching.
+
+00:39.040 --> 00:40.399
+I've been doing a variety of these
+
+00:40.399 --> 00:43.034
+things in my professional life for a while now,
+
+00:43.034 --> 00:43.840
+and I found Emacs to be a
+
+00:43.840 --> 00:46.879
+really nice tool to help out with that,
+
+00:46.879 --> 00:50.719
+since it actually pulls in different languages.
+
+00:50.719 --> 00:52.800
+The ones I work with is Scala, Java, C++,
+
+00:52.800 --> 00:54.480
+and things like that, and everything
+
+00:54.480 --> 00:56.160
+works in the same way within Emacs,
+
+00:56.160 --> 00:58.300
+so you don't have to learn different tools
+
+00:58.400 --> 00:59.840
+to do the same thing.
+
+00:59.840 --> 01:02.079
+Doing all of this against Java looks the
+
+01:02.079 --> 01:04.720
+same as it would but with C++ except
+
+01:04.720 --> 01:07.119
+the language is different.
+
+01:07.119 --> 01:08.640
+A little refresher for people that might
+
+01:08.640 --> 01:10.666
+be viewing this out of context.
+
+01:10.666 --> 01:13.280
+Emacs is a very customizable text editor
+
+01:13.280 --> 01:15.600
+environment, and Org mode is a
+
+01:15.600 --> 01:17.360
+part of Emacs that allows you to deal
+
+01:17.360 --> 01:18.734
+with structured text.
+
+01:18.734 --> 01:21.920
+So, a plain text file containing headings,
+
+01:21.920 --> 01:25.439
+lists, tables, and even code blocks
+
+01:25.439 --> 01:27.360
+formatted in a particular way, so Org
+
+01:27.360 --> 01:29.866
+mode can help out with that.
+
+01:29.866 --> 01:32.560
+And Org babel is the particular part of Org mode
+
+01:32.560 --> 01:34.400
+that deals with executing those code
+
+01:34.400 --> 01:37.000
+blocks and actually interacting with,
+
+01:37.000 --> 01:38.720
+say, a Java or a Python environment
+
+01:38.720 --> 01:40.720
+underneath, and showing the results of
+
+01:40.720 --> 01:43.840
+that right inside the same Org file.
+
+01:43.840 --> 01:44.966
+Let's look at
+
+01:44.966 --> 01:47.167
+what are a couple of scenarios
+
+01:47.167 --> 01:49.400
+using this might actually look like.
+
+01:49.400 --> 01:52.533
+Let's start with imagining that
+
+01:52.533 --> 01:55.000
+we are writing a developer guide
+
+01:55.000 --> 01:59.439
+for a service or a library,
+
+01:59.439 --> 02:02.560
+or a computer program that we might be writing.
+
+02:02.560 --> 02:04.560
+And, imagine that we have some
+
+02:04.560 --> 02:07.119
+dependencies that the program requires
+
+02:07.119 --> 02:09.520
+that are configured using docker-compose,
+
+02:09.520 --> 02:11.767
+for those who don't know Docker, docker-compose,
+
+02:11.767 --> 02:15.599
+it's a way to quickly describe some Linux
+
+02:15.599 --> 02:17.920
+programs that can be immediately run
+
+02:17.920 --> 02:21.280
+without installing too much dependencies.
+
+02:21.280 --> 02:23.040
+You define these using a YAML file
+
+02:23.040 --> 02:25.040
+called the docker-compose file.
+
+02:25.040 --> 02:26.959
+Now, here inside Emacs we have a block
+
+02:26.959 --> 02:29.280
+that defines a YAML file, and we're
+
+02:29.280 --> 02:30.900
+actually saying this is called
+
+02:30.900 --> 02:33.840
+docker-compose.yaml
+
+02:33.840 --> 02:36.400
+with some content here, and you can see
+
+02:36.400 --> 02:38.200
+that even though we are in Org mode,
+
+02:38.200 --> 02:40.959
+Org mode knows that it can highlight this
+
+02:40.959 --> 02:43.360
+according to YAML and Org mode doesn't
+
+02:43.360 --> 02:45.200
+directly know about YAML, we just said hey
+
+02:45.200 --> 02:47.360
+this block has to do with YAML.
+
+02:47.360 --> 02:51.467
+Because there's a yaml-mode in Emacs,
+
+02:51.467 --> 02:53.280
+it will borrow from that mode to actually
+
+02:53.280 --> 02:55.920
+highlight this block.
+
+02:55.920 --> 02:57.680
+Now, the fun thing is that there's a
+
+02:57.680 --> 03:00.080
+feature in Org called tangling that
+
+03:00.080 --> 03:02.159
+allows you to take these kinds of blocks
+
+03:02.159 --> 03:04.800
+and actually export them to separate files.
+
+03:04.800 --> 03:06.959
+So, if we look at the
+
+03:06.959 --> 03:08.720
+directory that we're in right now, we see
+
+03:08.720 --> 03:10.434
+that we just got the presentation,
+
+03:10.434 --> 03:12.239
+there is no docker-compose file yet.
+
+03:12.239 --> 03:16.000
+If I say Control c Control v t (C-c C-v t)
+
+03:16.000 --> 03:18.080
+and I go back and refresh this directory,
+
+03:18.080 --> 03:20.200
+now we have a docker-compose file as well,
+
+03:20.200 --> 03:22.000
+which has the content in it that we
+
+03:22.000 --> 03:23.334
+just created here.
+
+03:23.334 --> 03:25.200
+That's very nice because
+
+03:25.200 --> 03:26.560
+conceptually we don't actually need to
+
+03:26.560 --> 03:28.080
+leave Org mode, we can say something
+
+03:28.080 --> 03:29.760
+about this file and have the contents of
+
+03:29.760 --> 03:32.480
+the file in the same descriptive document
+
+03:32.480 --> 03:34.966
+while also having some actual side effect
+
+03:34.966 --> 03:36.159
+of the file existing on disk and
+
+03:36.159 --> 03:38.000
+us being able to interact with it.
+
+03:38.000 --> 03:40.000
+For example, we could…, now that the file is
+
+03:40.000 --> 03:42.319
+there, invoke docker-compose and actually
+
+03:42.319 --> 03:44.400
+create the nginx web server that we're
+
+03:44.400 --> 03:46.700
+defining here. Let's do that.
+
+03:46.700 --> 03:47.120
+We have a little block
+
+03:47.120 --> 03:49.599
+here that runs the shell script if I
+
+03:49.599 --> 03:51.920
+invoke that from Org mode, we get the
+
+03:51.920 --> 03:53.439
+results here, we see that now we have a
+
+03:53.439 --> 03:55.867
+web server running on port 8080.
+
+03:55.867 --> 03:56.767
+That's, by the way,
+
+03:56.767 --> 03:58.319
+serving up the contents of
+
+03:58.319 --> 04:00.799
+the directory that we're in here
+
+04:00.799 --> 04:02.799
+on port 8080.
+
+04:02.799 --> 04:06.000
+So, that's already quite nice.
+
+04:06.000 --> 04:08.959
+Let's look at another scenario where we
+
+04:08.959 --> 04:11.760
+may be documenting a REST API.
+
+04:11.760 --> 04:14.720
+REST APIs use a lot of HTTP interactions
+
+04:14.720 --> 04:17.199
+typically describing an XML or JSON
+
+04:17.199 --> 04:20.000
+structure and which HTTP verb GET or PUT
+
+04:20.000 --> 04:22.320
+to use with that and the URL.
+
+04:22.320 --> 04:25.919
+There's actually a nice extension to
+
+04:25.919 --> 04:28.240
+Org babel called rest client that you
+
+04:28.240 --> 04:30.000
+can install, that allows you to describe
+
+04:30.000 --> 04:33.360
+these kind of requests right inside Emacs.
+
+04:33.360 --> 04:35.360
+First, let's make sure that our HTTP
+
+04:35.360 --> 04:36.720
+server has something to respond with,
+
+04:36.720 --> 04:38.080
+that's a little interesting, for example,
+
+04:38.080 --> 04:40.433
+an XML file. We already know how to do that.
+
+04:40.433 --> 04:42.533
+So, let's create a code block type xml
+
+04:42.533 --> 04:43.600
+that we can tangle to file called
+
+04:43.600 --> 04:46.960
+test.xml, Control c Control v t (C-c C-v t).
+
+04:46.960 --> 04:52.067
+Now, if we look at the directory again,
+
+04:52.067 --> 04:55.120
+we have a test.xml file.
+
+04:55.120 --> 04:57.520
+And, now we can have a new type of block
+
+04:57.520 --> 04:59.600
+called the restclient, which will invoke
+
+04:59.600 --> 05:01.199
+REST client, and anything you type into
+
+05:01.199 --> 05:04.160
+here will be sent as an HTTP request to
+
+05:04.160 --> 05:05.600
+the server that you specify.
+
+05:05.600 --> 05:08.880
+Right now it goes to localhost on 8080 and
+
+05:08.880 --> 05:10.720
+let's see if we can get our test.xml
+
+05:10.720 --> 05:11.433
+file back.
+
+05:11.433 --> 05:13.600
+I've just invoked this, and you can see
+
+05:13.600 --> 05:16.479
+we got the spec and the content type of
+
+05:16.479 --> 05:17.680
+the server, if we scroll down a little
+
+05:17.680 --> 05:19.199
+bit I think we see the headers here, yeah,
+
+05:19.199 --> 05:22.080
+so the server said it's text/xml and
+
+05:22.080 --> 05:23.759
+restclient is smart enough to actually
+
+05:23.759 --> 05:27.966
+invoke Emacs's sgml-mode to highlight it.
+
+05:27.966 --> 05:28.639
+I'm not exactly sure
+
+05:28.639 --> 05:31.039
+what's the difference is between sxml
+
+05:31.039 --> 05:33.680
+and xml-mode and there's a nxml-mode,
+
+05:33.680 --> 05:35.600
+they all pretty much know how to deal
+
+05:35.600 --> 05:38.800
+with XML. In this case sgml was
+
+05:38.800 --> 05:41.600
+chosen, which is fine.
+
+05:41.600 --> 05:42.960
+But you can see we just served up that
+
+05:42.960 --> 05:45.680
+test.xml file, and
+
+05:45.680 --> 05:46.880
+we can have some actual text here
+
+05:46.880 --> 05:48.639
+describing "Hey, if you do this request
+
+05:48.639 --> 05:50.734
+you might get a response like that,"
+
+05:50.734 --> 05:53.199
+and the server will actually serve that up
+
+05:53.199 --> 05:56.233
+and insert it right into the Org mode document.
+
+05:56.233 --> 05:57.759
+By the way, we're looking at
+
+05:57.759 --> 06:00.720
+this now inside Emacs rendered somewhat
+
+06:00.720 --> 06:02.479
+interestingly, but obviously you can
+
+06:02.479 --> 06:05.280
+export this to a PDF, or HTML, or in all
+
+06:05.280 --> 06:06.880
+sorts of nice and different ways as well
+
+06:06.880 --> 06:09.759
+depending on what your particular needs are.
+
+06:09.759 --> 06:11.520
+Of course, we can't just send GET
+
+06:11.520 --> 06:14.080
+requests, we can send PUT requests as
+
+06:14.080 --> 06:16.400
+well, and just like in plain HTTP you
+
+06:16.400 --> 06:19.120
+have the PUT method on the first line then
+
+06:19.120 --> 06:20.600
+your headers, and a blank line,
+
+06:20.600 --> 06:22.000
+and then the body.
+
+06:22.000 --> 06:24.720
+If we try and invoke this then
+
+06:24.720 --> 06:27.440
+nginx will say "405 Not Allowed"
+
+06:27.440 --> 06:29.199
+because, obviously, just running a plain
+
+06:29.199 --> 06:30.319
+web server will not allow you to
+
+06:30.319 --> 06:32.080
+actually upload any files,
+
+06:32.080 --> 06:33.440
+but this of course could have been any
+
+06:33.440 --> 06:36.800
+other response as well.
+
+06:36.800 --> 06:39.759
+Now, let's look at doing
+
+06:39.759 --> 06:41.600
+presentations themselves, like the one
+
+06:41.600 --> 06:42.867
+you're looking at.
+
+06:42.867 --> 06:45.766
+There's a package that I like to use a lot,
+
+06:45.766 --> 06:47.520
+which is called org-tree-slide.
+
+06:47.520 --> 06:49.759
+That's the one that's active right now,
+
+06:49.759 --> 06:52.080
+which takes an Org document and allows
+
+06:52.080 --> 06:54.600
+you to show one heading at a time.
+
+06:54.600 --> 06:55.599
+It doesn't matter whether it's the first
+
+06:55.599 --> 06:57.280
+level, second level, third level heading,
+
+06:57.280 --> 07:00.319
+they sort of fold into nice
+
+07:00.319 --> 07:02.720
+things at the top,
+
+07:02.720 --> 07:03.919
+where you can
+
+07:03.919 --> 07:05.366
+sort of go through a document
+
+07:05.366 --> 07:07.680
+one piece at a time.
+
+07:07.680 --> 07:10.367
+I actually do like to use
+
+07:10.367 --> 07:12.319
+Org babel at the same time to
+
+07:12.319 --> 07:14.479
+do some live coding in it as well.
+
+07:14.479 --> 07:16.800
+Actually there are two ways to go to a PDF,
+
+07:16.800 --> 07:20.720
+you can just use the normal Org export
+
+07:20.720 --> 07:22.733
+option to go to a PDF, which is
+
+07:22.733 --> 07:25.120
+Control c Control e, and then l p (C-c C-e l p),
+
+07:25.120 --> 07:27.520
+but if you use restclient, the
+
+07:27.520 --> 07:30.960
+LaTeX file underneath sometimes gets
+
+07:30.960 --> 07:33.280
+a little wonky because those things
+
+07:33.280 --> 07:34.866
+don't directly work together.
+
+07:34.866 --> 07:36.166
+I wrote a little bit of Lisp
+
+07:36.166 --> 07:37.039
+to help out with that,
+
+07:37.039 --> 07:38.880
+which you can look at if you check
+
+07:38.880 --> 07:40.960
+out my presentation later.
+
+07:40.960 --> 07:45.919
+There's another package for Org babel called
+
+07:45.919 --> 07:48.800
+beamer, or ox-beamer it's called,
+
+07:48.800 --> 07:51.680
+which uses a LaTeX style called beamer
+
+07:51.680 --> 07:53.360
+to create a PDF,
+
+07:53.360 --> 07:57.400
+and that one looks sort of…,
+
+07:57.400 --> 07:58.000
+that one tries to actually
+
+07:58.000 --> 07:59.840
+create one page per slide which you
+
+07:59.840 --> 08:01.039
+would actually have a PDF with the
+
+08:01.039 --> 08:03.280
+slides, but that one is a lot more picky
+
+08:03.280 --> 08:06.160
+on what your Org file is
+
+08:06.160 --> 08:07.440
+structured like, so you need to have all
+
+08:07.440 --> 08:08.879
+your leaf headings at the same level,
+
+08:08.879 --> 08:11.360
+which I typically don't do.
+
+08:11.360 --> 08:12.800
+So, I can show you what this one
+
+08:12.800 --> 08:16.639
+looks like.
+
+08:16.639 --> 08:18.240
+For this presentation you get a nice
+
+08:18.240 --> 08:20.067
+title slide, and then you get…,
+
+08:20.067 --> 08:21.167
+it tries to make an outline,
+
+08:21.167 --> 08:23.360
+which is the one level above.
+
+08:23.360 --> 08:26.319
+The slides sort of look okay, but as
+
+08:26.319 --> 08:28.479
+you go further they sort of start
+
+08:28.479 --> 08:31.680
+to run into, you know,
+
+08:31.680 --> 08:34.633
+things not flowing as they should.
+
+08:34.633 --> 08:36.800
+I'm sure with a lot more LaTeX
+
+08:36.800 --> 08:37.919
+knowledge you could make this
+
+08:37.919 --> 08:40.640
+look a lot nicer, but personally I tend
+
+08:40.640 --> 08:44.080
+to just create a normal PDF document
+
+08:44.080 --> 08:46.399
+that's just, you know, text
+
+08:46.399 --> 08:48.560
+with all the actual content of the
+
+08:48.560 --> 08:50.560
+document. Inside the text you can see the
+
+08:50.560 --> 08:52.880
+highlighting of especially restclient
+
+08:52.880 --> 08:55.920
+stuff that works just fine, and
+
+08:55.920 --> 08:57.400
+it's enough for my needs,
+
+08:57.400 --> 09:00.959
+so I just tend to make plain PDFs.
+
+09:00.959 --> 09:02.959
+Since we only have 10 minutes, I will
+
+09:02.959 --> 09:05.200
+not go into the detailed configuration,
+
+09:05.200 --> 09:06.800
+you can check out the presentation
+
+09:06.800 --> 09:09.440
+online to see how all these packages are
+
+09:09.440 --> 09:13.440
+configured and how I use them,
+
+09:13.440 --> 09:18.000
+but for now that's all I have.
+
+09:18.000 --> 09:20.000
+I do recommend you try this out yourself.
+
+09:20.000 --> 09:22.240
+If you have any kind of documentation
+
+09:22.240 --> 09:24.399
+or textual things to do,
+
+09:24.399 --> 09:26.320
+just pick one of these packages at a
+
+09:26.320 --> 09:27.519
+time, integrate them into your
+
+09:27.519 --> 09:29.200
+configuration if you haven't already.
+
+09:29.200 --> 09:31.040
+That's really the best way to go
+
+09:31.040 --> 09:32.959
+about this, and you know, Google is your
+
+09:32.959 --> 09:34.240
+friend, if you think "Hey how I would do
+
+09:34.240 --> 09:35.467
+this with these packages,"
+
+09:35.567 --> 09:37.839
+definitely do that.
+
+09:37.839 --> 09:41.760
+More things I will be looking at is
+
+09:41.760 --> 09:44.000
+using this concept to write unit or
+
+09:44.000 --> 09:45.360
+integration tests, you can imagine if you
+
+09:45.360 --> 09:47.600
+have a documentation in Org mode that
+
+09:47.600 --> 09:50.800
+describes your service as a
+
+09:50.800 --> 09:53.360
+function of its REST API, you may want to
+
+09:53.360 --> 09:55.040
+actually run all those commands as part
+
+09:55.040 --> 09:56.480
+of your build and check if all the
+
+09:56.480 --> 09:58.399
+documentation is still in order.
+
+09:58.399 --> 09:59.680
+I'm not doing that yet, but I'm
+
+09:59.680 --> 10:01.033
+definitely looking into that.
+
+10:01.133 --> 10:03.667
+I'm also writing some extensions
+
+10:03.767 --> 10:06.000
+to use Java and Scala
+
+10:06.000 --> 10:08.720
+in a somewhat higher level with Org mode.
+
+10:08.720 --> 10:11.680
+But that's not entirely working yet,
+
+10:11.680 --> 10:12.959
+and we don't have time to go into that
+
+10:12.959 --> 10:14.240
+today.
+
+10:14.240 --> 10:16.666
+That's it. Thanks a lot for your attention,
+
+10:16.766 --> 10:21.880
+and I'll be there for questions later.
diff --git a/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt
new file mode 100644
index 00000000..0a977036
--- /dev/null
+++ b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla--main.vtt
@@ -0,0 +1,768 @@
+WEBVTT
+
+00:00.000 --> 00:01.599
+Hello, my name is Gabriele,
+
+00:01.599 --> 00:03.439
+and today I'm going to tell you about Telega
+
+00:03.439 --> 00:05.600
+and the Emacs community on Telegram.
+
+00:05.600 --> 00:08.400
+I'm not affiliated with Telegram or Telega,
+
+00:08.400 --> 00:10.719
+and opinions are my own in general.
+
+00:10.719 --> 00:14.160
+I'm going to give you my personal spin about these topics.
+
+00:14.160 --> 00:16.160
+The plan for the talk is the following.
+
+00:16.160 --> 00:18.800
+First, I'm going to talk about what is Telegram.
+
+00:18.800 --> 00:19.840
+Next, I'm going to tell you
+
+00:19.840 --> 00:21.840
+about the Emacs community on Telegram.
+
+00:21.840 --> 00:24.720
+And finally, I'm going to discuss telega.el,
+
+00:24.720 --> 00:26.560
+an Emacs package for Telegram.
+
+00:26.560 --> 00:29.359
+In all of these, I'm now going to dive into details.
+
+00:29.359 --> 00:30.880
+My goal here is to give you
+
+00:30.880 --> 00:33.120
+some exposure about these topics.
+
+00:33.120 --> 00:35.840
+You can find out more online, if you want.
+
+00:35.840 --> 00:38.960
+Let's get started with what is
+Telegram.
+
+00:38.960 --> 00:41.100
+Telegram is a cloud-based
+
+00:41.100 --> 00:42.879
+instant messaging platform.
+
+00:42.879 --> 00:44.079
+It's a popular one.
+
+00:44.079 --> 00:46.559
+It has more than half a billion users.
+
+00:46.559 --> 00:47.840
+I think one of the reasons
+
+00:47.840 --> 00:49.600
+why it's so popular, it's because
+
+00:49.600 --> 00:51.360
+it's really rich in features
+
+00:51.360 --> 00:52.960
+while being user friendly.
+
+00:52.960 --> 00:54.640
+Hence, in some regions,
+
+00:54.640 --> 00:56.960
+Telegram has good market penetration.
+
+00:56.960 --> 00:59.039
+And of course, because of network effects,
+
+00:59.039 --> 01:01.120
+this brings even more users.
+
+01:01.120 --> 01:02.239
+The details of the features
+
+01:02.239 --> 01:03.680
+is not particularly important.
+
+01:03.680 --> 01:04.879
+What I want to emphasize, though,
+
+01:04.879 --> 01:08.400
+is that while Telegram is mostly text-based,
+
+01:08.400 --> 01:12.000
+there's also support for audio/video calls and notes,
+
+01:12.000 --> 01:13.600
+and there's also a lot of features
+
+01:13.600 --> 01:15.119
+which typically you find
+
+01:15.119 --> 01:17.360
+in other instant messaging platforms:
+
+01:17.360 --> 01:18.479
+you can chat with yourself,
+
+01:18.479 --> 01:19.360
+you can make polls,
+
+01:19.360 --> 01:20.159
+you can make quizzes,
+
+01:20.159 --> 01:21.280
+you can schedule messages,
+
+01:21.280 --> 01:23.280
+you can send attachments of any kind,
+
+01:23.280 --> 01:25.759
+even big ones, and you can send stickers.
+
+01:25.759 --> 01:27.759
+Telegram, overall, is quite customizable,
+
+01:27.759 --> 01:30.560
+and I would say that the platform is, overall, hackable.
+
+01:30.560 --> 01:32.799
+You can expand it with bots
+
+01:32.799 --> 01:35.280
+and the clients are open source.
+
+01:35.280 --> 01:37.280
+In all of this, we shouldn't forget, though,
+
+01:37.280 --> 01:38.448
+the Telegram is centralized
+
+01:38.448 --> 01:39.840
+and it is not free software.
+
+01:39.840 --> 01:42.720
+Nonetheless, it's still used by a number of people,
+
+01:42.720 --> 01:45.200
+and people use Telegram for different reasons.
+
+01:45.200 --> 01:47.200
+For example, some people use it to stay in touch
+
+01:47.200 --> 01:48.399
+with friends and families.
+
+01:48.399 --> 01:50.560
+For this, Telegram offers private chats
+
+01:50.560 --> 01:53.600
+or group chats with a restricted number of people.
+
+01:53.600 --> 01:55.040
+A lot of people use it
+
+01:55.040 --> 01:57.600
+for engaging in online communities.
+
+01:57.600 --> 01:59.439
+For this, Telegram has super groups,
+
+01:59.439 --> 02:00.719
+which are groups with up to
+
+02:00.719 --> 02:02.159
+hundreds of thousands of users,
+
+02:02.159 --> 02:03.360
+and has also channels,
+
+02:03.360 --> 02:07.119
+which are one-to-many ways of communicating,
+
+02:07.119 --> 02:09.280
+so these are ideally suited for,
+
+02:09.280 --> 02:10.959
+for example, following news,
+
+02:10.959 --> 02:12.167
+all sorts of news.
+
+02:12.167 --> 02:13.680
+Telegram also has bots
+
+02:13.680 --> 02:15.840
+which can be useful by themselves.
+
+02:15.840 --> 02:17.040
+They provide value.
+
+02:17.040 --> 02:18.400
+And the chat with oneself
+
+02:18.400 --> 02:20.400
+can be used for sending links,
+
+02:20.400 --> 02:23.440
+making notes, or sending reminders.
+
+02:23.440 --> 02:24.959
+So overall, there's multiple ways
+
+02:24.959 --> 02:26.560
+in which you can use Telegram.
+
+02:26.560 --> 02:28.239
+When it comes to instant messaging,
+
+02:28.239 --> 02:30.000
+many people call Telegram home.
+
+02:30.000 --> 02:31.840
+It shouldn't come as a surprise, then,
+
+02:31.840 --> 02:34.480
+that Emacs users want to meet
+
+02:34.480 --> 02:35.680
+on Telegram as well.
+
+02:35.680 --> 02:38.480
+And indeed, there's an Emacs community on Telegram.
+
+02:38.480 --> 02:41.519
+Here I'm listing a few super groups
+about Emacs.
+
+02:41.519 --> 02:43.040
+There are language groups,
+
+02:43.040 --> 02:45.599
+so there's Emacs English, Emacs Russian,
+
+02:45.599 --> 02:48.800
+Emacs Spanish, Emacs Mandarin, Portuguese...
+
+02:48.800 --> 02:51.440
+There are groups which are specific to starter packs.
+
+02:51.440 --> 02:53.040
+For example, there are Doom Emacs,
+
+02:53.040 --> 02:54.879
+Spacemacs, and there are groups
+
+02:54.879 --> 02:57.280
+which are specific to packages like telega
+
+02:57.280 --> 02:58.720
+which I'm going to discuss later.
+
+02:58.720 --> 03:00.159
+These are what you would expect
+
+03:00.159 --> 03:02.800
+from traditional internet chat rooms.
+
+03:02.800 --> 03:04.319
+So they're used for shared links,
+
+03:04.319 --> 03:06.959
+they're used for discussing, troubleshooting,
+
+03:06.959 --> 03:09.120
+giving each other recommendations...
+
+03:09.120 --> 03:10.879
+I think there are healthy communities
+
+03:10.879 --> 03:12.239
+with typically a hundred
+
+03:12.239 --> 03:13.519
+to a thousand members.
+
+03:13.519 --> 03:15.280
+An example of an initiative that's put forth
+
+03:15.280 --> 03:16.879
+by the Emacs community on Telegram
+
+03:16.879 --> 03:18.720
+is @emacs_stories. @emacs_stories
+
+03:18.720 --> 03:21.680
+collects links and messages and pictures
+
+03:21.680 --> 03:24.080
+that can showcase what Emacs can do.
+
+03:24.080 --> 03:25.680
+One of the goals here is
+
+03:25.680 --> 03:28.239
+to show people that are new to emacs
+
+03:28.239 --> 03:29.120
+what you can achieve
+
+03:29.120 --> 03:31.200
+if you spend time with your editor.
+
+03:31.200 --> 03:32.480
+And here, what I'm showing you
+
+03:32.480 --> 03:34.159
+is a screenshot from Telega.
+
+03:34.159 --> 03:36.080
+So let's move on to the final topic
+
+03:36.080 --> 03:37.040
+of this discussion,
+
+03:37.040 --> 03:39.200
+which is telega.el.
+
+03:39.200 --> 03:41.440
+Telega is a terrific piece of software.
+
+03:41.440 --> 03:45.280
+Telega is a interface to telegram within Emacs.
+
+03:45.280 --> 03:46.959
+It's developed by @zevlg,
+
+03:46.959 --> 03:49.680
+which is a long-time Emacs hacker,
+
+03:49.680 --> 03:51.280
+and it's very actively developed.
+
+03:51.280 --> 03:54.000
+Telegram itself is under active development,
+
+03:54.000 --> 03:55.840
+and telega has to implement
+
+03:55.840 --> 03:57.200
+all these new features
+
+03:57.200 --> 03:58.720
+that Telegram implements.
+
+03:58.720 --> 04:00.400
+Indeed, Telega implements
+
+04:00.400 --> 04:01.360
+almost all the features
+
+04:01.360 --> 04:02.319
+available in Telegram,
+
+04:02.319 --> 04:04.159
+even things like live location,
+
+04:04.159 --> 04:05.439
+except for audio/video calls
+
+04:05.439 --> 04:07.040
+but these are work in progress.
+
+04:07.040 --> 04:08.000
+Just to give you an idea
+
+04:08.000 --> 04:09.040
+of the size of this effort,
+
+04:09.040 --> 04:09.680
+we're talking about
+
+04:09.680 --> 04:11.280
+30,000 lines of code,
+
+04:11.280 --> 04:12.720
+which doesn't tell you much,
+
+04:12.720 --> 04:14.080
+but maybe you can get a sense
+
+04:14.080 --> 04:16.000
+that this is a significant project.
+
+04:16.000 --> 04:18.400
+In fact, I think Telega is a really remarkable
+
+04:18.400 --> 04:19.199
+piece of software.
+
+04:19.199 --> 04:20.639
+Not only it implements all the features
+
+04:20.639 --> 04:21.680
+available in Telegram,
+
+04:21.680 --> 04:22.960
+but implements new ones,
+
+04:22.960 --> 04:25.120
+which are only available to Emacs users.
+
+04:25.120 --> 04:26.800
+Here I'm blinking the documentation
+
+04:26.800 --> 04:28.560
+for you to read if you're interested.
+
+04:28.560 --> 04:29.759
+What I want to mention, though,
+
+04:29.759 --> 04:31.360
+is that Telega is available on MELPA,
+
+04:31.360 --> 04:34.160
+but it requires an external library, TDlib.
+
+04:34.160 --> 04:35.759
+Most distributions do not pack
+
+04:35.759 --> 04:37.360
+a recent version of TDlib.
+
+04:37.360 --> 04:39.600
+Such you have to compile yourself.
+
+04:39.600 --> 04:41.280
+if you don't want to compile TDlib,
+
+04:41.280 --> 04:43.120
+you can use the officially supported
+
+04:43.120 --> 04:44.560
+Dockerfile or guix file
+
+04:44.560 --> 04:46.080
+so that you can get everything
+
+04:46.080 --> 04:48.000
+without too much worry.
+
+04:48.000 --> 04:50.720
+Now let me tell you more about Telegram.
+
+04:50.720 --> 04:52.080
+Of course, the best way is to just
+
+04:52.080 --> 04:53.520
+experiment with it yourself.
+
+04:53.520 --> 04:54.800
+And here I just want to give you
+
+04:54.800 --> 04:56.720
+a glimpse of how Telega works.
+
+04:56.720 --> 04:57.840
+When you start Telega,
+
+04:57.840 --> 05:00.000
+what you see is a root buffer.
+
+05:00.000 --> 05:01.280
+The root buffer is essentially
+
+05:01.280 --> 05:02.960
+the list of all the chats that you have,
+
+05:02.960 --> 05:05.199
+and, by itself, is a really powerful tool.
+
+05:05.199 --> 05:06.639
+You can use it for sorting
+
+05:06.639 --> 05:07.680
+and filtering your chats,
+
+05:07.680 --> 05:10.639
+or you can create groups which are thematic.
+
+05:10.639 --> 05:12.720
+There's sophisticated search functions.
+
+05:12.720 --> 05:14.240
+For example, if you want to search only
+
+05:14.240 --> 05:16.800
+for specific type of media,
+
+05:16.800 --> 05:18.240
+you can start new chats,
+
+05:18.240 --> 05:19.680
+you can get info about the chats,
+
+05:19.680 --> 05:22.479
+and you can even change Telegram settings
+
+05:22.479 --> 05:24.720
+which are applied across the board.
+
+05:24.720 --> 05:26.479
+Here I'm showing you an example
+
+05:26.479 --> 05:27.520
+of what it looks like.
+
+05:27.520 --> 05:30.720
+As you see, we're enjoying the support for emoji
+
+05:30.720 --> 05:33.039
+that Emacs has been improving upon
+
+05:33.039 --> 05:34.320
+over the past years.
+
+05:34.320 --> 05:36.400
+Once you select one of these charts,
+
+05:36.400 --> 05:38.880
+you're brought to the chat buffer.
+
+05:38.880 --> 05:40.400
+Here I'm showing an example of
+
+05:40.400 --> 05:42.320
+what a chat buffer looks like.
+
+05:42.320 --> 05:43.360
+So this is a screenshot
+
+05:43.360 --> 05:45.520
+from the Emacs English group
+
+05:45.520 --> 05:47.840
+where people were discussing about
+
+05:47.840 --> 05:49.039
+compiling Emacs.
+
+05:49.039 --> 05:52.000
+As you can see, we see the conversation.
+
+05:52.000 --> 05:53.280
+We see the avatars.
+
+05:53.280 --> 05:54.639
+We see that there's a thread.
+
+05:54.639 --> 05:55.440
+We also see that
+
+05:55.440 --> 05:57.360
+I'm going to send a message,
+
+05:57.360 --> 05:58.240
+message with emoji,
+
+05:58.240 --> 05:59.440
+a message with formatting,
+
+05:59.440 --> 06:01.120
+and I'm attaching an object.
+
+06:01.120 --> 06:03.680
+I can format my messages
+
+06:03.680 --> 06:05.520
+using Markdown or Org Mode
+
+06:05.520 --> 06:06.720
+or whatever I prefer
+
+06:06.720 --> 06:09.199
+and I can attach any kind of attachment
+
+06:09.199 --> 06:10.560
+I like. For example...
+
+06:10.560 --> 06:11.520
+What I can also do is,
+
+06:11.520 --> 06:13.120
+if I'm editing a buffer,
+
+06:13.120 --> 06:15.680
+I can send that buffer through Telega,
+
+06:15.680 --> 06:17.199
+which I find quite useful
+
+06:17.199 --> 06:18.720
+especially when I'm sending code.
+
+06:18.720 --> 06:20.240
+And again, just to show you that
+
+06:20.240 --> 06:22.319
+Telegram is not just text messages
+
+06:22.319 --> 06:25.199
+and Telega supports all the features in Telegram,
+
+06:25.199 --> 06:27.199
+here at the bottom, I'm showing
+
+06:27.199 --> 06:29.759
+a voice note being played through Emacs,
+
+06:29.759 --> 06:31.919
+and as you see, there are some buttons
+
+06:31.919 --> 06:33.199
+which are functional.
+
+06:33.199 --> 06:36.240
+If I hit the two times button,
+
+06:36.240 --> 06:38.160
+the playback speed will be twice,
+
+06:38.160 --> 06:39.600
+which is really neat.
+
+06:39.600 --> 06:40.800
+Telega and Emacs can even
+
+06:40.800 --> 06:43.039
+reproduce videos or gifs,
+
+06:43.039 --> 06:45.280
+at least for a recent version of Emacs.
+
+06:45.280 --> 06:47.520
+Finally, I want to emphasize that Telega
+
+06:47.520 --> 06:49.280
+integrates really well with Emacs.
+
+06:49.280 --> 06:51.039
+For example, we are showing you
+
+06:51.039 --> 06:54.319
+how you can use a transient interface
+
+06:54.319 --> 06:56.720
+to Telega, or on the other side,
+
+06:56.720 --> 06:59.280
+I'm showing you how Telega integrates
+
+06:59.280 --> 07:00.080
+with dashboard,
+
+07:00.080 --> 07:01.440
+so that we have recent chats
+
+07:01.440 --> 07:03.120
+and we have the Emacs stories.
+
+07:03.120 --> 07:03.840
+Because, you know,
+
+07:03.840 --> 07:05.759
+who doesn't like Emacs with stories.
+
+07:05.759 --> 07:06.880
+On top, on the other hand,
+
+07:06.880 --> 07:08.880
+I'm showing you that we can have
+
+07:08.880 --> 07:09.919
+syntax highlighting,
+
+07:09.919 --> 07:11.759
+which is something that Telegram by itself
+
+07:11.759 --> 07:14.240
+doesn't have, this Emacs-only feature,
+
+07:14.240 --> 07:15.919
+and we can edit this
+
+07:15.919 --> 07:17.599
+in the same way we edit
+
+07:17.599 --> 07:19.759
+Org Mode source blocks,
+
+07:19.759 --> 07:20.880
+so we can edit this
+
+07:20.880 --> 07:22.800
+with the minor mode for,
+
+07:22.800 --> 07:24.080
+in this case, Emacs Lisp.
+
+07:24.080 --> 07:26.240
+So, to conclude, I wanted to show you
+
+07:26.240 --> 07:27.759
+that the Emacs community
+
+07:27.759 --> 07:29.120
+also meets on Telegram,
+
+07:29.120 --> 07:31.360
+and we're an active and healthy community,
+
+07:31.360 --> 07:32.880
+and I want to present Telega
+
+07:32.880 --> 07:35.759
+as a really amazing piece of software,
+
+07:35.759 --> 07:37.919
+one of the best clients available for
+
+07:37.919 --> 07:39.599
+Telegram with Emacs.
+
+07:39.599 --> 07:41.680
+Even if you don't use Telegram,
+
+07:41.680 --> 07:43.599
+I think you should have a look at Telega
+
+07:43.599 --> 07:46.080
+just to appreciate how amazing
+
+07:46.080 --> 07:47.280
+a piece of software it is.
+
+07:47.280 --> 07:49.680
+And with this, I thank you for your attention,
+
+07:49.680 --> 07:50.960
+and if you like Telega,
+
+07:50.960 --> 07:52.720
+please consider donating
+
+07:52.720 --> 07:54.800
+to support the development of the package.
+
+07:54.800 --> 07:57.599
+Thanks.
diff --git a/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt
new file mode 100644
index 00000000..87161e3d
--- /dev/null
+++ b/2021/captions/emacsconf-2021-telega--telega-el-and-the-emacs-community-on-telegram--gabriele-bozolla-and-evgeny-zajcev--main.vtt
@@ -0,0 +1,769 @@
+WEBVTT
+
+00:00.000 --> 00:01.599
+Hello, my name is Gabriele,
+
+00:01.599 --> 00:03.439
+and today I'm going to tell you about Telega
+
+00:03.439 --> 00:05.600
+and the Emacs community on Telegram.
+
+00:05.600 --> 00:08.400
+I'm not affiliated with Telegram or Telega,
+
+00:08.400 --> 00:10.719
+and opinions are my own in general.
+
+00:10.719 --> 00:14.160
+I'm going to give you my personal spin about these topics.
+
+00:14.160 --> 00:16.160
+The plan for the talk is the following.
+
+00:16.160 --> 00:18.800
+First, I'm going to talk about what is Telegram.
+
+00:18.800 --> 00:19.840
+Next, I'm going to tell you
+
+00:19.840 --> 00:21.840
+about the Emacs community on Telegram.
+
+00:21.840 --> 00:24.720
+And finally, I'm going to discuss telega.el,
+
+00:24.720 --> 00:26.560
+an Emacs package for Telegram.
+
+00:26.560 --> 00:29.359
+In all of these, I'm now going to dive into details.
+
+00:29.359 --> 00:30.880
+My goal here is to give you
+
+00:30.880 --> 00:33.120
+some exposure about these topics.
+
+00:33.120 --> 00:35.840
+You can find out more online, if you want.
+
+00:35.840 --> 00:38.960
+Let's get started with what is
+Telegram.
+
+00:38.960 --> 00:41.100
+Telegram is a cloud-based
+
+00:41.100 --> 00:42.879
+instant messaging platform.
+
+00:42.879 --> 00:44.079
+It's a popular one.
+
+00:44.079 --> 00:46.559
+It has more than half a billion users.
+
+00:46.559 --> 00:47.840
+I think one of the reasons
+
+00:47.840 --> 00:49.600
+why it's so popular, it's because
+
+00:49.600 --> 00:51.360
+it's really rich in features
+
+00:51.360 --> 00:52.960
+while being user friendly.
+
+00:52.960 --> 00:54.640
+Hence, in some regions,
+
+00:54.640 --> 00:56.960
+Telegram has good market penetration.
+
+00:56.960 --> 00:59.039
+And of course, because of network effects,
+
+00:59.039 --> 01:01.120
+this brings even more users.
+
+01:01.120 --> 01:02.239
+The details of the features
+
+01:02.239 --> 01:03.680
+is not particularly important.
+
+01:03.680 --> 01:04.879
+What i want to emphasize, though,
+
+01:04.879 --> 01:08.400
+is that while telegram is mostly text-based
+
+01:08.400 --> 01:12.000
+there's also support for audio/video calls and notes,
+
+01:12.000 --> 01:13.600
+and there's also a lot of features
+
+01:13.600 --> 01:15.119
+which typically you find
+
+01:15.119 --> 01:17.360
+in other instant messaging platforms:
+
+01:17.360 --> 01:18.479
+you can chat with yourself,
+
+01:18.479 --> 01:19.360
+you can make polls,
+
+01:19.360 --> 01:20.159
+you can make quizzes,
+
+01:20.159 --> 01:21.280
+you can schedule messages,
+
+01:21.280 --> 01:23.280
+you can send attachments of any kind,
+
+01:23.280 --> 01:25.759
+even big ones, and you can send stickers.
+
+01:25.759 --> 01:27.759
+Telegram, overall, is quite customizable,
+
+01:27.759 --> 01:30.560
+and I would say that the platform is, overall, hackable.
+
+01:30.560 --> 01:32.799
+You can expand it with bots
+
+01:32.799 --> 01:35.280
+and the clients are open source.
+
+01:35.280 --> 01:37.280
+In all of this, we shouldn't forget, though,
+
+01:37.280 --> 01:38.448
+the Telegram is centralized
+
+01:38.448 --> 01:39.840
+and it is not free software.
+
+01:39.840 --> 01:42.720
+Nonetheless, it's still used by a number of people,
+
+01:42.720 --> 01:45.200
+and people use telegram for different reasons.
+
+01:45.200 --> 01:47.200
+For example, some people use it to stay in touch
+
+01:47.200 --> 01:48.399
+with friends and families.
+
+01:48.399 --> 01:50.560
+For this, Telegram offers private chats
+
+01:50.560 --> 01:53.600
+or group chats with a restricted number of people.
+
+01:53.600 --> 01:55.040
+A lot of people use it
+
+01:55.040 --> 01:57.600
+for engaging in online communities.
+
+01:57.600 --> 01:59.439
+For this, Telegram has super groups,
+
+01:59.439 --> 02:00.719
+which are groups with up to
+
+02:00.719 --> 02:02.159
+hundreds of thousands of users,
+
+02:02.159 --> 02:03.360
+and has also channels,
+
+02:03.360 --> 02:07.119
+which are one-to-many ways of communicating,
+
+02:07.119 --> 02:09.280
+so these are ideally suited for,
+
+02:09.280 --> 02:10.959
+for example, following news,
+
+02:10.959 --> 02:12.167
+all sorts of news.
+
+02:12.167 --> 02:13.680
+Telegram also has bots
+
+02:13.680 --> 02:15.840
+which can be useful by themselves.
+
+02:15.840 --> 02:17.040
+They provide value.
+
+02:17.040 --> 02:18.400
+And the chat with oneself
+
+02:18.400 --> 02:20.400
+can be used for sending links,
+
+02:20.400 --> 02:23.440
+making notes, or sending reminders.
+
+02:23.440 --> 02:24.959
+So overall, there's multiple ways
+
+02:24.959 --> 02:26.560
+in which you can use telegram.
+
+02:26.560 --> 02:28.239
+When it comes to instant messaging,
+
+02:28.239 --> 02:30.000
+many people call Telegram home.
+
+02:30.000 --> 02:31.840
+It shouldn't come as a surprise, then,
+
+02:31.840 --> 02:34.480
+that Emacs users want to
+meet
+
+02:34.480 --> 02:35.680
+on Telegram as well.
+
+02:35.680 --> 02:38.480
+And indeed, there's an Emacs community on Telegram.
+
+02:38.480 --> 02:41.519
+Here I'm listing a few super groups
+about Emacs.
+
+02:41.519 --> 02:43.040
+There are language groups,
+
+02:43.040 --> 02:45.599
+so there's Emacs English, Emacs Russian,
+
+02:45.599 --> 02:48.800
+Emacs Spanish, Emacs Mandarin, Portuguese...
+
+02:48.800 --> 02:51.440
+There are groups which are specific to starter packs.
+
+02:51.440 --> 02:53.040
+For example, there are Doom Emacs,
+
+02:53.040 --> 02:54.879
+Spacemacs, and there are groups
+
+02:54.879 --> 02:57.280
+which are specific to packages like telega
+
+02:57.280 --> 02:58.720
+which I'm going to discuss later.
+
+02:58.720 --> 03:00.159
+These are what you would expect
+
+03:00.159 --> 03:02.800
+from traditional internet chat rooms.
+
+03:02.800 --> 03:04.319
+So they're used for shared links,
+
+03:04.319 --> 03:06.959
+they're used for discussing, troubleshooting,
+
+03:06.959 --> 03:09.120
+giving each other recommendations...
+
+03:09.120 --> 03:10.879
+I think there are healthy communities
+
+03:10.879 --> 03:12.239
+with typically a hundred
+
+03:12.239 --> 03:13.519
+to a thousand members.
+
+03:13.519 --> 03:15.280
+An example of an initiative that's put forth
+
+03:15.280 --> 03:16.879
+by the Emacs community on Telegram
+
+03:16.879 --> 03:18.720
+is @emacs_stories. @emacs_stories
+
+03:18.720 --> 03:21.680
+collects links and messages and pictures
+
+03:21.680 --> 03:24.080
+that can showcase what Emacs can do.
+
+03:24.080 --> 03:25.680
+One of the goals here is
+
+03:25.680 --> 03:28.239
+to show people that are new to emacs
+
+03:28.239 --> 03:29.120
+what you can achieve
+
+03:29.120 --> 03:31.200
+if you spend time with your editor.
+
+03:31.200 --> 03:32.480
+And here, what I'm showing you
+
+03:32.480 --> 03:34.159
+is a screenshot from Telega.
+
+03:34.159 --> 03:36.080
+So let's move on to the final topic
+
+03:36.080 --> 03:37.040
+of this discussion,
+
+03:37.040 --> 03:39.200
+which is telega.el.
+
+03:39.200 --> 03:41.440
+Telega is a terrific piece of software.
+
+03:41.440 --> 03:45.280
+Telega is a interface to telegram within Emacs.
+
+03:45.280 --> 03:46.959
+It's developed by @zevlg,
+
+03:46.959 --> 03:49.680
+which is a long-time Emacs hacker,
+
+03:49.680 --> 03:51.280
+and it's very actively developed.
+
+03:51.280 --> 03:54.000
+Telegram itself is under active development,
+
+03:54.000 --> 03:55.840
+and telega has to implement
+
+03:55.840 --> 03:57.200
+all these new features
+
+03:57.200 --> 03:58.720
+that Telegram implements.
+
+03:58.720 --> 04:00.400
+Indeed, Telega implements
+
+04:00.400 --> 04:01.360
+almost all the features
+
+04:01.360 --> 04:02.319
+available in Telegram,
+
+04:02.319 --> 04:04.159
+even things like live location,
+
+04:04.159 --> 04:05.439
+except for audio/video calls
+
+04:05.439 --> 04:07.040
+but these are work in progress.
+
+04:07.040 --> 04:08.000
+Just to give you an idea
+
+04:08.000 --> 04:09.040
+of the size of this effort,
+
+04:09.040 --> 04:09.680
+we're talking about
+
+04:09.680 --> 04:11.280
+30,000 lines of code,
+
+04:11.280 --> 04:12.720
+which doesn't tell you much,
+
+04:12.720 --> 04:14.080
+but maybe you can get a sense
+
+04:14.080 --> 04:16.000
+that this is a significant project.
+
+04:16.000 --> 04:18.400
+In fact, I think Telega is a really remarkable
+
+04:18.400 --> 04:19.199
+piece of software.
+
+04:19.199 --> 04:20.639
+Not only it implements all the features
+
+04:20.639 --> 04:21.680
+available in Telegram,
+
+04:21.680 --> 04:22.960
+but implements new ones,
+
+04:22.960 --> 04:25.120
+which are only available to Emacs users.
+
+04:25.120 --> 04:26.800
+Here I'm blinking the documentation
+
+04:26.800 --> 04:28.560
+for you to read if you're interested.
+
+04:28.560 --> 04:29.759
+What I want to mention, though,
+
+04:29.759 --> 04:31.360
+is that Telega is available on MELPA,
+
+04:31.360 --> 04:34.160
+but it requires an external library, TDlib.
+
+04:34.160 --> 04:35.759
+Most distributions do not pack
+
+04:35.759 --> 04:37.360
+a recent version of TDlib.
+
+04:37.360 --> 04:39.600
+Such you have to compile yourself.
+
+04:39.600 --> 04:41.280
+if you don't want to compile TDlib,
+
+04:41.280 --> 04:43.120
+you can use the officially supported
+
+04:43.120 --> 04:44.560
+Dockerfile or guix file
+
+04:44.560 --> 04:46.080
+so that you can get everything
+
+04:46.080 --> 04:48.000
+without too much worry.
+
+04:48.000 --> 04:50.720
+Now let me tell you more about Telegram.
+
+04:50.720 --> 04:52.080
+Of course, the best way is to just
+
+04:52.080 --> 04:53.520
+experiment with it yourself.
+
+04:53.520 --> 04:54.800
+And here I just want to give you
+
+04:54.800 --> 04:56.720
+a glimpse of how Telega works.
+
+04:56.720 --> 04:57.840
+When you start Telega,
+
+04:57.840 --> 05:00.000
+what you see is a root buffer.
+
+05:00.000 --> 05:01.280
+The root buffer is essentially
+
+05:01.280 --> 05:02.960
+the list of all the chats that you have,
+
+05:02.960 --> 05:05.199
+and, by itself, is a really powerful tool.
+
+05:05.199 --> 05:06.639
+You can use it for sorting
+
+05:06.639 --> 05:07.680
+and filtering your chats,
+
+05:07.680 --> 05:10.639
+or you can create groups which are thematic.
+
+05:10.639 --> 05:12.720
+There's sophisticated search functions.
+
+05:12.720 --> 05:14.240
+For example, if you want to search only
+
+05:14.240 --> 05:16.800
+for specific type of media,
+
+05:16.800 --> 05:18.240
+you can start new chats,
+
+05:18.240 --> 05:19.680
+you can get info about the chats,
+
+05:19.680 --> 05:22.479
+and you can even change Telegram settings
+
+05:22.479 --> 05:24.720
+which are applied across the board.
+
+05:24.720 --> 05:26.479
+Here I'm showing you an example
+
+05:26.479 --> 05:27.520
+of what it looks like.
+
+05:27.520 --> 05:30.720
+As you see, we're enjoying the support for emoji
+
+05:30.720 --> 05:33.039
+that Emacs has been improving upon
+
+05:33.039 --> 05:34.320
+over the past years.
+
+05:34.320 --> 05:36.400
+Once you select one of these charts,
+
+05:36.400 --> 05:38.880
+you're brought to the chat buffer.
+
+05:38.880 --> 05:40.400
+Here I'm showing an example of
+
+05:40.400 --> 05:42.320
+what a chat buffer looks like.
+
+05:42.320 --> 05:43.360
+So this is a screenshot
+
+05:43.360 --> 05:45.520
+from the Emacs English group
+
+05:45.520 --> 05:47.840
+where people were discussing about
+
+05:47.840 --> 05:49.039
+compiling Emacs.
+
+05:49.039 --> 05:52.000
+As you can see, we see the conversation.
+
+05:52.000 --> 05:53.280
+We see the avatars.
+
+05:53.280 --> 05:54.639
+We see that there's a thread.
+
+05:54.639 --> 05:55.440
+We also see that
+
+05:55.440 --> 05:57.360
+I'm going to send a message,
+
+05:57.360 --> 05:58.240
+message with emoji,
+
+05:58.240 --> 05:59.440
+a message with formatting,
+
+05:59.440 --> 06:01.120
+and I'm attaching an object.
+
+06:01.120 --> 06:03.680
+I can format my messages
+
+06:03.680 --> 06:05.520
+using Markdown or Org Mode
+
+06:05.520 --> 06:06.720
+or whatever I prefer
+
+06:06.720 --> 06:09.199
+and I can attach any kind of attachment
+
+06:09.199 --> 06:10.560
+I like. For example...
+
+06:10.560 --> 06:11.520
+What I can also do is,
+
+06:11.520 --> 06:13.120
+if I'm editing a buffer,
+
+06:13.120 --> 06:15.680
+I can send that buffer through Telega,
+
+06:15.680 --> 06:17.199
+which I find quite useful
+
+06:17.199 --> 06:18.720
+especially when I'm sending code.
+
+06:18.720 --> 06:20.240
+And again, just to show you that
+
+06:20.240 --> 06:22.319
+Telegram is not just text messages
+
+06:22.319 --> 06:25.199
+and Telega supports all the features in Telegram,
+
+06:25.199 --> 06:27.199
+here at the bottom, I'm showing
+
+06:27.199 --> 06:29.759
+a voice note being played through Emacs,
+
+06:29.759 --> 06:31.919
+and as you see, there are some buttons
+
+06:31.919 --> 06:33.199
+which are functional.
+
+06:33.199 --> 06:36.240
+If I hit the two times button,
+
+06:36.240 --> 06:38.160
+the playback speed will be twice,
+
+06:38.160 --> 06:39.600
+which is really neat.
+
+06:39.600 --> 06:40.800
+Telega and Emacs can even
+
+06:40.800 --> 06:43.039
+reproduce videos or gifs,
+
+06:43.039 --> 06:45.280
+at least for a recent version of Emacs.
+
+06:45.280 --> 06:47.520
+Finally, I want to emphasize that Telega
+
+06:47.520 --> 06:49.280
+integrates really well with Emacs.
+
+06:49.280 --> 06:51.039
+For example, we are showing you
+
+06:51.039 --> 06:54.319
+how you can use a transient interface
+
+06:54.319 --> 06:56.720
+to Telega, or on the other side,
+
+06:56.720 --> 06:59.280
+I'm showing you how Telega integrates
+
+06:59.280 --> 07:00.080
+with dashboard,
+
+07:00.080 --> 07:01.440
+so that we have recent chats
+
+07:01.440 --> 07:03.120
+and we have the Emacs stories.
+
+07:03.120 --> 07:03.840
+Because, you know,
+
+07:03.840 --> 07:05.759
+who doesn't like Emacs with stories.
+
+07:05.759 --> 07:06.880
+On top, on the other hand,
+
+07:06.880 --> 07:08.880
+I'm showing you that we can have
+
+07:08.880 --> 07:09.919
+syntax highlighting,
+
+07:09.919 --> 07:11.759
+which is something that Telegram by itself
+
+07:11.759 --> 07:14.240
+doesn't have, this Emacs-only feature,
+
+07:14.240 --> 07:15.919
+and we can edit this
+
+07:15.919 --> 07:17.599
+in the same way we edit
+
+07:17.599 --> 07:19.759
+Org Mode source blocks,
+
+07:19.759 --> 07:20.880
+so we can edit this
+
+07:20.880 --> 07:22.800
+with the minor mode for,
+
+07:22.800 --> 07:24.080
+in this case, Emacs Lisp.
+
+07:24.080 --> 07:26.240
+So, to conclude, I wanted to show you
+
+07:26.240 --> 07:27.759
+that the Emacs community
+
+07:27.759 --> 07:29.120
+also meets on Telegram,
+
+07:29.120 --> 07:31.360
+and we're an active and healthy community,
+
+07:31.360 --> 07:32.880
+and I want to present Telega
+
+07:32.880 --> 07:35.759
+as a really amazing piece of software,
+
+07:35.759 --> 07:37.919
+one of the best clients available for
+
+07:37.919 --> 07:39.599
+Telegram with Emacs.
+
+07:39.599 --> 07:41.680
+Even if you don't use Telegram,
+
+07:41.680 --> 07:43.599
+I think you should have a look at Telega
+
+07:43.599 --> 07:46.080
+just to appreciate how amazing
+
+07:46.080 --> 07:47.280
+a piece of software it is.
+
+07:47.280 --> 07:49.680
+And with this, I thank you for your attention,
+
+07:49.680 --> 07:50.960
+and if you like Telega,
+
+07:50.960 --> 07:52.720
+please consider donating
+
+07:52.720 --> 07:54.800
+to support the development of the package.
+
+07:54.800 --> 07:57.599
+Thanks.
diff --git a/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt b/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt
new file mode 100644
index 00000000..f41f699b
--- /dev/null
+++ b/2021/captions/emacsconf-2021-test--test-blocks--eduardo-ochs--main.vtt
@@ -0,0 +1,493 @@
+WEBVTT
+
+00:00.240 --> 00:00:01.839
+Hi! My name is Eduardo Ochs.
+
+00:00:01.839 --> 00:00:02.639
+I'm the author of
+
+00:00:02.639 --> 00:00:04.319
+an Emacs package called eev,
+
+00:00:04.319 --> 00:00:05.279
+and this talk is about
+
+00:00:05.279 --> 00:00:06.480
+a new feature of eev
+
+00:00:06.480 --> 00:00:08.400
+called "test blocks".
+
+00:08.400 --> 00:00:10.320
+Let's start by a demo.
+
+00:10.320 --> 00:00:12.320
+This is a file in Lua that defines
+
+00:00:12.320 --> 00:00:14.160
+these two functions here,
+
+00:14.160 --> 00:00:18.000
+and if we type &lt;f8&gt; several times here,
+
+00:18.000 --> 00:00:20.720
+the &lt;f8&gt;s create a Lua REPL here
+
+00:00:20.720 --> 00:00:22.240
+and then they send these lines
+
+00:00:22.240 --> 00:00:25.840
+to the REPL, where this line here
+
+00:00:25.840 --> 00:00:27.840
+loads this file into the REPL,
+
+00:00:27.840 --> 00:00:29.679
+and these other lines here
+
+00:29.679 --> 00:00:33.200
+are tests for these lines.
+
+00:33.200 --> 00:00:34.719
+There's a lot of information here,
+
+00:00:34.719 --> 00:00:36.160
+so let me organize them
+
+00:00:36.160 --> 00:00:40.480
+in a more visual way.
+
+00:40.480 --> 00:00:42.960
+This is our file in Lua.
+
+00:42.960 --> 00:00:44.559
+Lua sees this thing
+
+00:00:44.559 --> 00:00:46.160
+as a multi-line comment,
+
+00:00:46.160 --> 00:00:47.520
+but we are going to see it
+
+00:00:47.520 --> 00:00:48.879
+as a test block.
+
+00:00:48.879 --> 00:00:50.879
+And eev mode is active,
+
+00:00:50.879 --> 00:00:54.480
+so &lt;f8&gt; does the right thing.
+
+00:54.480 --> 00:00:56.800
+These three lines here
+
+00:00:56.800 --> 00:00:58.320
+set up the target buffer
+
+00:00:58.320 --> 00:01:00.000
+running a Lua REPL.
+
+00:01:00.000 --> 00:01:02.079
+You can see the the prompt
+
+00:01:02.079 --> 00:01:03.520
+of the REPL here,
+
+01:03.520 --> 00:01:04.640
+and these lines here
+
+00:01:04.640 --> 00:01:07.200
+are sent to the REPL.
+
+01:07.200 --> 00:01:08.960
+When we type &lt;f8&gt;
+
+00:01:08.960 --> 00:01:10.720
+on a line that starts
+
+01:10.720 --> 00:01:11.680
+with a red star,
+
+00:01:11.680 --> 00:01:13.600
+like these lines here,
+
+01:13.600 --> 00:01:15.119
+what &lt;f8&gt; does is that
+
+00:01:15.119 --> 00:01:17.537
+it sends the rest of the line--
+
+00:01:17.537 --> 00:01:18.880
+sorry, it executes
+
+00:01:18.880 --> 00:01:21.119
+the rest of the line as Lisp.
+
+01:21.119 --> 00:01:23.920
+So the three &lt;f8&gt;s here
+
+01:23.920 --> 00:01:26.000
+executes these lines as Lisp,
+
+00:01:26.000 --> 00:01:29.520
+and they set up the target buffer here.
+
+01:29.520 --> 00:01:31.119
+When we type &lt;f8&gt;
+
+00:01:31.119 --> 00:01:32.720
+on a line that does not start
+
+00:01:32.720 --> 00:01:34.159
+with a red star,
+
+00:01:34.159 --> 00:01:35.680
+the &lt;f8&gt; sends the line
+
+00:01:35.680 --> 00:01:38.799
+to the target buffer and moves down.
+
+01:38.799 --> 00:01:40.619
+This line loads this file
+
+00:01:40.619 --> 00:01:45.200
+in the REPL, and these lines are tests.
+
+01:45.200 --> 00:01:46.799
+So we just saw how to use
+
+00:01:46.799 --> 00:01:48.240
+an existing test block;
+
+00:01:48.240 --> 00:01:49.840
+let's now see how to create
+
+00:01:49.840 --> 00:01:51.280
+a new test block.
+
+00:01:51.280 --> 00:01:52.640
+We just have to run this:
+
+01:52.640 --> 00:01:55.680
+M-x ee-insert-test-block -
+
+01:55.680 --> 00:01:58.079
+or M-x eeit.
+
+01:58.079 --> 00:02:01.439
+The result depends on the major mode.
+
+02:01.439 --> 00:02:03.920
+Let's understand that
+
+02:03.920 --> 00:02:06.079
+by looking at the source code.
+
+02:06.079 --> 00:02:08.720
+eeit is an alias to this function here,
+
+02:08.720 --> 00:02:09.920
+and this function is just
+
+00:02:09.920 --> 00:02:12.800
+five lines of code plus a docstring...
+
+02:12.800 --> 00:02:14.160
+and the docstring explains
+
+00:02:14.160 --> 00:02:15.920
+that if the major mode is foo-mode,
+
+00:02:15.920 --> 00:02:18.800
+then this function tries to call
+
+02:18.800 --> 00:02:21.360
+a function called ee-insert-test-foo-mode
+
+02:21.360 --> 00:02:24.800
+if that function exists,
+
+02:24.800 --> 00:02:27.280
+and that, if that function does not exist,
+
+02:27.280 --> 00:02:29.680
+then it yields an error.
+
+02:29.680 --> 00:02:31.120
+And here's an example
+
+00:02:31.120 --> 00:02:32.560
+of one such function.
+
+00:02:32.560 --> 00:02:34.800
+That's a function that inserts
+
+00:02:34.800 --> 00:02:37.280
+a test block in haskell-mode.
+
+02:37.280 --> 00:02:40.959
+Here we can see two functions like this:
+
+00:02:40.959 --> 00:02:46.080
+one for haskell-mode and one for js-mode.
+
+02:46.080 --> 00:02:48.560
+These functions look quite similar,
+
+00:02:48.560 --> 00:02:52.720
+but their effects look quite different.
+
+02:52.720 --> 00:02:54.800
+To make this comparison here,
+
+00:02:54.800 --> 00:02:57.280
+I started by writing--
+
+02:57.280 --> 00:02:59.040
+by creating seven files,
+
+00:02:59.040 --> 00:03:01.120
+each one in a different language.
+
+03:01.120 --> 00:03:03.040
+Initially, each one of these files
+
+03:03.040 --> 00:03:04.159
+only had a comment
+
+00:03:04.159 --> 00:03:06.403
+with the name of the language...
+
+00:03:06.403 --> 00:03:10.560
+so: C, Haskell, Javascript, Org Mode, etc.
+
+03:10.560 --> 00:03:12.560
+In each one of these files,
+
+00:03:12.560 --> 00:03:16.959
+I typed M-x eeit to insert a test block.
+
+03:16.959 --> 00:03:18.319
+So here we can see that
+
+00:03:18.319 --> 00:03:20.319
+these test blocks are different.
+
+03:20.319 --> 00:03:21.440
+For example, the syntax
+
+00:03:21.440 --> 00:03:22.560
+for multi-line comments
+
+00:03:22.560 --> 00:03:25.200
+is different depending on the language.
+
+03:25.200 --> 00:03:27.440
+This block here that selects
+
+00:03:27.440 --> 00:03:30.100
+which REPL to run is also different,
+
+00:03:30.100 --> 00:03:34.080
+and this line here that tells the REPL
+
+00:03:34.080 --> 00:03:36.000
+to load the current file
+
+00:03:36.000 --> 00:03:37.680
+is also different,
+
+03:37.680 --> 00:03:39.680
+depending on the language.
+
+03:39.680 --> 00:03:41.840
+In some cases, I had to improvise a bit.
+
+03:41.840 --> 00:03:45.360
+For example, to implement test blocks
+
+00:03:45.360 --> 00:03:48.560
+in shell mode, I had to use
+
+03:48.560 --> 00:03:52.560
+this weird syntax using a here-document.
+
+03:52.560 --> 00:03:55.040
+In Tcl, I also had to improvise a bit,
+
+00:03:55.040 --> 00:03:55.920
+and in some cases,
+
+00:03:55.920 --> 00:03:57.840
+I had to improvise a lot.
+
+03:57.840 --> 00:04:00.159
+For example, in Org Mode,
+
+00:04:00.159 --> 00:04:02.400
+there isn't an obvious REPL to run,
+
+00:04:02.400 --> 00:04:03.840
+and there isn't an obvious way
+
+00:04:03.840 --> 00:04:06.480
+to load the the current Org file
+
+00:04:06.480 --> 00:04:09.360
+into the REPL, so the default action
+
+00:04:09.360 --> 00:04:12.560
+of M-x eeit in Org Mode
+
+00:04:12.560 --> 00:04:15.439
+is just to insert this thing here,
+
+04:15.439 --> 00:04:22.320
+that we can use to run a shell in a REPL.
+
+04:22.320 --> 00:04:25.280
+So these functions are quite similar.
+
+00:04:25.280 --> 00:04:26.240
+In the beginning,
+
+00:04:26.240 --> 00:04:27.919
+I was writing all of them by hand...
+
+00:04:27.919 --> 00:04:29.120
+but then I got bored
+
+00:04:29.120 --> 00:04:30.160
+and I wrote a function
+
+00:04:30.160 --> 00:04:33.840
+to help me write functions like that.
+
+04:33.840 --> 00:04:37.280
+This function is called find-eeit-links,
+
+00:04:37.280 --> 00:04:39.919
+and it creates a temporary buffer,
+
+04:39.919 --> 00:04:42.080
+and the contents of this temporary buffer
+
+00:04:42.080 --> 00:04:44.320
+depends on the major mode. For example,
+
+00:04:44.320 --> 00:04:45.680
+if the current mode is python-mode,
+
+04:45.680 --> 00:04:48.880
+then running this function here
+
+04:48.880 --> 00:04:50.160
+creates a temporary buffer
+
+00:04:50.160 --> 00:04:53.120
+that lets me write the support
+
+00:04:53.120 --> 00:04:55.440
+for test blocks in python-mode,
+
+00:04:55.440 --> 00:04:57.440
+or rewrite the function
+
+00:04:57.440 --> 00:04:59.040
+that supports test blocks
+
+04:59.040 --> 00:05:00.880
+in python-mode.
+
+05:00.880 --> 00:05:03.600
+So if I'm in python-mode and I run this,
+
+05:03.600 --> 00:05:06.639
+I get a temporary buffer like this,
+
+05:06.639 --> 00:05:08.639
+in which this thing is my template
+
+00:05:08.639 --> 00:05:11.039
+for the function. Usually, this string
+
+00:05:11.039 --> 00:05:11.919
+is totally wrong,
+
+00:05:11.919 --> 00:05:13.919
+I have to rewrite this string,
+
+05:13.919 --> 00:05:14.960
+but the rest is right.
+
+00:05:14.960 --> 00:05:16.960
+You can see python-mode here
+
+00:05:16.960 --> 00:05:18.479
+in the name of the function.
+
+00:05:18.479 --> 00:05:20.080
+So we have to edit this
+
+00:05:20.080 --> 00:05:22.840
+and save that to our ~/.emacs.
+
+05:22.840 --> 00:05:26.080
+By the way, these things here
+
+00:05:26.080 --> 00:05:28.880
+hyperlinks to many different things...
+
+05:28.880 --> 00:05:31.600
+This Elisp hyperlink here
+
+05:31.600 --> 00:05:32.880
+points to the source code,
+
+00:05:32.880 --> 00:05:36.880
+to the section in which these functions
+
+00:05:36.880 --> 00:05:39.919
+are defined. So you can see this here,
+
+00:05:39.919 --> 00:05:41.759
+the function that supports C,
+
+05:41.759 --> 00:05:42.800
+the function for Haskell,
+
+00:05:42.800 --> 00:05:46.400
+the function for Javascript, etc...
+
+05:46.400 --> 00:05:47.520
+and that's it!
+
+00:05:47.520 --> 00:05:49.440
+This is a five-minute talk,
+
+00:05:49.440 --> 00:05:50.960
+so I can't say much...
+
+05:50.960 --> 00:05:52.320
+If you want more information,
+
+00:05:52.320 --> 00:05:54.800
+or if you want to see real-world examples,
+
+00:05:54.800 --> 00:05:57.280
+how I use test blocks, etc. etc.,
+
+00:05:57.280 --> 00:05:58.639
+see this page here...
+
+00:05:58.639 --> 00:06:01.253
+and I do not have time to explain this
+
+00:06:01.253 --> 00:06:02.560
+"By the way" here.
+
+06:02.560 --> 06:03.333
+So that's it! Thanks! =)
+
+06:03.333 --> 06:04.333
+[captions by Eduardo Ochs]
diff --git a/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 b/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
new file mode 100644
index 00000000..7ee41c3a
--- /dev/null
+++ b/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
@@ -0,0 +1,634 @@
+WEBVTT
+
+00:07.600 --> 00:00:09.120
+Hi! I'm Erik Anderson,
+
+00:00:09.120 --> 00:00:10.559
+and I'll be talking about tui,
+
+00:00:10.559 --> 00:00:11.840
+a user interface framework
+
+00:11.840 --> 00:00:15.040
+that I've written in Emacs Lisp.
+
+00:15.040 --> 00:00:16.196
+First, I want to talk a bit about
+
+00:00:16.196 --> 00:00:17.296
+the problem space of
+
+00:00:17.296 --> 00:00:18.728
+user interface development,
+
+00:00:18.728 --> 00:00:20.880
+specifically, I want to quickly illustrate
+
+00:00:20.880 --> 00:00:22.320
+some of the complexities involved
+
+00:00:22.320 --> 00:00:26.480
+with UI implementation in Emacs.
+
+00:26.480 --> 00:00:27.920
+In Emacs, we have the ubiquitous
+
+00:00:27.920 --> 00:00:29.920
+buffer object type that forms the container
+
+00:00:29.920 --> 00:00:31.920
+for most content in Emacs.
+
+00:00:31.920 --> 00:00:34.079
+Most interfaces we interact with
+
+00:00:34.079 --> 00:00:36.239
+consist of character based content
+
+00:00:36.239 --> 00:00:38.239
+in a buffer that's presented
+
+00:00:38.239 --> 00:00:40.079
+in a window in frame.
+
+00:40.079 --> 00:00:41.520
+Although the underlying content
+
+00:00:41.520 --> 00:00:44.320
+may be textual, Emacs has capable APIs
+
+00:00:44.320 --> 00:00:47.680
+to present rich content.
+
+00:47.680 --> 00:00:49.200
+The pervasiveness of buffers
+
+00:00:49.200 --> 00:00:50.879
+affords us wonderful flexibility.
+
+00:00:50.879 --> 00:00:52.559
+This presentation, for instance,
+
+00:00:52.559 --> 00:00:55.520
+is running in an Emacs buffer.
+
+00:55.520 --> 00:00:57.420
+Using Emacs's built-in basic
+
+00:00:57.420 --> 00:00:59.199
+button library, we can insert
+
+00:00:59.199 --> 00:01:00.884
+an interactive button
+
+00:01:00.884 --> 00:01:01.760
+that shows a message
+
+00:01:01.760 --> 00:01:06.080
+in the minibuffer when clicked.
+
+01:06.080 --> 00:01:09.200
+What about UIs that express application state?
+
+01:09.200 --> 00:01:11.439
+Most applications don't have a static UI.
+
+01:11.439 --> 00:01:13.280
+As application state changes,
+
+00:01:13.280 --> 00:01:14.320
+the UI should change
+
+00:01:14.320 --> 00:01:18.479
+to display the desired content.
+
+01:18.479 --> 00:01:20.320
+One simplifying strategy is to simply
+
+01:20.320 --> 00:01:23.600
+re-render the entire UI upon any change.
+
+01:23.600 --> 00:01:25.680
+First erase the contents of the buffer,
+
+01:25.680 --> 00:01:27.600
+and then reinsert your UI again
+
+00:01:27.600 --> 00:01:29.040
+with desired changes,
+
+00:01:29.040 --> 00:01:33.040
+and restore things like point and region.
+
+01:33.040 --> 00:01:34.560
+Basic composition is possible
+
+00:01:34.560 --> 00:01:35.759
+with this approach.
+
+00:01:35.759 --> 00:01:37.200
+Simply insert the elements
+
+00:01:37.200 --> 00:01:39.280
+of the UI in sequence.
+
+01:39.280 --> 00:01:40.640
+Complex elements can be
+
+00:01:40.640 --> 00:01:44.320
+composed of multiple sub-elements.
+
+01:44.320 --> 00:01:45.840
+UIs can be made extensible,
+
+00:01:45.840 --> 00:01:47.040
+and expose this composition,
+
+00:01:47.040 --> 00:01:49.360
+for example, with insertion hooks
+
+00:01:49.360 --> 00:01:52.320
+like magit's status sections hook.
+
+01:52.320 --> 00:01:54.159
+This generally relies on elements
+
+00:01:54.159 --> 00:01:56.640
+being well-behaved inserting themselves,
+
+00:01:56.640 --> 00:02:00.399
+not affecting the rest of the buffer.
+
+02:00.399 --> 00:02:02.960
+If we find ourselves with complex UIs,
+
+02:02.960 --> 00:02:04.640
+large buffers, long lines,
+
+00:02:04.640 --> 00:02:06.320
+or poor rendering performance,
+
+00:02:06.320 --> 00:02:09.039
+we might consider partial UI updates
+
+00:02:09.039 --> 00:02:11.360
+rather than re-rendering completely.
+
+02:11.360 --> 00:02:12.800
+In that case, the complexity
+
+00:02:12.800 --> 00:02:15.840
+for maintaining the UI quickly increases.
+
+00:02:15.840 --> 00:02:17.360
+As accessible as buffers are,
+
+00:02:17.360 --> 00:02:19.120
+we don't have high level abstractions
+
+00:02:19.120 --> 00:02:20.879
+for managing portions of a UI
+
+00:02:20.879 --> 00:02:22.160
+rendered to a buffer.
+
+00:02:22.160 --> 00:02:23.520
+(It) is left up to the programmers
+
+00:02:23.520 --> 00:02:25.440
+to track and update UI state.
+
+00:02:25.440 --> 00:02:26.540
+This is generally done by
+
+00:02:26.540 --> 00:02:28.959
+one of two methods, reflection,
+
+00:02:28.959 --> 00:02:30.800
+searching for strings or text properties
+
+00:02:30.800 --> 00:02:34.239
+within the buffer, or tracking segments
+
+00:02:34.239 --> 00:02:36.080
+of a UI buffer manually
+
+00:02:36.080 --> 00:02:38.959
+using numeric offsets, or marker,
+
+00:02:38.959 --> 00:02:45.280
+or overlay objects.
+
+02:45.280 --> 00:02:47.280
+Here we have a basic timer component
+
+02:47.280 --> 00:02:48.720
+that shows elapsed time
+
+00:02:48.720 --> 00:02:50.319
+after it's inserted.
+
+00:02:50.319 --> 00:02:52.160
+It works, but has several problems.
+
+00:02:52.160 --> 00:02:55.519
+It doesn't restore the user's point or mark,
+
+02:55.519 --> 00:02:59.120
+so it snaps back after every render,
+
+02:59.120 --> 00:03:01.040
+after every update.
+
+03:01.040 --> 00:03:03.360
+It relies on singleton global state,
+
+00:03:03.360 --> 00:03:05.124
+so isn't designed to coexist
+
+00:03:05.124 --> 00:03:12.000
+with other instances of itself.
+
+03:12.000 --> 00:03:13.200
+It doesn't use a marker,
+
+00:03:13.200 --> 00:03:14.640
+so it's sensitive to content
+
+00:03:14.640 --> 00:03:16.239
+proceeding it, that's following it,
+
+00:03:16.239 --> 00:03:23.519
+changing in the buffer.
+
+03:23.519 --> 00:03:25.120
+The update logic doesn't even consider
+
+03:25.120 --> 00:03:26.799
+which buffer it's trying to update.
+
+00:03:26.799 --> 00:03:27.840
+If I switch buffers,
+
+00:03:27.840 --> 00:03:29.360
+it will insert into another buffer,
+
+00:03:29.360 --> 00:03:31.519
+or even the minibuffer.
+
+03:31.519 --> 00:03:33.360
+It can't remove itself, or re-render
+
+00:03:33.360 --> 00:03:34.879
+if it gets corrupted, as you see.
+
+00:03:34.879 --> 00:03:35.920
+All in all, it's not
+
+00:03:35.920 --> 00:03:38.400
+a readily composable component.
+
+03:38.400 --> 00:03:39.519
+Addressing these components
+
+00:03:39.519 --> 00:03:41.920
+within this logic further increases
+
+00:03:41.920 --> 00:03:43.936
+the implementation complexity
+
+00:03:43.936 --> 00:03:45.680
+of this component,
+
+00:03:45.680 --> 00:03:46.640
+and still this component
+
+00:03:46.640 --> 00:03:47.280
+would likely have
+
+00:03:47.280 --> 00:03:49.120
+various subtle differences
+
+03:49.120 --> 00:03:52.480
+with other components
+
+00:03:52.480 --> 00:03:58.959
+implemented by other authors.
+
+03:58.959 --> 00:04:00.319
+For those of you unfamiliar
+
+00:04:00.319 --> 00:04:02.159
+with this term Yak Shaving,
+
+00:04:02.159 --> 00:04:04.080
+that is a quite technical term
+
+00:04:04.080 --> 00:04:07.599
+for any seemingly pointless activity,
+
+00:04:07.599 --> 00:04:09.680
+which is actually necessary
+
+00:04:09.680 --> 00:04:10.879
+to solve a problem,
+
+04:10.879 --> 00:04:11.920
+which solves a problem,
+
+00:04:11.920 --> 00:04:14.799
+which, several levels of recursion later,
+
+04:14.799 --> 00:04:18.239
+solves the real problem you're working on.
+
+04:18.239 --> 00:04:19.943
+The itch that led to this project
+
+00:04:19.943 --> 00:04:21.840
+was the desire to display a dense summary
+
+00:04:21.840 --> 00:04:24.400
+of local Git repository statuses.
+
+04:24.400 --> 00:04:26.560
+Encountering various implementation
+
+04:26.560 --> 00:04:30.080
+complexity for building UI elements,
+
+04:30.080 --> 00:04:31.680
+it led to the yak shaving endeavor
+
+00:04:31.680 --> 00:04:33.680
+that produced tui.
+
+04:33.680 --> 00:04:35.440
+When I wrote the library,
+
+04:35.440 --> 00:04:36.479
+I had recently played with
+
+00:04:36.479 --> 00:04:39.360
+a popular UI framework called React,
+
+00:04:39.360 --> 00:04:41.840
+and had an interest in learning
+
+00:04:41.840 --> 00:04:44.080
+about the internal architecture of React.
+
+00:04:44.080 --> 00:04:45.680
+So, rather than implement
+
+00:04:45.680 --> 00:04:46.960
+a string caching layer
+
+00:04:46.960 --> 00:04:49.280
+on top of tabulated list mode,
+
+00:04:49.280 --> 00:04:50.360
+I was rather inclined
+
+00:04:50.360 --> 00:04:52.400
+to go down the path of implementing
+
+00:04:52.400 --> 00:04:58.960
+the React API for Emacs Lisp.
+
+04:58.960 --> 00:05:00.896
+I'll offer a brief view of
+
+00:05:00.896 --> 00:05:05.120
+the tui Emacs Lisp API.
+
+05:05.120 --> 00:05:07.360
+Inserting component content
+
+00:05:07.360 --> 00:05:08.320
+is pretty straightforward.
+
+00:05:08.320 --> 00:05:10.160
+You take a component tree
+
+00:05:10.160 --> 00:05:16.240
+and render it in an Emacs buffer.
+
+05:16.240 --> 00:05:18.639
+If any elements in that tree are updated,
+
+05:18.639 --> 00:05:21.039
+their respective content on the tree
+
+00:05:21.039 --> 00:05:26.320
+is updated automatically.
+
+05:26.320 --> 00:05:27.919
+Here's a basic re-implementation
+
+00:05:27.919 --> 00:05:29.919
+of the straw man timer from earlier,
+
+00:05:29.919 --> 00:05:32.400
+using a macro for syntactic trigger.
+
+05:32.400 --> 00:05:34.404
+You'll notice that
+
+00:05:34.404 --> 00:05:36.164
+the signature includes its own
+
+00:05:36.164 --> 00:05:44.560
+object reference, arguments, and state.
+
+05:44.560 --> 00:05:46.400
+Associating arguments in the state
+
+05:46.400 --> 00:05:51.360
+with a component instance out of the box,
+
+05:51.360 --> 00:05:54.400
+makes it easy to design reusable components,
+
+00:05:54.400 --> 00:06:06.080
+and forms the basis for partial UI updates.
+
+06:06.080 --> 00:06:07.840
+The component rendering anchors
+
+00:06:07.840 --> 00:06:09.199
+are durable, so content can be
+
+00:06:09.199 --> 00:06:11.360
+added and removed surrounding content,
+
+00:06:11.360 --> 00:06:12.479
+or even within the region
+
+00:06:12.479 --> 00:06:13.280
+of the component,
+
+00:06:13.280 --> 00:06:16.319
+and replaced when it re-renders.
+
+06:16.319 --> 00:06:17.600
+Components will also
+
+00:06:17.600 --> 00:06:20.880
+cleanly remove themselves from a buffer
+
+00:06:20.880 --> 00:06:28.400
+when instructed to.
+
+06:28.400 --> 00:06:30.160
+tui contains the core implementation
+
+00:06:30.160 --> 00:06:33.440
+of the React API, so components,
+
+06:33.440 --> 00:06:35.840
+their constituent props, state,
+
+00:06:35.840 --> 00:06:38.000
+and all of the lifecycle methods
+
+00:06:38.000 --> 00:06:39.440
+associated with them,
+
+06:39.440 --> 00:06:41.120
+as well as keys, refs,
+
+00:06:41.120 --> 00:06:43.228
+and the fundamental
+
+00:06:43.228 --> 00:06:47.520
+reconciliation algorithm of React.
+
+06:47.520 --> 00:06:52.188
+A variety of other React APIs
+
+00:06:52.188 --> 00:06:58.080
+that haven't been implemented yet.
+
+06:58.080 --> 00:07:00.080
+It contains some useful features so far,
+
+07:00.080 --> 00:07:02.639
+such as hot reloading, reflection,
+
+00:07:02.639 --> 00:07:06.164
+and various debugging tools,
+
+00:07:06.164 --> 00:07:12.639
+and some reconciliation logging.
+
+07:12.639 --> 00:07:14.880
+Lastly, I'd like to give you some quick
+
+07:14.880 --> 00:07:19.039
+visual taste of components built with tui.
+
+07:19.039 --> 00:07:20.240
+The grid view that motivated
+
+00:07:20.240 --> 00:07:21.520
+my development of this package
+
+00:07:21.520 --> 00:07:23.039
+is very similar to Magit's
+
+00:07:23.039 --> 00:07:30.720
+list repositories functionality.
+
+07:30.720 --> 00:07:36.080
+Essentially, tabulated list mode
+
+07:36.080 --> 00:07:39.440
+but portable and has a separated model
+
+00:07:39.440 --> 00:07:49.360
+and presentation layers.
+
+07:49.360 --> 00:07:51.840
+Here's a basic xkcd comic viewer
+
+00:07:51.840 --> 00:08:07.360
+showing a couple classics.
+
+08:07.360 --> 00:08:10.080
+A long-standing React tutorial is
+
+08:10.080 --> 00:08:13.280
+building a tic-tac-toe game
+
+08:13.280 --> 00:08:14.879
+as a bit of a gimmick,
+
+08:14.879 --> 00:08:17.039
+and I'm not quite satisfied with
+
+00:08:17.039 --> 00:08:25.599
+the buffering direction,
+
+00:08:25.599 --> 00:08:27.120
+but it got me thinking about
+
+00:08:27.120 --> 00:08:28.639
+layout engines with text,
+
+00:08:28.639 --> 00:08:35.120
+so it was interesting.
+
+08:35.120 --> 00:08:38.560
+And here's a small
+
+00:08:38.560 --> 00:08:46.080
+Unicode character viewer
+
+08:46.080 --> 00:08:55.279
+capable of showing a bunch of characters.
+
+08:55.279 --> 00:08:57.279
+If this piques your interest,
+
+00:08:57.279 --> 00:08:59.200
+I would encourage you to check it out.
+
+08:59.200 --> 00:09:01.440
+tui should be usable by anyone
+
+00:09:01.440 --> 00:09:04.640
+with some basic Elisp familiarity,
+
+09:04.640 --> 00:09:09.680
+no prior knowledge about JavaScript
+
+00:09:09.680 --> 00:09:12.080
+or React is necessary.
+
+09:12.080 --> 00:09:13.732
+I'd absolutely love to talk with people
+
+00:09:13.732 --> 00:09:14.880
+about the tui package,
+
+00:09:14.880 --> 00:09:17.440
+textual user interfaces in general,
+
+00:09:17.440 --> 00:09:19.040
+and really anything in Emacs.
+
+00:09:19.040 --> 00:09:20.693
+If you have any ideas, feedback,
+
+00:09:20.693 --> 00:09:21.680
+or want to contribute,
+
+00:09:21.680 --> 00:09:23.360
+please reach out.
+
+09:23.360 --> 00:09:24.360
+Thank you all for listening.
+
+00:09:24.360 --> 00:09:27.000
+[captions by bhavin192 (Bhavin Gandhi)]
diff --git a/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--chapters.vtt b/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--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--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/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/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt b/2021/captions/emacsconf-2021-unix--gnus-not-unix-why-emacs-demonstrates-the-unix-philosophy-isnt-always-the-only-answer--daniel-rose--main.vtt
new file mode 100644
index 00000000..7925cec4
--- /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.vtt
@@ -0,0 +1,766 @@
+WEBVTT
+
+00:00.080 --> 00:01.199
+Hello!
+
+00:01.199 --> 00:04.000
+My name is Daniel or Daniil Rose.
+
+00:04.000 --> 00:05.680
+I use Emacs in my everyday life,
+
+00:05.680 --> 00:08.320
+from programming in C or Rust for work,
+
+00:08.320 --> 00:11.120
+to writing reports for classes.
+
+00:11.120 --> 00:12.389
+I'd like to start by adding
+
+00:12.389 --> 00:14.719
+an overarching theme to this talk.
+
+00:14.719 --> 00:15.603
+If there's only one thing
+
+00:15.603 --> 00:16.670
+that you remember from today,
+
+00:16.670 --> 00:17.886
+I'd like you to walk away
+
+00:17.886 --> 00:18.550
+with the understanding
+
+00:18.550 --> 00:20.720
+that the philosophies or ideologies
+
+00:20.720 --> 00:21.280
+are just that.
+
+00:21.280 --> 00:24.400
+By trying to box yourself in with a concept
+
+00:24.400 --> 00:25.440
+you might be blind to other methods.
+
+00:25.440 --> 00:27.360
+We live in an ever-changing world,
+
+00:27.360 --> 00:28.880
+and I hope that you can appreciate
+
+00:28.880 --> 00:00:31.598
+being flexible and adaptable.
+
+00:31.599 --> 00:33.280
+UNIX philosophy? As a quick intro
+
+00:33.280 --> 00:34.720
+for those who don't know,
+
+00:34.720 --> 00:35.680
+the UNIX philosophy
+
+00:35.680 --> 00:37.920
+was written by Doug McIlroy.
+
+00:37.920 --> 00:39.136
+It's wordy, so there is
+
+00:39.136 --> 00:40.000
+a great summarization
+
+00:40.000 --> 00:42.719
+by Peter H. Salus:
+
+00:42.719 --> 00:43.920
+Write programs that do one thing
+
+00:43.920 --> 00:46.879
+and do it well.
+
+00:46.879 --> 00:50.000
+Write programs to work together,
+
+00:50.000 --> 00:52.750
+and write programs to handle text streams,
+
+00:52.750 --> 00:00:57.599
+because they are the universal interface.
+
+00:57.600 --> 00:59.233
+So enter Emacs.
+
+00:59.233 --> 01:01.020
+Emacs doesn't quite adhere
+
+01:01.020 --> 01:01.983
+to those principles.
+
+01:01.983 --> 01:03.680
+"Do one thing and do it well"
+
+01:03.680 --> 01:04.640
+surely doesn't apply,
+
+01:04.640 --> 01:06.261
+since Emacs does /a lot/ of things
+
+01:06.261 --> 01:08.640
+and does the majority of those things well.
+
+01:08.640 --> 01:10.240
+It might apply if you consider Emacs
+
+01:10.240 --> 01:12.560
+purely as a Lisp environment, however.
+
+01:12.560 --> 01:14.141
+"Write programs to work together?"
+
+01:14.141 --> 01:15.767
+Arguably the thing Emacs is best
+
+01:15.767 --> 01:16.320
+out of the three,
+
+01:16.320 --> 01:17.370
+proven especially
+
+01:17.370 --> 01:18.619
+by all the various packages
+
+01:18.619 --> 01:20.240
+that work with external programs,
+
+01:20.240 --> 01:22.560
+LSP, and whatever else.
+
+01:22.560 --> 01:23.703
+"Handle text streams?"
+
+01:23.703 --> 00:01:25.438
+Well, that one depends.
+
+01:25.439 --> 01:27.583
+So, Emacs versus the original ideas.
+
+01:27.583 --> 01:29.317
+The summarizations are good,
+
+01:29.317 --> 01:31.067
+but they aren't truly what was said.
+
+01:31.067 --> 01:32.800
+If we look back at the originals,
+
+01:32.800 --> 01:34.517
+we'll see that Emacs strongly adheres
+
+01:34.517 --> 01:35.759
+to the second rule:
+
+01:35.759 --> 01:37.267
+Design and build software,
+
+01:37.267 --> 01:38.433
+even operating systems,
+
+01:38.433 --> 01:39.233
+to be tried early,
+
+01:39.233 --> 01:40.633
+ideally within weeks.
+
+01:40.633 --> 01:41.479
+Don't hesitate to throw away
+
+01:41.479 --> 01:42.367
+the clumsy parts
+
+01:42.367 --> 01:43.600
+and rebuild them.
+
+01:43.600 --> 01:45.003
+The concept of LISP,
+
+01:45.003 --> 01:46.933
+self documentation of Emacs,
+
+01:46.933 --> 01:48.159
+and the "REPL" style all make it
+
+01:48.159 --> 00:01:50.798
+a shining example of this rule.
+
+01:50.799 --> 01:52.880
+But why compare to UNIX?
+
+01:52.880 --> 01:55.520
+Truly, why compare to the UNIX philosophy?
+
+01:55.520 --> 01:57.360
+Although the "rules" set down are good ones
+
+01:57.360 --> 01:58.467
+for most programs,
+
+01:58.467 --> 02:00.000
+Emacs isn't most programs.
+
+02:00.000 --> 02:01.920
+The rules and summarizations
+
+02:01.920 --> 02:03.532
+even were written decades ago,
+
+02:03.532 --> 02:05.717
+before we had REST APIs, JSON,
+
+02:05.717 --> 02:07.150
+or any other modern interface.
+
+02:07.150 --> 02:08.467
+If the world adapts,
+
+02:08.467 --> 02:10.640
+why too can't we adapt the past?
+
+02:10.640 --> 02:11.966
+This concept of breaking the rules
+
+02:11.966 --> 02:13.250
+and forging its own path
+
+02:13.250 --> 02:14.467
+has allowed Emacs to continue
+
+02:14.467 --> 00:02:17.439
+and be reworked for modern eras.
+
+02:17.440 --> 02:20.480
+Emacs /does/ work with the UNIX philosophy.
+
+02:20.480 --> 02:22.239
+By looking at both of these ideologies,
+
+02:22.239 --> 02:24.319
+why must they be mutually exclusive?
+
+02:24.319 --> 02:26.239
+Emacs does work with text:
+
+02:26.239 --> 02:28.800
+Magit is a wrapper for the git CLI
+
+02:28.800 --> 02:30.733
+Dired is a wrapper for ls,
+
+02:30.733 --> 02:32.450
+Consult grep for grep, and so on.
+
+02:32.450 --> 02:34.867
+Why rewrite poorly tools,
+
+02:34.867 --> 02:37.200
+when we can use the existing powerful ones?
+
+02:37.200 --> 02:38.253
+Well, that in itself
+
+02:38.253 --> 02:39.242
+is part of the UNIX philosophy.
+
+02:39.242 --> 02:40.567
+It seems that most strongly
+
+02:40.567 --> 02:41.453
+the UNIX philosophy
+
+02:41.453 --> 02:42.319
+applies to the command line.
+
+02:42.319 --> 02:44.183
+If we look at most graphical applications,
+
+02:44.183 --> 02:45.550
+these notions fall apart.
+
+02:45.550 --> 02:47.133
+But that isn't true for Emacs.
+
+02:47.133 --> 02:49.000
+It is a graphical application
+
+02:49.000 --> 02:49.817
+(at least for me)
+
+02:49.817 --> 02:51.133
+but it does use many other tools.
+
+02:51.133 --> 02:52.283
+Some have proposed
+
+02:52.283 --> 02:53.367
+that Emacs should be looked at
+
+02:53.367 --> 02:55.350
+alongside UNIX, as its own OS.
+
+02:55.350 --> 02:56.567
+It has windowing capabilities
+
+02:56.567 --> 02:57.567
+handles its own formats,
+
+02:57.567 --> 00:02:59.649
+and so on, but I disagree with this concept.
+
+02:59.650 --> 03:02.103
+Philosophies don't really matter
+
+03:02.103 --> 03:03.050
+in computing.
+
+03:03.050 --> 03:03.967
+It's true, they don't.
+
+03:03.967 --> 03:05.683
+As people, we like to group things.
+
+03:05.683 --> 03:06.603
+We like to have our set ways
+
+03:06.603 --> 03:07.267
+to describe them,
+
+03:07.267 --> 03:08.300
+but that doesn't always work.
+
+03:08.300 --> 03:10.017
+By sticking with a common concept
+
+03:10.017 --> 03:11.033
+in the Emacs community,
+
+03:11.033 --> 03:13.117
+do everything in Emacs,
+
+03:13.117 --> 00:03:15.049
+is it truly benefitting me and you?
+
+03:15.050 --> 03:18.017
+Android Studio. Here's an example.
+
+03:18.017 --> 03:20.083
+I work most often in Emacs.
+
+03:20.083 --> 03:21.067
+But I also have courses
+
+03:21.067 --> 03:22.567
+in Android and iOS development.
+
+03:22.567 --> 03:24.367
+I can absolutely install
+
+03:24.367 --> 03:25.317
+~android-mode~ and ~kotlin-mode~,
+
+03:25.317 --> 03:26.517
+and use ~adb~ in Emacs,
+
+03:26.517 --> 03:27.800
+but at that point,
+
+03:27.800 --> 03:29.050
+I am creating more work than it's worth.
+
+03:29.050 --> 03:30.300
+When unmaintained,
+
+03:30.300 --> 03:31.333
+things tend to fall apart,
+
+03:31.333 --> 03:33.100
+and many features of ~android-mode~
+
+03:33.100 --> 03:33.967
+no longer work for me.
+
+03:33.967 --> 03:35.817
+So I have two main options:
+
+03:35.817 --> 03:37.500
+fix the existing mode or write my own,
+
+03:37.500 --> 03:39.683
+or use the assumed tools for the job,
+
+03:39.683 --> 03:41.517
+like Android Studio and/or IntelliJ.
+
+03:41.517 --> 03:43.017
+Looking at Android Studio:
+
+03:43.017 --> 03:45.083
+I have plenty of plugins for colour themes,
+
+03:45.083 --> 03:45.733
+just like Emacs.
+
+03:45.733 --> 03:47.300
+I have Emacs keybindings built in,
+
+03:47.300 --> 03:48.800
+and other quality-of-life features.
+
+03:48.800 --> 03:50.833
+According to the UNIX philosophy,
+
+03:50.833 --> 03:51.933
+in a round-about way,
+
+03:51.933 --> 03:53.367
+I should be using one tool
+
+03:53.367 --> 03:54.683
+that does its job well.
+
+03:54.683 --> 03:55.500
+While not minimal,
+
+03:55.500 --> 03:57.650
+Android Studio accomplishes this job.
+
+03:57.650 --> 03:59.733
+Does that mean that I shouldn't use Emacs at all?
+
+03:59.733 --> 04:00.300
+Of course not!
+
+04:00.300 --> 04:01.700
+And while it may seem obvious,
+
+04:01.700 --> 04:03.050
+I feel we in this group
+
+04:03.050 --> 04:03.867
+often get caught up
+
+04:03.867 --> 04:04.533
+finding solutions
+
+04:04.533 --> 04:05.983
+in the one particular way
+
+04:05.983 --> 04:06.783
+we want it.
+
+04:06.783 --> 04:08.467
+This is where being adaptable
+
+04:08.467 --> 04:09.183
+comes in again.
+
+04:09.183 --> 04:11.000
+I need to learn how to mold my tools
+
+04:11.000 --> 04:11.800
+to my workflow,
+
+04:11.800 --> 04:13.133
+but also mold my workflow
+
+04:13.133 --> 00:04:14.382
+to the tools available.
+
+04:14.383 --> 04:15.683
+Window Managers.
+
+04:15.683 --> 04:18.050
+Another example of this is window managers.
+
+04:18.050 --> 04:19.367
+Although I've probably dabbled
+
+04:19.367 --> 04:21.083
+in window managers or desktop environments
+
+04:21.083 --> 04:22.583
+as much as the next person,
+
+04:22.583 --> 04:23.817
+I have usually stuck with DWM.
+
+04:23.817 --> 04:25.633
+But DWM doesn't follow
+
+04:25.633 --> 04:26.833
+any of the Emacs concepts:
+
+04:26.833 --> 04:27.967
+it has different keybindings--
+
+04:27.967 --> 04:29.250
+you can sort of do Emacs ones,
+
+04:29.250 --> 04:31.283
+no REPL (it's a C program after all).
+
+04:31.283 --> 04:33.617
+But I can still mold it to my workflow.
+
+04:33.617 --> 04:35.833
+If I run Emacs as a daemon and a client,
+
+04:35.833 --> 04:36.700
+what difference is it?
+
+04:36.700 --> 04:37.850
+My WM is essentially a wrapper
+
+04:37.850 --> 04:39.583
+for Emacs and my other vital programs.
+
+04:39.583 --> 04:41.533
+I don't need to make Emacs my WM,
+
+04:41.533 --> 00:04:42.899
+and bring along all the other issues.
+
+04:42.900 --> 04:45.383
+Browsers are a similar conversation.
+
+04:45.383 --> 04:46.883
+Initially, I understand the value
+
+04:46.883 --> 04:48.750
+of having my browser in Emacs, but why?
+
+04:48.750 --> 04:49.883
+If a tool exists that works well,
+
+04:49.883 --> 04:51.233
+ignoring the UNIX philosophy for a moment,
+
+04:51.233 --> 04:52.817
+why should I take the effort to rewrite it?
+
+04:52.817 --> 04:54.617
+Now, don't misinterpret what I'm saying.
+
+04:54.617 --> 04:56.083
+If you have a better way to do something:
+
+04:56.083 --> 04:57.583
+you can make it faster, easier to use,
+
+04:57.583 --> 04:58.717
+that I understand.
+
+04:58.717 --> 05:00.800
+But if I have, say, Nyxt or Firefox?
+
+05:00.800 --> 05:01.517
+Why would I take the effort
+
+05:01.517 --> 05:02.750
+to try and rewrite that into Emacs?
+
+05:02.750 --> 05:04.267
+Instead, this is a scenario
+
+05:04.267 --> 05:05.217
+where using a different tool
+
+05:05.217 --> 05:06.567
+alongside Emacs might be better.
+
+05:06.567 --> 05:08.433
+There's a talk later on in the conference
+
+05:08.350 --> 00:05:09.299
+about that from someone else.
+
+05:09.300 --> 05:12.017
+Vim. Even vim, jokingly,
+
+05:12.017 --> 05:13.500
+is the enemy of our community,
+
+05:13.500 --> 05:15.383
+but it's a good tool.
+
+05:15.383 --> 05:16.667
+Sometimes I just don't want to
+
+05:16.667 --> 05:17.983
+run Emacs as a daemon with evil-mode
+
+05:17.983 --> 05:19.883
+and I just want to quickly do something.
+
+05:19.883 --> 05:21.267
+And most people come from
+
+05:21.267 --> 05:22.733
+a power user terminal background,
+
+05:22.733 --> 05:24.167
+or at least I would assume s,.
+
+05:24.167 --> 05:25.900
+and those I have spoken with.
+
+05:25.900 --> 05:27.150
+If I need to quickly edit something,
+
+05:27.150 --> 06:40.960
+it might benefit me to
+
+05:27.840 --> 05:29.917
+just run a quick vim ./file
+
+05:29.917 --> 05:30.333
+in the terminal.
+
+05:30.333 --> 05:32.183
+I often have terminals open anyway
+
+05:32.183 --> 05:33.417
+due to the graphic acceleration
+
+05:33.417 --> 05:36.880
+from things like Alacritty.
+
+05:34.639 --> 05:36.167
+Speaking of terminals,
+
+05:36.167 --> 05:38.383
+this is the main tool I don't use in Emacs.
+
+05:38.383 --> 05:39.850
+While vterm might be nice,
+
+05:39.850 --> 05:41.433
+I often want to use a TUI tool.
+
+05:41.433 --> 05:43.667
+I most often write programs in C or Rust
+
+05:43.667 --> 05:45.200
+due to those being my main languages
+
+05:45.200 --> 05:46.050
+that I use professionally.
+
+05:46.050 --> 05:48.250
+If I can write a faster C or Rust program
+
+05:48.250 --> 05:49.400
+in half the time it'll take for me
+
+05:49.400 --> 05:50.483
+to write a slower Elisp one,
+
+05:50.483 --> 05:52.283
+I might prefer to do just that.
+
+05:52.283 --> 05:53.633
+Especially in the case of a TUI program,
+
+05:53.633 --> 05:55.517
+Alacritty helps me develop them faster
+
+05:55.517 --> 05:58.800
+but also run them.
+
+05:56.639 --> 05:58.850
+So if you've been using systemd
+
+05:58.850 --> 06:00.500
+or running commands in the terminal for years,
+
+06:00.500 --> 06:03.680
+it might take more effort to learn
+
+06:01.680 --> 06:05.039
+the way to do it in an Emacs frontend
+
+06:03.680 --> 06:04.933
+than in the terminal.
+
+06:04.933 --> 06:07.117
+And remember, most shells come with
+
+06:07.117 --> 06:07.567
+Emacs key bindings by default
+
+06:07.567 --> 06:09.350
+and macOS, for example,
+
+06:09.350 --> 06:11.200
+can use Emacs keybindings in most places
+
+06:11.200 --> 00:06:12.232
+including browsers.
+
+06:12.233 --> 06:13.567
+Do what helps you most,
+
+06:13.567 --> 06:17.360
+not what a philosophy or group tells you to do.
+
+06:16.000 --> 06:17.467
+I hope this illustrated some ways
+
+06:17.467 --> 06:18.750
+that Emacs is a tool in your belt,
+
+06:18.750 --> 06:19.733
+but not the belt itself.
+
+06:19.733 --> 06:22.800
+Do what works best for you,
+
+06:21.520 --> 06:22.717
+as being the most efficient
+
+06:22.717 --> 06:24.233
+doesn't always grant the best results.
+
+06:24.233 --> 06:25.983
+If you're used to doing something one way,
+
+06:25.983 --> 06:27.183
+consider still doing it that way
+
+06:27.183 --> 06:28.117
+while learning new skills
+
+06:28.117 --> 06:29.250
+and being adaptable. And after all,
+
+06:29.250 --> 06:30.683
+this is an Emacs conference
+
+06:30.683 --> 06:32.150
+so maybe consider learning a tool
+
+06:32.150 --> 06:33.517
+for both Emacs and the terminal,
+
+06:33.517 --> 06:34.367
+and then you might be
+
+06:34.367 --> 06:36.720
+just a little bit more flexible
+
+06:35.440 --> 06:40.960
+in the future.
+
+06:36.720 --> 06:40.960
+Thank you for listening to my talk today.
diff --git a/2021/captions/erg.md b/2021/captions/erg.md
new file mode 100644
index 00000000..873078dd
--- /dev/null
+++ b/2021/captions/erg.md
@@ -0,0 +1,354 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Raymond Puzio: Hello, I'm Raymond Puzio." start="00:00:00.880" video="mainVideo" id=subtitle]]
+[[!template text="I first learned about Emacs and Lisp" start="00:00:02.720" video="mainVideo" id=subtitle]]
+[[!template text="at an enrichment program" start="00:00:04.799" video="mainVideo" id=subtitle]]
+[[!template text="for high school students." start="00:00:05.920" video="mainVideo" id=subtitle]]
+[[!template text="When I studied physics at the university," start="00:00:07.200" video="mainVideo" id=subtitle]]
+[[!template text="I used Emacs and Tex" start="00:00:09.120" video="mainVideo" id=subtitle]]
+[[!template text="to write mathematical documents." start="00:00:10.400" video="mainVideo" id=subtitle]]
+[[!template text="Later on, I became active" start="00:00:12.320" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs and Lisp user groups where," start="00:00:13.920" video="mainVideo" id=subtitle]]
+[[!template text="among other things, I learned about" start="00:00:16.480" video="mainVideo" id=subtitle]]
+[[!template text="Org mode for reproducible research." start="00:00:18.160" video="mainVideo" id=subtitle]]
+[[!template text="Nowadays, I am working on" start="00:00:20.400" video="mainVideo" id=subtitle]]
+[[!template text="synthesizing Emacs and other programs" start="00:00:21.680" video="mainVideo" id=subtitle]]
+[[!template text="into an end-to-end platform" start="00:00:24.080" video="mainVideo" id=subtitle]]
+[[!template text="for scientific research and collaboration." start="00:00:25.599" video="mainVideo" id=subtitle]]
+[[!template text="Joe Corneli: I'm Joe Corneli." start="00:00:30.560" video="mainVideo" id=subtitle]]
+[[!template text="I also started using Emacs in high school" start="00:00:31.519" video="mainVideo" id=subtitle]]
+[[!template text="in a course on C programming," start="00:00:33.920" video="mainVideo" id=subtitle]]
+[[!template text="and now I'm technically" start="00:00:35.440" video="mainVideo" id=subtitle]]
+[[!template text="a computer scientist." start="00:00:36.800" video="mainVideo" id=subtitle]]
+[[!template text="My research background" start="00:00:38.239" video="mainVideo" id=subtitle]]
+[[!template text="is in mathematics and online communities." start="00:00:39.280" video="mainVideo" id=subtitle]]
+[[!template text="Noorah Alhasan: Hi, I'm Noorah Alhasan." start="00:00:43.120" video="mainVideo" id=subtitle]]
+[[!template text="I'm a member of the ERG group" start="00:00:45.039" video="mainVideo" id=subtitle]]
+[[!template text="and a PhD student at UT Austin" start="00:00:46.719" video="mainVideo" id=subtitle]]
+[[!template text="studying climate policy." start="00:00:49.600" video="mainVideo" id=subtitle]]
+[[!template text="So for this talk, the four of us" start="00:00:51.760" video="mainVideo" id=subtitle]]
+[[!template text="met at EmacsConf 2020 last year" start="00:00:54.239" video="mainVideo" id=subtitle]]
+[[!template text="with a common interest" start="00:00:56.640" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs and research." start="00:00:57.760" video="mainVideo" id=subtitle]]
+[[!template text="we've met almost every week since then" start="00:00:59.520" video="mainVideo" id=subtitle]]
+[[!template text="because we wanted to" start="00:01:01.760" video="mainVideo" id=subtitle]]
+[[!template text="keep the conversation going." start="00:01:02.640" video="mainVideo" id=subtitle]]
+[[!template text="In this short talk," start="00:01:04.479" video="mainVideo" id=subtitle]]
+[[!template text="we share information" start="00:01:05.519" video="mainVideo" id=subtitle]]
+[[!template text="about the methods we use." start="00:01:06.560" video="mainVideo" id=subtitle]]
+[[!template text="Here's the outline of our talk." start="00:01:08.240" video="mainVideo" id=subtitle]]
+[[!template text="First, we'll tell you" start="00:01:09.680" video="mainVideo" id=subtitle]]
+[[!template text="about the technologies we use" start="00:01:10.560" video="mainVideo" id=subtitle]]
+[[!template text="and show a short demo video" start="00:01:12.320" video="mainVideo" id=subtitle]]
+[[!template text="from one of the meetings." start="00:01:13.840" video="mainVideo" id=subtitle]]
+[[!template text="We'll then focus on" start="00:01:15.360" video="mainVideo" id=subtitle]]
+[[!template text="the time and content structuring methods" start="00:01:16.320" video="mainVideo" id=subtitle]]
+[[!template text="we use in our live sessions." start="00:01:18.880" video="mainVideo" id=subtitle]]
+[[!template text="Finally, we'll talk about" start="00:01:21.040" video="mainVideo" id=subtitle]]
+[[!template text="what came out of all this work." start="00:01:22.240" video="mainVideo" id=subtitle]]
+[[!template text="For example, we wrote a paper for the" start="00:01:24.320" video="mainVideo" id=subtitle]]
+[[!template text="Pattern Languages of Programs conference," start="00:01:28.159" video="mainVideo" id=subtitle]]
+[[!template text="and we designed a workshop" start="00:01:30.400" video="mainVideo" id=subtitle]]
+[[!template text="using the knowledge we created together." start="00:01:31.759" video="mainVideo" id=subtitle]]
+[[!template text="Very practically," start="00:01:33.920" video="mainVideo" id=subtitle]]
+[[!template text="this has improved the quality" start="00:01:35.600" video="mainVideo" id=subtitle]]
+[[!template text="of our own collaboration" start="00:01:37.119" video="mainVideo" id=subtitle]]
+[[!template text="and we have some lessons" start="00:01:38.640" video="mainVideo" id=subtitle]]
+[[!template text="about how you can create" start="00:01:39.680" video="mainVideo" id=subtitle]]
+[[!template text="a research community similar to ours." start="00:01:41.360" video="mainVideo" id=subtitle]]
+[[!template text="Joe: You'll have noticed that we all have" start="00:01:46.000" video="mainVideo" id=subtitle]]
+[[!template text="different research backgrounds" start="00:01:48.399" video="mainVideo" id=subtitle]]
+[[!template text="and we do think that transdisciplinarity" start="00:01:50.159" video="mainVideo" id=subtitle]]
+[[!template text="is important for solving big problems." start="00:01:52.640" video="mainVideo" id=subtitle]]
+[[!template text="However, if you have people" start="00:01:54.960" video="mainVideo" id=subtitle]]
+[[!template text="from different research backgrounds" start="00:01:56.719" video="mainVideo" id=subtitle]]
+[[!template text="working together," start="00:01:58.000" video="mainVideo" id=subtitle]]
+[[!template text="they need some scaffolding," start="00:01:58.560" video="mainVideo" id=subtitle]]
+[[!template text="both in terms of tools and methods," start="00:01:59.680" video="mainVideo" id=subtitle]]
+[[!template text="to have good conversations." start="00:02:01.360" video="mainVideo" id=subtitle]]
+[[!template text="And of course, as Emacs users," start="00:02:02.880" video="mainVideo" id=subtitle]]
+[[!template text="we wanted to have Emacs" start="00:02:04.320" video="mainVideo" id=subtitle]]
+[[!template text="at the center of that." start="00:02:05.439" video="mainVideo" id=subtitle]]
+[[!template text="Being in a meeting," start="00:02:07.360" video="mainVideo" id=subtitle]]
+[[!template text="taking real-time notes" start="00:02:08.640" video="mainVideo" id=subtitle]]
+[[!template text="collaboratively with Emacs" start="00:02:10.720" video="mainVideo" id=subtitle]]
+[[!template text="realizes a dream that some of us" start="00:02:11.920" video="mainVideo" id=subtitle]]
+[[!template text="have been entertaining" start="00:02:13.440" video="mainVideo" id=subtitle]]
+[[!template text="(and experimenting with)" start="00:02:14.480" video="mainVideo" id=subtitle]]
+[[!template text="for a while. The package crdt.el" start="00:02:15.520" video="mainVideo" id=subtitle]]
+[[!template text="by Qiantan Hong makes this easy." start="00:02:18.800" video="mainVideo" id=subtitle]]
+[[!template text="We take notes in our meetings" start="00:02:21.440" video="mainVideo" id=subtitle]]
+[[!template text="using Org Mode." start="00:02:22.959" video="mainVideo" id=subtitle]]
+[[!template text="Since we've seen this before" start="00:02:24.239" video="mainVideo" id=subtitle]]
+[[!template text="in talks on reproducible research," start="00:02:25.520" video="mainVideo" id=subtitle]]
+[[!template text="and since Leo is the maintainer of org-roam," start="00:02:27.040" video="mainVideo" id=subtitle]]
+[[!template text="it was a natural choice for us." start="00:02:29.920" video="mainVideo" id=subtitle]]
+[[!template text="It allows us to" start="00:02:31.680" video="mainVideo" id=subtitle]]
+[[!template text="put our notes online using git" start="00:02:32.400" video="mainVideo" id=subtitle]]
+[[!template text="and the static state generator Firn." start="00:02:34.080" video="mainVideo" id=subtitle]]
+[[!template text="And lastly, of course, we need" start="00:02:36.080" video="mainVideo" id=subtitle]]
+[[!template text="a real-time meeting tool." start="00:02:37.599" video="mainVideo" id=subtitle]]
+[[!template text="For that purpose," start="00:02:38.720" video="mainVideo" id=subtitle]]
+[[!template text="we use BBB in our weekly sessions" start="00:02:39.519" video="mainVideo" id=subtitle]]
+[[!template text="(in fact, we use the same server" start="00:02:41.920" video="mainVideo" id=subtitle]]
+[[!template text="that's used by EmacsConf," start="00:02:43.519" video="mainVideo" id=subtitle]]
+[[!template text="thanks again to Leo)." start="00:02:44.879" video="mainVideo" id=subtitle]]
+[[!template text="All of these tools are" start="00:02:46.720" video="mainVideo" id=subtitle]]
+[[!template text="free/libre/open source." start="00:02:48.000" video="mainVideo" id=subtitle]]
+[[!template text="However, BBB does have" start="00:02:49.380" video="mainVideo" id=subtitle]]
+[[!template text="some intensive hardware requirements." start="00:02:50.720" video="mainVideo" id=subtitle]]
+[[!template text="Next up, here's a" start="00:02:53.680" video="mainVideo" id=subtitle]]
+[[!template text="short pre-recorded snippet" start="00:02:54.800" video="mainVideo" id=subtitle]]
+[[!template text="from one of our recent meetings" start="00:02:56.239" video="mainVideo" id=subtitle]]
+[[!template text="so you can get a sense of how they go." start="00:02:57.680" video="mainVideo" id=subtitle]]
+[[!template text="Demo - Leo Vivier: Are we okay" start="00:03:01.840" video="mainVideo" id=subtitle]]
+[[!template text="pushing the demo to the end?" start="00:03:02.640" video="mainVideo" id=subtitle]]
+[[!template text="That kind of presupposes" start="00:03:04.159" video="mainVideo" id=subtitle]]
+[[!template text="a different structure" start="00:03:05.440" video="mainVideo" id=subtitle]]
+[[!template text="that you would usually have" start="00:03:07.120" video="mainVideo" id=subtitle]]
+[[!template text="in a presentation." start="00:03:08.080" video="mainVideo" id=subtitle]]
+[[!template text="Generally you have..." start="00:03:08.800" video="mainVideo" id=subtitle]]
+[[!template text="You introduce the demo, you do the demo," start="00:03:09.760" video="mainVideo" id=subtitle]]
+[[!template text="and then you do the conclusions," start="00:03:12.800" video="mainVideo" id=subtitle]]
+[[!template text="or what was good about the demo." start="00:03:14.720" video="mainVideo" id=subtitle]]
+[[!template text="Does that make sense to everyone?" start="00:03:16.560" video="mainVideo" id=subtitle]]
+[[!template text="Ray: Let's see." start="00:03:18.159" video="mainVideo" id=subtitle]]
+[[!template text="When you usually do that," start="00:03:18.560" video="mainVideo" id=subtitle]]
+[[!template text="that's because whatever you're demonstrating" start="00:03:19.599" video="mainVideo" id=subtitle]]
+[[!template text="is the main point of your talk," start="00:03:21.760" video="mainVideo" id=subtitle]]
+[[!template text="so if this was a talk about action reviews," start="00:03:23.840" video="mainVideo" id=subtitle]]
+[[!template text="that would make sense, but isn't it not ERG?" start="00:03:25.840" video="mainVideo" id=subtitle]]
+[[!template text="Leo: But it's because we are telling..." start="00:03:29.760" video="mainVideo" id=subtitle]]
+[[!template text="For me, I think it's a compound element." start="00:03:32.319" video="mainVideo" id=subtitle]]
+[[!template text="Yes, we are demonstrating the power," start="00:03:34.400" video="mainVideo" id=subtitle]]
+[[!template text="but we are also demonstrating" start="00:03:36.640" video="mainVideo" id=subtitle]]
+[[!template text="how we're working together by..." start="00:03:37.840" video="mainVideo" id=subtitle]]
+[[!template text="Yes, we might have introduced CRDT before" start="00:03:39.680" video="mainVideo" id=subtitle]]
+[[!template text="in the presentation itself," start="00:03:42.000" video="mainVideo" id=subtitle]]
+[[!template text="but if we need to be doing the power," start="00:03:43.840" video="mainVideo" id=subtitle]]
+[[!template text="and also showing tools like CRDT," start="00:03:46.959" video="mainVideo" id=subtitle]]
+[[!template text="obviously, we're not... probably not going" start="00:03:49.360" video="mainVideo" id=subtitle]]
+[[!template text="to be talking about... oh by the way," start="00:03:50.879" video="mainVideo" id=subtitle]]
+[[!template text="here we are using CRDT" start="00:03:52.959" video="mainVideo" id=subtitle]]
+[[!template text="and stuff like this." start="00:03:54.239" video="mainVideo" id=subtitle]]
+[[!template text="It feels like cramming a lot of stuff" start="00:03:54.879" video="mainVideo" id=subtitle]]
+[[!template text="into this demo at the end." start="00:03:57.280" video="mainVideo" id=subtitle]]
+[[!template text="Joe: So I think demo to me" start="00:03:58.720" video="mainVideo" id=subtitle]]
+[[!template text="is less about demoing one of the methods," start="00:04:00.159" video="mainVideo" id=subtitle]]
+[[!template text="because then people will get" start="00:04:02.159" video="mainVideo" id=subtitle]]
+[[!template text="a bit hung up on that." start="00:04:02.879" video="mainVideo" id=subtitle]]
+[[!template text="I think the demo..." start="00:04:05.439" video="mainVideo" id=subtitle]]
+[[!template text="You know, to be honest," start="00:04:07.360" video="mainVideo" id=subtitle]]
+[[!template text="here's another thing." start="00:04:08.080" video="mainVideo" id=subtitle]]
+[[!template text="What we could do--" start="00:04:09.200" video="mainVideo" id=subtitle]]
+[[!template text="this would be very clever--" start="00:04:09.920" video="mainVideo" id=subtitle]]
+[[!template text="we could make this the demo," start="00:04:10.959" video="mainVideo" id=subtitle]]
+[[!template text="what we're doing right now," start="00:04:12.400" video="mainVideo" id=subtitle]]
+[[!template text="writing this talk is the demo," start="00:04:13.920" video="mainVideo" id=subtitle]]
+[[!template text="and just go back into the video" start="00:04:15.519" video="mainVideo" id=subtitle]]
+[[!template text="and just get out a two-minute section," start="00:04:18.560" video="mainVideo" id=subtitle]]
+[[!template text="so we say, look we tried to write this talk," start="00:04:20.160" video="mainVideo" id=subtitle]]
+[[!template text="we went around, had a discussion," start="00:04:22.479" video="mainVideo" id=subtitle]]
+[[!template text="we had these things and then we just take..." start="00:04:23.680" video="mainVideo" id=subtitle]]
+[[!template text="We're going to pick two minutes" start="00:04:25.040" video="mainVideo" id=subtitle]]
+[[!template text="out of this video" start="00:04:26.240" video="mainVideo" id=subtitle]]
+[[!template text="and show you that" start="00:04:26.880" video="mainVideo" id=subtitle]]
+[[!template text="as a demo of how we actually work" start="00:04:27.440" video="mainVideo" id=subtitle]]
+[[!template text="and then we'll go back to the talk." start="00:04:29.280" video="mainVideo" id=subtitle]]
+[[!template text="I mean, it'd be very funny," start="00:04:30.320" video="mainVideo" id=subtitle]]
+[[!template text="and then we've already done the demo." start="00:04:31.199" video="mainVideo" id=subtitle]]
+[[!template text="It's just, like... uh yeah," start="00:04:32.880" video="mainVideo" id=subtitle]]
+[[!template text="then we're good to go." start="00:04:34.560" video="mainVideo" id=subtitle]]
+[[!template text="And it's got neural lines on the floor." start="00:04:35.280" video="mainVideo" id=subtitle]]
+[[!template text="It's like a perfect writer's room." start="00:04:37.120" video="mainVideo" id=subtitle]]
+[[!template text="It's a total amazing writer's room scenario," start="00:04:39.199" video="mainVideo" id=subtitle]]
+[[!template text="specifically because she's lying on her back" start="00:04:41.199" video="mainVideo" id=subtitle]]
+[[!template text="on the floor. Anyway. I mean," start="00:04:43.120" video="mainVideo" id=subtitle]]
+[[!template text="I think this would be fine." start="00:04:45.360" video="mainVideo" id=subtitle]]
+[[!template text="Leo: I think I particularly like the idea" start="00:04:47.680" video="mainVideo" id=subtitle]]
+[[!template text="of taking the snippet," start="00:04:49.520" video="mainVideo" id=subtitle]]
+[[!template text="the two minutes before the realization" start="00:04:52.080" video="mainVideo" id=subtitle]]
+[[!template text="that we could be using this as the demo," start="00:04:54.000" video="mainVideo" id=subtitle]]
+[[!template text="and then seeing the... well my face light up" start="00:04:56.400" video="mainVideo" id=subtitle]]
+[[!template text="because it feels like a good idea," start="00:05:00.240" video="mainVideo" id=subtitle]]
+[[!template text="and Joe gets excited about this." start="00:05:01.680" video="mainVideo" id=subtitle]]
+[[!template text="I think this could be a good demo," start="00:05:03.360" video="mainVideo" id=subtitle]]
+[[!template text="and I think this would be" start="00:05:04.720" video="mainVideo" id=subtitle]]
+[[!template text="a very genuine demonstration" start="00:05:07.120" video="mainVideo" id=subtitle]]
+[[!template text="of how we work here" start="00:05:08.479" video="mainVideo" id=subtitle]]
+[[!template text="and how we get excited about" start="00:05:09.360" video="mainVideo" id=subtitle]]
+[[!template text="some of our ideas sometimes." start="00:05:10.400" video="mainVideo" id=subtitle]]
+[[!template text="Noorah: In the demo," start="00:05:13.600" video="mainVideo" id=subtitle]]
+[[!template text="you saw a very improvised" start="00:05:14.639" video="mainVideo" id=subtitle]]
+[[!template text="free-flowing conversation." start="00:05:16.240" video="mainVideo" id=subtitle]]
+[[!template text="In order to have this kind of conversation" start="00:05:18.000" video="mainVideo" id=subtitle]]
+[[!template text="and still get things done," start="00:05:19.840" video="mainVideo" id=subtitle]]
+[[!template text="we need a pretty rigorous structure in place" start="00:05:20.960" video="mainVideo" id=subtitle]]
+[[!template text="at the bigger scale of the meetings." start="00:05:23.520" video="mainVideo" id=subtitle]]
+[[!template text="This involves both" start="00:05:26.000" video="mainVideo" id=subtitle]]
+[[!template text="a timetable for the meetings" start="00:05:27.120" video="mainVideo" id=subtitle]]
+[[!template text="and some review and planning processes." start="00:05:31.280" video="mainVideo" id=subtitle]]
+[[!template text="Joe: Just to say a little bit more" start="00:05:35.120" video="mainVideo" id=subtitle]]
+[[!template text="about the timetable, if you could go back," start="00:05:36.320" video="mainVideo" id=subtitle]]
+[[!template text="the meetings are generally following" start="00:05:40.160" video="mainVideo" id=subtitle]]
+[[!template text="a structure as we have up on the screen" start="00:05:42.320" video="mainVideo" id=subtitle]]
+[[!template text="of informal check-ins" start="00:05:45.199" video="mainVideo" id=subtitle]]
+[[!template text="followed by any announcements," start="00:05:46.479" video="mainVideo" id=subtitle]]
+[[!template text="and then two topics, at most two topics," start="00:05:48.400" video="mainVideo" id=subtitle]]
+[[!template text="with a break in the middle." start="00:05:50.960" video="mainVideo" id=subtitle]]
+[[!template text="The whole thing takes about two hours," start="00:05:52.560" video="mainVideo" id=subtitle]]
+[[!template text="and we meet weekly." start="00:05:54.800" video="mainVideo" id=subtitle]]
+[[!template text="The consistency of these meetings" start="00:05:56.400" video="mainVideo" id=subtitle]]
+[[!template text="is really important" start="00:05:58.160" video="mainVideo" id=subtitle]]
+[[!template text="for how the group works." start="00:05:58.800" video="mainVideo" id=subtitle]]
+[[!template text="Ray: At at the end of every meeting," start="00:06:00.720" video="mainVideo" id=subtitle]]
+[[!template text="we ask and answer" start="00:06:02.560" video="mainVideo" id=subtitle]]
+[[!template text="a series of questions" start="00:06:03.600" video="mainVideo" id=subtitle]]
+[[!template text="adapted from the ‘After Action Review’" start="00:06:04.800" video="mainVideo" id=subtitle]]
+[[!template text="developed by the United States Army" start="00:06:07.120" video="mainVideo" id=subtitle]]
+[[!template text="in their training programs," start="00:06:08.880" video="mainVideo" id=subtitle]]
+[[!template text="and also used in some business contexts." start="00:06:10.800" video="mainVideo" id=subtitle]]
+[[!template text="The adaptation we use here" start="00:06:13.840" video="mainVideo" id=subtitle]]
+[[!template text="came out of the Peeragogy project," start="00:06:15.759" video="mainVideo" id=subtitle]]
+[[!template text="which some of us have been involved with" start="00:06:17.440" video="mainVideo" id=subtitle]]
+[[!template text="since 2012, and it's designed to be" start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="less hierarchical than the army's review." start="00:06:22.160" video="mainVideo" id=subtitle]]
+[[!template text="By writing down and sharing these reviews," start="00:06:24.560" video="mainVideo" id=subtitle]]
+[[!template text="we create a resource" start="00:06:26.960" video="mainVideo" id=subtitle]]
+[[!template text="for further peer learning" start="00:06:28.240" video="mainVideo" id=subtitle]]
+[[!template text="later down the line." start="00:06:29.600" video="mainVideo" id=subtitle]]
+[[!template text="Joe: So, specifically," start="00:06:32.240" video="mainVideo" id=subtitle]]
+[[!template text="every six weeks or so," start="00:06:33.280" video="mainVideo" id=subtitle]]
+[[!template text="we look at the transcripts" start="00:06:34.560" video="mainVideo" id=subtitle]]
+[[!template text="from the previous action reviews" start="00:06:35.840" video="mainVideo" id=subtitle]]
+[[!template text="using a four-layered framework" start="00:06:37.360" video="mainVideo" id=subtitle]]
+[[!template text="that comes from future studies," start="00:06:39.120" video="mainVideo" id=subtitle]]
+[[!template text="and we use this to better understand" start="00:06:41.199" video="mainVideo" id=subtitle]]
+[[!template text="the underlying themes" start="00:06:42.560" video="mainVideo" id=subtitle]]
+[[!template text="that surface in the reviews" start="00:06:43.759" video="mainVideo" id=subtitle]]
+[[!template text="and to develop the deeper motivations" start="00:06:44.880" video="mainVideo" id=subtitle]]
+[[!template text="for ongoing work together." start="00:06:46.479" video="mainVideo" id=subtitle]]
+[[!template text="This helps us get a big-picture sense" start="00:06:48.160" video="mainVideo" id=subtitle]]
+[[!template text="of where we're going," start="00:06:49.680" video="mainVideo" id=subtitle]]
+[[!template text="and we can keep that up to date" start="00:06:50.720" video="mainVideo" id=subtitle]]
+[[!template text="at a slower pace" start="00:06:51.840" video="mainVideo" id=subtitle]]
+[[!template text="than we do in the weekly meetings." start="00:06:52.720" video="mainVideo" id=subtitle]]
+[[!template text="This also helps us tie our work" start="00:06:54.479" video="mainVideo" id=subtitle]]
+[[!template text="into a broader context" start="00:06:55.759" video="mainVideo" id=subtitle]]
+[[!template text="and gives us some hope" start="00:06:56.880" video="mainVideo" id=subtitle]]
+[[!template text="that over time we can contribute to" start="00:06:57.759" video="mainVideo" id=subtitle]]
+[[!template text="solving big problems." start="00:06:59.919" video="mainVideo" id=subtitle]]
+[[!template text="Ray: Going back" start="00:07:02.319" video="mainVideo" id=subtitle]]
+[[!template text="to solving larger problems." start="00:07:02.880" video="mainVideo" id=subtitle]]
+[[!template text="When we carry out the analysis," start="00:07:04.880" video="mainVideo" id=subtitle]]
+[[!template text="we don't just think about what happened" start="00:07:06.560" video="mainVideo" id=subtitle]]
+[[!template text="at previous meetings," start="00:07:08.400" video="mainVideo" id=subtitle]]
+[[!template text="but we also take a longer view," start="00:07:09.440" video="mainVideo" id=subtitle]]
+[[!template text="thinking about things such as" start="00:07:11.520" video="mainVideo" id=subtitle]]
+[[!template text="structuring a community of collaborators," start="00:07:12.960" video="mainVideo" id=subtitle]]
+[[!template text="or building platforms" start="00:07:15.680" video="mainVideo" id=subtitle]]
+[[!template text="for scientific research." start="00:07:16.960" video="mainVideo" id=subtitle]]
+[[!template text="We want to think about how" start="00:07:18.720" video="mainVideo" id=subtitle]]
+[[!template text="what we have been doing" start="00:07:20.080" video="mainVideo" id=subtitle]]
+[[!template text="fits into broader historical patterns" start="00:07:21.120" video="mainVideo" id=subtitle]]
+[[!template text="and trends." start="00:07:23.599" video="mainVideo" id=subtitle]]
+[[!template text="In the past, the pattern is a" start="00:07:24.720" video="mainVideo" id=subtitle]]
+[[!template text="historical pattern;" start="00:07:27.120" video="mainVideo" id=subtitle]]
+[[!template text="in the present, we contextualize" start="00:07:28.240" video="mainVideo" id=subtitle]]
+[[!template text="what we learned about designed futures;" start="00:07:30.000" video="mainVideo" id=subtitle]]
+[[!template text="towards the future, we use these patterns" start="00:07:32.400" video="mainVideo" id=subtitle]]
+[[!template text="to augment our big-picture analysis" start="00:07:34.639" video="mainVideo" id=subtitle]]
+[[!template text="with the next steps." start="00:07:37.440" video="mainVideo" id=subtitle]]
+[[!template text="This helps keep us on track." start="00:07:38.800" video="mainVideo" id=subtitle]]
+[[!template text="Noorah: Okay. So we have been working on" start="00:07:42.880" video="mainVideo" id=subtitle]]
+[[!template text="several projects: a paper" start="00:07:44.720" video="mainVideo" id=subtitle]]
+[[!template text="for the pattern conference" start="00:07:46.160" video="mainVideo" id=subtitle]]
+[[!template text="mentioned earlier," start="00:07:47.280" video="mainVideo" id=subtitle]]
+[[!template text="a workshop, and a user study," start="00:07:48.240" video="mainVideo" id=subtitle]]
+[[!template text="and we'll say a little bit more" start="00:07:50.080" video="mainVideo" id=subtitle]]
+[[!template text="about these." start="00:07:51.280" video="mainVideo" id=subtitle]]
+[[!template text="We co-authored a paper" start="00:07:53.599" video="mainVideo" id=subtitle]]
+[[!template text="that touches on all of the topics" start="00:07:56.319" video="mainVideo" id=subtitle]]
+[[!template text="we mentioned earlier" start="00:07:57.919" video="mainVideo" id=subtitle]]
+[[!template text="and presented it at the leading conference" start="00:07:58.960" video="mainVideo" id=subtitle]]
+[[!template text="on Design Patterns" start="00:08:01.120" video="mainVideo" id=subtitle]]
+[[!template text="for programs and programming." start="00:08:02.080" video="mainVideo" id=subtitle]]
+[[!template text="One of the case studies in the paper" start="00:08:04.000" video="mainVideo" id=subtitle]]
+[[!template text="sums up the way we work in ERG." start="00:08:09.520" video="mainVideo" id=subtitle]]
+[[!template text="The paper puts ERG in context" start="00:08:12.960" video="mainVideo" id=subtitle]]
+[[!template text="with other peer learning communities," start="00:08:16.000" video="mainVideo" id=subtitle]]
+[[!template text="and we aim to describe" start="00:08:17.520" video="mainVideo" id=subtitle]]
+[[!template text="our way of working" start="00:08:18.960" video="mainVideo" id=subtitle]]
+[[!template text="in a way that others would find accessible" start="00:08:20.160" video="mainVideo" id=subtitle]]
+[[!template text="and potentially useful." start="00:08:22.720" video="mainVideo" id=subtitle]]
+[[!template text="We are also developing" start="00:08:24.560" video="mainVideo" id=subtitle]]
+[[!template text="an interactive workshop" start="00:08:25.680" video="mainVideo" id=subtitle]]
+[[!template text="based on the ideas in the paper," start="00:08:27.039" video="mainVideo" id=subtitle]]
+[[!template text="which we piloted at the PLoP conference." start="00:08:28.800" video="mainVideo" id=subtitle]]
+[[!template text="Our intent with the workshop" start="00:08:31.039" video="mainVideo" id=subtitle]]
+[[!template text="was to build a method" start="00:08:32.479" video="mainVideo" id=subtitle]]
+[[!template text="for rapid problem solving," start="00:08:34.800" video="mainVideo" id=subtitle]]
+[[!template text="which could, at least in principle," start="00:08:36.240" video="mainVideo" id=subtitle]]
+[[!template text="expand beyond the workshop setting" start="00:08:37.839" video="mainVideo" id=subtitle]]
+[[!template text="to distributed networks." start="00:08:40.159" video="mainVideo" id=subtitle]]
+[[!template text="The workshop involves made-up roles," start="00:08:41.839" video="mainVideo" id=subtitle]]
+[[!template text="like a kaiju communicator" start="00:08:44.080" video="mainVideo" id=subtitle]]
+[[!template text="who helps understand problems" start="00:08:45.440" video="mainVideo" id=subtitle]]
+[[!template text="as they arise." start="00:08:46.800" video="mainVideo" id=subtitle]]
+[[!template text="We also realize that it has given us" start="00:08:47.839" video="mainVideo" id=subtitle]]
+[[!template text="a lot of wealth for thinking about" start="00:08:49.760" video="mainVideo" id=subtitle]]
+[[!template text="the roles we take on in our weekly meetings." start="00:08:51.279" video="mainVideo" id=subtitle]]
+[[!template text="Ray: Free software may be lacking" start="00:08:57.519" video="mainVideo" id=subtitle]]
+[[!template text="on ‘user’ aspects." start="00:08:59.920" video="mainVideo" id=subtitle]]
+[[!template text="People too often program" start="00:09:01.200" video="mainVideo" id=subtitle]]
+[[!template text="to scratch their own itches," start="00:09:02.720" video="mainVideo" id=subtitle]]
+[[!template text="and assume others will do the same." start="00:09:04.320" video="mainVideo" id=subtitle]]
+[[!template text="To deal with this, we did several things." start="00:09:06.720" video="mainVideo" id=subtitle]]
+[[!template text="We looked at user experience" start="00:09:09.360" video="mainVideo" id=subtitle]]
+[[!template text="and development together" start="00:09:11.040" video="mainVideo" id=subtitle]]
+[[!template text="to see how the process went" start="00:09:12.160" video="mainVideo" id=subtitle]]
+[[!template text="and where the gaps might be." start="00:09:13.760" video="mainVideo" id=subtitle]]
+[[!template text="We compared Emacs with other platforms," start="00:09:15.440" video="mainVideo" id=subtitle]]
+[[!template text="not just a technical level," start="00:09:17.600" video="mainVideo" id=subtitle]]
+[[!template text="but also at the user experience level." start="00:09:19.279" video="mainVideo" id=subtitle]]
+[[!template text="We had guest sessions," start="00:09:21.440" video="mainVideo" id=subtitle]]
+[[!template text="where we've started to gather user stories." start="00:09:22.640" video="mainVideo" id=subtitle]]
+[[!template text="Building on these conversations," start="00:09:25.440" video="mainVideo" id=subtitle]]
+[[!template text="we would like to do more research" start="00:09:26.880" video="mainVideo" id=subtitle]]
+[[!template text="in all these topics," start="00:09:28.480" video="mainVideo" id=subtitle]]
+[[!template text="and eventually be able to" start="00:09:29.839" video="mainVideo" id=subtitle]]
+[[!template text="say something like:" start="00:09:30.959" video="mainVideo" id=subtitle]]
+[[!template text="‘If you are someone who does X," start="00:09:32.160" video="mainVideo" id=subtitle]]
+[[!template text="these are the packages" start="00:09:34.160" video="mainVideo" id=subtitle]]
+[[!template text="that would work for you.’" start="00:09:35.279" video="mainVideo" id=subtitle]]
+[[!template text="Joe: Putting these ideas into practice," start="00:09:38.480" video="mainVideo" id=subtitle]]
+[[!template text="our PLoP paper and the plans it contains" start="00:09:40.640" video="mainVideo" id=subtitle]]
+[[!template text="become a /template/" start="00:09:42.880" video="mainVideo" id=subtitle]]
+[[!template text="for some of the other things" start="00:09:43.680" video="mainVideo" id=subtitle]]
+[[!template text="we want to work on" start="00:09:44.720" video="mainVideo" id=subtitle]]
+[[!template text="as we go forward." start="00:09:45.600" video="mainVideo" id=subtitle]]
+[[!template text="If we imagine things in 2-3 years," start="00:09:46.880" video="mainVideo" id=subtitle]]
+[[!template text="what would it actually take" start="00:09:49.120" video="mainVideo" id=subtitle]]
+[[!template text="to realize the vision from that paper?" start="00:09:49.920" video="mainVideo" id=subtitle]]
+[[!template text="Thinking about the future:" start="00:09:52.240" video="mainVideo" id=subtitle]]
+[[!template text="this is one of the main reasons why" start="00:09:53.200" video="mainVideo" id=subtitle]]
+[[!template text="we want to share these ideas" start="00:09:54.480" video="mainVideo" id=subtitle]]
+[[!template text="and invite other people" start="00:09:55.839" video="mainVideo" id=subtitle]]
+[[!template text="into this way of working." start="00:09:56.800" video="mainVideo" id=subtitle]]
+[[!template text="There's no way we can actually achieve" start="00:09:58.160" video="mainVideo" id=subtitle]]
+[[!template text="everything in our vision" start="00:09:59.600" video="mainVideo" id=subtitle]]
+[[!template text="if we work all by ourselves." start="00:10:00.560" video="mainVideo" id=subtitle]]
+[[!template text="What we've been focusing on" start="00:10:02.160" video="mainVideo" id=subtitle]]
+[[!template text="in Season Zero of the Emacs Research Group" start="00:10:03.200" video="mainVideo" id=subtitle]]
+[[!template text="is methods that people can use" start="00:10:05.120" video="mainVideo" id=subtitle]]
+[[!template text="to organize their own research groups." start="00:10:06.640" video="mainVideo" id=subtitle]]
+[[!template text="We decided to share this talk" start="00:10:08.560" video="mainVideo" id=subtitle]]
+[[!template text="so that folks can learn from our community." start="00:10:10.000" video="mainVideo" id=subtitle]]
+[[!template text="Our goal has been to share" start="00:10:12.079" video="mainVideo" id=subtitle]]
+[[!template text="how we've been doing things," start="00:10:13.040" video="mainVideo" id=subtitle]]
+[[!template text="and we hope this information" start="00:10:14.000" video="mainVideo" id=subtitle]]
+[[!template text="is useful for you" start="00:10:14.959" video="mainVideo" id=subtitle]]
+[[!template text="in your own communities and collaborations." start="00:10:16.079" video="mainVideo" id=subtitle]]
+[[!template text="Thank you." start="00:10:18.800" video="mainVideo" id=subtitle]]
+[[!template text="captions by speakers and sachac" start="00:10:19.262" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/exec.md b/2021/captions/exec.md
new file mode 100644
index 00000000..0363771c
--- /dev/null
+++ b/2021/captions/exec.md
@@ -0,0 +1,186 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello all! Welcome to EmacsConf 2021." start="00:00:00.320" video="mainVideo" id=subtitle]]
+[[!template text="I'm Tom Gillespie." start="00:00:03.679" video="mainVideo" id=subtitle]]
+[[!template text="Thank you to the organizers for" start="00:00:05.040" video="mainVideo" id=subtitle]]
+[[!template text="all your hard work," start="00:00:06.799" video="mainVideo" id=subtitle]]
+[[!template text="and for inviting me to" start="00:00:07.680" video="mainVideo" id=subtitle]]
+[[!template text="give this short talk on" start="00:00:08.639" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Org as an executable format&quot;." start="00:00:10.021" video="mainVideo" id=subtitle]]
+[[!template text="The links to the talk page," start="00:00:12.240" video="mainVideo" id=subtitle]]
+[[!template text="the GitHub page for the project," start="00:00:13.840" video="mainVideo" id=subtitle]]
+[[!template text="and the package on MELPA" start="00:00:16.000" video="mainVideo" id=subtitle]]
+[[!template text="are listed on the right." start="00:00:18.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's start with one of the motivating" start="00:00:20.160" video="mainVideo" id=subtitle]]
+[[!template text="use cases for executable Org files." start="00:00:21.760" video="mainVideo" id=subtitle]]
+[[!template text="Many users keep global configuration" start="00:00:25.920" video="mainVideo" id=subtitle]]
+[[!template text="for Org in an init.el file," start="00:00:29.339" video="mainVideo" id=subtitle]]
+[[!template text="which works for many workflows." start="00:00:31.840" video="mainVideo" id=subtitle]]
+[[!template text="However, for reproducible research," start="00:00:33.520" video="mainVideo" id=subtitle]]
+[[!template text="this is a challenge" start="00:00:36.239" video="mainVideo" id=subtitle]]
+[[!template text="because if an Org file is" start="00:00:37.600" video="mainVideo" id=subtitle]]
+[[!template text="dissociated from the init.el file," start="00:00:39.280" video="mainVideo" id=subtitle]]
+[[!template text="then often it will no longer" start="00:00:41.440" video="mainVideo" id=subtitle]]
+[[!template text="function as expected." start="00:00:43.040" video="mainVideo" id=subtitle]]
+[[!template new="1" text="One potential solution to this problem" start="00:00:44.640" video="mainVideo" id=subtitle]]
+[[!template text="is to be able to include all of the" start="00:00:46.719" video="mainVideo" id=subtitle]]
+[[!template text="global configuration for Emacs" start="00:00:48.160" video="mainVideo" id=subtitle]]
+[[!template text="and the environment in the Org file itself," start="00:00:50.239" video="mainVideo" id=subtitle]]
+[[!template text="in which case when you" start="00:00:52.960" video="mainVideo" id=subtitle]]
+[[!template text="go to reuse the Org file," start="00:00:53.840" video="mainVideo" id=subtitle]]
+[[!template text="it will work as expected." start="00:00:55.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="What does an executable Org file" start="00:00:58.640" video="mainVideo" id=subtitle]]
+[[!template text="look like in action?" start="00:01:00.480" video="mainVideo" id=subtitle]]
+[[!template text="Here's a demo of an executable Org file" start="00:01:02.559" video="mainVideo" id=subtitle]]
+[[!template text="running in Bash, Dash, Zsh, and PowerShell." start="00:01:05.280" video="mainVideo" id=subtitle]]
+[[!template text="So, we are currently in Bash," start="00:01:09.680" video="mainVideo" id=subtitle]]
+[[!template text="and we can run our demo," start="00:01:14.799" video="mainVideo" id=subtitle]]
+[[!template text="and it will print some stuff," start="00:01:19.360" video="mainVideo" id=subtitle]]
+[[!template text="and wait for input." start="00:01:21.119" video="mainVideo" id=subtitle]]
+[[!template text="We can also run it in Dash," start="00:01:22.640" video="mainVideo" id=subtitle]]
+[[!template text="which is the default for Debian" start="00:01:24.144" video="mainVideo" id=subtitle]]
+[[!template text="and derivatives." start="00:01:25.720" video="mainVideo" id=subtitle]]
+[[!template text="Same program works as expected." start="00:01:29.840" video="mainVideo" id=subtitle]]
+[[!template text="Zsh also. And lastly PowerShell," start="00:01:32.320" video="mainVideo" id=subtitle]]
+[[!template text="if we try to run demo.org itself," start="00:01:38.560" video="mainVideo" id=subtitle]]
+[[!template text="we see (that) we get an error" start="00:01:41.439" video="mainVideo" id=subtitle]]
+[[!template text="because PowerShell cares" start="00:01:42.640" video="mainVideo" id=subtitle]]
+[[!template text="about file extensions," start="00:01:43.764" video="mainVideo" id=subtitle]]
+[[!template text="so, if we symlink to ps1," start="00:01:45.439" video="mainVideo" id=subtitle]]
+[[!template text="then it works as expected," start="00:01:49.840" video="mainVideo" id=subtitle]]
+[[!template text="and there are ways to alias this," start="00:01:51.680" video="mainVideo" id=subtitle]]
+[[!template text="so that you can run it as a program" start="00:01:53.341" video="mainVideo" id=subtitle]]
+[[!template text="without the ps1 extension." start="00:01:55.044" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, how does this work?" start="00:01:58.640" video="mainVideo" id=subtitle]]
+[[!template text="There are three components" start="00:02:03.920" video="mainVideo" id=subtitle]]
+[[!template text="to an executable Org file" start="00:02:05.759" video="mainVideo" id=subtitle]]
+[[!template text="that all need to be present" start="00:02:07.352" video="mainVideo" id=subtitle]]
+[[!template text="in order for this to work." start="00:02:08.560" video="mainVideo" id=subtitle]]
+[[!template text="Starting from the top of the file," start="00:02:10.080" video="mainVideo" id=subtitle]]
+[[!template text="we have a shebang block." start="00:02:11.920" video="mainVideo" id=subtitle]]
+[[!template text="Next we have an Org Babel block" start="00:02:14.239" video="mainVideo" id=subtitle]]
+[[!template text="written in Emacs Lisp," start="00:02:16.640" video="mainVideo" id=subtitle]]
+[[!template text="which is what we actually saw executing," start="00:02:17.760" video="mainVideo" id=subtitle]]
+[[!template text="and then there are some" start="00:02:20.000" video="mainVideo" id=subtitle]]
+[[!template text="eval local variables or Elvs" start="00:02:20.959" video="mainVideo" id=subtitle]]
+[[!template text="that are involved in making this" start="00:02:23.520" video="mainVideo" id=subtitle]]
+[[!template text="actually executable." start="00:02:25.200" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's start with the shebang block." start="00:02:26.800" video="mainVideo" id=subtitle]]
+[[!template text="Org syntax does not have support" start="00:02:29.760" video="mainVideo" id=subtitle]]
+[[!template text="for shebang lines." start="00:02:33.280" video="mainVideo" id=subtitle]]
+[[!template text="However, it supports the shebang block." start="00:02:34.959" video="mainVideo" id=subtitle]]
+[[!template text="This is because Org comments, blocks," start="00:02:37.120" video="mainVideo" id=subtitle]]
+[[!template text="keywords, etc. that start with the" start="00:02:39.440" video="mainVideo" id=subtitle]]
+[[!template text="sharp sign have the same syntax as" start="00:02:41.760" video="mainVideo" id=subtitle]]
+[[!template text="comments in POSIX and PowerShell." start="00:02:43.920" video="mainVideo" id=subtitle]]
+[[!template text="This block is in fact valid" start="00:02:46.720" video="mainVideo" id=subtitle]]
+[[!template text="Bash, Dash, Zsh, PowerShell," start="00:02:53.280" video="mainVideo" id=subtitle]]
+[[!template text="and maybe some other shells as well." start="00:02:55.040" video="mainVideo" id=subtitle]]
+[[!template text="In essence what it does is," start="00:02:57.280" video="mainVideo" id=subtitle]]
+[[!template text="perform some setup" start="00:03:02.480" video="mainVideo" id=subtitle]]
+[[!template text="to avoid polluting standard output," start="00:03:03.440" video="mainVideo" id=subtitle]]
+[[!template text="and then it runs Emacs" start="00:03:06.080" video="mainVideo" id=subtitle]]
+[[!template text="to load the file itself." start="00:03:07.516" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The Elisp that is passed on the command line" start="00:03:08.959" video="mainVideo" id=subtitle]]
+[[!template text="is explicated over here on the right," start="00:03:12.640" video="mainVideo" id=subtitle]]
+[[!template text="and in essence what it does is," start="00:03:14.959" video="mainVideo" id=subtitle]]
+[[!template text="to keep the startup time minimal" start="00:03:17.920" video="mainVideo" id=subtitle]]
+[[!template text="and as low as possible," start="00:03:20.480" video="mainVideo" id=subtitle]]
+[[!template text="it loads the absolute bare minimum" start="00:03:21.760" video="mainVideo" id=subtitle]]
+[[!template text="needed for Babel," start="00:03:24.080" video="mainVideo" id=subtitle]]
+[[!template text="and then it calls hack-local-variables" start="00:03:25.120" video="mainVideo" id=subtitle]]
+[[!template text="triggering the eval-local-variables." start="00:03:27.519" video="mainVideo" id=subtitle]]
+[[!template text="What do the eval-local-variables do," start="00:03:31.680" video="mainVideo" id=subtitle]]
+[[!template text="and how those work?" start="00:03:33.614" video="mainVideo" id=subtitle]]
+[[!template text="The essence of the approach is to" start="00:03:34.799" video="mainVideo" id=subtitle]]
+[[!template text="use org-confirm-babel-evaluate" start="00:03:36.319" video="mainVideo" id=subtitle]]
+[[!template text="to allow Babel execution." start="00:03:38.720" video="mainVideo" id=subtitle]]
+[[!template text="We can't set it to nil because that is" start="00:03:40.480" video="mainVideo" id=subtitle]]
+[[!template text="an arbitrary code execution vector," start="00:03:43.360" video="mainVideo" id=subtitle]]
+[[!template text="which we don't want if we're sharing files." start="00:03:45.308" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Instead what we do is," start="00:03:48.000" video="mainVideo" id=subtitle]]
+[[!template text="we use the fact that it can be a function," start="00:03:49.555" video="mainVideo" id=subtitle]]
+[[!template text="and we normalize the block of code," start="00:03:52.000" video="mainVideo" id=subtitle]]
+[[!template text="we checksum it, and then we check" start="00:03:55.280" video="mainVideo" id=subtitle]]
+[[!template text="that it matches this checksum up here" start="00:03:57.320" video="mainVideo" id=subtitle]]
+[[!template text="at the top of the file," start="00:03:59.280" video="mainVideo" id=subtitle]]
+[[!template text="and then sort of inside there," start="00:04:00.400" video="mainVideo" id=subtitle]]
+[[!template text="inside of org-sbe," start="00:04:02.640" video="mainVideo" id=subtitle]]
+[[!template text="which is Org source block evaluate," start="00:04:04.159" video="mainVideo" id=subtitle]]
+[[!template text="we call the block." start="00:04:06.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The actual implementation of this" start="00:04:08.959" video="mainVideo" id=subtitle]]
+[[!template text="is somewhat more complicated." start="00:04:11.120" video="mainVideo" id=subtitle]]
+[[!template text="However, it's small enough to fit in" start="00:04:12.497" video="mainVideo" id=subtitle]]
+[[!template text="the local variables at the end of the file." start="00:04:14.799" video="mainVideo" id=subtitle]]
+[[!template text="One thing to note is that" start="00:04:17.519" video="mainVideo" id=subtitle]]
+[[!template text="if you are using PowerShell," start="00:04:19.040" video="mainVideo" id=subtitle]]
+[[!template text="PowerShell parses the whole file" start="00:04:20.799" video="mainVideo" id=subtitle]]
+[[!template text="which means that" start="00:04:23.919" video="mainVideo" id=subtitle]]
+[[!template text="for any normal Org content," start="00:04:25.040" video="mainVideo" id=subtitle]]
+[[!template text="you need to put it in" start="00:04:27.759" video="mainVideo" id=subtitle]]
+[[!template text="a multi-line PowerShell comment," start="00:04:28.639" video="mainVideo" id=subtitle]]
+[[!template text="and close it." start="00:04:30.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, once we hit" start="00:04:31.199" video="mainVideo" id=subtitle]]
+[[!template text="hack-local-variables at the end," start="00:04:32.371" video="mainVideo" id=subtitle]]
+[[!template text="we run the eval-local-variables block," start="00:04:34.160" video="mainVideo" id=subtitle]]
+[[!template text="then we enter this Elisp block," start="00:04:37.120" video="mainVideo" id=subtitle]]
+[[!template text="and you can write whatever you want." start="00:04:40.880" video="mainVideo" id=subtitle]]
+[[!template text="All the power of Org Babel is" start="00:04:42.720" video="mainVideo" id=subtitle]]
+[[!template text="now at your fingertips" start="00:04:44.160" video="mainVideo" id=subtitle]]
+[[!template text="in order to do what you need" start="00:04:45.360" video="mainVideo" id=subtitle]]
+[[!template text="for this file." start="00:04:47.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Finally, let's do a quick demo" start="00:04:48.800" video="mainVideo" id=subtitle]]
+[[!template text="of how to use this to make" start="00:04:50.320" video="mainVideo" id=subtitle]]
+[[!template text="your own Org files executable." start="00:04:52.453" video="mainVideo" id=subtitle]]
+[[!template text="Orgstrap is available on MELPA as mentioned," start="00:04:54.800" video="mainVideo" id=subtitle]]
+[[!template text="and it can be installed using package.el" start="00:05:01.840" video="mainVideo" id=subtitle]]
+[[!template text="by calling package-install orgstrap." start="00:05:06.080" video="mainVideo" id=subtitle]]
+[[!template text="It will download, and it will install." start="00:05:11.280" video="mainVideo" id=subtitle]]
+[[!template text="Then you can open an existing file" start="00:05:13.520" video="mainVideo" id=subtitle]]
+[[!template text="or a new file. In this case," start="00:05:18.720" video="mainVideo" id=subtitle]]
+[[!template text="let me open a file called example.org." start="00:05:21.919" video="mainVideo" id=subtitle]]
+[[!template text="And then orgstrap provides" start="00:05:25.199" video="mainVideo" id=subtitle]]
+[[!template text="command called orgstrap-init." start="00:05:26.996" video="mainVideo" id=subtitle]]
+[[!template text="What orgstrap-init does is," start="00:05:29.360" video="mainVideo" id=subtitle]]
+[[!template text="it populates a file with the machinery" start="00:05:30.953" video="mainVideo" id=subtitle]]
+[[!template text="needed to run an orgstrap block." start="00:05:33.759" video="mainVideo" id=subtitle]]
+[[!template text="We're just going to do a message" start="00:05:36.639" video="mainVideo" id=subtitle]]
+[[!template text="&quot;hello orgstrap!&quot;." start="00:05:38.560" video="mainVideo" id=subtitle]]
+[[!template text="If you look up at the top," start="00:05:43.440" video="mainVideo" id=subtitle]]
+[[!template text="you will see that the" start="00:05:46.160" video="mainVideo" id=subtitle]]
+[[!template text="orgstrap-block-checksum will change" start="00:05:47.386" video="mainVideo" id=subtitle]]
+[[!template text="when I save the file." start="00:05:50.320" video="mainVideo" id=subtitle]]
+[[!template text="This makes it much easier to author files" start="00:05:51.520" video="mainVideo" id=subtitle]]
+[[!template text="with orgstrap blocks." start="00:05:53.840" video="mainVideo" id=subtitle]]
+[[!template text="And then we need one last piece" start="00:05:55.120" video="mainVideo" id=subtitle]]
+[[!template text="of machinery," start="00:05:56.560" video="mainVideo" id=subtitle]]
+[[!template text="which is the shebang block." start="00:05:57.876" video="mainVideo" id=subtitle]]
+[[!template text="I am just going to steal" start="00:06:00.400" video="mainVideo" id=subtitle]]
+[[!template text="the shebang block from" start="00:06:01.520" video="mainVideo" id=subtitle]]
+[[!template text="this other file over here" start="00:06:02.560" video="mainVideo" id=subtitle]]
+[[!template text="since it is available." start="00:06:06.080" video="mainVideo" id=subtitle]]
+[[!template text="You can also get it from shebang.org," start="00:06:07.039" video="mainVideo" id=subtitle]]
+[[!template text="and I have plans to add a command" start="00:06:08.880" video="mainVideo" id=subtitle]]
+[[!template text="to insert this into the file directly," start="00:06:10.800" video="mainVideo" id=subtitle]]
+[[!template text="which may actually be done by the time" start="00:06:12.560" video="mainVideo" id=subtitle]]
+[[!template text="this video is actually posted and visible." start="00:06:15.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There's one last step," start="00:06:19.520" video="mainVideo" id=subtitle]]
+[[!template text="which is that we need to run dired" start="00:06:21.120" video="mainVideo" id=subtitle]]
+[[!template text="in order to… There we go." start="00:06:24.160" video="mainVideo" id=subtitle]]
+[[!template text="So, we use Shift m, capital m," start="00:06:27.520" video="mainVideo" id=subtitle]]
+[[!template text="in order to make our" start="00:06:31.039" video="mainVideo" id=subtitle]]
+[[!template text="example file executable," start="00:06:32.800" video="mainVideo" id=subtitle]]
+[[!template text="and then if we come back to here," start="00:06:35.520" video="mainVideo" id=subtitle]]
+[[!template text="we see that example.org is now executable," start="00:06:42.140" video="mainVideo" id=subtitle]]
+[[!template text="and we can run it." start="00:06:47.360" video="mainVideo" id=subtitle]]
+[[!template text="&quot;hello orgstrap!&quot;, and we're done." start="00:06:48.000" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, that's the basic workflow" start="00:06:50.560" video="mainVideo" id=subtitle]]
+[[!template text="for getting orgstrap files" start="00:06:52.639" video="mainVideo" id=subtitle]]
+[[!template text="to be executable." start="00:06:54.880" video="mainVideo" id=subtitle]]
+[[!template text="I will be around to answer questions live," start="00:06:56.240" video="mainVideo" id=subtitle]]
+[[!template text="and I will be also available in" start="00:06:58.960" video="mainVideo" id=subtitle]]
+[[!template text="the #emacsconf IRC channel all day." start="00:07:00.800" video="mainVideo" id=subtitle]]
+[[!template text="I hope you have found this useful," start="00:07:03.280" video="mainVideo" id=subtitle]]
+[[!template text="and thank you very much for watching." start="00:07:04.960" video="mainVideo" id=subtitle]]
+[[!template text="captions by bhavin192 (Bhavin Gandhi)" start="00:07:08.160" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/faster.md b/2021/captions/faster.md
new file mode 100644
index 00000000..be9b5083
--- /dev/null
+++ b/2021/captions/faster.md
@@ -0,0 +1,512 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hi. Greetings from the cloudy St. Petersburg." start="00:00:01.120" video="mainVideo" id=subtitle]]
+[[!template text="My name is Dmitry Gutov." start="00:00:04.640" video="mainVideo" id=subtitle]]
+[[!template text="I write Ruby by day, Emacs Lisp by night" start="00:00:06.080" video="mainVideo" id=subtitle]]
+[[!template text="when I don't do anything else." start="00:00:09.280" video="mainVideo" id=subtitle]]
+[[!template text="You might know my work" start="00:00:12.080" video="mainVideo" id=subtitle]]
+[[!template text="from a number of third-party packages" start="00:00:14.559" video="mainVideo" id=subtitle]]
+[[!template text="as well as built-in ones." start="00:00:18.160" video="mainVideo" id=subtitle]]
+[[!template text="The idea for this talk came out from" start="00:00:22.240" video="mainVideo" id=subtitle]]
+[[!template text="an improvement request" start="00:00:25.599" video="mainVideo" id=subtitle]]
+[[!template text="for the performance of grep-like commands" start="00:00:26.800" video="mainVideo" id=subtitle]]
+[[!template text="using the xref interface" start="00:00:32.960" video="mainVideo" id=subtitle]]
+[[!template text="and its storage types, container types" start="00:00:35.200" video="mainVideo" id=subtitle]]
+[[!template text="for the search results," start="00:00:43.280" video="mainVideo" id=subtitle]]
+[[!template text="complaining that it's not as fast" start="00:00:47.840" video="mainVideo" id=subtitle]]
+[[!template text="as it potentially could have been" start="00:00:51.440" video="mainVideo" id=subtitle]]
+[[!template text="when there are lots of search results" start="00:00:54.320" video="mainVideo" id=subtitle]]
+[[!template text="coming for a given search." start="00:00:58.239" video="mainVideo" id=subtitle]]
+[[!template text="I have noticed myself that" start="00:01:01.600" video="mainVideo" id=subtitle]]
+[[!template text="when working on it, and probably before." start="00:01:06.159" video="mainVideo" id=subtitle]]
+[[!template text="My approach to optimizing Lisp code" start="00:01:10.159" video="mainVideo" id=subtitle]]
+[[!template text="has changed recently-ish," start="00:01:16.560" video="mainVideo" id=subtitle]]
+[[!template text="and I'd like to talk about it here." start="00:01:21.680" video="mainVideo" id=subtitle]]
+[[!template text="This talk is for people who already" start="00:01:26.960" video="mainVideo" id=subtitle]]
+[[!template text="know how to write some Emacs Lisp" start="00:01:34.079" video="mainVideo" id=subtitle]]
+[[!template text="to solve their problems" start="00:01:37.040" video="mainVideo" id=subtitle]]
+[[!template text="and who have possibly encountered" start="00:01:38.880" video="mainVideo" id=subtitle]]
+[[!template text="some performance issues doing that." start="00:01:43.360" video="mainVideo" id=subtitle]]
+[[!template text="Also, if you want to contribute" start="00:01:49.200" video="mainVideo" id=subtitle]]
+[[!template text="some improvements to the code" start="00:01:51.600" video="mainVideo" id=subtitle]]
+[[!template text="that is already in Emacs" start="00:01:54.799" video="mainVideo" id=subtitle]]
+[[!template text="or to other packages" start="00:01:56.960" video="mainVideo" id=subtitle]]
+[[!template text="which are owned by somebody else," start="00:02:02.159" video="mainVideo" id=subtitle]]
+[[!template text="it should also be helpful. Let's start." start="00:02:04.479" video="mainVideo" id=subtitle]]
+[[!template text="First of all, about Emacs and Emacs Lisp." start="00:02:13.520" video="mainVideo" id=subtitle]]
+[[!template text="It's not the fastest language." start="00:02:18.640" video="mainVideo" id=subtitle]]
+[[!template text="Let's switch to the notes." start="00:02:21.360" video="mainVideo" id=subtitle]]
+[[!template text="I hope the font is big enough" start="00:02:26.560" video="mainVideo" id=subtitle]]
+[[!template text="to be readable on this video, really hope." start="00:02:31.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs Lisp is not the fastest of the bunch." start="00:02:36.480" video="mainVideo" id=subtitle]]
+[[!template text="The garbage collector creates pauses" start="00:02:40.160" video="mainVideo" id=subtitle]]
+[[!template text="whenever it needs to sweep data." start="00:02:44.400" video="mainVideo" id=subtitle]]
+[[!template text="The interpreter is not the fastest one," start="00:02:48.800" video="mainVideo" id=subtitle]]
+[[!template text="even though the native compilation branch" start="00:02:51.760" video="mainVideo" id=subtitle]]
+[[!template text="is improving on that by twice" start="00:02:54.720" video="mainVideo" id=subtitle]]
+[[!template text="in certain scenarios, which is good." start="00:02:59.120" video="mainVideo" id=subtitle]]
+[[!template text="The standard library or functions" start="00:03:04.640" video="mainVideo" id=subtitle]]
+[[!template text="for working with collections, for example," start="00:03:10.560" video="mainVideo" id=subtitle]]
+[[!template text="are not so uniformly great." start="00:03:12.800" video="mainVideo" id=subtitle]]
+[[!template text="So there is some work to be done there." start="00:03:17.599" video="mainVideo" id=subtitle]]
+[[!template text="Maybe you can contribute" start="00:03:20.080" video="mainVideo" id=subtitle]]
+[[!template text="the next improvement in there." start="00:03:22.239" video="mainVideo" id=subtitle]]
+[[!template text="And also, if your package displays stuff," start="00:03:26.640" video="mainVideo" id=subtitle]]
+[[!template text="it has a visual component," start="00:03:33.200" video="mainVideo" id=subtitle]]
+[[!template text="then you might have to deal with" start="00:03:35.040" video="mainVideo" id=subtitle]]
+[[!template text="some drawbacks of the display engine" start="00:03:36.959" video="mainVideo" id=subtitle]]
+[[!template text="which might slow to a crawl" start="00:03:43.120" video="mainVideo" id=subtitle]]
+[[!template text="when your code has..." start="00:03:47.760" video="mainVideo" id=subtitle]]
+[[!template text="when you're trying to display lines" start="00:03:53.680" video="mainVideo" id=subtitle]]
+[[!template text="which are a little too long--" start="00:03:56.560" video="mainVideo" id=subtitle]]
+[[!template text="trying to print a long line, for example--" start="00:04:00.319" video="mainVideo" id=subtitle]]
+[[!template text="or you are using a lot of overlays," start="00:04:03.120" video="mainVideo" id=subtitle]]
+[[!template text="if you know what it is." start="00:04:07.120" video="mainVideo" id=subtitle]]
+[[!template text="With lots of overlays" start="00:04:09.120" video="mainVideo" id=subtitle]]
+[[!template text="on the same visual line, in particular." start="00:04:12.640" video="mainVideo" id=subtitle]]
+[[!template new="1" text="But okay. The first thing to understand," start="00:04:19.840" video="mainVideo" id=subtitle]]
+[[!template text="and I hope everybody who's done" start="00:04:24.160" video="mainVideo" id=subtitle]]
+[[!template text="some programming in the past knows," start="00:04:27.680" video="mainVideo" id=subtitle]]
+[[!template text="it's: first you write correctly," start="00:04:29.520" video="mainVideo" id=subtitle]]
+[[!template text="and then you try to benchmark." start="00:04:35.120" video="mainVideo" id=subtitle]]
+[[!template text="and see where the problems are," start="00:04:37.360" video="mainVideo" id=subtitle]]
+[[!template text="if there are any." start="00:04:39.199" video="mainVideo" id=subtitle]]
+[[!template text="So first do it right, then do it fast." start="00:04:40.720" video="mainVideo" id=subtitle]]
+[[!template text="How do we find the hotspots," start="00:04:45.919" video="mainVideo" id=subtitle]]
+[[!template text="the bottlenecks on the second step?" start="00:04:50.720" video="mainVideo" id=subtitle]]
+[[!template text="We try to do some profiling" start="00:04:52.400" video="mainVideo" id=subtitle]]
+[[!template text="or measuring how long the code takes." start="00:04:54.720" video="mainVideo" id=subtitle]]
+[[!template text="Emacs has two different profilers." start="00:04:58.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="One is the native profiler," start="00:05:03.039" video="mainVideo" id=subtitle]]
+[[!template text="which as I recall was contributed by" start="00:05:05.440" video="mainVideo" id=subtitle]]
+[[!template text="Tomohiro Matsuyama, the author" start="00:05:10.639" video="mainVideo" id=subtitle]]
+[[!template text="of the autocomplete package" start="00:05:13.280" video="mainVideo" id=subtitle]]
+[[!template text="back in Emacs 24.3, apparently." start="00:05:16.240" video="mainVideo" id=subtitle]]
+[[!template text="It's a low overhead profiler." start="00:05:22.720" video="mainVideo" id=subtitle]]
+[[!template text="It's sampling, which is good on one hand" start="00:05:24.320" video="mainVideo" id=subtitle]]
+[[!template text="but might be less good on the other hand." start="00:05:31.520" video="mainVideo" id=subtitle]]
+[[!template text="Let's try using it." start="00:05:33.919" video="mainVideo" id=subtitle]]
+[[!template text="So we start with profiler-start." start="00:05:35.199" video="mainVideo" id=subtitle]]
+[[!template text="Let's just ask for CPU profiling here," start="00:05:40.960" video="mainVideo" id=subtitle]]
+[[!template text="but it also can profile memory locations." start="00:05:44.960" video="mainVideo" id=subtitle]]
+[[!template text="Let's try a search for some string" start="00:05:48.320" video="mainVideo" id=subtitle]]
+[[!template text="in the current project." start="00:05:56.400" video="mainVideo" id=subtitle]]
+[[!template text="Let's do it a few times, maybe three times," start="00:06:01.360" video="mainVideo" id=subtitle]]
+[[!template text="so the profiler has more data to work with." start="00:06:04.080" video="mainVideo" id=subtitle]]
+[[!template text="Let's call the report." start="00:06:09.360" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So here we have the tree," start="00:06:13.680" video="mainVideo" id=subtitle]]
+[[!template text="the execution tree with percentages" start="00:06:16.960" video="mainVideo" id=subtitle]]
+[[!template text="of the time spent in each function." start="00:06:19.360" video="mainVideo" id=subtitle]]
+[[!template text="You can unwrap it by going up and down" start="00:06:22.960" video="mainVideo" id=subtitle]]
+[[!template text="and pressing TAB to unwrap every element." start="00:06:25.840" video="mainVideo" id=subtitle]]
+[[!template text="This is weird." start="00:06:35.039" video="mainVideo" id=subtitle]]
+[[!template text="Okay, here we see that the actual command" start="00:06:52.000" video="mainVideo" id=subtitle]]
+[[!template text="that was called only takes" start="00:06:55.199" video="mainVideo" id=subtitle]]
+[[!template text="8% of the whole runtime," start="00:06:56.639" video="mainVideo" id=subtitle]]
+[[!template text="meaning the input was..." start="00:06:59.599" video="mainVideo" id=subtitle]]
+[[!template text="The command took not enough time" start="00:07:07.759" video="mainVideo" id=subtitle]]
+[[!template text="for us to really dig into it." start="00:07:10.960" video="mainVideo" id=subtitle]]
+[[!template text="Let's try a shorter input with more matches." start="00:07:13.360" video="mainVideo" id=subtitle]]
+[[!template text="So profiler-start again, CPU." start="00:07:18.960" video="mainVideo" id=subtitle]]
+[[!template text="Let's search for list." start="00:07:25.680" video="mainVideo" id=subtitle]]
+[[!template text="Don't mind the minibuffer just yet." start="00:07:34.240" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So let's look at the report." start="00:07:40.160" video="mainVideo" id=subtitle]]
+[[!template text="We can unwrap it here, and we see" start="00:07:47.680" video="mainVideo" id=subtitle]]
+[[!template text="52% of the time was spent doing this," start="00:07:52.000" video="mainVideo" id=subtitle]]
+[[!template text="at least according to the profile." start="00:07:55.759" video="mainVideo" id=subtitle]]
+[[!template text="We can unwrap it, see the description" start="00:07:58.240" video="mainVideo" id=subtitle]]
+[[!template text="of any function that was called" start="00:08:00.960" video="mainVideo" id=subtitle]]
+[[!template text="by hitting d, or even jump to it" start="00:08:02.800" video="mainVideo" id=subtitle]]
+[[!template text="by tapping f." start="00:08:08.479" video="mainVideo" id=subtitle]]
+[[!template text="By going down the stream," start="00:08:12.960" video="mainVideo" id=subtitle]]
+[[!template text="we unwrap it with TAB," start="00:08:16.160" video="mainVideo" id=subtitle]]
+[[!template text="you can see where time was spent." start="00:08:18.240" video="mainVideo" id=subtitle]]
+[[!template text="One of the bigger drawbacks" start="00:08:22.400" video="mainVideo" id=subtitle]]
+[[!template text="of this profiler is the arithmetics" start="00:08:25.199" video="mainVideo" id=subtitle]]
+[[!template text="don't always work out," start="00:08:30.639" video="mainVideo" id=subtitle]]
+[[!template text="like you might have..." start="00:08:39.200" video="mainVideo" id=subtitle]]
+[[!template text="This is not a good example," start="00:08:45.760" video="mainVideo" id=subtitle]]
+[[!template text="but okay, you have 14% spent in here," start="00:08:47.519" video="mainVideo" id=subtitle]]
+[[!template text="but when we expand this entry," start="00:08:52.640" video="mainVideo" id=subtitle]]
+[[!template text="we only see like 6%, 3%, and 0%." start="00:08:57.200" video="mainVideo" id=subtitle]]
+[[!template text="Different sum, sometimes even bigger than that." start="00:09:01.760" video="mainVideo" id=subtitle]]
+[[!template text="So the native profiler" start="00:09:06.640" video="mainVideo" id=subtitle]]
+[[!template text="can give an accurate picture" start="00:09:10.800" video="mainVideo" id=subtitle]]
+[[!template text="and it has little overhead," start="00:09:13.200" video="mainVideo" id=subtitle]]
+[[!template text="but the specific numbers" start="00:09:15.920" video="mainVideo" id=subtitle]]
+[[!template text="are not very precise" start="00:09:20.399" video="mainVideo" id=subtitle]]
+[[!template text="because the principle is probabilistic." start="00:09:22.959" video="mainVideo" id=subtitle]]
+[[!template text="Let's stop here." start="00:09:28.640" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There is another package called elp," start="00:09:31.200" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Lisp Profiler," start="00:09:36.959" video="mainVideo" id=subtitle]]
+[[!template text="which is much older than that." start="00:09:39.360" video="mainVideo" id=subtitle]]
+[[!template text="It allows us to instrument" start="00:09:43.440" video="mainVideo" id=subtitle]]
+[[!template text="just specific functions or a package." start="00:09:47.920" video="mainVideo" id=subtitle]]
+[[!template text="We're instrumenting the xref package here." start="00:09:53.600" video="mainVideo" id=subtitle]]
+[[!template text="It works through advice. You can see" start="00:09:57.680" video="mainVideo" id=subtitle]]
+[[!template text="the description of one of the functions" start="00:10:01.360" video="mainVideo" id=subtitle]]
+[[!template text="in the package, and we see" start="00:10:03.279" video="mainVideo" id=subtitle]]
+[[!template text="that it has had :around device added." start="00:10:04.320" video="mainVideo" id=subtitle]]
+[[!template text="If we run the same search," start="00:10:12.640" video="mainVideo" id=subtitle]]
+[[!template text="we can see that -- when it finishes --" start="00:10:18.000" video="mainVideo" id=subtitle]]
+[[!template text="the table of all the numbers," start="00:10:21.360" video="mainVideo" id=subtitle]]
+[[!template text="that every function in the package" start="00:10:30.399" video="mainVideo" id=subtitle]]
+[[!template text="has been called, and the times" start="00:10:32.640" video="mainVideo" id=subtitle]]
+[[!template text="which the runtime has spent inside of them." start="00:10:41.680" video="mainVideo" id=subtitle]]
+[[!template text="sorted by impact, as it understands that." start="00:10:48.000" video="mainVideo" id=subtitle]]
+[[!template text="The main problem with this profiler is" start="00:10:55.040" video="mainVideo" id=subtitle]]
+[[!template text="it is slower because it adds overhead" start="00:11:00.079" video="mainVideo" id=subtitle]]
+[[!template text="to every function call," start="00:11:04.160" video="mainVideo" id=subtitle]]
+[[!template text="so it, in the end, might give an impression" start="00:11:06.880" video="mainVideo" id=subtitle]]
+[[!template text="that functions with lots of calls," start="00:11:11.519" video="mainVideo" id=subtitle]]
+[[!template text="which have been called a lot of times," start="00:11:19.519" video="mainVideo" id=subtitle]]
+[[!template text="are more important," start="00:11:21.839" video="mainVideo" id=subtitle]]
+[[!template text="hotter than they actually are," start="00:11:26.880" video="mainVideo" id=subtitle]]
+[[!template text="because it slows down" start="00:11:29.279" video="mainVideo" id=subtitle]]
+[[!template text="every such function call," start="00:11:30.959" video="mainVideo" id=subtitle]]
+[[!template text="including the subsequent calls" start="00:11:32.640" video="mainVideo" id=subtitle]]
+[[!template text="that these functions do" start="00:11:35.279" video="mainVideo" id=subtitle]]
+[[!template text="inside the same package." start="00:11:38.160" video="mainVideo" id=subtitle]]
+[[!template text="So it's a good way to analyze and drill down" start="00:11:40.560" video="mainVideo" id=subtitle]]
+[[!template text="to see which functions here" start="00:11:48.240" video="mainVideo" id=subtitle]]
+[[!template text="take a lot of time," start="00:11:50.320" video="mainVideo" id=subtitle]]
+[[!template text="but just keep in mind" start="00:11:51.200" video="mainVideo" id=subtitle]]
+[[!template text="that sometimes you might end up" start="00:11:53.839" video="mainVideo" id=subtitle]]
+[[!template text="trying to optimize one of these" start="00:11:57.760" video="mainVideo" id=subtitle]]
+[[!template text="smaller functions called" start="00:12:00.079" video="mainVideo" id=subtitle]]
+[[!template text="or usually smaller, and that the result" start="00:12:01.600" video="mainVideo" id=subtitle]]
+[[!template text="might not actually affect" start="00:12:09.279" video="mainVideo" id=subtitle]]
+[[!template text="the production runtime at all." start="00:12:11.040" video="mainVideo" id=subtitle]]
+[[!template text="But it's still a good tool," start="00:12:18.720" video="mainVideo" id=subtitle]]
+[[!template text="especially when you already know" start="00:12:22.240" video="mainVideo" id=subtitle]]
+[[!template text="which set of actions you are interested in," start="00:12:25.440" video="mainVideo" id=subtitle]]
+[[!template text="and which functions might be slower." start="00:12:30.560" video="mainVideo" id=subtitle]]
+[[!template text="elp allows you to instrument a package" start="00:12:33.760" video="mainVideo" id=subtitle]]
+[[!template text="or a set of functions. Just don't forget" start="00:12:37.120" video="mainVideo" id=subtitle]]
+[[!template text="to un-instrument them all afterwards," start="00:12:42.720" video="mainVideo" id=subtitle]]
+[[!template text="or else your session," start="00:12:49.600" video="mainVideo" id=subtitle]]
+[[!template text="your subsequent optimization efforts" start="00:12:52.000" video="mainVideo" id=subtitle]]
+[[!template text="might not work as well as you might" start="00:12:55.920" video="mainVideo" id=subtitle]]
+[[!template text="want to work." start="00:12:59.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And there's also this very nice," start="00:13:01.360" video="mainVideo" id=subtitle]]
+[[!template text="very handy package called benchmark," start="00:13:04.560" video="mainVideo" id=subtitle]]
+[[!template text="which unfortunately" start="00:13:09.600" video="mainVideo" id=subtitle]]
+[[!template text="not everybody knows about." start="00:13:12.480" video="mainVideo" id=subtitle]]
+[[!template text="It turns out that a lot of" start="00:13:16.000" video="mainVideo" id=subtitle]]
+[[!template text="older Emacs Lisp developers," start="00:13:21.519" video="mainVideo" id=subtitle]]
+[[!template text="users, package developers usually have" start="00:13:30.079" video="mainVideo" id=subtitle]]
+[[!template text="some benchmarking macros of their own." start="00:13:34.160" video="mainVideo" id=subtitle]]
+[[!template text="But there is this package" start="00:13:38.000" video="mainVideo" id=subtitle]]
+[[!template text="with perfectly usable interface" start="00:13:42.880" video="mainVideo" id=subtitle]]
+[[!template text="which doesn't require you" start="00:13:46.160" video="mainVideo" id=subtitle]]
+[[!template text="to define something else," start="00:13:49.199" video="mainVideo" id=subtitle]]
+[[!template text="especially when you are in" start="00:13:51.120" video="mainVideo" id=subtitle]]
+[[!template text="an emacs -Q session" start="00:13:52.560" video="mainVideo" id=subtitle]]
+[[!template text="trying to benchmark your code" start="00:13:57.120" video="mainVideo" id=subtitle]]
+[[!template text="in a bare Emacs. So it has" start="00:14:00.480" video="mainVideo" id=subtitle]]
+[[!template text="two main endpoints, I would say." start="00:14:05.440" video="mainVideo" id=subtitle]]
+[[!template text="First one is the benchmark macro," start="00:14:09.680" video="mainVideo" id=subtitle]]
+[[!template text="and the second one is benchmark-progn." start="00:14:14.480" video="mainVideo" id=subtitle]]
+[[!template text="benchmark is a function," start="00:14:19.199" video="mainVideo" id=subtitle]]
+[[!template text="and benchmark-progn is a macro." start="00:14:20.399" video="mainVideo" id=subtitle]]
+[[!template text="The first one you can use by specifying" start="00:14:25.040" video="mainVideo" id=subtitle]]
+[[!template text="the number of iterations and the form." start="00:14:27.839" video="mainVideo" id=subtitle]]
+[[!template text="I hope the minibuffer is easy to read here." start="00:14:30.480" video="mainVideo" id=subtitle]]
+[[!template text="For instance, we can take this long list" start="00:14:36.800" video="mainVideo" id=subtitle]]
+[[!template text="and try nreverse-ing it," start="00:14:43.360" video="mainVideo" id=subtitle]]
+[[!template text="and we see how long that takes." start="00:14:44.800" video="mainVideo" id=subtitle]]
+[[!template text="Then you can do it," start="00:14:49.680" video="mainVideo" id=subtitle]]
+[[!template text="adjust the inner code," start="00:14:54.160" video="mainVideo" id=subtitle]]
+[[!template text="and then basically compare" start="00:14:55.600" video="mainVideo" id=subtitle]]
+[[!template text="to figure out how much" start="00:14:58.079" video="mainVideo" id=subtitle]]
+[[!template text="and how long nreverse takes" start="00:14:59.519" video="mainVideo" id=subtitle]]
+[[!template text="in this scenario." start="00:15:01.440" video="mainVideo" id=subtitle]]
+[[!template text="Or, we can take a function" start="00:15:03.839" video="mainVideo" id=subtitle]]
+[[!template text="which we have probably found" start="00:15:07.760" video="mainVideo" id=subtitle]]
+[[!template text="using one of the previous methods" start="00:15:10.880" video="mainVideo" id=subtitle]]
+[[!template text="which we anticipate that," start="00:15:12.880" video="mainVideo" id=subtitle]]
+[[!template text="as we understand, it takes a while," start="00:15:17.279" video="mainVideo" id=subtitle]]
+[[!template text="and annotate it with a benchmark-progn form," start="00:15:19.440" video="mainVideo" id=subtitle]]
+[[!template text="which... just execute the body" start="00:15:26.720" video="mainVideo" id=subtitle]]
+[[!template text="and report, each and every one of them," start="00:15:33.360" video="mainVideo" id=subtitle]]
+[[!template text="how long that body execution took." start="00:15:36.880" video="mainVideo" id=subtitle]]
+[[!template text="So for instance, here we added" start="00:15:41.360" video="mainVideo" id=subtitle]]
+[[!template text="a few message calls" start="00:15:45.360" video="mainVideo" id=subtitle]]
+[[!template text="inside those benchmark-progns," start="00:15:46.959" video="mainVideo" id=subtitle]]
+[[!template text="so we can see how long each part" start="00:15:49.040" video="mainVideo" id=subtitle]]
+[[!template text="of the function xref-matches-in-files" start="00:15:53.199" video="mainVideo" id=subtitle]]
+[[!template text="takes when it is run." start="00:16:03.600" video="mainVideo" id=subtitle]]
+[[!template text="Let's try it. Let's first call" start="00:16:06.320" video="mainVideo" id=subtitle]]
+[[!template text="emacs-lisp-byte-compile-and-load," start="00:16:11.839" video="mainVideo" id=subtitle]]
+[[!template text="so that we're sure that we are running" start="00:16:17.199" video="mainVideo" id=subtitle]]
+[[!template text="the fastest possible version of this code," start="00:16:20.720" video="mainVideo" id=subtitle]]
+[[!template text="so when we do find the bottlenecks," start="00:16:24.079" video="mainVideo" id=subtitle]]
+[[!template text="we are sure that they are real" start="00:16:29.519" video="mainVideo" id=subtitle]]
+[[!template text="and not because of the uncompiled code," start="00:16:31.279" video="mainVideo" id=subtitle]]
+[[!template text="macro expansion, or the lack of" start="00:16:36.240" video="mainVideo" id=subtitle]]
+[[!template text="some substitutions, other substitutions" start="00:16:43.519" video="mainVideo" id=subtitle]]
+[[!template text="that our code is relying on" start="00:16:46.160" video="mainVideo" id=subtitle]]
+[[!template text="but which might not be available" start="00:16:50.800" video="mainVideo" id=subtitle]]
+[[!template text="in the interpreter mode" start="00:17:01.279" video="mainVideo" id=subtitle]]
+[[!template text="just in the compiled code." start="00:17:03.279" video="mainVideo" id=subtitle]]
+[[!template text="Let's run." start="00:17:07.039" video="mainVideo" id=subtitle]]
+[[!template text="So we have this list," start="00:17:10.160" video="mainVideo" id=subtitle]]
+[[!template text="search for list," start="00:17:14.880" video="mainVideo" id=subtitle]]
+[[!template text="and the remaining time is spent during" start="00:17:26.160" video="mainVideo" id=subtitle]]
+[[!template text="printing of the results, which we didn't" start="00:17:29.760" video="mainVideo" id=subtitle]]
+[[!template text="annotate with the benchmarking macro," start="00:17:36.720" video="mainVideo" id=subtitle]]
+[[!template text="but it's still there." start="00:17:38.320" video="mainVideo" id=subtitle]]
+[[!template text="So we can see by switching to the" start="00:17:41.280" video="mainVideo" id=subtitle]]
+[[!template text="*Messages* buffer, C-h e," start="00:17:43.679" video="mainVideo" id=subtitle]]
+[[!template text="that unquoting was very fast." start="00:17:49.919" video="mainVideo" id=subtitle]]
+[[!template text="So the search took 400 milliseconds." start="00:17:52.080" video="mainVideo" id=subtitle]]
+[[!template text="It's slower than it would be" start="00:17:59.280" video="mainVideo" id=subtitle]]
+[[!template text="without the video being recorded, as well" start="00:18:02.480" video="mainVideo" id=subtitle]]
+[[!template text="as the rest of the measurements here." start="00:18:06.080" video="mainVideo" id=subtitle]]
+[[!template text="So the parsing of the results took more" start="00:18:09.039" video="mainVideo" id=subtitle]]
+[[!template text="than that, and the object allocation" start="00:18:12.160" video="mainVideo" id=subtitle]]
+[[!template text="took even more, which is unfortunate" start="00:18:16.559" video="mainVideo" id=subtitle]]
+[[!template text="but it's the reality" start="00:18:21.919" video="mainVideo" id=subtitle]]
+[[!template text="when we're dealing with a lot of" start="00:18:23.919" video="mainVideo" id=subtitle]]
+[[!template text="search results, because, well," start="00:18:26.400" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Lisp is slower than grep." start="00:18:29.840" video="mainVideo" id=subtitle]]
+[[!template text="That's just a given." start="00:18:34.559" video="mainVideo" id=subtitle]]
+[[!template text="What can be done and what had been done" start="00:18:49.200" video="mainVideo" id=subtitle]]
+[[!template text="to improve on this?" start="00:18:54.400" video="mainVideo" id=subtitle]]
+[[!template text="Well, first of all," start="00:18:57.120" video="mainVideo" id=subtitle]]
+[[!template text="let's change the question," start="00:19:04.240" video="mainVideo" id=subtitle]]
+[[!template text="because this is more of" start="00:19:06.000" video="mainVideo" id=subtitle]]
+[[!template text="a retrospective sort of talk" start="00:19:07.360" video="mainVideo" id=subtitle]]
+[[!template text="rather than talking about future plans." start="00:19:09.760" video="mainVideo" id=subtitle]]
+[[!template new="1" text="What can one do to improve performance?" start="00:19:13.440" video="mainVideo" id=subtitle]]
+[[!template text="Well, basically, two things:" start="00:19:19.679" video="mainVideo" id=subtitle]]
+[[!template text="first, you try to make sure" start="00:19:24.160" video="mainVideo" id=subtitle]]
+[[!template text="that you're writing less code," start="00:19:27.919" video="mainVideo" id=subtitle]]
+[[!template text="then your code does fewer things," start="00:19:30.559" video="mainVideo" id=subtitle]]
+[[!template text="Fewer iterations of your operations." start="00:19:37.200" video="mainVideo" id=subtitle]]
+[[!template text="Basically, it's the realm" start="00:19:40.400" video="mainVideo" id=subtitle]]
+[[!template text="of choosing your algorithm well." start="00:19:42.000" video="mainVideo" id=subtitle]]
+[[!template text="But make sure it's as little complexity" start="00:19:46.880" video="mainVideo" id=subtitle]]
+[[!template text="as you can manage reasonably." start="00:19:54.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Another is to try to reduce memory allocations." start="00:20:00.240" video="mainVideo" id=subtitle]]
+[[!template text="It's creating conses, the links of the list," start="00:20:05.760" video="mainVideo" id=subtitle]]
+[[!template text="of the lists. If you are mapping through" start="00:20:13.760" video="mainVideo" id=subtitle]]
+[[!template text="a list, creating a new one," start="00:20:17.919" video="mainVideo" id=subtitle]]
+[[!template text="you are creating conses." start="00:20:19.200" video="mainVideo" id=subtitle]]
+[[!template text="New objects in memory, anyway." start="00:20:22.640" video="mainVideo" id=subtitle]]
+[[!template text="And also, when you call string operations" start="00:20:26.159" video="mainVideo" id=subtitle]]
+[[!template text="like substring, when you create new strings," start="00:20:30.480" video="mainVideo" id=subtitle]]
+[[!template text="that's also what you do." start="00:20:33.679" video="mainVideo" id=subtitle]]
+[[!template text="When you allocate new memory," start="00:20:36.640" video="mainVideo" id=subtitle]]
+[[!template text="that triggers garbage collections later," start="00:20:39.200" video="mainVideo" id=subtitle]]
+[[!template text="which affect the performance of your code" start="00:20:43.600" video="mainVideo" id=subtitle]]
+[[!template text="quite severely. I have found that actually," start="00:20:49.200" video="mainVideo" id=subtitle]]
+[[!template text="contrary to my personal intuition," start="00:21:01.600" video="mainVideo" id=subtitle]]
+[[!template text="when you try to fine-tune the code" start="00:21:04.960" video="mainVideo" id=subtitle]]
+[[!template text="working on long lists of elements," start="00:21:08.240" video="mainVideo" id=subtitle]]
+[[!template text="long, long collection, large collections," start="00:21:13.120" video="mainVideo" id=subtitle]]
+[[!template text="it's even more important to try to avoid" start="00:21:15.520" video="mainVideo" id=subtitle]]
+[[!template text="or reduce memory allocations" start="00:21:20.159" video="mainVideo" id=subtitle]]
+[[!template text="rather than try to ensure" start="00:21:23.200" video="mainVideo" id=subtitle]]
+[[!template text="that less code is running," start="00:21:26.400" video="mainVideo" id=subtitle]]
+[[!template text="less operations are performed," start="00:21:32.240" video="mainVideo" id=subtitle]]
+[[!template text="because the garbage collector" start="00:21:34.960" video="mainVideo" id=subtitle]]
+[[!template text="can hit you in the posterior quite suddenly" start="00:21:38.080" video="mainVideo" id=subtitle]]
+[[!template text="that you will not always..." start="00:21:44.799" video="mainVideo" id=subtitle]]
+[[!template text="When you measure the input impact," start="00:21:49.520" video="mainVideo" id=subtitle]]
+[[!template text="you might not always measure the whole of it." start="00:21:51.760" video="mainVideo" id=subtitle]]
+[[!template text="And sometimes even when you have" start="00:21:56.799" video="mainVideo" id=subtitle]]
+[[!template text="a few operations, you can measure" start="00:22:02.640" video="mainVideo" id=subtitle]]
+[[!template text="all three of them, but at some point," start="00:22:06.559" video="mainVideo" id=subtitle]]
+[[!template text="if you just reduce a lot," start="00:22:09.520" video="mainVideo" id=subtitle]]
+[[!template text="remove most of the allocations," start="00:22:11.919" video="mainVideo" id=subtitle]]
+[[!template text="all three of them, the improvement" start="00:22:14.720" video="mainVideo" id=subtitle]]
+[[!template text="might be even bigger than the total" start="00:22:16.799" video="mainVideo" id=subtitle]]
+[[!template text="of three improvements" start="00:22:21.520" video="mainVideo" id=subtitle]]
+[[!template text="which you might have measured previously," start="00:22:23.440" video="mainVideo" id=subtitle]]
+[[!template text="like separately." start="00:22:27.200" video="mainVideo" id=subtitle]]
+[[!template text="So it's something to be on the lookout for," start="00:22:29.679" video="mainVideo" id=subtitle]]
+[[!template text="but of course, when you pick the algorithm," start="00:22:33.039" video="mainVideo" id=subtitle]]
+[[!template text="it's important not to do" start="00:22:39.520" video="mainVideo" id=subtitle]]
+[[!template text="more operations than you have to." start="00:22:45.200" video="mainVideo" id=subtitle]]
+[[!template new="1" text="We have examples of both" start="00:22:52.159" video="mainVideo" id=subtitle]]
+[[!template text="in the recent changes" start="00:22:56.000" video="mainVideo" id=subtitle]]
+[[!template text="to the xref and project packages," start="00:22:58.720" video="mainVideo" id=subtitle]]
+[[!template text="which we can examine here." start="00:23:02.559" video="mainVideo" id=subtitle]]
+[[!template text="Let's take a look at this one." start="00:23:06.960" video="mainVideo" id=subtitle]]
+[[!template text="This commit message lies a little bit" start="00:23:11.200" video="mainVideo" id=subtitle]]
+[[!template text="because it's referring to" start="00:23:14.880" video="mainVideo" id=subtitle]]
+[[!template text="the use of assoc instead of cl-assoc," start="00:23:19.039" video="mainVideo" id=subtitle]]
+[[!template text="and the actual change incorporates that," start="00:23:24.559" video="mainVideo" id=subtitle]]
+[[!template text="but it also incorporates" start="00:23:29.919" video="mainVideo" id=subtitle]]
+[[!template text="the second part of the sentence" start="00:23:33.440" video="mainVideo" id=subtitle]]
+[[!template text="which actually replaced" start="00:23:39.440" video="mainVideo" id=subtitle]]
+[[!template text="the use of assoc in there." start="00:23:41.360" video="mainVideo" id=subtitle]]
+[[!template text="Curiously, cl-assoc was pretty slow" start="00:23:46.960" video="mainVideo" id=subtitle]]
+[[!template text="because not only it created" start="00:23:50.480" video="mainVideo" id=subtitle]]
+[[!template text="quadratic complexity in the operation" start="00:23:52.559" video="mainVideo" id=subtitle]]
+[[!template text="and it was also calling" start="00:23:57.919" video="mainVideo" id=subtitle]]
+[[!template text="the Lisp function equal" start="00:23:59.919" video="mainVideo" id=subtitle]]
+[[!template text="for every iteration," start="00:24:02.880" video="mainVideo" id=subtitle]]
+[[!template text="whereas if we just use assoc there," start="00:24:04.400" video="mainVideo" id=subtitle]]
+[[!template text="which was the first version" start="00:24:08.880" video="mainVideo" id=subtitle]]
+[[!template text="of this change, of the improvement," start="00:24:10.080" video="mainVideo" id=subtitle]]
+[[!template text="it became already much faster," start="00:24:13.919" video="mainVideo" id=subtitle]]
+[[!template text="but then switching to a hash table" start="00:24:15.760" video="mainVideo" id=subtitle]]
+[[!template text="which turned this lookup" start="00:24:20.640" video="mainVideo" id=subtitle]]
+[[!template text="from O(n) complexity" start="00:24:28.080" video="mainVideo" id=subtitle]]
+[[!template text="into, well, amortized constant one," start="00:24:31.760" video="mainVideo" id=subtitle]]
+[[!template text="even better." start="00:24:35.600" video="mainVideo" id=subtitle]]
+[[!template text="So, use hash tables, kids." start="00:24:37.600" video="mainVideo" id=subtitle]]
+[[!template text="Another commit here is about using" start="00:24:45.679" video="mainVideo" id=subtitle]]
+[[!template text="the inhibit-modification-hooks." start="00:24:52.400" video="mainVideo" id=subtitle]]
+[[!template text="So, turns out when you're printing" start="00:24:55.520" video="mainVideo" id=subtitle]]
+[[!template text="into a buffer, even if you have already" start="00:24:58.000" video="mainVideo" id=subtitle]]
+[[!template text="disabled the undo history," start="00:25:01.679" video="mainVideo" id=subtitle]]
+[[!template text="binding this variable to" start="00:25:06.159" video="mainVideo" id=subtitle]]
+[[!template text="a non-null value is pretty good" start="00:25:08.480" video="mainVideo" id=subtitle]]
+[[!template text="because you are able to avoid running" start="00:25:10.880" video="mainVideo" id=subtitle]]
+[[!template text="a number of hooks, which improves performance." start="00:25:15.520" video="mainVideo" id=subtitle]]
+[[!template text="Next. This one was about moving the" start="00:25:21.120" video="mainVideo" id=subtitle]]
+[[!template text="file-remote-p call" start="00:25:28.640" video="mainVideo" id=subtitle]]
+[[!template text="from inside the loop." start="00:25:32.000" video="mainVideo" id=subtitle]]
+[[!template text="This function is actually" start="00:25:37.279" video="mainVideo" id=subtitle]]
+[[!template text="surprisingly slow-ish for the goal," start="00:25:42.039" video="mainVideo" id=subtitle]]
+[[!template text="for its purpose, so you don't really want" start="00:25:49.039" video="mainVideo" id=subtitle]]
+[[!template text="to call it on every file name in the list" start="00:25:52.000" video="mainVideo" id=subtitle]]
+[[!template text="when you have a lot of them," start="00:25:56.159" video="mainVideo" id=subtitle]]
+[[!template text="and especially if your code" start="00:25:59.520" video="mainVideo" id=subtitle]]
+[[!template text="is running in a buffer" start="00:26:02.000" video="mainVideo" id=subtitle]]
+[[!template text="visiting a remote file, like through TRAMP." start="00:26:04.640" video="mainVideo" id=subtitle]]
+[[!template text="You might end up trying to" start="00:26:10.640" video="mainVideo" id=subtitle]]
+[[!template text="devise different approaches" start="00:26:15.120" video="mainVideo" id=subtitle]]
+[[!template text="to avoid checking whether" start="00:26:16.880" video="mainVideo" id=subtitle]]
+[[!template text="every file name is remote" start="00:26:20.159" video="mainVideo" id=subtitle]]
+[[!template text="if you're dealing with a list of file names," start="00:26:23.279" video="mainVideo" id=subtitle]]
+[[!template text="so this one, take a look, be careful with it." start="00:26:25.360" video="mainVideo" id=subtitle]]
+[[!template text="A similar, slower function, with-current-buffer," start="00:26:34.640" video="mainVideo" id=subtitle]]
+[[!template text="but not so much. So it all depends on" start="00:26:43.120" video="mainVideo" id=subtitle]]
+[[!template text="really how often you call it." start="00:26:46.880" video="mainVideo" id=subtitle]]
+[[!template text="Sometimes you might want to" start="00:26:48.400" video="mainVideo" id=subtitle]]
+[[!template text="rewrite your code so that" start="00:26:51.279" video="mainVideo" id=subtitle]]
+[[!template text="it's called less often." start="00:26:52.720" video="mainVideo" id=subtitle]]
+[[!template text="And expand-file-name, which hits the disk." start="00:26:54.720" video="mainVideo" id=subtitle]]
+[[!template text="So if you're dealing with file names," start="00:26:59.760" video="mainVideo" id=subtitle]]
+[[!template text="you might want to replace it" start="00:27:01.200" video="mainVideo" id=subtitle]]
+[[!template text="with concatenation at certain points." start="00:27:02.960" video="mainVideo" id=subtitle]]
+[[!template text="Okay, back to these changes later." start="00:27:07.520" video="mainVideo" id=subtitle]]
+[[!template text="This one just removed a location of a cons" start="00:27:22.159" video="mainVideo" id=subtitle]]
+[[!template text="per match hit, and still it brought 5%" start="00:27:28.480" video="mainVideo" id=subtitle]]
+[[!template text="or something like that improvement" start="00:27:33.679" video="mainVideo" id=subtitle]]
+[[!template text="to the whole command." start="00:27:37.039" video="mainVideo" id=subtitle]]
+[[!template text="So that's a pretty significant improvement" start="00:27:41.120" video="mainVideo" id=subtitle]]
+[[!template text="for a small change like that." start="00:27:46.000" video="mainVideo" id=subtitle]]
+[[!template text="Similarly, here we just made sure" start="00:27:53.600" video="mainVideo" id=subtitle]]
+[[!template text="to avoid a splits... no, a substring call," start="00:28:01.679" video="mainVideo" id=subtitle]]
+[[!template text="and probably an allocation of the whole" start="00:28:09.520" video="mainVideo" id=subtitle]]
+[[!template text="buffer string, but in my testing," start="00:28:12.399" video="mainVideo" id=subtitle]]
+[[!template text="that doesn't actually matter much," start="00:28:16.320" video="mainVideo" id=subtitle]]
+[[!template text="at least so much, but a substring call" start="00:28:19.440" video="mainVideo" id=subtitle]]
+[[!template text="per result... If we see," start="00:28:22.399" video="mainVideo" id=subtitle]]
+[[!template text="since we changed to manual parsing" start="00:28:28.960" video="mainVideo" id=subtitle]]
+[[!template text="of the buffer, with the strings" start="00:28:33.039" video="mainVideo" id=subtitle]]
+[[!template text="delimited with zero bytes," start="00:28:37.440" video="mainVideo" id=subtitle]]
+[[!template text="it gave an overall improvement" start="00:28:41.440" video="mainVideo" id=subtitle]]
+[[!template text="of 20%, again on my machine" start="00:28:43.840" video="mainVideo" id=subtitle]]
+[[!template text="with a pretty fast SSD," start="00:28:47.440" video="mainVideo" id=subtitle]]
+[[!template text="and with a warm disk cache, of course." start="00:28:50.720" video="mainVideo" id=subtitle]]
+[[!template text="But still... Going back to this revision," start="00:28:53.679" video="mainVideo" id=subtitle]]
+[[!template text="it was actually quite surprising" start="00:29:05.360" video="mainVideo" id=subtitle]]
+[[!template text="that migration to a cl-defstruct" start="00:29:09.440" video="mainVideo" id=subtitle]]
+[[!template text="from eieio, the Common Lisp-inspired" start="00:29:15.200" video="mainVideo" id=subtitle]]
+[[!template text="object system first introduced" start="00:29:24.080" video="mainVideo" id=subtitle]]
+[[!template text="in the CEDET tools," start="00:29:26.480" video="mainVideo" id=subtitle]]
+[[!template text="that was a bit of a surprise," start="00:29:34.240" video="mainVideo" id=subtitle]]
+[[!template text="because not much of my" start="00:29:39.360" video="mainVideo" id=subtitle]]
+[[!template text="benchmark benchmarking" start="00:29:44.799" video="mainVideo" id=subtitle]]
+[[!template text="actually pointed at it being the problem." start="00:29:46.080" video="mainVideo" id=subtitle]]
+[[!template text="Probably because the accessors" start="00:29:50.960" video="mainVideo" id=subtitle]]
+[[!template text="were not the actual problem," start="00:29:55.760" video="mainVideo" id=subtitle]]
+[[!template text="like the oref macros" start="00:29:57.520" video="mainVideo" id=subtitle]]
+[[!template text="and the code accessing the slots," start="00:30:00.399" video="mainVideo" id=subtitle]]
+[[!template text="but the construction," start="00:30:06.960" video="mainVideo" id=subtitle]]
+[[!template text="the object construction code," start="00:30:10.720" video="mainVideo" id=subtitle]]
+[[!template text="that was where most of the time" start="00:30:14.320" video="mainVideo" id=subtitle]]
+[[!template text="was spent unnecessarily," start="00:30:16.559" video="mainVideo" id=subtitle]]
+[[!template text="maybe doing type-checking," start="00:30:21.200" video="mainVideo" id=subtitle]]
+[[!template text="maybe some other stuff." start="00:30:24.240" video="mainVideo" id=subtitle]]
+[[!template text="So if you have lots of values," start="00:30:28.880" video="mainVideo" id=subtitle]]
+[[!template text="you need to treat like objects in... and" start="00:30:36.080" video="mainVideo" id=subtitle]]
+[[!template text="virtual dispatch on them in your package," start="00:30:39.120" video="mainVideo" id=subtitle]]
+[[!template text="you might want to look into" start="00:30:42.000" video="mainVideo" id=subtitle]]
+[[!template text="cl-defstruct for them." start="00:30:45.200" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Going on to the next section," start="00:30:52.240" video="mainVideo" id=subtitle]]
+[[!template text="I have prepared the sort of comparison" start="00:30:54.080" video="mainVideo" id=subtitle]]
+[[!template text="between cl-lib, dash, and seq," start="00:31:01.200" video="mainVideo" id=subtitle]]
+[[!template text="the collection libraries we have" start="00:31:05.519" video="mainVideo" id=subtitle]]
+[[!template text="available for us in Emacs." start="00:31:09.360" video="mainVideo" id=subtitle]]
+[[!template text="That is the popular ones," start="00:31:11.279" video="mainVideo" id=subtitle]]
+[[!template text="but since I'm running behind on time," start="00:31:15.760" video="mainVideo" id=subtitle]]
+[[!template text="I'll probably just summarize the findings." start="00:31:21.440" video="mainVideo" id=subtitle]]
+[[!template text="First of all, seq is nice." start="00:31:27.760" video="mainVideo" id=subtitle]]
+[[!template text="Its generic approach is probably" start="00:31:31.919" video="mainVideo" id=subtitle]]
+[[!template text="quite decent for most of the situations," start="00:31:38.480" video="mainVideo" id=subtitle]]
+[[!template text="but there are places where it could be" start="00:31:41.919" video="mainVideo" id=subtitle]]
+[[!template text="optimized better, so instead of having" start="00:31:49.840" video="mainVideo" id=subtitle]]
+[[!template text="quadratic performance, it could use a" start="00:31:53.679" video="mainVideo" id=subtitle]]
+[[!template text="hash table, like for instance," start="00:31:56.399" video="mainVideo" id=subtitle]]
+[[!template text="dash does here--" start="00:31:59.200" video="mainVideo" id=subtitle]]
+[[!template text="in dash, union or delete-dups" start="00:32:02.000" video="mainVideo" id=subtitle]]
+[[!template text="does in its implementation." start="00:32:06.240" video="mainVideo" id=subtitle]]
+[[!template text="The dash itself is curiously fast," start="00:32:12.960" video="mainVideo" id=subtitle]]
+[[!template text="at least faster than I might have expected," start="00:32:16.640" video="mainVideo" id=subtitle]]
+[[!template text="possibly because of" start="00:32:20.000" video="mainVideo" id=subtitle]]
+[[!template text="the implementation approach" start="00:32:21.600" video="mainVideo" id=subtitle]]
+[[!template text="where it uses code generation" start="00:32:25.120" video="mainVideo" id=subtitle]]
+[[!template text="to avoid function calls," start="00:32:33.200" video="mainVideo" id=subtitle]]
+[[!template text="at least some of them," start="00:32:35.840" video="mainVideo" id=subtitle]]
+[[!template text="which is interesting." start="00:32:37.840" video="mainVideo" id=subtitle]]
+[[!template text="But since both seq and dash" start="00:32:41.120" video="mainVideo" id=subtitle]]
+[[!template text="avoid mutations--they don't really have" start="00:32:45.600" video="mainVideo" id=subtitle]]
+[[!template text="mutating counterparts to common functions" start="00:32:49.919" video="mainVideo" id=subtitle]]
+[[!template text="like you have with cl-remove-if, cl-delete-if," start="00:32:52.399" video="mainVideo" id=subtitle]]
+[[!template text="or just cl-remove, cl-delete," start="00:32:56.480" video="mainVideo" id=subtitle]]
+[[!template text="it still can be valuable to look into" start="00:33:02.000" video="mainVideo" id=subtitle]]
+[[!template text="destructive versions of those functions," start="00:33:08.000" video="mainVideo" id=subtitle]]
+[[!template text="something from the core library" start="00:33:12.240" video="mainVideo" id=subtitle]]
+[[!template text="like delete-dups or nreverse," start="00:33:16.880" video="mainVideo" id=subtitle]]
+[[!template text="for your code when you're really trying" start="00:33:22.559" video="mainVideo" id=subtitle]]
+[[!template text="to get as close to the metal" start="00:33:24.399" video="mainVideo" id=subtitle]]
+[[!template text="or whatever as you can," start="00:33:29.519" video="mainVideo" id=subtitle]]
+[[!template text="because avoiding extra allocations," start="00:33:34.320" video="mainVideo" id=subtitle]]
+[[!template text="it can really be useful." start="00:33:40.080" video="mainVideo" id=subtitle]]
+[[!template text="You can really improve their performance" start="00:33:43.200" video="mainVideo" id=subtitle]]
+[[!template text="if you don't do a lot of other stuff." start="00:33:46.159" video="mainVideo" id=subtitle]]
+[[!template text="delete-consecutive-dups is blazing faster." start="00:33:54.080" video="mainVideo" id=subtitle]]
+[[!template text="It only requires pre-sorted strings." start="00:34:00.080" video="mainVideo" id=subtitle]]
+[[!template text="What else to say..." start="00:34:03.919" video="mainVideo" id=subtitle]]
+[[!template text="If you are going to read these measurements," start="00:34:08.399" video="mainVideo" id=subtitle]]
+[[!template text="make sure to keep in mind" start="00:34:13.200" video="mainVideo" id=subtitle]]
+[[!template text="that reverse is not free," start="00:34:15.359" video="mainVideo" id=subtitle]]
+[[!template text="so for instance, if we're looking" start="00:34:18.000" video="mainVideo" id=subtitle]]
+[[!template text="at this comparison" start="00:34:20.240" video="mainVideo" id=subtitle]]
+[[!template text="between remove and delete, for instance," start="00:34:22.480" video="mainVideo" id=subtitle]]
+[[!template text="they're using reverse" start="00:34:26.399" video="mainVideo" id=subtitle]]
+[[!template text="to avoid modifying the data," start="00:34:27.919" video="mainVideo" id=subtitle]]
+[[!template text="the sample data, so we don't have to" start="00:34:32.159" video="mainVideo" id=subtitle]]
+[[!template text="create it every time." start="00:34:34.800" video="mainVideo" id=subtitle]]
+[[!template text="But to compare how much faster" start="00:34:36.720" video="mainVideo" id=subtitle]]
+[[!template text="delete is than remove," start="00:34:41.919" video="mainVideo" id=subtitle]]
+[[!template text="we need to subtract 787 milliseconds" start="00:34:43.760" video="mainVideo" id=subtitle]]
+[[!template text="from here and from here" start="00:34:50.800" video="mainVideo" id=subtitle]]
+[[!template text="so it comes out to like 230 milliseconds" start="00:34:52.320" video="mainVideo" id=subtitle]]
+[[!template text="in this example, the last example," start="00:34:58.480" video="mainVideo" id=subtitle]]
+[[!template text="and 100 to 1 second, 250 milliseconds here," start="00:35:02.560" video="mainVideo" id=subtitle]]
+[[!template text="so the difference is 5-fold here." start="00:35:12.000" video="mainVideo" id=subtitle]]
+[[!template text="Not 2-fold." start="00:35:17.599" video="mainVideo" id=subtitle]]
+[[!template text="All right. With this, I'm going to" start="00:35:20.160" video="mainVideo" id=subtitle]]
+[[!template text="thank you for listening, for watching" start="00:35:26.480" video="mainVideo" id=subtitle]]
+[[!template text="and I'll be taking questions." start="00:35:29.520" video="mainVideo" id=subtitle]]
+[[!template text="Thank you." start="00:35:31.920" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:35:32.920" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/forever.md b/2021/captions/forever.md
new file mode 100644
index 00000000..c9a7f9f3
--- /dev/null
+++ b/2021/captions/forever.md
@@ -0,0 +1,894 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hi everyone! I'm very excited" start="00:00:01.280" video="mainVideo" id=subtitle]]
+[[!template text="to be here at EmacsConf 2021 today" start="00:00:02.800" video="mainVideo" id=subtitle]]
+[[!template text="to give my talk called" start="00:00:05.200" video="mainVideo" id=subtitle]]
+[[!template text="&quot;M-x Forever: How Emacs Will Outlast" start="00:00:06.640" video="mainVideo" id=subtitle]]
+[[!template text="Text Editor Trends.&quot;" start="00:00:09.360" video="mainVideo" id=subtitle]]
+[[!template text="So let's start with the conclusion first." start="00:00:11.519" video="mainVideo" id=subtitle]]
+[[!template text="I know, it's a little bit unorthodox," start="00:00:13.759" video="mainVideo" id=subtitle]]
+[[!template text="but let's just try and see what happens." start="00:00:15.040" video="mainVideo" id=subtitle]]
+[[!template text="So no matter what happens" start="00:00:16.960" video="mainVideo" id=subtitle]]
+[[!template text="in the wider software world," start="00:00:18.400" video="mainVideo" id=subtitle]]
+[[!template text="GNU Emacs will continue to be" start="00:00:19.760" video="mainVideo" id=subtitle]]
+[[!template text="a beloved program" start="00:00:21.520" video="mainVideo" id=subtitle]]
+[[!template text="with a dedicated community" start="00:00:22.640" video="mainVideo" id=subtitle]]
+[[!template text="and a healthy team" start="00:00:24.080" video="mainVideo" id=subtitle]]
+[[!template text="of maintainers and contributors." start="00:00:25.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="You're probably wondering" start="00:00:28.080" video="mainVideo" id=subtitle]]
+[[!template text="who am I to be making such a claim," start="00:00:29.439" video="mainVideo" id=subtitle]]
+[[!template text="so I'll tell you." start="00:00:31.141" video="mainVideo" id=subtitle]]
+[[!template text="I am David Wilson, the creator of the" start="00:00:32.640" video="mainVideo" id=subtitle]]
+[[!template text="System Crafters YouTube channel" start="00:00:34.640" video="mainVideo" id=subtitle]]
+[[!template text="and community. If you want to see" start="00:00:36.000" video="mainVideo" id=subtitle]]
+[[!template text="a lot of really great videos" start="00:00:38.079" video="mainVideo" id=subtitle]]
+[[!template text="about GNU Emacs, GNU Guix, etc.," start="00:00:39.040" video="mainVideo" id=subtitle]]
+[[!template text="come check out my YouTube channel." start="00:00:41.280" video="mainVideo" id=subtitle]]
+[[!template text="I'm also on LBRY and Odysee" start="00:00:42.719" video="mainVideo" id=subtitle]]
+[[!template text="if you don't want to go use YouTubea" start="00:00:44.480" video="mainVideo" id=subtitle]]
+[[!template text="And also, if you're the type of person" start="00:00:46.399" video="mainVideo" id=subtitle]]
+[[!template text="who doesn't want to use" start="00:00:47.360" video="mainVideo" id=subtitle]]
+[[!template text="any of these websites" start="00:00:48.399" video="mainVideo" id=subtitle]]
+[[!template text="and you want to see my videos anyway," start="00:00:49.680" video="mainVideo" id=subtitle]]
+[[!template text="please just send me an email" start="00:00:51.039" video="mainVideo" id=subtitle]]
+[[!template text="at the email address below" start="00:00:52.160" video="mainVideo" id=subtitle]]
+[[!template text="and I'll see if I can set you up" start="00:00:53.280" video="mainVideo" id=subtitle]]
+[[!template text="with that. You can also check out" start="00:00:54.079" video="mainVideo" id=subtitle]]
+[[!template text="my website and the places where we chat," start="00:00:55.520" video="mainVideo" id=subtitle]]
+[[!template text="especially on libera.chat" start="00:00:58.160" video="mainVideo" id=subtitle]]
+[[!template text="at the #systemcrafters channel." start="00:00:59.440" video="mainVideo" id=subtitle]]
+[[!template text="If you have any thoughts" start="00:01:01.440" video="mainVideo" id=subtitle]]
+[[!template text="after seeing this talk," start="00:01:02.719" video="mainVideo" id=subtitle]]
+[[!template text="please feel free to send me an email" start="00:01:03.600" video="mainVideo" id=subtitle]]
+[[!template text="or find me on chat." start="00:01:04.799" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So there is a recurring concern" start="00:01:07.200" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs community" start="00:01:09.920" video="mainVideo" id=subtitle]]
+[[!template text="about its popularity." start="00:01:11.119" video="mainVideo" id=subtitle]]
+[[!template text="This is something that keeps coming back" start="00:01:12.799" video="mainVideo" id=subtitle]]
+[[!template text="time and time again. You probably see it" start="00:01:14.320" video="mainVideo" id=subtitle]]
+[[!template text="every year or two where people on Reddit" start="00:01:16.479" video="mainVideo" id=subtitle]]
+[[!template text="or maybe on the emacs-devel" start="00:01:18.640" video="mainVideo" id=subtitle]]
+[[!template text="mailing list are talking about ways" start="00:01:19.840" video="mainVideo" id=subtitle]]
+[[!template text="to increase Emacs popularity." start="00:01:21.600" video="mainVideo" id=subtitle]]
+[[!template text="More recently, there was a discussion" start="00:01:24.000" video="mainVideo" id=subtitle]]
+[[!template text="on Hacker News where somebody posted" start="00:01:25.600" video="mainVideo" id=subtitle]]
+[[!template text="a link to this" start="00:01:27.600" video="mainVideo" id=subtitle]]
+[[!template text="Making Emacs Popular Again blog post" start="00:01:28.159" video="mainVideo" id=subtitle]]
+[[!template text="which does chronicle some of the" start="00:01:31.360" video="mainVideo" id=subtitle]]
+[[!template text="more recent discussions on emacs-devel" start="00:01:32.479" video="mainVideo" id=subtitle]]
+[[!template text="about things that could be done" start="00:01:34.479" video="mainVideo" id=subtitle]]
+[[!template text="to make Emacs a more popular editor." start="00:01:35.840" video="mainVideo" id=subtitle]]
+[[!template text="So the title of my talk claims" start="00:01:38.479" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is going to" start="00:01:40.079" video="mainVideo" id=subtitle]]
+[[!template text="outlast text editor trends." start="00:01:41.280" video="mainVideo" id=subtitle]]
+[[!template text="So to elaborate on this claim," start="00:01:43.759" video="mainVideo" id=subtitle]]
+[[!template text="we're going to try to answer" start="00:01:45.840" video="mainVideo" id=subtitle]]
+[[!template text="a few specific questions." start="00:01:46.799" video="mainVideo" id=subtitle]]
+[[!template text="First of all, what is popularity" start="00:01:48.720" video="mainVideo" id=subtitle]]
+[[!template text="and how do you even measure it?" start="00:01:51.200" video="mainVideo" id=subtitle]]
+[[!template text="If people are saying" start="00:01:53.280" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs needs to be more popular," start="00:01:54.240" video="mainVideo" id=subtitle]]
+[[!template text="then what do we really mean" start="00:01:55.920" video="mainVideo" id=subtitle]]
+[[!template text="by popularity?" start="00:01:57.040" video="mainVideo" id=subtitle]]
+[[!template text="Also, what are the benefits" start="00:01:59.040" video="mainVideo" id=subtitle]]
+[[!template text="of popularity? If emacs did somehow" start="00:02:00.159" video="mainVideo" id=subtitle]]
+[[!template text="become more popular, what benefits" start="00:02:01.920" video="mainVideo" id=subtitle]]
+[[!template text="would it receive from that?" start="00:02:03.920" video="mainVideo" id=subtitle]]
+[[!template text="And also, how does an editor" start="00:02:05.680" video="mainVideo" id=subtitle]]
+[[!template text="lose popularity, and what are" start="00:02:07.439" video="mainVideo" id=subtitle]]
+[[!template text="the possible consequences to that?" start="00:02:08.720" video="mainVideo" id=subtitle]]
+[[!template text="And then what are the unique factors" start="00:02:11.120" video="mainVideo" id=subtitle]]
+[[!template text="about Emacs that will ensure" start="00:02:12.480" video="mainVideo" id=subtitle]]
+[[!template text="that it survives long term?" start="00:02:13.680" video="mainVideo" id=subtitle]]
+[[!template text="What is special about Emacs" start="00:02:16.000" video="mainVideo" id=subtitle]]
+[[!template text="that will help it to thrive" start="00:02:17.520" video="mainVideo" id=subtitle]]
+[[!template text="despite whatever happens in the" start="00:02:19.440" video="mainVideo" id=subtitle]]
+[[!template text="popular sphere of text editors and" start="00:02:21.920" video="mainVideo" id=subtitle]]
+[[!template text="programming languages, etc.?" start="00:02:24.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, first of all, what does popularity" start="00:02:26.959" video="mainVideo" id=subtitle]]
+[[!template text="really mean? When someone says" start="00:02:28.800" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs needs to become more popular," start="00:02:30.720" video="mainVideo" id=subtitle]]
+[[!template text="what are they really saying" start="00:02:32.400" video="mainVideo" id=subtitle]]
+[[!template text="is that there needs to be more users," start="00:02:33.680" video="mainVideo" id=subtitle]]
+[[!template text="and that they stick around." start="00:02:35.840" video="mainVideo" id=subtitle]]
+[[!template text="Like, they learn how to use Emacs" start="00:02:37.102" video="mainVideo" id=subtitle]]
+[[!template text="and they continue to be users." start="00:02:38.800" video="mainVideo" id=subtitle]]
+[[!template text="If we did get those new users," start="00:02:41.680" video="mainVideo" id=subtitle]]
+[[!template text="what would it actually do for Emacs?" start="00:02:42.800" video="mainVideo" id=subtitle]]
+[[!template text="Also, is it that there are" start="00:02:45.599" video="mainVideo" id=subtitle]]
+[[!template text="more community members that are" start="00:02:47.440" video="mainVideo" id=subtitle]]
+[[!template text="creating new packages?" start="00:02:48.959" video="mainVideo" id=subtitle]]
+[[!template text="You know, that sort of assumes" start="00:02:51.040" video="mainVideo" id=subtitle]]
+[[!template text="that the editor itself" start="00:02:52.480" video="mainVideo" id=subtitle]]
+[[!template text="doesn't have enough packages," start="00:02:53.519" video="mainVideo" id=subtitle]]
+[[!template text="or that the only way" start="00:02:54.720" video="mainVideo" id=subtitle]]
+[[!template text="that the an editor stays alive" start="00:02:55.519" video="mainVideo" id=subtitle]]
+[[!template text="is for there to be constant churn," start="00:02:57.120" video="mainVideo" id=subtitle]]
+[[!template text="with new packages coming around." start="00:02:58.800" video="mainVideo" id=subtitle]]
+[[!template text="Is it that there is more content" start="00:03:01.440" video="mainVideo" id=subtitle]]
+[[!template text="being created by users," start="00:03:03.120" video="mainVideo" id=subtitle]]
+[[!template text="like more blog posts being written," start="00:03:04.319" video="mainVideo" id=subtitle]]
+[[!template text="more YouTube videos being made," start="00:03:05.840" video="mainVideo" id=subtitle]]
+[[!template text="more other ways that people are" start="00:03:07.920" video="mainVideo" id=subtitle]]
+[[!template text="evangelizing the use of Emacs" start="00:03:09.360" video="mainVideo" id=subtitle]]
+[[!template text="and also teaching people how to use it?" start="00:03:11.599" video="mainVideo" id=subtitle]]
+[[!template text="Also, is it that" start="00:03:14.720" video="mainVideo" id=subtitle]]
+[[!template text="more long-term stability is had" start="00:03:16.080" video="mainVideo" id=subtitle]]
+[[!template text="in the editor, and more core" start="00:03:18.720" video="mainVideo" id=subtitle]]
+[[!template text="improvements that are being made" start="00:03:20.159" video="mainVideo" id=subtitle]]
+[[!template text="over time? I mean, I guess you could say" start="00:03:21.280" video="mainVideo" id=subtitle]]
+[[!template text="that it does make sense" start="00:03:22.879" video="mainVideo" id=subtitle]]
+[[!template text="that if the editor is more popular," start="00:03:23.760" video="mainVideo" id=subtitle]]
+[[!template text="then people will be more invested" start="00:03:25.680" video="mainVideo" id=subtitle]]
+[[!template text="in improving it, and there will be" start="00:03:26.959" video="mainVideo" id=subtitle]]
+[[!template text="more new contributors coming in," start="00:03:28.080" video="mainVideo" id=subtitle]]
+[[!template text="but is greater and greater popularity" start="00:03:30.000" video="mainVideo" id=subtitle]]
+[[!template text="really what's needed" start="00:03:32.480" video="mainVideo" id=subtitle]]
+[[!template text="to ensure that this happens?" start="00:03:33.280" video="mainVideo" id=subtitle]]
+[[!template text="Also, it could just be that" start="00:03:35.280" video="mainVideo" id=subtitle]]
+[[!template text="there's more validation" start="00:03:37.040" video="mainVideo" id=subtitle]]
+[[!template text="for someone's personal choices." start="00:03:38.080" video="mainVideo" id=subtitle]]
+[[!template text="You know, people tend to use" start="00:03:40.480" video="mainVideo" id=subtitle]]
+[[!template text="these software choices they use" start="00:03:42.159" video="mainVideo" id=subtitle]]
+[[!template text="as part of their identity." start="00:03:43.760" video="mainVideo" id=subtitle]]
+[[!template text="So is it that they want Emacs" start="00:03:44.799" video="mainVideo" id=subtitle]]
+[[!template text="to be more popular" start="00:03:46.000" video="mainVideo" id=subtitle]]
+[[!template text="so that they can finally say," start="00:03:46.799" video="mainVideo" id=subtitle]]
+[[!template text="&quot;I'm an Emacs user,&quot;" start="00:03:48.319" video="mainVideo" id=subtitle]]
+[[!template text="and have people think" start="00:03:49.440" video="mainVideo" id=subtitle]]
+[[!template text="that they're cool or &quot;hip&quot; or whatever?" start="00:03:50.080" video="mainVideo" id=subtitle]]
+[[!template text="I hope that... Hopefully," start="00:03:51.840" video="mainVideo" id=subtitle]]
+[[!template text="that's not the case." start="00:03:52.720" video="mainVideo" id=subtitle]]
+[[!template text="Hopefully, it's one of these" start="00:03:53.370" video="mainVideo" id=subtitle]]
+[[!template text="other points. But it could be something" start="00:03:54.239" video="mainVideo" id=subtitle]]
+[[!template text="because, as we see, you know," start="00:03:56.000" video="mainVideo" id=subtitle]]
+[[!template text="there's a lot of trends and fashion" start="00:03:57.120" video="mainVideo" id=subtitle]]
+[[!template text="when it comes to software development" start="00:03:59.439" video="mainVideo" id=subtitle]]
+[[!template text="and also free software" start="00:04:00.879" video="mainVideo" id=subtitle]]
+[[!template text="and open source tools." start="00:04:02.640" video="mainVideo" id=subtitle]]
+[[!template text="So as we go through this talk," start="00:04:04.159" video="mainVideo" id=subtitle]]
+[[!template text="keep these questions in mind" start="00:04:05.840" video="mainVideo" id=subtitle]]
+[[!template text="as we talk about" start="00:04:07.200" video="mainVideo" id=subtitle]]
+[[!template text="some of the finer points on all of this," start="00:04:07.760" video="mainVideo" id=subtitle]]
+[[!template text="and see whether you think" start="00:04:09.680" video="mainVideo" id=subtitle]]
+[[!template text="that popularity really correlates" start="00:04:11.280" video="mainVideo" id=subtitle]]
+[[!template text="with these things." start="00:04:13.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So first of all, how do we measure" start="00:04:15.680" video="mainVideo" id=subtitle]]
+[[!template text="popularity? What information do we have" start="00:04:17.919" video="mainVideo" id=subtitle]]
+[[!template text="to actually determine" start="00:04:20.720" video="mainVideo" id=subtitle]]
+[[!template text="which editors are popular," start="00:04:21.600" video="mainVideo" id=subtitle]]
+[[!template text="and whether they're gaining or losing" start="00:04:23.360" video="mainVideo" id=subtitle]]
+[[!template text="popularity? So I've got a few," start="00:04:25.199" video="mainVideo" id=subtitle]]
+[[!template text="or a couple places here" start="00:04:26.880" video="mainVideo" id=subtitle]]
+[[!template text="that we can look at" start="00:04:27.759" video="mainVideo" id=subtitle]]
+[[!template text="to judge the popularity" start="00:04:29.120" video="mainVideo" id=subtitle]]
+[[!template text="of various editors." start="00:04:30.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="First of all, Google Trends." start="00:04:32.400" video="mainVideo" id=subtitle]]
+[[!template text="Google actually gives us the ability" start="00:04:33.840" video="mainVideo" id=subtitle]]
+[[!template text="to track and compare search volume" start="00:04:35.199" video="mainVideo" id=subtitle]]
+[[!template text="for particular terms and topics" start="00:04:37.199" video="mainVideo" id=subtitle]]
+[[!template text="over time. So if you wanted to know" start="00:04:39.040" video="mainVideo" id=subtitle]]
+[[!template text="how often someone was searching" start="00:04:41.759" video="mainVideo" id=subtitle]]
+[[!template text="about Emacs, maybe to try to find help" start="00:04:43.040" video="mainVideo" id=subtitle]]
+[[!template text="for something, or look for documentation," start="00:04:44.800" video="mainVideo" id=subtitle]]
+[[!template text="or maybe look for blog posts, etc.," start="00:04:46.479" video="mainVideo" id=subtitle]]
+[[!template text="you can look at Google Trends" start="00:04:48.800" video="mainVideo" id=subtitle]]
+[[!template text="to see how often people are searching" start="00:04:49.919" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs over time." start="00:04:51.600" video="mainVideo" id=subtitle]]
+[[!template text="One useful ability is that we can" start="00:04:53.440" video="mainVideo" id=subtitle]]
+[[!template text="compare how much people are searching" start="00:04:55.199" video="mainVideo" id=subtitle]]
+[[!template text="across various different topics" start="00:04:57.360" video="mainVideo" id=subtitle]]
+[[!template text="and see a graph, which is" start="00:04:58.720" video="mainVideo" id=subtitle]]
+[[!template text="what i'm going to show you right now." start="00:05:00.000" video="mainVideo" id=subtitle]]
+[[!template text="This graph shows you the search volume" start="00:05:01.680" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs compared to Vim, Atom," start="00:05:04.000" video="mainVideo" id=subtitle]]
+[[!template text="Sublime Text, and Visual Studio Code" start="00:05:06.320" video="mainVideo" id=subtitle]]
+[[!template text="from 2004 to the present" start="00:05:08.800" video="mainVideo" id=subtitle]]
+[[!template text="worldwide, so all across the world" start="00:05:11.120" video="mainVideo" id=subtitle]]
+[[!template text="where searches are happening." start="00:05:12.880" video="mainVideo" id=subtitle]]
+[[!template text="You can see that in 2004," start="00:05:14.479" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is the reigning king supreme" start="00:05:16.240" video="mainVideo" id=subtitle]]
+[[!template text="where you have the most search terms" start="00:05:18.479" video="mainVideo" id=subtitle]]
+[[!template text="or searches happening on emacs" start="00:05:21.039" video="mainVideo" id=subtitle]]
+[[!template text="at that time. Also, Vim is quite high" start="00:05:22.720" video="mainVideo" id=subtitle]]
+[[!template text="on this list as well." start="00:05:25.199" video="mainVideo" id=subtitle]]
+[[!template text="Let's see. Sublime Text is a bit lower" start="00:05:26.960" video="mainVideo" id=subtitle]]
+[[!template text="in the list, but it's in third place." start="00:05:28.560" video="mainVideo" id=subtitle]]
+[[!template text="Nope. Yep. That's right." start="00:05:31.120" video="mainVideo" id=subtitle]]
+[[!template text="Then atom is quite low, but I think that" start="00:05:32.080" video="mainVideo" id=subtitle]]
+[[!template text="Atom didn't exist yet," start="00:05:34.880" video="mainVideo" id=subtitle]]
+[[!template text="so maybe at that point, you know," start="00:05:36.320" video="mainVideo" id=subtitle]]
+[[!template text="this is probably something else." start="00:05:37.759" video="mainVideo" id=subtitle]]
+[[!template text="Google is just getting random data." start="00:05:39.120" video="mainVideo" id=subtitle]]
+[[!template text="And then Visual Studio Code" start="00:05:41.360" video="mainVideo" id=subtitle]]
+[[!template text="also didn't exist," start="00:05:42.880" video="mainVideo" id=subtitle]]
+[[!template text="so probably this is like" start="00:05:43.919" video="mainVideo" id=subtitle]]
+[[!template text="Visual Studio searches," start="00:05:45.039" video="mainVideo" id=subtitle]]
+[[!template text="but then as you go across the years," start="00:05:46.479" video="mainVideo" id=subtitle]]
+[[!template text="you see that gradually," start="00:05:48.000" video="mainVideo" id=subtitle]]
+[[!template text="Emacs popularity appears to be declining." start="00:05:48.960" video="mainVideo" id=subtitle]]
+[[!template text="As does Vim, but not quite so much." start="00:05:52.160" video="mainVideo" id=subtitle]]
+[[!template text="And then over time, Sublime Text" start="00:05:54.639" video="mainVideo" id=subtitle]]
+[[!template text="becomes more popular," start="00:05:56.560" video="mainVideo" id=subtitle]]
+[[!template text="and then VS Code in more recent years" start="00:05:57.520" video="mainVideo" id=subtitle]]
+[[!template text="becomes very popular" start="00:05:59.280" video="mainVideo" id=subtitle]]
+[[!template text="compared to everything else." start="00:06:00.319" video="mainVideo" id=subtitle]]
+[[!template text="So it looks like Emacs" start="00:06:02.400" video="mainVideo" id=subtitle]]
+[[!template text="has declined significantly in popularity," start="00:06:04.479" video="mainVideo" id=subtitle]]
+[[!template text="while the other editors have taken over." start="00:06:06.960" video="mainVideo" id=subtitle]]
+[[!template text="But is the search volume really" start="00:06:09.600" video="mainVideo" id=subtitle]]
+[[!template text="the only important factor" start="00:06:11.360" video="mainVideo" id=subtitle]]
+[[!template text="that indicates popularity or health" start="00:06:12.800" video="mainVideo" id=subtitle]]
+[[!template text="of a given editor?" start="00:06:14.800" video="mainVideo" id=subtitle]]
+[[!template text="That still remains to be seen." start="00:06:16.080" video="mainVideo" id=subtitle]]
+[[!template new="1" text="We can also take a look" start="00:06:18.319" video="mainVideo" id=subtitle]]
+[[!template text="at the yearly survey" start="00:06:19.680" video="mainVideo" id=subtitle]]
+[[!template text="that the website Stack Overflow puts out" start="00:06:22.400" video="mainVideo" id=subtitle]]
+[[!template text="asking developers about the tools" start="00:06:24.602" video="mainVideo" id=subtitle]]
+[[!template text="that they use to find out" start="00:06:26.533" video="mainVideo" id=subtitle]]
+[[!template text="which ones are being used" start="00:06:27.360" video="mainVideo" id=subtitle]]
+[[!template text="most frequently and that are" start="00:06:28.720" video="mainVideo" id=subtitle]]
+[[!template text="gaining popularity over time." start="00:06:29.759" video="mainVideo" id=subtitle]]
+[[!template text="So there is a great blog post" start="00:06:31.919" video="mainVideo" id=subtitle]]
+[[!template text="by someone named Roben Kleene," start="00:06:33.680" video="mainVideo" id=subtitle]]
+[[!template text="who synthesizes some" start="00:06:35.039" video="mainVideo" id=subtitle]]
+[[!template text="of this data together," start="00:06:37.039" video="mainVideo" id=subtitle]]
+[[!template text="specifically about editors," start="00:06:37.840" video="mainVideo" id=subtitle]]
+[[!template text="and provides us with a graph" start="00:06:39.120" video="mainVideo" id=subtitle]]
+[[!template text="that we can take a look at" start="00:06:40.240" video="mainVideo" id=subtitle]]
+[[!template text="that compares the popularity" start="00:06:41.680" video="mainVideo" id=subtitle]]
+[[!template text="of particular editors" start="00:06:43.440" video="mainVideo" id=subtitle]]
+[[!template text="in the last maybe four or five years," start="00:06:44.639" video="mainVideo" id=subtitle]]
+[[!template text="at least 2015 to 2019," start="00:06:46.560" video="mainVideo" id=subtitle]]
+[[!template text="based on the responses" start="00:06:49.199" video="mainVideo" id=subtitle]]
+[[!template text="to the Stack Overflow survey." start="00:06:50.560" video="mainVideo" id=subtitle]]
+[[!template text="In this case we see that" start="00:06:52.560" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is the light blue line," start="00:06:54.479" video="mainVideo" id=subtitle]]
+[[!template text="and it sort of stays in maybe, let's see," start="00:06:56.560" video="mainVideo" id=subtitle]]
+[[!template text="maybe third place in the beginning," start="00:06:59.440" video="mainVideo" id=subtitle]]
+[[!template text="and then fifth place," start="00:07:00.960" video="mainVideo" id=subtitle]]
+[[!template text="and basically just stays in fifth place" start="00:07:02.000" video="mainVideo" id=subtitle]]
+[[!template text="the whole time, compared to things like" start="00:07:03.520" video="mainVideo" id=subtitle]]
+[[!template text="Atom, Sublime Text, and VS Code." start="00:07:05.039" video="mainVideo" id=subtitle]]
+[[!template text="As we saw before, the VS Code" start="00:07:07.120" video="mainVideo" id=subtitle]]
+[[!template text="just sort of ramps up at the end." start="00:07:08.560" video="mainVideo" id=subtitle]]
+[[!template text="Now, this is another thing" start="00:07:10.960" video="mainVideo" id=subtitle]]
+[[!template text="that basically is showing us" start="00:07:13.199" video="mainVideo" id=subtitle]]
+[[!template text="similarly to the Google Trends" start="00:07:14.560" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs's popularity is not quite" start="00:07:17.039" video="mainVideo" id=subtitle]]
+[[!template text="as much as other editors out there." start="00:07:19.280" video="mainVideo" id=subtitle]]
+[[!template text="You can also look at the 2021 results" start="00:07:21.840" video="mainVideo" id=subtitle]]
+[[!template text="of the Stack Overflow survey," start="00:07:23.840" video="mainVideo" id=subtitle]]
+[[!template text="which I'll show you now," start="00:07:26.160" video="mainVideo" id=subtitle]]
+[[!template text="which shows Emacs in 16th place." start="00:07:27.199" video="mainVideo" id=subtitle]]
+[[!template text="Let's see. If we look here," start="00:07:30.319" video="mainVideo" id=subtitle]]
+[[!template text="we see Visual Studio Code" start="00:07:31.680" video="mainVideo" id=subtitle]]
+[[!template text="is the most popular, then we have" start="00:07:32.960" video="mainVideo" id=subtitle]]
+[[!template text="a whole bunch of other well-known editors." start="00:07:34.400" video="mainVideo" id=subtitle]]
+[[!template text="Some are kind of surprising," start="00:07:36.800" video="mainVideo" id=subtitle]]
+[[!template text="like Notepad++ is quite high up there," start="00:07:37.840" video="mainVideo" id=subtitle]]
+[[!template text="but then we have Emacs here" start="00:07:40.400" video="mainVideo" id=subtitle]]
+[[!template text="coming right in behind" start="00:07:42.080" video="mainVideo" id=subtitle]]
+[[!template text="PhpStorm and NetBeans," start="00:07:43.199" video="mainVideo" id=subtitle]]
+[[!template text="which is pretty funny to me." start="00:07:44.879" video="mainVideo" id=subtitle]]
+[[!template text="But it just goes to show you" start="00:07:46.400" video="mainVideo" id=subtitle]]
+[[!template text="that the Emacs community is smaller" start="00:07:48.879" video="mainVideo" id=subtitle]]
+[[!template text="than what you might consider" start="00:07:54.000" video="mainVideo" id=subtitle]]
+[[!template text="for other editors, or at least" start="00:07:55.599" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs user base, maybe." start="00:07:56.960" video="mainVideo" id=subtitle]]
+[[!template text="Maybe it's just the people" start="00:07:58.800" video="mainVideo" id=subtitle]]
+[[!template text="who actually respond to the survey." start="00:07:59.440" video="mainVideo" id=subtitle]]
+[[!template text="You can't really tell for sure" start="00:08:00.800" video="mainVideo" id=subtitle]]
+[[!template text="because all this data is coming from" start="00:08:02.080" video="mainVideo" id=subtitle]]
+[[!template text="a self-selected group of people" start="00:08:03.759" video="mainVideo" id=subtitle]]
+[[!template text="who have responded to the survey." start="00:08:05.039" video="mainVideo" id=subtitle]]
+[[!template text="So I think what... Basically," start="00:08:06.720" video="mainVideo" id=subtitle]]
+[[!template text="what I'm trying to say is that" start="00:08:08.879" video="mainVideo" id=subtitle]]
+[[!template text="if you look at all these things," start="00:08:10.560" video="mainVideo" id=subtitle]]
+[[!template text="you would probably get the perception" start="00:08:12.080" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is dead" start="00:08:14.080" video="mainVideo" id=subtitle]]
+[[!template text="and that maybe nobody really" start="00:08:15.919" video="mainVideo" id=subtitle]]
+[[!template text="uses the editor anymore," start="00:08:17.199" video="mainVideo" id=subtitle]]
+[[!template text="or that it's on its way out." start="00:08:18.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="However, I think there's another way" start="00:08:20.000" video="mainVideo" id=subtitle]]
+[[!template text="to look at the health or popularity" start="00:08:21.599" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs (or any other editor, really)," start="00:08:24.879" video="mainVideo" id=subtitle]]
+[[!template text="and that is to judge" start="00:08:27.280" video="mainVideo" id=subtitle]]
+[[!template text="the popularity and health" start="00:08:28.240" video="mainVideo" id=subtitle]]
+[[!template text="by taking a look" start="00:08:29.520" video="mainVideo" id=subtitle]]
+[[!template text="at the community activity" start="00:08:30.240" video="mainVideo" id=subtitle]]
+[[!template text="in places such as Reddit," start="00:08:32.080" video="mainVideo" id=subtitle]]
+[[!template text="or maybe on Discord servers," start="00:08:33.680" video="mainVideo" id=subtitle]]
+[[!template text="Slack servers, IRC channels," start="00:08:35.760" video="mainVideo" id=subtitle]]
+[[!template text="mailing lists, particularly" start="00:08:38.880" video="mainVideo" id=subtitle]]
+[[!template text="on emacs-devel," start="00:08:40.000" video="mainVideo" id=subtitle]]
+[[!template text="where all of the conversation" start="00:08:41.120" video="mainVideo" id=subtitle]]
+[[!template text="about the development of Emacs happens." start="00:08:42.640" video="mainVideo" id=subtitle]]
+[[!template text="Blogs. There's quite a lot of people" start="00:08:45.120" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs community" start="00:08:46.640" video="mainVideo" id=subtitle]]
+[[!template text="writing blog posts." start="00:08:47.519" video="mainVideo" id=subtitle]]
+[[!template text="There's quite a few YouTube channels now" start="00:08:48.959" video="mainVideo" id=subtitle]]
+[[!template text="making content about Emacs" start="00:08:50.640" video="mainVideo" id=subtitle]]
+[[!template text="pretty frequently, and then" start="00:08:52.399" video="mainVideo" id=subtitle]]
+[[!template text="conferences like this one, EmacsConf." start="00:08:53.839" video="mainVideo" id=subtitle]]
+[[!template text="If you've spent any time" start="00:08:56.880" video="mainVideo" id=subtitle]]
+[[!template text="in any of these places recently," start="00:08:58.399" video="mainVideo" id=subtitle]]
+[[!template text="did you actually get the sense" start="00:08:59.600" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs community lacks activity?" start="00:09:00.640" video="mainVideo" id=subtitle]]
+[[!template text="I personally don't." start="00:09:03.440" video="mainVideo" id=subtitle]]
+[[!template text="I see quite a lot of activity on Reddit," start="00:09:04.800" video="mainVideo" id=subtitle]]
+[[!template text="I see a lot of activity" start="00:09:06.560" video="mainVideo" id=subtitle]]
+[[!template text="in various other places," start="00:09:07.360" video="mainVideo" id=subtitle]]
+[[!template text="even my own chats that I've created." start="00:09:08.320" video="mainVideo" id=subtitle]]
+[[!template text="Lots of people talking about Emacs" start="00:09:11.040" video="mainVideo" id=subtitle]]
+[[!template text="every day. But this is harder to measure," start="00:09:12.480" video="mainVideo" id=subtitle]]
+[[!template text="because you would have to go count" start="00:09:16.320" video="mainVideo" id=subtitle]]
+[[!template text="all of the mailing list emails" start="00:09:18.160" video="mainVideo" id=subtitle]]
+[[!template text="compared to other editors," start="00:09:21.279" video="mainVideo" id=subtitle]]
+[[!template text="or maybe like the Reddit posts" start="00:09:22.560" video="mainVideo" id=subtitle]]
+[[!template text="compared to other editors." start="00:09:23.760" video="mainVideo" id=subtitle]]
+[[!template text="We could do that, but really," start="00:09:24.959" video="mainVideo" id=subtitle]]
+[[!template text="the more important thing" start="00:09:26.880" video="mainVideo" id=subtitle]]
+[[!template text="is to just go experience the community" start="00:09:27.839" video="mainVideo" id=subtitle]]
+[[!template text="by going to one of these places" start="00:09:29.920" video="mainVideo" id=subtitle]]
+[[!template text="and take a look at what's going on." start="00:09:31.279" video="mainVideo" id=subtitle]]
+[[!template text="You can get a really good sense of that" start="00:09:33.360" video="mainVideo" id=subtitle]]
+[[!template text="by checking out Sacha Chua's Emacs News" start="00:09:34.560" video="mainVideo" id=subtitle]]
+[[!template text="roll-up blog posts" start="00:09:37.760" video="mainVideo" id=subtitle]]
+[[!template text="that come out every week." start="00:09:39.120" video="mainVideo" id=subtitle]]
+[[!template text="It's a very good distillation of things" start="00:09:40.399" video="mainVideo" id=subtitle]]
+[[!template text="that are happening" start="00:09:42.000" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs community." start="00:09:42.560" video="mainVideo" id=subtitle]]
+[[!template text="If you look at those things" start="00:09:43.920" video="mainVideo" id=subtitle]]
+[[!template text="and look at all that," start="00:09:48.080" video="mainVideo" id=subtitle]]
+[[!template text="you can tell that there is actually" start="00:09:49.040" video="mainVideo" id=subtitle]]
+[[!template text="something happening" start="00:09:50.640" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs community" start="00:09:51.360" video="mainVideo" id=subtitle]]
+[[!template text="that is more than what you see" start="00:09:52.240" video="mainVideo" id=subtitle]]
+[[!template text="in the numbers on Google Trends" start="00:09:54.000" video="mainVideo" id=subtitle]]
+[[!template text="and on Stack Overflow." start="00:09:55.680" video="mainVideo" id=subtitle]]
+[[!template text="Another interesting point" start="00:09:58.080" video="mainVideo" id=subtitle]]
+[[!template text="that doesn't really fit into all this," start="00:09:59.200" video="mainVideo" id=subtitle]]
+[[!template text="but if you want to look" start="00:10:00.480" video="mainVideo" id=subtitle]]
+[[!template text="at the actual data" start="00:10:01.440" video="mainVideo" id=subtitle]]
+[[!template text="from the Emacs community" start="00:10:02.640" video="mainVideo" id=subtitle]]
+[[!template text="about how the community uses Emacs," start="00:10:03.920" video="mainVideo" id=subtitle]]
+[[!template text="check out the results" start="00:10:06.160" video="mainVideo" id=subtitle]]
+[[!template text="of the 2020 Emacs survey." start="00:10:06.880" video="mainVideo" id=subtitle]]
+[[!template text="I'm sure there's going to be" start="00:10:08.480" video="mainVideo" id=subtitle]]
+[[!template text="another Emacs survey at some point soon," start="00:10:09.040" video="mainVideo" id=subtitle]]
+[[!template text="as well, but that will give you" start="00:10:11.760" video="mainVideo" id=subtitle]]
+[[!template text="some insight into what's happening" start="00:10:13.120" video="mainVideo" id=subtitle]]
+[[!template text="within the community itself." start="00:10:14.480" video="mainVideo" id=subtitle]]
+[[!template text="You can see that" start="00:10:16.000" video="mainVideo" id=subtitle]]
+[[!template text="there's quite a lot of activity" start="00:10:16.399" video="mainVideo" id=subtitle]]
+[[!template text="and a lot of different use cases for Emacs" start="00:10:17.600" video="mainVideo" id=subtitle]]
+[[!template text="and types of people who are using Emacs." start="00:10:19.839" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's talk about" start="00:10:23.200" video="mainVideo" id=subtitle]]
+[[!template text="how editors lose popularity." start="00:10:24.000" video="mainVideo" id=subtitle]]
+[[!template text="So people are worried" start="00:10:26.079" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is going to lose popularity." start="00:10:26.880" video="mainVideo" id=subtitle]]
+[[!template text="What do they worry is going to happen" start="00:10:29.360" video="mainVideo" id=subtitle]]
+[[!template text="if that happens?" start="00:10:31.440" video="mainVideo" id=subtitle]]
+[[!template text="Or how actually could it happen?" start="00:10:37.040" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So maybe a new editor" start="00:10:38.320" video="mainVideo" id=subtitle]]
+[[!template text="with better features appears." start="00:10:39.680" video="mainVideo" id=subtitle]]
+[[!template text="So one theory for why users" start="00:10:41.839" video="mainVideo" id=subtitle]]
+[[!template text="left TextMate for Sublime Text..." start="00:10:43.440" video="mainVideo" id=subtitle]]
+[[!template text="If you don't know about TextMate," start="00:10:45.920" video="mainVideo" id=subtitle]]
+[[!template text="it was a very popular editor on macOS" start="00:10:46.880" video="mainVideo" id=subtitle]]
+[[!template text="back probably in the Ruby on Rails craze" start="00:10:49.600" video="mainVideo" id=subtitle]]
+[[!template text="time frame, maybe like the mid-2000s," start="00:10:52.160" video="mainVideo" id=subtitle]]
+[[!template text="2005 or so. Then eventually Sublime Text" start="00:10:54.079" video="mainVideo" id=subtitle]]
+[[!template text="came along, and it had" start="00:10:57.200" video="mainVideo" id=subtitle]]
+[[!template text="a better extensibility API" start="00:10:59.519" video="mainVideo" id=subtitle]]
+[[!template text="and really good performance." start="00:11:01.360" video="mainVideo" id=subtitle]]
+[[!template text="It also was able to use" start="00:11:03.200" video="mainVideo" id=subtitle]]
+[[!template text="some of the same stuff from TextMate," start="00:11:05.200" video="mainVideo" id=subtitle]]
+[[!template text="like these syntax highlighting grammars" start="00:11:07.040" video="mainVideo" id=subtitle]]
+[[!template text="and the snippet definitions, etc." start="00:11:08.720" video="mainVideo" id=subtitle]]
+[[!template text="So you had TextMate" start="00:11:11.040" video="mainVideo" id=subtitle]]
+[[!template text="which was a well-loved editor," start="00:11:12.240" video="mainVideo" id=subtitle]]
+[[!template text="but then a new editor called Sublime Text" start="00:11:13.519" video="mainVideo" id=subtitle]]
+[[!template text="came along with better functionality," start="00:11:15.200" video="mainVideo" id=subtitle]]
+[[!template text="and people started switching over to it" start="00:11:17.200" video="mainVideo" id=subtitle]]
+[[!template text="because it could do more things" start="00:11:18.880" video="mainVideo" id=subtitle]]
+[[!template text="and the user had more ability" start="00:11:20.160" video="mainVideo" id=subtitle]]
+[[!template text="to add functionality to it." start="00:11:21.680" video="mainVideo" id=subtitle]]
+[[!template text="Also, VS Code came along" start="00:11:24.399" video="mainVideo" id=subtitle]]
+[[!template text="and used a similar model" start="00:11:26.880" video="mainVideo" id=subtitle]]
+[[!template text="to the Atom editor," start="00:11:27.920" video="mainVideo" id=subtitle]]
+[[!template text="basically being a web-based editor" start="00:11:29.120" video="mainVideo" id=subtitle]]
+[[!template text="using Electron," start="00:11:31.360" video="mainVideo" id=subtitle]]
+[[!template text="but it greatly improved upon performance" start="00:11:32.480" video="mainVideo" id=subtitle]]
+[[!template text="and IDE tooling ecosystem." start="00:11:34.640" video="mainVideo" id=subtitle]]
+[[!template text="For people getting real work done" start="00:11:36.640" video="mainVideo" id=subtitle]]
+[[!template text="with large projects," start="00:11:38.640" video="mainVideo" id=subtitle]]
+[[!template text="you need to have things like IntelliSense," start="00:11:39.519" video="mainVideo" id=subtitle]]
+[[!template text="and being able to find definitions" start="00:11:41.120" video="mainVideo" id=subtitle]]
+[[!template text="of functions or classes that are defined." start="00:11:42.800" video="mainVideo" id=subtitle]]
+[[!template text="So you have a new editor" start="00:11:45.839" video="mainVideo" id=subtitle]]
+[[!template text="that comes along" start="00:11:47.040" video="mainVideo" id=subtitle]]
+[[!template text="that has basically better functionality" start="00:11:47.519" video="mainVideo" id=subtitle]]
+[[!template text="than the one that was there before." start="00:11:49.440" video="mainVideo" id=subtitle]]
+[[!template text="But the thing is," start="00:11:51.279" video="mainVideo" id=subtitle]]
+[[!template text="if you have a new editor that comes along" start="00:11:52.399" video="mainVideo" id=subtitle]]
+[[!template text="with better functionality," start="00:11:53.760" video="mainVideo" id=subtitle]]
+[[!template text="it still has to be at least as good as" start="00:11:54.720" video="mainVideo" id=subtitle]]
+[[!template text="or better than the previous editor" start="00:11:57.120" video="mainVideo" id=subtitle]]
+[[!template text="for people to stick with it." start="00:11:58.800" video="mainVideo" id=subtitle]]
+[[!template text="So it's a very tall order" start="00:12:00.000" video="mainVideo" id=subtitle]]
+[[!template text="for someone to say" start="00:12:02.480" video="mainVideo" id=subtitle]]
+[[!template text="there's going to be some editor" start="00:12:03.680" video="mainVideo" id=subtitle]]
+[[!template text="that will come along" start="00:12:05.200" video="mainVideo" id=subtitle]]
+[[!template text="that would be better than Emacs" start="00:12:05.839" video="mainVideo" id=subtitle]]
+[[!template text="on every dimension," start="00:12:07.040" video="mainVideo" id=subtitle]]
+[[!template text="because there are some unique dimensions" start="00:12:08.240" video="mainVideo" id=subtitle]]
+[[!template text="that are hard to beat" start="00:12:09.680" video="mainVideo" id=subtitle]]
+[[!template text="in an editor like Emacs." start="00:12:11.360" video="mainVideo" id=subtitle]]
+[[!template text="Lack of sufficient maintenance." start="00:12:14.160" video="mainVideo" id=subtitle]]
+[[!template text="That's one thing" start="00:12:15.920" video="mainVideo" id=subtitle]]
+[[!template text="that could possibly happen" start="00:12:16.560" video="mainVideo" id=subtitle]]
+[[!template text="if an editor loses popularity." start="00:12:17.600" video="mainVideo" id=subtitle]]
+[[!template text="So maybe sometimes..." start="00:12:19.279" video="mainVideo" id=subtitle]]
+[[!template text="Sorry, that's something" start="00:12:20.687" video="mainVideo" id=subtitle]]
+[[!template text="that can cause a lack," start="00:12:22.480" video="mainVideo" id=subtitle]]
+[[!template text="a loss of popularity." start="00:12:23.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Sometimes the development team" start="00:12:25.680" video="mainVideo" id=subtitle]]
+[[!template text="for an editor either moves on" start="00:12:26.959" video="mainVideo" id=subtitle]]
+[[!template text="or maybe switches focus" start="00:12:28.320" video="mainVideo" id=subtitle]]
+[[!template text="to a different project." start="00:12:29.279" video="mainVideo" id=subtitle]]
+[[!template text="When this happens, the development" start="00:12:30.720" video="mainVideo" id=subtitle]]
+[[!template text="of the editor can stagnate," start="00:12:32.079" video="mainVideo" id=subtitle]]
+[[!template text="giving the impression that it's dead." start="00:12:33.360" video="mainVideo" id=subtitle]]
+[[!template text="You can see this happening" start="00:12:37.279" video="mainVideo" id=subtitle]]
+[[!template text="a lot of times on repositories" start="00:12:38.160" video="mainVideo" id=subtitle]]
+[[!template text="for open source projects," start="00:12:40.720" video="mainVideo" id=subtitle]]
+[[!template text="where if someone doesn't make any commits" start="00:12:41.920" video="mainVideo" id=subtitle]]
+[[!template text="or adding new features for a while," start="00:12:43.440" video="mainVideo" id=subtitle]]
+[[!template text="people just automatically assume" start="00:12:44.639" video="mainVideo" id=subtitle]]
+[[!template text="that the thing is dead," start="00:12:45.839" video="mainVideo" id=subtitle]]
+[[!template text="even if it's in a very stable state" start="00:12:46.880" video="mainVideo" id=subtitle]]
+[[!template text="and doesn't really need any improvements" start="00:12:48.399" video="mainVideo" id=subtitle]]
+[[!template text="to be made. This is something" start="00:12:49.920" video="mainVideo" id=subtitle]]
+[[!template text="that can happen over time." start="00:12:53.680" video="mainVideo" id=subtitle]]
+[[!template text="The developers of Sublime Text" start="00:12:55.360" video="mainVideo" id=subtitle]]
+[[!template text="sometimes give the impression" start="00:12:56.720" video="mainVideo" id=subtitle]]
+[[!template text="that the editor isn't being maintained" start="00:12:57.920" video="mainVideo" id=subtitle]]
+[[!template text="because of long breaks between updates," start="00:12:59.519" video="mainVideo" id=subtitle]]
+[[!template text="and this gives people..." start="00:13:02.000" video="mainVideo" id=subtitle]]
+[[!template text="If you go search for" start="00:13:03.360" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Is Sublime Text dead?&quot;," start="00:13:04.560" video="mainVideo" id=subtitle]]
+[[!template text="you'll see posts about this" start="00:13:05.440" video="mainVideo" id=subtitle]]
+[[!template text="every couple years," start="00:13:07.519" video="mainVideo" id=subtitle]]
+[[!template text="where people are wondering" start="00:13:08.240" video="mainVideo" id=subtitle]]
+[[!template text="what's happening with Sublime Text," start="00:13:09.120" video="mainVideo" id=subtitle]]
+[[!template text="when in reality, there's actually" start="00:13:10.320" video="mainVideo" id=subtitle]]
+[[!template text="development happening on this project," start="00:13:12.320" video="mainVideo" id=subtitle]]
+[[!template text="and paid users are getting these updates" start="00:13:15.120" video="mainVideo" id=subtitle]]
+[[!template text="because they've paid," start="00:13:18.160" video="mainVideo" id=subtitle]]
+[[!template text="but the product is not open source." start="00:13:19.279" video="mainVideo" id=subtitle]]
+[[!template text="You have no visibility" start="00:13:20.639" video="mainVideo" id=subtitle]]
+[[!template text="into the development." start="00:13:21.600" video="mainVideo" id=subtitle]]
+[[!template text="So if people have the perception" start="00:13:22.399" video="mainVideo" id=subtitle]]
+[[!template text="that the editor is not being maintained," start="00:13:24.639" video="mainVideo" id=subtitle]]
+[[!template text="then there's going to be" start="00:13:26.160" video="mainVideo" id=subtitle]]
+[[!template text="rumors getting started," start="00:13:26.880" video="mainVideo" id=subtitle]]
+[[!template text="and that could cause" start="00:13:28.079" video="mainVideo" id=subtitle]]
+[[!template text="the mentality of people to shift" start="00:13:29.200" video="mainVideo" id=subtitle]]
+[[!template text="and try to move on to other editors" start="00:13:30.959" video="mainVideo" id=subtitle]]
+[[!template text="because they perceive them to be" start="00:13:32.639" video="mainVideo" id=subtitle]]
+[[!template text="more well-maintained or more active." start="00:13:34.240" video="mainVideo" id=subtitle]]
+[[!template text="Another problem can be that there are" start="00:13:36.399" video="mainVideo" id=subtitle]]
+[[!template text="major bugs that persist over a long time" start="00:13:37.920" video="mainVideo" id=subtitle]]
+[[!template text="that aren't being fixed" start="00:13:39.839" video="mainVideo" id=subtitle]]
+[[!template text="while the maintainers are focusing on" start="00:13:41.040" video="mainVideo" id=subtitle]]
+[[!template text="some other efforts in the project," start="00:13:42.560" video="mainVideo" id=subtitle]]
+[[!template text="and this could hurt sentiment" start="00:13:44.639" video="mainVideo" id=subtitle]]
+[[!template text="in the community and cause a backlash" start="00:13:46.000" video="mainVideo" id=subtitle]]
+[[!template text="leading to an exodus." start="00:13:48.160" video="mainVideo" id=subtitle]]
+[[!template text="So if you have really bad bugs" start="00:13:49.120" video="mainVideo" id=subtitle]]
+[[!template text="and people think" start="00:13:51.120" video="mainVideo" id=subtitle]]
+[[!template text="that you're not really concerned" start="00:13:51.600" video="mainVideo" id=subtitle]]
+[[!template text="about fixing them," start="00:13:52.560" video="mainVideo" id=subtitle]]
+[[!template text="then that could be something" start="00:13:53.519" video="mainVideo" id=subtitle]]
+[[!template text="that would cause an editor" start="00:13:54.399" video="mainVideo" id=subtitle]]
+[[!template text="to lose popularity" start="00:13:55.360" video="mainVideo" id=subtitle]]
+[[!template text="as people move on to find something else" start="00:13:56.399" video="mainVideo" id=subtitle]]
+[[!template text="that appears to be more stable." start="00:13:58.000" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Lastly, sometimes all it takes is" start="00:14:01.040" video="mainVideo" id=subtitle]]
+[[!template text="for a new programming language" start="00:14:03.199" video="mainVideo" id=subtitle]]
+[[!template text="to become popular" start="00:14:04.480" video="mainVideo" id=subtitle]]
+[[!template text="or for an influential person to say" start="00:14:05.279" video="mainVideo" id=subtitle]]
+[[!template text="that they switched to a different editor," start="00:14:06.880" video="mainVideo" id=subtitle]]
+[[!template text="because people are capable of being led" start="00:14:08.720" video="mainVideo" id=subtitle]]
+[[!template text="by someone else who is influential," start="00:14:14.560" video="mainVideo" id=subtitle]]
+[[!template text="so sometimes it's just..." start="00:14:16.720" video="mainVideo" id=subtitle]]
+[[!template text="All it takes is someone to say, you know," start="00:14:18.320" video="mainVideo" id=subtitle]]
+[[!template text="I'm not going to use this editor any more," start="00:14:20.240" video="mainVideo" id=subtitle]]
+[[!template text="and other people will follow." start="00:14:22.240" video="mainVideo" id=subtitle]]
+[[!template text="But oftentimes, it's not just about" start="00:14:24.000" video="mainVideo" id=subtitle]]
+[[!template text="the fashion changing," start="00:14:26.240" video="mainVideo" id=subtitle]]
+[[!template text="it's also there's other problems" start="00:14:27.199" video="mainVideo" id=subtitle]]
+[[!template text="that are happening." start="00:14:28.560" video="mainVideo" id=subtitle]]
+[[!template text="Some of these other things" start="00:14:29.040" video="mainVideo" id=subtitle]]
+[[!template text="that I mentioned before" start="00:14:29.680" video="mainVideo" id=subtitle]]
+[[!template text="that could be contributing" start="00:14:30.959" video="mainVideo" id=subtitle]]
+[[!template text="to this overall sentiment" start="00:14:32.160" video="mainVideo" id=subtitle]]
+[[!template text="that caused people to move on." start="00:14:33.839" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So then what happens" start="00:14:36.959" video="mainVideo" id=subtitle]]
+[[!template text="when an editor loses popularity?" start="00:14:38.000" video="mainVideo" id=subtitle]]
+[[!template text="If people are worried" start="00:14:40.000" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is going to lose popularity," start="00:14:40.800" video="mainVideo" id=subtitle]]
+[[!template text="what happens if it doesn't gain more?" start="00:14:43.120" video="mainVideo" id=subtitle]]
+[[!template text="So what are the possible consequences?" start="00:14:44.880" video="mainVideo" id=subtitle]]
+[[!template text="Well, maybe core maintainers" start="00:14:47.839" video="mainVideo" id=subtitle]]
+[[!template text="will gradually leave the project" start="00:14:49.120" video="mainVideo" id=subtitle]]
+[[!template text="with nobody to replace them. I mean," start="00:14:50.399" video="mainVideo" id=subtitle]]
+[[!template text="if you have a project like Emacs" start="00:14:52.160" video="mainVideo" id=subtitle]]
+[[!template text="where there's a core" start="00:14:53.839" video="mainVideo" id=subtitle]]
+[[!template text="that's written in a language" start="00:14:57.199" video="mainVideo" id=subtitle]]
+[[!template text="that's different than the language" start="00:14:58.240" video="mainVideo" id=subtitle]]
+[[!template text="everybody uses to extend it," start="00:14:59.600" video="mainVideo" id=subtitle]]
+[[!template text="then maybe it's risky" start="00:15:01.040" video="mainVideo" id=subtitle]]
+[[!template text="to have people leave the project" start="00:15:02.240" video="mainVideo" id=subtitle]]
+[[!template text="because you don't have other people" start="00:15:03.440" video="mainVideo" id=subtitle]]
+[[!template text="to come along who can help maintain it" start="00:15:04.800" video="mainVideo" id=subtitle]]
+[[!template text="and to carry on the knowledge of the core." start="00:15:06.560" video="mainVideo" id=subtitle]]
+[[!template text="Also, maybe no new features" start="00:15:10.240" video="mainVideo" id=subtitle]]
+[[!template text="are being added to stay competitive" start="00:15:11.519" video="mainVideo" id=subtitle]]
+[[!template text="with other editors." start="00:15:13.279" video="mainVideo" id=subtitle]]
+[[!template text="So this is one of these things" start="00:15:14.800" video="mainVideo" id=subtitle]]
+[[!template text="where people kind of feel like" start="00:15:15.920" video="mainVideo" id=subtitle]]
+[[!template text="there's a feature mill, where you know" start="00:15:17.120" video="mainVideo" id=subtitle]]
+[[!template text="if new features are coming online" start="00:15:18.800" video="mainVideo" id=subtitle]]
+[[!template text="in other editors," start="00:15:20.880" video="mainVideo" id=subtitle]]
+[[!template text="maybe your editor needs to catch up." start="00:15:21.680" video="mainVideo" id=subtitle]]
+[[!template text="Well, I don't really think that" start="00:15:23.279" video="mainVideo" id=subtitle]]
+[[!template text="that's necessarily needed," start="00:15:24.160" video="mainVideo" id=subtitle]]
+[[!template text="but if there are new paradigms" start="00:15:25.279" video="mainVideo" id=subtitle]]
+[[!template text="or usage patterns or workflows" start="00:15:28.160" video="mainVideo" id=subtitle]]
+[[!template text="that are becoming..." start="00:15:29.839" video="mainVideo" id=subtitle]]
+[[!template text="I guess you could say mainstream," start="00:15:32.320" video="mainVideo" id=subtitle]]
+[[!template text="sometimes it does make sense" start="00:15:33.759" video="mainVideo" id=subtitle]]
+[[!template text="for an editor to be able to adopt these," start="00:15:34.800" video="mainVideo" id=subtitle]]
+[[!template text="but if you have" start="00:15:37.199" video="mainVideo" id=subtitle]]
+[[!template text="a sufficiently extendable editor," start="00:15:37.759" video="mainVideo" id=subtitle]]
+[[!template text="then oftentimes, you don't really need to" start="00:15:39.519" video="mainVideo" id=subtitle]]
+[[!template text="do anything other than" start="00:15:41.440" video="mainVideo" id=subtitle]]
+[[!template text="just write a new package." start="00:15:42.079" video="mainVideo" id=subtitle]]
+[[!template text="Critical bugs that never get fixed..." start="00:15:44.480" video="mainVideo" id=subtitle]]
+[[!template text="I mean, if people start to drift off" start="00:15:46.160" video="mainVideo" id=subtitle]]
+[[!template text="from the project, it is much more likely" start="00:15:48.240" video="mainVideo" id=subtitle]]
+[[!template text="that bad bugs won't get fixed over time." start="00:15:49.839" video="mainVideo" id=subtitle]]
+[[!template text="Less community interest in creating" start="00:15:52.720" video="mainVideo" id=subtitle]]
+[[!template text="and maintaining packages." start="00:15:54.079" video="mainVideo" id=subtitle]]
+[[!template text="There's another possibility" start="00:15:55.199" video="mainVideo" id=subtitle]]
+[[!template text="if people don't feel like" start="00:15:56.320" video="mainVideo" id=subtitle]]
+[[!template text="it's worth their time anymore" start="00:15:57.519" video="mainVideo" id=subtitle]]
+[[!template text="because not many people" start="00:15:58.880" video="mainVideo" id=subtitle]]
+[[!template text="are using an editor," start="00:16:00.079" video="mainVideo" id=subtitle]]
+[[!template text="maybe they'll have more users" start="00:16:00.880" video="mainVideo" id=subtitle]]
+[[!template text="or more interaction" start="00:16:02.480" video="mainVideo" id=subtitle]]
+[[!template text="if they go write a similar package" start="00:16:03.279" video="mainVideo" id=subtitle]]
+[[!template text="for a different editor." start="00:16:04.959" video="mainVideo" id=subtitle]]
+[[!template text="Less blog posts, videos, content." start="00:16:07.440" video="mainVideo" id=subtitle]]
+[[!template text="Basically, like, if people feel" start="00:16:10.079" video="mainVideo" id=subtitle]]
+[[!template text="that it's not worth their time" start="00:16:11.519" video="mainVideo" id=subtitle]]
+[[!template text="to make content about the editor either," start="00:16:12.480" video="mainVideo" id=subtitle]]
+[[!template text="or if you're just not interested any more," start="00:16:13.839" video="mainVideo" id=subtitle]]
+[[!template text="then those things will dry up." start="00:16:15.360" video="mainVideo" id=subtitle]]
+[[!template text="And also one thing that is possible," start="00:16:17.040" video="mainVideo" id=subtitle]]
+[[!template text="but probably not very likely," start="00:16:18.639" video="mainVideo" id=subtitle]]
+[[!template text="is that the program may not be" start="00:16:19.839" video="mainVideo" id=subtitle]]
+[[!template text="packaged any more in Linux distributions" start="00:16:21.839" video="mainVideo" id=subtitle]]
+[[!template text="or for other operating systems." start="00:16:24.000" video="mainVideo" id=subtitle]]
+[[!template text="So if it's not worth someone to package it," start="00:16:25.680" video="mainVideo" id=subtitle]]
+[[!template text="or they just sort of lose interest" start="00:16:27.519" video="mainVideo" id=subtitle]]
+[[!template text="in the editor, then maybe those things" start="00:16:29.040" video="mainVideo" id=subtitle]]
+[[!template text="sort of drift away" start="00:16:31.360" video="mainVideo" id=subtitle]]
+[[!template text="and you can't even install it any more" start="00:16:32.320" video="mainVideo" id=subtitle]]
+[[!template text="in many places." start="00:16:33.920" video="mainVideo" id=subtitle]]
+[[!template text="But I feel that these things" start="00:16:35.360" video="mainVideo" id=subtitle]]
+[[!template text="would only really happen" start="00:16:36.399" video="mainVideo" id=subtitle]]
+[[!template text="if there was already other major issues" start="00:16:37.279" video="mainVideo" id=subtitle]]
+[[!template text="in the dev team or in the community," start="00:16:39.279" video="mainVideo" id=subtitle]]
+[[!template text="like maybe a high profile schism" start="00:16:41.920" video="mainVideo" id=subtitle]]
+[[!template text="in the maintainer team," start="00:16:44.320" video="mainVideo" id=subtitle]]
+[[!template text="sort of like what we saw with GNU Emacs" start="00:16:45.199" video="mainVideo" id=subtitle]]
+[[!template text="versus XEmacs, because you have" start="00:16:47.519" video="mainVideo" id=subtitle]]
+[[!template text="two competing versions" start="00:16:49.759" video="mainVideo" id=subtitle]]
+[[!template text="of the same idea" start="00:16:50.959" video="mainVideo" id=subtitle]]
+[[!template text="with different implementations," start="00:16:52.160" video="mainVideo" id=subtitle]]
+[[!template text="and then over time," start="00:16:53.600" video="mainVideo" id=subtitle]]
+[[!template text="one of them may fade out" start="00:16:54.800" video="mainVideo" id=subtitle]]
+[[!template text="because people just lose interest" start="00:16:55.920" video="mainVideo" id=subtitle]]
+[[!template text="and maybe something like GNU Emacs" start="00:16:57.839" video="mainVideo" id=subtitle]]
+[[!template text="gradually catches up and surpasses it" start="00:17:00.800" video="mainVideo" id=subtitle]]
+[[!template text="in functionality. So these things" start="00:17:02.399" video="mainVideo" id=subtitle]]
+[[!template text="can happen, but it's not really" start="00:17:04.720" video="mainVideo" id=subtitle]]
+[[!template text="as likely as people would think, I think." start="00:17:07.520" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So how is Emacs going to survive" start="00:17:10.240" video="mainVideo" id=subtitle]]
+[[!template text="despite popularity? I feel that" start="00:17:12.959" video="mainVideo" id=subtitle]]
+[[!template text="there are a few important" start="00:17:15.280" video="mainVideo" id=subtitle]]
+[[!template text="and unique factors" start="00:17:16.640" video="mainVideo" id=subtitle]]
+[[!template text="that are going to contribute to this." start="00:17:17.679" video="mainVideo" id=subtitle]]
+[[!template new="1" text="First of all, Emacs is" start="00:17:20.160" video="mainVideo" id=subtitle]]
+[[!template text="more deeply hackable" start="00:17:21.520" video="mainVideo" id=subtitle]]
+[[!template text="than almost all other editors." start="00:17:22.720" video="mainVideo" id=subtitle]]
+[[!template text="I'm couching that a bit," start="00:17:24.959" video="mainVideo" id=subtitle]]
+[[!template text="but really it is" start="00:17:26.000" video="mainVideo" id=subtitle]]
+[[!template text="basically more extensible" start="00:17:26.880" video="mainVideo" id=subtitle]]
+[[!template text="than any other editor." start="00:17:28.000" video="mainVideo" id=subtitle]]
+[[!template text="I haven't seen one" start="00:17:28.960" video="mainVideo" id=subtitle]]
+[[!template text="that's more extensible than Emacs so far," start="00:17:29.679" video="mainVideo" id=subtitle]]
+[[!template text="and that's because" start="00:17:31.440" video="mainVideo" id=subtitle]]
+[[!template text="Emacs was designed for this." start="00:17:32.000" video="mainVideo" id=subtitle]]
+[[!template text="The whole point of Emacs" start="00:17:34.160" video="mainVideo" id=subtitle]]
+[[!template text="is that you should be able to go in" start="00:17:35.360" video="mainVideo" id=subtitle]]
+[[!template text="and customize your workflow," start="00:17:36.960" video="mainVideo" id=subtitle]]
+[[!template text="and customize the editor to do" start="00:17:38.320" video="mainVideo" id=subtitle]]
+[[!template text="exactly what you want it to do." start="00:17:39.600" video="mainVideo" id=subtitle]]
+[[!template text="It's this whole idea of user freedom." start="00:17:41.039" video="mainVideo" id=subtitle]]
+[[!template text="You're not letting the editor designer" start="00:17:44.080" video="mainVideo" id=subtitle]]
+[[!template text="tell you what to do," start="00:17:46.320" video="mainVideo" id=subtitle]]
+[[!template text="you're telling the editor what to do" start="00:17:47.120" video="mainVideo" id=subtitle]]
+[[!template text="at every step of the way." start="00:17:48.880" video="mainVideo" id=subtitle]]
+[[!template text="Also, an Emacs user can grow their skills" start="00:17:50.559" video="mainVideo" id=subtitle]]
+[[!template text="from small configuration tweaks," start="00:17:53.440" video="mainVideo" id=subtitle]]
+[[!template text="just basically setting variables" start="00:17:55.039" video="mainVideo" id=subtitle]]
+[[!template text="and whatnot, to writing" start="00:17:56.240" video="mainVideo" id=subtitle]]
+[[!template text="their own packages over time," start="00:17:57.280" video="mainVideo" id=subtitle]]
+[[!template text="and then eventually" start="00:17:58.960" video="mainVideo" id=subtitle]]
+[[!template text="to contributing to Emacs itself--" start="00:17:59.600" video="mainVideo" id=subtitle]]
+[[!template text="the same skill set," start="00:18:01.280" video="mainVideo" id=subtitle]]
+[[!template text="because the majority" start="00:18:02.320" video="mainVideo" id=subtitle]]
+[[!template text="of the functionality of the editor" start="00:18:03.360" video="mainVideo" id=subtitle]]
+[[!template text="is written with the same language" start="00:18:04.640" video="mainVideo" id=subtitle]]
+[[!template text="that you use to configure it." start="00:18:06.160" video="mainVideo" id=subtitle]]
+[[!template text="So unlike other editors," start="00:18:07.600" video="mainVideo" id=subtitle]]
+[[!template text="where you have..." start="00:18:09.280" video="mainVideo" id=subtitle]]
+[[!template text="the way that you write extensions" start="00:18:10.960" video="mainVideo" id=subtitle]]
+[[!template text="for the editor," start="00:18:12.960" video="mainVideo" id=subtitle]]
+[[!template text="that has a specific API," start="00:18:13.440" video="mainVideo" id=subtitle]]
+[[!template text="but if you go contribute to the core," start="00:18:14.960" video="mainVideo" id=subtitle]]
+[[!template text="the code base is completely different." start="00:18:16.400" video="mainVideo" id=subtitle]]
+[[!template text="It's different with Emacs" start="00:18:18.160" video="mainVideo" id=subtitle]]
+[[!template text="because you have basically the same APIs," start="00:18:19.280" video="mainVideo" id=subtitle]]
+[[!template text="the same code and same everything" start="00:18:22.640" video="mainVideo" id=subtitle]]
+[[!template text="that you use to write a package" start="00:18:24.320" video="mainVideo" id=subtitle]]
+[[!template text="versus writing actual code" start="00:18:26.080" video="mainVideo" id=subtitle]]
+[[!template text="for functionality for the editor." start="00:18:28.160" video="mainVideo" id=subtitle]]
+[[!template text="Now obviously, there's the C layer" start="00:18:29.600" video="mainVideo" id=subtitle]]
+[[!template text="that is different," start="00:18:30.960" video="mainVideo" id=subtitle]]
+[[!template text="but I think a lot of the actual packages" start="00:18:32.000" video="mainVideo" id=subtitle]]
+[[!template text="and functionality in Emacs" start="00:18:34.000" video="mainVideo" id=subtitle]]
+[[!template text="are at the Emacs Lisp layer." start="00:18:35.280" video="mainVideo" id=subtitle]]
+[[!template text="So what this means is that" start="00:18:36.640" video="mainVideo" id=subtitle]]
+[[!template text="Emacs configuration hackers" start="00:18:38.797" video="mainVideo" id=subtitle]]
+[[!template text="and package authors" start="00:18:41.120" video="mainVideo" id=subtitle]]
+[[!template text="are prime candidates" start="00:18:42.000" video="mainVideo" id=subtitle]]
+[[!template text="for eventually becoming contributors" start="00:18:43.200" video="mainVideo" id=subtitle]]
+[[!template text="to Emacs itself. You see this play out" start="00:18:44.880" video="mainVideo" id=subtitle]]
+[[!template text="a lot of times in Emacs community," start="00:18:46.960" video="mainVideo" id=subtitle]]
+[[!template text="where someone writes" start="00:18:48.559" video="mainVideo" id=subtitle]]
+[[!template text="some really good packages," start="00:18:49.760" video="mainVideo" id=subtitle]]
+[[!template text="and either parts of those" start="00:18:51.039" video="mainVideo" id=subtitle]]
+[[!template text="get merged into Emacs" start="00:18:52.240" video="mainVideo" id=subtitle]]
+[[!template text="or that person maybe makes contributions" start="00:18:53.440" video="mainVideo" id=subtitle]]
+[[!template text="to Emacs to add new functionality" start="00:18:55.520" video="mainVideo" id=subtitle]]
+[[!template text="that their own packages can use," start="00:18:57.280" video="mainVideo" id=subtitle]]
+[[!template text="or just to improve Emacs as a whole." start="00:18:59.360" video="mainVideo" id=subtitle]]
+[[!template text="So there's much more chance" start="00:19:01.679" video="mainVideo" id=subtitle]]
+[[!template text="that people who are involved" start="00:19:03.679" video="mainVideo" id=subtitle]]
+[[!template text="in the community of Emacs" start="00:19:04.880" video="mainVideo" id=subtitle]]
+[[!template text="can actually become contributors" start="00:19:06.160" video="mainVideo" id=subtitle]]
+[[!template text="to the project itself." start="00:19:07.440" video="mainVideo" id=subtitle]]
+[[!template text="I think that's going to be" start="00:19:08.480" video="mainVideo" id=subtitle]]
+[[!template text="very important for its health." start="00:19:09.200" video="mainVideo" id=subtitle]]
+[[!template text="Also, you don't need to add functionality" start="00:19:11.600" video="mainVideo" id=subtitle]]
+[[!template text="to Emacs core" start="00:19:13.200" video="mainVideo" id=subtitle]]
+[[!template text="to make the editor itself better." start="00:19:14.080" video="mainVideo" id=subtitle]]
+[[!template text="Package authors are on" start="00:19:16.160" video="mainVideo" id=subtitle]]
+[[!template text="an equal playing field" start="00:19:17.120" video="mainVideo" id=subtitle]]
+[[!template text="as the built-in functionality," start="00:19:18.480" video="mainVideo" id=subtitle]]
+[[!template text="for the same reason what I said before." start="00:19:19.679" video="mainVideo" id=subtitle]]
+[[!template text="Everything's written with Emacs Lisp," start="00:19:21.008" video="mainVideo" id=subtitle]]
+[[!template text="or I guess a lot of the functionality" start="00:19:22.640" video="mainVideo" id=subtitle]]
+[[!template text="is written with Emacs Lisp." start="00:19:24.160" video="mainVideo" id=subtitle]]
+[[!template text="Since there's a lot of ways to hook into" start="00:19:26.000" video="mainVideo" id=subtitle]]
+[[!template text="or replace functionality in Emacs," start="00:19:28.720" video="mainVideo" id=subtitle]]
+[[!template text="you can do a lot of deep customizations" start="00:19:30.720" video="mainVideo" id=subtitle]]
+[[!template text="to Emacs itself to make it better" start="00:19:33.280" video="mainVideo" id=subtitle]]
+[[!template text="in ways that aren't really..." start="00:19:35.360" video="mainVideo" id=subtitle]]
+[[!template text="The core developers don't need to" start="00:19:37.600" video="mainVideo" id=subtitle]]
+[[!template text="add new things for you to do that." start="00:19:39.760" video="mainVideo" id=subtitle]]
+[[!template text="You can just do it if you want to." start="00:19:40.960" video="mainVideo" id=subtitle]]
+[[!template text="So that gives Emacs more of" start="00:19:42.320" video="mainVideo" id=subtitle]]
+[[!template text="a platform feel" start="00:19:44.640" video="mainVideo" id=subtitle]]
+[[!template text="rather than just being an editor" start="00:19:45.840" video="mainVideo" id=subtitle]]
+[[!template text="that can't really be changed very much." start="00:19:47.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Also, Emacs has a strong community" start="00:19:51.440" video="mainVideo" id=subtitle]]
+[[!template text="of highly-skilled packaged authors" start="00:19:53.440" video="mainVideo" id=subtitle]]
+[[!template text="and the high-quality packages" start="00:19:56.080" video="mainVideo" id=subtitle]]
+[[!template text="that they create make it far better" start="00:19:58.000" video="mainVideo" id=subtitle]]
+[[!template text="and more uniquely valuable" start="00:19:59.919" video="mainVideo" id=subtitle]]
+[[!template text="than many other editors." start="00:20:01.679" video="mainVideo" id=subtitle]]
+[[!template text="Specifically, things like Org mode," start="00:20:02.960" video="mainVideo" id=subtitle]]
+[[!template text="Magit, Org-roam," start="00:20:04.960" video="mainVideo" id=subtitle]]
+[[!template text="and a lot of other things" start="00:20:06.240" video="mainVideo" id=subtitle]]
+[[!template text="that we've talked about" start="00:20:07.039" video="mainVideo" id=subtitle]]
+[[!template text="on the System Crafters channel over time," start="00:20:08.000" video="mainVideo" id=subtitle]]
+[[!template text="and the hundreds of other" start="00:20:10.000" video="mainVideo" id=subtitle]]
+[[!template text="workflow-improving packages" start="00:20:11.136" video="mainVideo" id=subtitle]]
+[[!template text="that have been created over the years." start="00:20:12.480" video="mainVideo" id=subtitle]]
+[[!template text="So all these things really make Emacs" start="00:20:14.720" video="mainVideo" id=subtitle]]
+[[!template text="a unique offering" start="00:20:18.559" video="mainVideo" id=subtitle]]
+[[!template text="in the space of text editors," start="00:20:20.159" video="mainVideo" id=subtitle]]
+[[!template text="or development tools," start="00:20:21.679" video="mainVideo" id=subtitle]]
+[[!template text="or even just general" start="00:20:22.640" video="mainVideo" id=subtitle]]
+[[!template text="information management tools," start="00:20:24.240" video="mainVideo" id=subtitle]]
+[[!template text="or desktop environments," start="00:20:25.440" video="mainVideo" id=subtitle]]
+[[!template text="if you want to call it that." start="00:20:27.120" video="mainVideo" id=subtitle]]
+[[!template text="So the people who are involved" start="00:20:28.960" video="mainVideo" id=subtitle]]
+[[!template text="in making these things" start="00:20:31.280" video="mainVideo" id=subtitle]]
+[[!template text="make Emacs far better than it could be" start="00:20:32.159" video="mainVideo" id=subtitle]]
+[[!template text="just by itself," start="00:20:33.600" video="mainVideo" id=subtitle]]
+[[!template text="and this thriving ecosystem helps Emacs" start="00:20:35.039" video="mainVideo" id=subtitle]]
+[[!template text="to continually feel fresh," start="00:20:37.360" video="mainVideo" id=subtitle]]
+[[!template text="regardless of what's happening" start="00:20:39.120" video="mainVideo" id=subtitle]]
+[[!template text="in core Emacs development," start="00:20:40.320" video="mainVideo" id=subtitle]]
+[[!template text="because packages can do so much" start="00:20:41.600" video="mainVideo" id=subtitle]]
+[[!template text="and because people can come along" start="00:20:43.840" video="mainVideo" id=subtitle]]
+[[!template text="and propose sort of" start="00:20:45.280" video="mainVideo" id=subtitle]]
+[[!template text="a new way of doing things" start="00:20:46.640" video="mainVideo" id=subtitle]]
+[[!template text="and other people can start using it." start="00:20:47.760" video="mainVideo" id=subtitle]]
+[[!template text="Emacs itself doesn't have to be" start="00:20:49.360" video="mainVideo" id=subtitle]]
+[[!template text="beholden to just what" start="00:20:51.120" video="mainVideo" id=subtitle]]
+[[!template text="the core developers do." start="00:20:52.400" video="mainVideo" id=subtitle]]
+[[!template text="The community can also play" start="00:20:53.840" video="mainVideo" id=subtitle]]
+[[!template text="a major role in making Emacs feel fresh" start="00:20:55.280" video="mainVideo" id=subtitle]]
+[[!template text="and be modernized over time." start="00:20:57.760" video="mainVideo" id=subtitle]]
+[[!template text="Just take a look at what Doom Emacs" start="00:20:59.919" video="mainVideo" id=subtitle]]
+[[!template text="is doing to give Emacs a better face," start="00:21:01.360" video="mainVideo" id=subtitle]]
+[[!template text="and Spacemacs as well." start="00:21:03.919" video="mainVideo" id=subtitle]]
+[[!template text="Those things are very good" start="00:21:04.960" video="mainVideo" id=subtitle]]
+[[!template text="for making Emacs more palatable" start="00:21:06.240" video="mainVideo" id=subtitle]]
+[[!template text="to the general public," start="00:21:08.000" video="mainVideo" id=subtitle]]
+[[!template text="because you have a much better experience" start="00:21:09.440" video="mainVideo" id=subtitle]]
+[[!template text="out of the box, and a lot of things" start="00:21:11.120" video="mainVideo" id=subtitle]]
+[[!template text="have been polished" start="00:21:12.240" video="mainVideo" id=subtitle]]
+[[!template text="for the user experience." start="00:21:12.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs also has a very strong" start="00:21:15.280" video="mainVideo" id=subtitle]]
+[[!template text="user community. Lots of activity" start="00:21:17.200" video="mainVideo" id=subtitle]]
+[[!template text="and discussion about emacs" start="00:21:18.799" video="mainVideo" id=subtitle]]
+[[!template text="is taking place all the time" start="00:21:20.000" video="mainVideo" id=subtitle]]
+[[!template text="in various places," start="00:21:21.440" video="mainVideo" id=subtitle]]
+[[!template text="like we talked about before." start="00:21:22.559" video="mainVideo" id=subtitle]]
+[[!template text="Mailing lists, IRC, Reddit, etc." start="00:21:23.919" video="mainVideo" id=subtitle]]
+[[!template text="If you get into Emacs" start="00:21:26.559" video="mainVideo" id=subtitle]]
+[[!template text="and you go take part" start="00:21:28.159" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs community," start="00:21:28.880" video="mainVideo" id=subtitle]]
+[[!template text="there's always going to be" start="00:21:29.840" video="mainVideo" id=subtitle]]
+[[!template text="somebody around who's going to want to" start="00:21:30.640" video="mainVideo" id=subtitle]]
+[[!template text="talk about Emacs with you" start="00:21:32.000" video="mainVideo" id=subtitle]]
+[[!template text="and answer your questions." start="00:21:33.520" video="mainVideo" id=subtitle]]
+[[!template text="So it's a very good thing" start="00:21:34.960" video="mainVideo" id=subtitle]]
+[[!template text="for the health of the project" start="00:21:37.120" video="mainVideo" id=subtitle]]
+[[!template text="because there's a lot of people there" start="00:21:39.039" video="mainVideo" id=subtitle]]
+[[!template text="that are very invested in it every day" start="00:21:40.320" video="mainVideo" id=subtitle]]
+[[!template text="and want to see it succeed." start="00:21:42.640" video="mainVideo" id=subtitle]]
+[[!template text="Also, there's many community members" start="00:21:45.120" video="mainVideo" id=subtitle]]
+[[!template text="writing articles" start="00:21:47.039" video="mainVideo" id=subtitle]]
+[[!template text="and making videos about Emacs," start="00:21:47.840" video="mainVideo" id=subtitle]]
+[[!template text="many of which are actually moving forward" start="00:21:49.440" video="mainVideo" id=subtitle]]
+[[!template text="the state of the art" start="00:21:51.280" video="mainVideo" id=subtitle]]
+[[!template text="about how we use the editor," start="00:21:52.240" video="mainVideo" id=subtitle]]
+[[!template text="and how we use it... I mean," start="00:21:53.679" video="mainVideo" id=subtitle]]
+[[!template text="how many times have you seen" start="00:21:55.360" video="mainVideo" id=subtitle]]
+[[!template text="a really great blog post" start="00:21:56.480" video="mainVideo" id=subtitle]]
+[[!template text="that completely blew your mind" start="00:21:57.520" video="mainVideo" id=subtitle]]
+[[!template text="and showed you a new way" start="00:21:59.120" video="mainVideo" id=subtitle]]
+[[!template text="to use Emacs, or a new way to think about" start="00:22:00.880" video="mainVideo" id=subtitle]]
+[[!template text="how you use Emacs. I see stuff like that" start="00:22:02.720" video="mainVideo" id=subtitle]]
+[[!template text="all the time, like posts by Protesilaos," start="00:22:05.120" video="mainVideo" id=subtitle]]
+[[!template text="or by Karthik, or by many other people" start="00:22:08.480" video="mainVideo" id=subtitle]]
+[[!template text="who show you a new way" start="00:22:10.640" video="mainVideo" id=subtitle]]
+[[!template text="to look at things, and then you're, like," start="00:22:12.080" video="mainVideo" id=subtitle]]
+[[!template text="Wow. This... I could do things" start="00:22:13.360" video="mainVideo" id=subtitle]]
+[[!template text="completely different" start="00:22:14.720" video="mainVideo" id=subtitle]]
+[[!template text="than I was doing before." start="00:22:15.200" video="mainVideo" id=subtitle]]
+[[!template text="This kind of stuff" start="00:22:16.559" video="mainVideo" id=subtitle]]
+[[!template text="is extremely important" start="00:22:17.200" video="mainVideo" id=subtitle]]
+[[!template text="for the health of the editor" start="00:22:18.240" video="mainVideo" id=subtitle]]
+[[!template text="going forward, because people are able to" start="00:22:20.080" video="mainVideo" id=subtitle]]
+[[!template text="inspire others to use the editor." start="00:22:22.799" video="mainVideo" id=subtitle]]
+[[!template text="It's a great thing for evangelism as well." start="00:22:24.799" video="mainVideo" id=subtitle]]
+[[!template text="Like, if someone happens to" start="00:22:26.559" video="mainVideo" id=subtitle]]
+[[!template text="stumble across a video or a blog post," start="00:22:28.080" video="mainVideo" id=subtitle]]
+[[!template text="they may be really inspired to use Emacs." start="00:22:30.080" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And lastly, the Emacs maintainers" start="00:22:33.440" video="mainVideo" id=subtitle]]
+[[!template text="and contributors really care" start="00:22:35.280" video="mainVideo" id=subtitle]]
+[[!template text="about the users." start="00:22:36.720" video="mainVideo" id=subtitle]]
+[[!template text="There are many core maintainers" start="00:22:38.000" video="mainVideo" id=subtitle]]
+[[!template text="who have been with the project" start="00:22:39.280" video="mainVideo" id=subtitle]]
+[[!template text="for 10+ years, some way longer than that." start="00:22:40.080" video="mainVideo" id=subtitle]]
+[[!template text="So it shows you that" start="00:22:43.360" video="mainVideo" id=subtitle]]
+[[!template text="the people who work on this project" start="00:22:45.200" video="mainVideo" id=subtitle]]
+[[!template text="really care a lot," start="00:22:46.559" video="mainVideo" id=subtitle]]
+[[!template text="and they're very invested" start="00:22:47.600" video="mainVideo" id=subtitle]]
+[[!template text="in making sure that it remains healthy" start="00:22:48.640" video="mainVideo" id=subtitle]]
+[[!template text="for the long term." start="00:22:51.120" video="mainVideo" id=subtitle]]
+[[!template text="They also really care about ensuring" start="00:22:53.360" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs continues to work well" start="00:22:55.440" video="mainVideo" id=subtitle]]
+[[!template text="for long-time users," start="00:22:56.720" video="mainVideo" id=subtitle]]
+[[!template text="(and some people have been using it" start="00:22:58.159" video="mainVideo" id=subtitle]]
+[[!template text="for 30 to 40 years," start="00:23:00.080" video="mainVideo" id=subtitle]]
+[[!template text="which is kind of insane," start="00:23:01.280" video="mainVideo" id=subtitle]]
+[[!template text="if you think about it)," start="00:23:02.400" video="mainVideo" id=subtitle]]
+[[!template text="all while gradually and sensibly" start="00:23:03.760" video="mainVideo" id=subtitle]]
+[[!template text="enabling new scenarios" start="00:23:05.679" video="mainVideo" id=subtitle]]
+[[!template text="and core improvements" start="00:23:07.120" video="mainVideo" id=subtitle]]
+[[!template text="that benefit all of us," start="00:23:08.080" video="mainVideo" id=subtitle]]
+[[!template text="even the new and the old users." start="00:23:09.280" video="mainVideo" id=subtitle]]
+[[!template text="Keeping a piece of software" start="00:23:11.520" video="mainVideo" id=subtitle]]
+[[!template text="running and relevant" start="00:23:12.880" video="mainVideo" id=subtitle]]
+[[!template text="for this many years" start="00:23:13.600" video="mainVideo" id=subtitle]]
+[[!template text="is a huge effort," start="00:23:14.400" video="mainVideo" id=subtitle]]
+[[!template text="so I'm very thankful" start="00:23:15.440" video="mainVideo" id=subtitle]]
+[[!template text="to the maintainers of Emacs," start="00:23:16.799" video="mainVideo" id=subtitle]]
+[[!template text="and I hope all of you are as well," start="00:23:18.480" video="mainVideo" id=subtitle]]
+[[!template text="because this is kind of an anomaly" start="00:23:20.159" video="mainVideo" id=subtitle]]
+[[!template text="in the software field" start="00:23:22.799" video="mainVideo" id=subtitle]]
+[[!template text="to have a piece of software" start="00:23:23.600" video="mainVideo" id=subtitle]]
+[[!template text="that has existed for so long," start="00:23:24.960" video="mainVideo" id=subtitle]]
+[[!template text="who has managed to survive" start="00:23:26.640" video="mainVideo" id=subtitle]]
+[[!template text="despite various different types" start="00:23:30.000" video="mainVideo" id=subtitle]]
+[[!template text="of platform transitions," start="00:23:31.840" video="mainVideo" id=subtitle]]
+[[!template text="operating transitions over the years" start="00:23:33.280" video="mainVideo" id=subtitle]]
+[[!template text="and still thrive and be a very useful" start="00:23:35.280" video="mainVideo" id=subtitle]]
+[[!template text="and very key piece of software" start="00:23:37.360" video="mainVideo" id=subtitle]]
+[[!template text="for a lot of people." start="00:23:38.559" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So aren't all these things" start="00:23:40.960" video="mainVideo" id=subtitle]]
+[[!template text="that we just talked about" start="00:23:42.320" video="mainVideo" id=subtitle]]
+[[!template text="supposed to come" start="00:23:43.039" video="mainVideo" id=subtitle]]
+[[!template text="when an editor is popular?" start="00:23:43.840" video="mainVideo" id=subtitle]]
+[[!template text="We've been talking about" start="00:23:45.279" video="mainVideo" id=subtitle]]
+[[!template text="what is popularity," start="00:23:46.080" video="mainVideo" id=subtitle]]
+[[!template text="what benefits come with popularity." start="00:23:47.039" video="mainVideo" id=subtitle]]
+[[!template text="So all the things I just mentioned," start="00:23:48.720" video="mainVideo" id=subtitle]]
+[[!template text="shouldn't that be something" start="00:23:50.320" video="mainVideo" id=subtitle]]
+[[!template text="that would only be for editors" start="00:23:51.120" video="mainVideo" id=subtitle]]
+[[!template text="that are super popular? Well, I guess" start="00:23:52.720" video="mainVideo" id=subtitle]]
+[[!template text="the answer is maybe Emacs is actually" start="00:23:54.640" video="mainVideo" id=subtitle]]
+[[!template text="popular enough." start="00:23:56.720" video="mainVideo" id=subtitle]]
+[[!template text="That doesn't necessarily mean" start="00:23:57.840" video="mainVideo" id=subtitle]]
+[[!template text="that we should not try to" start="00:23:58.799" video="mainVideo" id=subtitle]]
+[[!template text="help other people find Emacs," start="00:24:00.640" video="mainVideo" id=subtitle]]
+[[!template text="but I think that we should not" start="00:24:03.600" video="mainVideo" id=subtitle]]
+[[!template text="worry so much about" start="00:24:04.960" video="mainVideo" id=subtitle]]
+[[!template text="the popularity of Emacs," start="00:24:05.760" video="mainVideo" id=subtitle]]
+[[!template text="because what we have is great," start="00:24:06.880" video="mainVideo" id=subtitle]]
+[[!template text="and we should just focus our time" start="00:24:08.480" video="mainVideo" id=subtitle]]
+[[!template text="on continuing to improve the health" start="00:24:11.120" video="mainVideo" id=subtitle]]
+[[!template text="of the community that we have" start="00:24:13.919" video="mainVideo" id=subtitle]]
+[[!template text="and the health of the editor itself," start="00:24:15.520" video="mainVideo" id=subtitle]]
+[[!template text="and not worry too much about chasing" start="00:24:17.360" video="mainVideo" id=subtitle]]
+[[!template text="whatever is happening out in the world" start="00:24:19.440" video="mainVideo" id=subtitle]]
+[[!template text="at any given point." start="00:24:20.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="To conclude, the next time someone says" start="00:24:22.880" video="mainVideo" id=subtitle]]
+[[!template text="we should do this thing" start="00:24:26.159" video="mainVideo" id=subtitle]]
+[[!template text="or this other thing" start="00:24:27.760" video="mainVideo" id=subtitle]]
+[[!template text="to make Emacs more popular," start="00:24:28.559" video="mainVideo" id=subtitle]]
+[[!template text="ask them these questions." start="00:24:30.400" video="mainVideo" id=subtitle]]
+[[!template text="1\. What does popularity mean to you?" start="00:24:32.240" video="mainVideo" id=subtitle]]
+[[!template text="2\. How do you measure it?" start="00:24:35.200" video="mainVideo" id=subtitle]]
+[[!template text="3\. What do you think Emacs is going to" start="00:24:37.279" video="mainVideo" id=subtitle]]
+[[!template text="gain from increased popularity?" start="00:24:39.440" video="mainVideo" id=subtitle]]
+[[!template text="So I hope that you found this talk" start="00:24:41.600" video="mainVideo" id=subtitle]]
+[[!template text="inspiring and maybe" start="00:24:43.279" video="mainVideo" id=subtitle]]
+[[!template text="a little bit reassuring. Thanks so much" start="00:24:44.159" video="mainVideo" id=subtitle]]
+[[!template text="for your time, and happy hacking." start="00:24:46.320" video="mainVideo" id=subtitle]]
+[[!template text="We'll see ya." start="00:24:48.240" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:24:50.867" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/form.md b/2021/captions/form.md
new file mode 100644
index 00000000..76984b28
--- /dev/null
+++ b/2021/captions/form.md
@@ -0,0 +1,430 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="My name is Ian Eure," start="00:00:01.199" video="mainVideo" id=subtitle]]
+[[!template text="and welcome to my talk" start="00:00:02.320" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Old McCarthy Had a Form&quot;." start="00:00:03.199" video="mainVideo" id=subtitle]]
+[[!template text="In this talk," start="00:00:05.120" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to be discussing EIEIO," start="00:00:05.759" video="mainVideo" id=subtitle]]
+[[!template text="which is an Emacs Lisp implementation" start="00:00:07.759" video="mainVideo" id=subtitle]]
+[[!template text="of the Common Lisp object system." start="00:00:09.920" video="mainVideo" id=subtitle]]
+[[!template text="CLOS is a way of writing" start="00:00:12.320" video="mainVideo" id=subtitle]]
+[[!template text="object-oriented Common Lisp code," start="00:00:13.519" video="mainVideo" id=subtitle]]
+[[!template text="and with EIEIO you have much of that same" start="00:00:15.360" video="mainVideo" id=subtitle]]
+[[!template text="power but inside Emacs." start="00:00:17.920" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to be using those two names" start="00:00:19.920" video="mainVideo" id=subtitle]]
+[[!template text="interchangeably throughout this talk," start="00:00:21.359" video="mainVideo" id=subtitle]]
+[[!template text="since they're nearly equivalent." start="00:00:22.988" video="mainVideo" id=subtitle]]
+[[!template text="You might wonder," start="00:00:26.640" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Why would I want to write" start="00:00:27.534" video="mainVideo" id=subtitle]]
+[[!template text="object Emacs Lisp code?&quot;." start="00:00:28.880" video="mainVideo" id=subtitle]]
+[[!template text="I like it because I like writing" start="00:00:31.439" video="mainVideo" id=subtitle]]
+[[!template text="in a functional programming style," start="00:00:33.440" video="mainVideo" id=subtitle]]
+[[!template text="or I like to do an imperative style" start="00:00:34.960" video="mainVideo" id=subtitle]]
+[[!template text="that captures interactive key sequences" start="00:00:36.896" video="mainVideo" id=subtitle]]
+[[!template text="that I might enter manually." start="00:00:39.040" video="mainVideo" id=subtitle]]
+[[!template text="Well, I think, different kinds of programs" start="00:00:41.200" video="mainVideo" id=subtitle]]
+[[!template text="need different kind of programming paradigms," start="00:00:42.800" video="mainVideo" id=subtitle]]
+[[!template text="and sometimes OOP is the one that fits." start="00:00:45.120" video="mainVideo" id=subtitle]]
+[[!template text="Also, if you've done much OOP before," start="00:00:47.760" video="mainVideo" id=subtitle]]
+[[!template text="you might be surprised by" start="00:00:49.708" video="mainVideo" id=subtitle]]
+[[!template text="how EIEIO works and the sorts of power" start="00:00:50.655" video="mainVideo" id=subtitle]]
+[[!template text="that it brings to your programs." start="00:00:52.879" video="mainVideo" id=subtitle]]
+[[!template text="So, let's talk about that model now." start="00:00:55.039" video="mainVideo" id=subtitle]]
+[[!template text="Classes are pretty much what" start="00:00:58.480" video="mainVideo" id=subtitle]]
+[[!template text="you would expect if you've done" start="00:01:00.000" video="mainVideo" id=subtitle]]
+[[!template text="OOP programming before." start="00:01:01.120" video="mainVideo" id=subtitle]]
+[[!template text="In the CLOS model," start="00:01:02.879" video="mainVideo" id=subtitle]]
+[[!template text="they only have fields," start="00:01:04.400" video="mainVideo" id=subtitle]]
+[[!template text="they only encapsulate values," start="00:01:06.400" video="mainVideo" id=subtitle]]
+[[!template text="they don't have anything to do with methods." start="00:01:08.000" video="mainVideo" id=subtitle]]
+[[!template text="So, in this case, we have a base class for" start="00:01:10.720" video="mainVideo" id=subtitle]]
+[[!template text="an EMMS player backend," start="00:01:13.040" video="mainVideo" id=subtitle]]
+[[!template text="and it has one field (a slot is what" start="00:01:15.040" video="mainVideo" id=subtitle]]
+[[!template text="it's called in CLOS terminology)," start="00:01:18.159" video="mainVideo" id=subtitle]]
+[[!template text="which indicates whether it's playing or not," start="00:01:20.000" video="mainVideo" id=subtitle]]
+[[!template text="and it's declared abstract," start="00:01:22.720" video="mainVideo" id=subtitle]]
+[[!template text="so you can't create an instance" start="00:01:24.080" video="mainVideo" id=subtitle]]
+[[!template text="of an object based on this class," start="00:01:25.439" video="mainVideo" id=subtitle]]
+[[!template text="you can only extend it with another class," start="00:01:27.040" video="mainVideo" id=subtitle]]
+[[!template text="that's an EIEIO extension," start="00:01:29.280" video="mainVideo" id=subtitle]]
+[[!template text="but I think it's a pretty good one." start="00:01:31.119" video="mainVideo" id=subtitle]]
+[[!template text="You can also see there's a class" start="00:01:33.439" video="mainVideo" id=subtitle]]
+[[!template text="that implements an mpv player back-end," start="00:01:34.640" video="mainVideo" id=subtitle]]
+[[!template text="and it extends the base class," start="00:01:37.119" video="mainVideo" id=subtitle]]
+[[!template text="it doesn't add any slots," start="00:01:39.680" video="mainVideo" id=subtitle]]
+[[!template text="and those get inherited from the base class." start="00:01:40.960" video="mainVideo" id=subtitle]]
+[[!template text="If you want these to do much more" start="00:01:44.479" video="mainVideo" id=subtitle]]
+[[!template text="than encapsulate data," start="00:01:45.936" video="mainVideo" id=subtitle]]
+[[!template text="you need to start writing methods." start="00:01:46.960" video="mainVideo" id=subtitle]]
+[[!template text="The CLOS model is to have" start="00:01:48.880" video="mainVideo" id=subtitle]]
+[[!template text="a generic function." start="00:01:50.324" video="mainVideo" id=subtitle]]
+[[!template text="A generic function is" start="00:01:51.439" video="mainVideo" id=subtitle]]
+[[!template text="kind of like an interface," start="00:01:52.399" video="mainVideo" id=subtitle]]
+[[!template text="it's just a name and an argument list," start="00:01:53.680" video="mainVideo" id=subtitle]]
+[[!template text="and there's no implementation," start="00:01:55.600" video="mainVideo" id=subtitle]]
+[[!template text="you have to write a method" start="00:01:57.280" video="mainVideo" id=subtitle]]
+[[!template text="in order to have an actual implementation." start="00:01:58.560" video="mainVideo" id=subtitle]]
+[[!template text="When you call the generic function," start="00:02:00.960" video="mainVideo" id=subtitle]]
+[[!template text="the system will do a dynamic dispatch" start="00:02:02.880" video="mainVideo" id=subtitle]]
+[[!template text="to a method that matches based on" start="00:02:04.960" video="mainVideo" id=subtitle]]
+[[!template text="its argument types and how the method" start="00:02:06.560" video="mainVideo" id=subtitle]]
+[[!template text="has declared that it should be invoked." start="00:02:08.319" video="mainVideo" id=subtitle]]
+[[!template text="Here's an example of some methods" start="00:02:12.239" video="mainVideo" id=subtitle]]
+[[!template text="for our mpv player backend," start="00:02:14.239" video="mainVideo" id=subtitle]]
+[[!template text="you can see that it'll play anything" start="00:02:16.480" video="mainVideo" id=subtitle]]
+[[!template text="other than something" start="00:02:19.599" video="mainVideo" id=subtitle]]
+[[!template text="with a keyword of `unplayable`," start="00:02:21.200" video="mainVideo" id=subtitle]]
+[[!template text="and it just has dummy start and stop methods" start="00:02:23.200" video="mainVideo" id=subtitle]]
+[[!template text="that return &quot;Started&quot; and &quot;Stopped&quot; text." start="00:02:25.328" video="mainVideo" id=subtitle]]
+[[!template text="A method is just one implementation" start="00:02:27.680" video="mainVideo" id=subtitle]]
+[[!template text="of a generic function," start="00:02:29.599" video="mainVideo" id=subtitle]]
+[[!template text="and you can have as many as you need." start="00:02:30.552" video="mainVideo" id=subtitle]]
+[[!template text="In order to determine" start="00:02:32.640" video="mainVideo" id=subtitle]]
+[[!template text="which method gets dispatched" start="00:02:33.920" video="mainVideo" id=subtitle]]
+[[!template text="when you call a generic function," start="00:02:35.519" video="mainVideo" id=subtitle]]
+[[!template text="they're specialized based on" start="00:02:36.879" video="mainVideo" id=subtitle]]
+[[!template text="their argument type." start="00:02:38.080" video="mainVideo" id=subtitle]]
+[[!template text="In this case, you can see that" start="00:02:39.360" video="mainVideo" id=subtitle]]
+[[!template text="first argument says" start="00:02:40.640" video="mainVideo" id=subtitle]]
+[[!template text="`player talk/emms-player-mpv`," start="00:02:41.680" video="mainVideo" id=subtitle]]
+[[!template text="that means that if that first argument" start="00:02:44.480" video="mainVideo" id=subtitle]]
+[[!template text="is an instance of the mpv player" start="00:02:46.239" video="mainVideo" id=subtitle]]
+[[!template text="or a subclass of it," start="00:02:48.480" video="mainVideo" id=subtitle]]
+[[!template text="then those methods will be invoked," start="00:02:50.080" video="mainVideo" id=subtitle]]
+[[!template text="unless there's a more specific one" start="00:02:52.000" video="mainVideo" id=subtitle]]
+[[!template text="based on that argument type." start="00:02:53.560" video="mainVideo" id=subtitle]]
+[[!template text="You don't have to define" start="00:02:55.440" video="mainVideo" id=subtitle]]
+[[!template text="the generic functions." start="00:02:56.656" video="mainVideo" id=subtitle]]
+[[!template text="If you define a method," start="00:02:57.760" video="mainVideo" id=subtitle]]
+[[!template text="then it'll implicitly define" start="00:02:59.040" video="mainVideo" id=subtitle]]
+[[!template text="the generic function for you." start="00:03:00.451" video="mainVideo" id=subtitle]]
+[[!template text="Specialization is really powerful." start="00:03:03.599" video="mainVideo" id=subtitle]]
+[[!template text="It lets the methods define" start="00:03:05.440" video="mainVideo" id=subtitle]]
+[[!template text="how they get invoked" start="00:03:06.939" video="mainVideo" id=subtitle]]
+[[!template text="If you've done much programming in Clojure," start="00:03:08.400" video="mainVideo" id=subtitle]]
+[[!template text="this sounds a little bit like multi-methods," start="00:03:10.472" video="mainVideo" id=subtitle]]
+[[!template text="but with multi-methods, only the main method," start="00:03:12.959" video="mainVideo" id=subtitle]]
+[[!template text="the equivalent of the generic function," start="00:03:16.319" video="mainVideo" id=subtitle]]
+[[!template text="can determine how they're dispatched." start="00:03:18.000" video="mainVideo" id=subtitle]]
+[[!template text="So, as the writer of an interface," start="00:03:19.920" video="mainVideo" id=subtitle]]
+[[!template text="you might not be able to foresee" start="00:03:21.519" video="mainVideo" id=subtitle]]
+[[!template text="every way that someone who's implementing" start="00:03:23.120" video="mainVideo" id=subtitle]]
+[[!template text="a version of that interface" start="00:03:25.519" video="mainVideo" id=subtitle]]
+[[!template text="would like to dispatch." start="00:03:26.959" video="mainVideo" id=subtitle]]
+[[!template text="CLOS doesn't have that problem," start="00:03:28.400" video="mainVideo" id=subtitle]]
+[[!template text="you get to define your" start="00:03:29.920" video="mainVideo" id=subtitle]]
+[[!template text="own invocation semantics." start="00:03:31.200" video="mainVideo" id=subtitle]]
+[[!template text="You're also not limited to" start="00:03:34.080" video="mainVideo" id=subtitle]]
+[[!template text="dispatching based on the value" start="00:03:35.360" video="mainVideo" id=subtitle]]
+[[!template text="being a subclass of an EIEIO type." start="00:03:37.200" video="mainVideo" id=subtitle]]
+[[!template text="You can dispatch based on" start="00:03:39.920" video="mainVideo" id=subtitle]]
+[[!template text="a primitive type like integer," start="00:03:41.280" video="mainVideo" id=subtitle]]
+[[!template text="you can dispatch based on the value," start="00:03:42.879" video="mainVideo" id=subtitle]]
+[[!template text="you can dispatch on multiple arguments," start="00:03:45.360" video="mainVideo" id=subtitle]]
+[[!template text="and there's also a default dispatch" start="00:03:47.599" video="mainVideo" id=subtitle]]
+[[!template text="that will get applied" start="00:03:49.599" video="mainVideo" id=subtitle]]
+[[!template text="if there's no others that are defined." start="00:03:50.688" video="mainVideo" id=subtitle]]
+[[!template text="If you don't have a default," start="00:03:53.200" video="mainVideo" id=subtitle]]
+[[!template text="then you'll just get an error" start="00:03:54.319" video="mainVideo" id=subtitle]]
+[[!template text="from the system," start="00:03:55.439" video="mainVideo" id=subtitle]]
+[[!template text="and if that doesn't cover it," start="00:03:56.480" video="mainVideo" id=subtitle]]
+[[!template text="you can even define your own." start="00:03:57.439" video="mainVideo" id=subtitle]]
+[[!template text="Definition is with the" start="00:03:59.040" video="mainVideo" id=subtitle]]
+[[!template text="`cl-generic-generalizers`," start="00:04:00.239" video="mainVideo" id=subtitle]]
+[[!template text="which is itself a generic function." start="00:04:01.760" video="mainVideo" id=subtitle]]
+[[!template text="Much of CLOS is built in CLOS," start="00:04:03.680" video="mainVideo" id=subtitle]]
+[[!template text="which I think is really cool." start="00:04:05.680" video="mainVideo" id=subtitle]]
+[[!template text="In addition to all that," start="00:04:08.319" video="mainVideo" id=subtitle]]
+[[!template text="you have four different types of methods," start="00:04:09.599" video="mainVideo" id=subtitle]]
+[[!template text="and those are distinguished by" start="00:04:12.319" video="mainVideo" id=subtitle]]
+[[!template text="what's called a qualifier." start="00:04:13.680" video="mainVideo" id=subtitle]]
+[[!template text="Every function can have methods" start="00:04:16.000" video="mainVideo" id=subtitle]]
+[[!template text="that have all four different" start="00:04:18.400" video="mainVideo" id=subtitle]]
+[[!template text="types of qualifiers," start="00:04:20.239" video="mainVideo" id=subtitle]]
+[[!template text="and based on your class inheritance," start="00:04:21.280" video="mainVideo" id=subtitle]]
+[[!template text="you might have multiple of each type." start="00:04:22.960" video="mainVideo" id=subtitle]]
+[[!template text="There's the primary method," start="00:04:25.680" video="mainVideo" id=subtitle]]
+[[!template text="which is equivalent to the method" start="00:04:26.800" video="mainVideo" id=subtitle]]
+[[!template text="in any other OOP system," start="00:04:28.560" video="mainVideo" id=subtitle]]
+[[!template text="so we're not going to cover that too much." start="00:04:29.919" video="mainVideo" id=subtitle]]
+[[!template text="Then there's a `before` method." start="00:04:32.160" video="mainVideo" id=subtitle]]
+[[!template text="This is evaluated before" start="00:04:33.759" video="mainVideo" id=subtitle]]
+[[!template text="the primary method for side effects," start="00:04:35.600" video="mainVideo" id=subtitle]]
+[[!template text="and its return value is discarded." start="00:04:37.440" video="mainVideo" id=subtitle]]
+[[!template text="There's an `after` method," start="00:04:40.080" video="mainVideo" id=subtitle]]
+[[!template text="which is the same but happens after" start="00:04:41.120" video="mainVideo" id=subtitle]]
+[[!template text="the method has finished evaluating." start="00:04:42.560" video="mainVideo" id=subtitle]]
+[[!template text="And then there's an `around` method" start="00:04:44.479" video="mainVideo" id=subtitle]]
+[[!template text="that happens around all the other three." start="00:04:46.639" video="mainVideo" id=subtitle]]
+[[!template text="And by using these types of methods" start="00:04:49.199" video="mainVideo" id=subtitle]]
+[[!template text="and using class inheritance" start="00:04:51.120" video="mainVideo" id=subtitle]]
+[[!template text="to compose them into your classes," start="00:04:52.560" video="mainVideo" id=subtitle]]
+[[!template text="you can add some really powerful" start="00:04:54.560" video="mainVideo" id=subtitle]]
+[[!template text="mixin type functionality." start="00:04:56.479" video="mainVideo" id=subtitle]]
+[[!template text="You can use before and after" start="00:04:58.240" video="mainVideo" id=subtitle]]
+[[!template text="to build things like logging," start="00:04:59.764" video="mainVideo" id=subtitle]]
+[[!template text="and you can use around" start="00:05:01.280" video="mainVideo" id=subtitle]]
+[[!template text="to implement things like memoization." start="00:05:02.479" video="mainVideo" id=subtitle]]
+[[!template text="If you've done much Emacs Lisp programming," start="00:05:04.880" video="mainVideo" id=subtitle]]
+[[!template text="those before after and around" start="00:05:06.720" video="mainVideo" id=subtitle]]
+[[!template text="might jog your memory because" start="00:05:08.160" video="mainVideo" id=subtitle]]
+[[!template text="they're the same features you get" start="00:05:09.919" video="mainVideo" id=subtitle]]
+[[!template text="with Emacs's built-in function advice." start="00:05:11.440" video="mainVideo" id=subtitle]]
+[[!template text="The thing with function advice is that" start="00:05:14.160" video="mainVideo" id=subtitle]]
+[[!template text="it only works on functions" start="00:05:15.680" video="mainVideo" id=subtitle]]
+[[!template text="in the global namespace," start="00:05:17.199" video="mainVideo" id=subtitle]]
+[[!template text="and there's no kind of conditionality," start="00:05:18.240" video="mainVideo" id=subtitle]]
+[[!template text="they always get dispatched" start="00:05:20.360" video="mainVideo" id=subtitle]]
+[[!template text="when that function is invoked." start="00:05:21.840" video="mainVideo" id=subtitle]]
+[[!template text="The nice thing about the CLOS system is that" start="00:05:23.440" video="mainVideo" id=subtitle]]
+[[!template text="whether they get invoked or not" start="00:05:25.600" video="mainVideo" id=subtitle]]
+[[!template text="depends on whether they exist in" start="00:05:27.039" video="mainVideo" id=subtitle]]
+[[!template text="the class hierarchy," start="00:05:28.872" video="mainVideo" id=subtitle]]
+[[!template text="so you can add them to your" start="00:05:30.160" video="mainVideo" id=subtitle]]
+[[!template text="class hierarchy if you want" start="00:05:31.520" video="mainVideo" id=subtitle]]
+[[!template text="that extra functionality" start="00:05:32.880" video="mainVideo" id=subtitle]]
+[[!template text="like logging or memoization," start="00:05:34.000" video="mainVideo" id=subtitle]]
+[[!template text="and you can exclude it if you don't." start="00:05:35.440" video="mainVideo" id=subtitle]]
+[[!template text="I think that's really powerful" start="00:05:37.120" video="mainVideo" id=subtitle]]
+[[!template text="and a very interesting way of doing it." start="00:05:38.320" video="mainVideo" id=subtitle]]
+[[!template text="It also supports multiple inheritance," start="00:05:42.639" video="mainVideo" id=subtitle]]
+[[!template text="which is the mechanism that you can use" start="00:05:44.639" video="mainVideo" id=subtitle]]
+[[!template text="to compose all these different kinds of" start="00:05:46.639" video="mainVideo" id=subtitle]]
+[[!template text="behaviors into a single object that does" start="00:05:48.560" video="mainVideo" id=subtitle]]
+[[!template text="all the things that you want." start="00:05:50.479" video="mainVideo" id=subtitle]]
+[[!template text="Here's a quick example of a logger." start="00:05:52.240" video="mainVideo" id=subtitle]]
+[[!template text="So, you can see the class just has" start="00:05:54.720" video="mainVideo" id=subtitle]]
+[[!template text="a single slot called `messages`," start="00:05:56.240" video="mainVideo" id=subtitle]]
+[[!template text="it has a `log` method" start="00:05:58.319" video="mainVideo" id=subtitle]]
+[[!template text="that pushes a new message," start="00:05:59.840" video="mainVideo" id=subtitle]]
+[[!template text="which is a format string, into that," start="00:06:01.440" video="mainVideo" id=subtitle]]
+[[!template text="and then it will return them back out," start="00:06:03.840" video="mainVideo" id=subtitle]]
+[[!template text="or it'll just return the latest." start="00:06:05.520" video="mainVideo" id=subtitle]]
+[[!template text="And there's a simple example" start="00:06:07.280" video="mainVideo" id=subtitle]]
+[[!template text="that shows it logging," start="00:06:08.479" video="mainVideo" id=subtitle]]
+[[!template text="and then shows it coming back out," start="00:06:09.600" video="mainVideo" id=subtitle]]
+[[!template text="pretty much what you would expect." start="00:06:11.280" video="mainVideo" id=subtitle]]
+[[!template text="Here's another class that adapts" start="00:06:14.080" video="mainVideo" id=subtitle]]
+[[!template text="the `emms-player` to the `logger` class." start="00:06:16.400" video="mainVideo" id=subtitle]]
+[[!template text="It only extends the logger" start="00:06:19.039" video="mainVideo" id=subtitle]]
+[[!template text="because it doesn't need any features" start="00:06:20.560" video="mainVideo" id=subtitle]]
+[[!template text="of the `emms-player` class itself." start="00:06:22.400" video="mainVideo" id=subtitle]]
+[[!template text="It just implements methods that dispatch" start="00:06:25.039" video="mainVideo" id=subtitle]]
+[[!template text="based on it being that logging player class," start="00:06:27.440" video="mainVideo" id=subtitle]]
+[[!template text="and you can see it logs whenever" start="00:06:30.240" video="mainVideo" id=subtitle]]
+[[!template text="a track is started or stopped," start="00:06:31.759" video="mainVideo" id=subtitle]]
+[[!template text="and it also adds some track" start="00:06:34.240" video="mainVideo" id=subtitle]]
+[[!template text="to tell you whether or not" start="00:06:36.240" video="mainVideo" id=subtitle]]
+[[!template text="the track was playable," start="00:06:37.520" video="mainVideo" id=subtitle]]
+[[!template text="that is using the around method." start="00:06:38.560" video="mainVideo" id=subtitle]]
+[[!template text="So, you can see we have all three methods" start="00:06:41.199" video="mainVideo" id=subtitle]]
+[[!template text="before, after, and around in this class," start="00:06:43.199" video="mainVideo" id=subtitle]]
+[[!template text="so you can see how those work." start="00:06:45.280" video="mainVideo" id=subtitle]]
+[[!template text="Then you need one more," start="00:06:48.160" video="mainVideo" id=subtitle]]
+[[!template text="which is the class" start="00:06:49.440" video="mainVideo" id=subtitle]]
+[[!template text="that mixes it all together," start="00:06:50.184" video="mainVideo" id=subtitle]]
+[[!template text="So, that's the `logging-player-mpv`," start="00:06:51.759" video="mainVideo" id=subtitle]]
+[[!template text="and it extends both the `logging-player` class" start="00:06:54.080" video="mainVideo" id=subtitle]]
+[[!template text="and the `emms-player-mpv` class." start="00:06:56.639" video="mainVideo" id=subtitle]]
+[[!template text="What's really interesting about this is" start="00:06:59.680" video="mainVideo" id=subtitle]]
+[[!template text="that even though the logging player is" start="00:07:01.440" video="mainVideo" id=subtitle]]
+[[!template text="part of the `emms-player` hierarchy," start="00:07:03.360" video="mainVideo" id=subtitle]]
+[[!template text="it doesn't depend on" start="00:07:05.520" video="mainVideo" id=subtitle]]
+[[!template text="a specific implementation," start="00:07:06.472" video="mainVideo" id=subtitle]]
+[[!template text="so you can combine the two different" start="00:07:08.240" video="mainVideo" id=subtitle]]
+[[!template text="classes that lets the logging class" start="00:07:10.400" video="mainVideo" id=subtitle]]
+[[!template text="only care about logging," start="00:07:12.639" video="mainVideo" id=subtitle]]
+[[!template text="and the `emms-player` class" start="00:07:13.919" video="mainVideo" id=subtitle]]
+[[!template text="only care about playing," start="00:07:15.440" video="mainVideo" id=subtitle]]
+[[!template text="and that is a really nice" start="00:07:17.039" video="mainVideo" id=subtitle]]
+[[!template text="way of separating your concerns" start="00:07:18.240" video="mainVideo" id=subtitle]]
+[[!template text="that I think is very powerful." start="00:07:19.599" video="mainVideo" id=subtitle]]
+[[!template text="Here's a quick example of" start="00:07:21.440" video="mainVideo" id=subtitle]]
+[[!template text="just how that works," start="00:07:22.515" video="mainVideo" id=subtitle]]
+[[!template text="and you can see the `unplayable`" start="00:07:23.599" video="mainVideo" id=subtitle]]
+[[!template text="track is not playable," start="00:07:25.199" video="mainVideo" id=subtitle]]
+[[!template text="and it gets logged as such," start="00:07:26.160" video="mainVideo" id=subtitle]]
+[[!template text="`foo` is playable, and you can see" start="00:07:27.840" video="mainVideo" id=subtitle]]
+[[!template text="the logs in started and stopped." start="00:07:29.360" video="mainVideo" id=subtitle]]
+[[!template text="So, you can see it's having" start="00:07:31.120" video="mainVideo" id=subtitle]]
+[[!template text="the side effects from those methods," start="00:07:32.560" video="mainVideo" id=subtitle]]
+[[!template text="and it's also returning" start="00:07:34.000" video="mainVideo" id=subtitle]]
+[[!template text="the value off the player as well." start="00:07:36.960" video="mainVideo" id=subtitle]]
+[[!template text="I think this system has a bunch of" start="00:07:40.319" video="mainVideo" id=subtitle]]
+[[!template text="really nice properties." start="00:07:41.599" video="mainVideo" id=subtitle]]
+[[!template text="First and foremost," start="00:07:43.120" video="mainVideo" id=subtitle]]
+[[!template text="it feels like a normal Lisp," start="00:07:44.080" video="mainVideo" id=subtitle]]
+[[!template text="all you're doing is calling functions," start="00:07:45.840" video="mainVideo" id=subtitle]]
+[[!template text="there's no magic involved." start="00:07:47.360" video="mainVideo" id=subtitle]]
+[[!template text="Also, you can use either or both of the" start="00:07:49.840" video="mainVideo" id=subtitle]]
+[[!template text="classes or generic functions." start="00:07:51.919" video="mainVideo" id=subtitle]]
+[[!template text="If you only need to" start="00:07:53.840" video="mainVideo" id=subtitle]]
+[[!template text="encapsulate data into a structure," start="00:07:55.120" video="mainVideo" id=subtitle]]
+[[!template text="then you can only use classes," start="00:07:56.960" video="mainVideo" id=subtitle]]
+[[!template text="you don't have to use generic functions." start="00:07:58.479" video="mainVideo" id=subtitle]]
+[[!template text="And if you only need dynamic dispatch," start="00:08:00.400" video="mainVideo" id=subtitle]]
+[[!template text="you can only implement" start="00:08:02.080" video="mainVideo" id=subtitle]]
+[[!template text="a generic function and methods." start="00:08:03.068" video="mainVideo" id=subtitle]]
+[[!template text="You don't get forced into a model" start="00:08:04.720" video="mainVideo" id=subtitle]]
+[[!template text="where you have to use both." start="00:08:06.560" video="mainVideo" id=subtitle]]
+[[!template text="You can mix and match for" start="00:08:08.000" video="mainVideo" id=subtitle]]
+[[!template text="whatever needs your program has," start="00:08:09.247" video="mainVideo" id=subtitle]]
+[[!template text="which I think is really amazing." start="00:08:10.800" video="mainVideo" id=subtitle]]
+[[!template text="Any value can conform to an interface," start="00:08:13.039" video="mainVideo" id=subtitle]]
+[[!template text="meaning a generic function." start="00:08:15.440" video="mainVideo" id=subtitle]]
+[[!template text="So, you don't have to use those classes." start="00:08:17.039" video="mainVideo" id=subtitle]]
+[[!template text="You can even implement" start="00:08:19.520" video="mainVideo" id=subtitle]]
+[[!template text="a generic function over `nil`," start="00:08:20.479" video="mainVideo" id=subtitle]]
+[[!template text="which gives you those really nice" start="00:08:22.240" video="mainVideo" id=subtitle]]
+[[!template text="properties of Lisp," start="00:08:23.599" video="mainVideo" id=subtitle]]
+[[!template text="where you have nil-punning, you know," start="00:08:24.800" video="mainVideo" id=subtitle]]
+[[!template text="if you take the head of a nil list," start="00:08:26.460" video="mainVideo" id=subtitle]]
+[[!template text="then the output is `nil`," start="00:08:28.800" video="mainVideo" id=subtitle]]
+[[!template text="but you can do that" start="00:08:30.479" video="mainVideo" id=subtitle]]
+[[!template text="with your object system too." start="00:08:31.283" video="mainVideo" id=subtitle]]
+[[!template text="And a really nice feature of that is" start="00:08:32.880" video="mainVideo" id=subtitle]]
+[[!template text="that you have no possibility of" start="00:08:34.320" video="mainVideo" id=subtitle]]
+[[!template text="null pointer exceptions" start="00:08:35.919" video="mainVideo" id=subtitle]]
+[[!template text="like you do in other languages." start="00:08:36.959" video="mainVideo" id=subtitle]]
+[[!template text="They have a calling convention" start="00:08:38.719" video="mainVideo" id=subtitle]]
+[[!template text="where you call object dot method," start="00:08:39.919" video="mainVideo" id=subtitle]]
+[[!template text="but in CLOS, you call a generic function," start="00:08:42.880" video="mainVideo" id=subtitle]]
+[[!template text="and you just give it some arguments." start="00:08:45.600" video="mainVideo" id=subtitle]]
+[[!template text="Typically, the first one is going to be" start="00:08:47.279" video="mainVideo" id=subtitle]]
+[[!template text="an EIEIO class object," start="00:08:48.959" video="mainVideo" id=subtitle]]
+[[!template text="but it doesn't have to be," start="00:08:51.680" video="mainVideo" id=subtitle]]
+[[!template text="but because you're not calling that" start="00:08:53.200" video="mainVideo" id=subtitle]]
+[[!template text="instance of an object," start="00:08:54.640" video="mainVideo" id=subtitle]]
+[[!template text="there's nothing to be nil in the first place," start="00:08:55.519" video="mainVideo" id=subtitle]]
+[[!template text="so there's no possibility of" start="00:08:57.279" video="mainVideo" id=subtitle]]
+[[!template text="a nil pointer exception." start="00:08:58.320" video="mainVideo" id=subtitle]]
+[[!template text="And then the ability to" start="00:09:00.080" video="mainVideo" id=subtitle]]
+[[!template text="have multiple inheritance" start="00:09:01.376" video="mainVideo" id=subtitle]]
+[[!template text="and mix in all of these different" start="00:09:02.480" video="mainVideo" id=subtitle]]
+[[!template text="functionalities into your final object" start="00:09:04.000" video="mainVideo" id=subtitle]]
+[[!template text="is very powerful." start="00:09:05.760" video="mainVideo" id=subtitle]]
+[[!template text="Because you have multiple inheritance," start="00:09:07.279" video="mainVideo" id=subtitle]]
+[[!template text="your final object that" start="00:09:09.839" video="mainVideo" id=subtitle]]
+[[!template text="composes all of those things" start="00:09:11.120" video="mainVideo" id=subtitle]]
+[[!template text="is both a player and a logger," start="00:09:12.560" video="mainVideo" id=subtitle]]
+[[!template text="and it can be substituted into code" start="00:09:14.080" video="mainVideo" id=subtitle]]
+[[!template text="that expects either of them." start="00:09:15.600" video="mainVideo" id=subtitle]]
+[[!template text="It's not an adapter class" start="00:09:17.279" video="mainVideo" id=subtitle]]
+[[!template text="that only allows you to do one thing," start="00:09:19.040" video="mainVideo" id=subtitle]]
+[[!template text="it does both of them." start="00:09:21.360" video="mainVideo" id=subtitle]]
+[[!template text="I think that's amazing." start="00:09:22.560" video="mainVideo" id=subtitle]]
+[[!template text="So, here are some practical examples" start="00:09:24.800" video="mainVideo" id=subtitle]]
+[[!template text="where I think maybe this" start="00:09:26.320" video="mainVideo" id=subtitle]]
+[[!template text="could be a good idea." start="00:09:27.387" video="mainVideo" id=subtitle]]
+[[!template text="And I like to think about," start="00:09:28.720" video="mainVideo" id=subtitle]]
+[[!template text="&quot;What is OOP actually good for?&quot;." start="00:09:30.399" video="mainVideo" id=subtitle]]
+[[!template text="I think it has three really amazing powers," start="00:09:32.320" video="mainVideo" id=subtitle]]
+[[!template text="encapsulation, abstraction," start="00:09:34.640" video="mainVideo" id=subtitle]]
+[[!template text="and extensibility," start="00:09:36.399" video="mainVideo" id=subtitle]]
+[[!template text="so let's look at those." start="00:09:37.279" video="mainVideo" id=subtitle]]
+[[!template text="Encapsulation is just keeping" start="00:09:39.200" video="mainVideo" id=subtitle]]
+[[!template text="related data together." start="00:09:40.959" video="mainVideo" id=subtitle]]
+[[!template text="Here's an example from the" start="00:09:42.480" video="mainVideo" id=subtitle]]
+[[!template text="transmission Torrent client." start="00:09:43.680" video="mainVideo" id=subtitle]]
+[[!template text="In order for it to work," start="00:09:45.360" video="mainVideo" id=subtitle]]
+[[!template text="it needs to have all four of" start="00:09:46.399" video="mainVideo" id=subtitle]]
+[[!template text="these variables set consistently," start="00:09:47.600" video="mainVideo" id=subtitle]]
+[[!template text="but if you use the customization interface," start="00:09:49.920" video="mainVideo" id=subtitle]]
+[[!template text="they're kind of strewn all over the buffer" start="00:09:52.240" video="mainVideo" id=subtitle]]
+[[!template text="because that shows them alphabetically" start="00:09:53.920" video="mainVideo" id=subtitle]]
+[[!template text="by variable name instead of" start="00:09:55.760" video="mainVideo" id=subtitle]]
+[[!template text="grouping them logically by function." start="00:09:57.040" video="mainVideo" id=subtitle]]
+[[!template text="You also have all these" start="00:09:59.920" video="mainVideo" id=subtitle]]
+[[!template text="in the global namespace," start="00:10:01.327" video="mainVideo" id=subtitle]]
+[[!template text="so you need this disambiguation in front," start="00:10:02.480" video="mainVideo" id=subtitle]]
+[[!template text="you have to have a transmission prefix," start="00:10:04.720" video="mainVideo" id=subtitle]]
+[[!template text="so it's kind of ugly." start="00:10:06.800" video="mainVideo" id=subtitle]]
+[[!template text="An alternative example would be to" start="00:10:08.720" video="mainVideo" id=subtitle]]
+[[!template text="encapsulate all of that" start="00:10:10.240" video="mainVideo" id=subtitle]]
+[[!template text="in a single class." start="00:10:11.760" video="mainVideo" id=subtitle]]
+[[!template text="This has one slot for each of those values," start="00:10:13.360" video="mainVideo" id=subtitle]]
+[[!template text="except the username" start="00:10:16.160" video="mainVideo" id=subtitle]]
+[[!template text="and password is broken out," start="00:10:17.040" video="mainVideo" id=subtitle]]
+[[!template text="there was only one in the previous example," start="00:10:18.000" video="mainVideo" id=subtitle]]
+[[!template text="but it works pretty much the same." start="00:10:20.240" video="mainVideo" id=subtitle]]
+[[!template text="The really neat thing about this is that" start="00:10:23.120" video="mainVideo" id=subtitle]]
+[[!template text="the customization interface understands" start="00:10:25.200" video="mainVideo" id=subtitle]]
+[[!template text="how to customize EIEIO objects," start="00:10:27.279" video="mainVideo" id=subtitle]]
+[[!template text="so you can set your custom variable" start="00:10:29.920" video="mainVideo" id=subtitle]]
+[[!template text="to the value of an object," start="00:10:32.640" video="mainVideo" id=subtitle]]
+[[!template text="and in the customization interface," start="00:10:34.000" video="mainVideo" id=subtitle]]
+[[!template text="it shows you all of the fields," start="00:10:35.760" video="mainVideo" id=subtitle]]
+[[!template text="and it lets you edit the values" start="00:10:37.040" video="mainVideo" id=subtitle]]
+[[!template text="of those slots directly." start="00:10:38.399" video="mainVideo" id=subtitle]]
+[[!template text="So, that keeps that logical grouping" start="00:10:40.079" video="mainVideo" id=subtitle]]
+[[!template text="that I think makes things really easy to use." start="00:10:41.760" video="mainVideo" id=subtitle]]
+[[!template text="Another thing it's really good at is" start="00:10:44.800" video="mainVideo" id=subtitle]]
+[[!template text="abstraction, and this is really core to" start="00:10:46.160" video="mainVideo" id=subtitle]]
+[[!template text="a lot of what Emacs does" start="00:10:48.268" video="mainVideo" id=subtitle]]
+[[!template text="because it runs on so many different systems," start="00:10:49.408" video="mainVideo" id=subtitle]]
+[[!template text="and it works with so many different" start="00:10:51.200" video="mainVideo" id=subtitle]]
+[[!template text="kinds of similar tools." start="00:10:53.308" video="mainVideo" id=subtitle]]
+[[!template text="Here's an example from" start="00:10:55.120" video="mainVideo" id=subtitle]]
+[[!template text="the built-in SQL implementation." start="00:10:56.109" video="mainVideo" id=subtitle]]
+[[!template text="This is the definition of" start="00:10:58.079" video="mainVideo" id=subtitle]]
+[[!template text="the postgres backend," start="00:10:59.360" video="mainVideo" id=subtitle]]
+[[!template text="there's one of these for" start="00:11:01.040" video="mainVideo" id=subtitle]]
+[[!template text="every supported database backend." start="00:11:02.160" video="mainVideo" id=subtitle]]
+[[!template text="And you can see, this is a pretty" start="00:11:04.000" video="mainVideo" id=subtitle]]
+[[!template text="classic interface abstraction pattern." start="00:11:05.440" video="mainVideo" id=subtitle]]
+[[!template text="On the left-hand side," start="00:11:08.480" video="mainVideo" id=subtitle]]
+[[!template text="you have a symbol that's common" start="00:11:09.680" video="mainVideo" id=subtitle]]
+[[!template text="among all the database backends," start="00:11:10.880" video="mainVideo" id=subtitle]]
+[[!template text="and the code that doesn't" start="00:11:12.399" video="mainVideo" id=subtitle]]
+[[!template text="know about the implementation can use," start="00:11:14.160" video="mainVideo" id=subtitle]]
+[[!template text="no matter what implementation" start="00:11:16.240" video="mainVideo" id=subtitle]]
+[[!template text="is being specified." start="00:11:17.519" video="mainVideo" id=subtitle]]
+[[!template text="On the right-hand side," start="00:11:19.040" video="mainVideo" id=subtitle]]
+[[!template text="you have the implementation" start="00:11:20.000" video="mainVideo" id=subtitle]]
+[[!template text="specific values," start="00:11:21.120" video="mainVideo" id=subtitle]]
+[[!template text="in some cases these are just strings," start="00:11:22.560" video="mainVideo" id=subtitle]]
+[[!template text="or regexes, and in others" start="00:11:24.399" video="mainVideo" id=subtitle]]
+[[!template text="those are actual functions." start="00:11:25.760" video="mainVideo" id=subtitle]]
+[[!template text="So, really this already is" start="00:11:27.519" video="mainVideo" id=subtitle]]
+[[!template text="object orientation," start="00:11:29.440" video="mainVideo" id=subtitle]]
+[[!template text="it's just an ad-hoc system for it," start="00:11:30.720" video="mainVideo" id=subtitle]]
+[[!template text="but you don't have to use an ad-hoc system" start="00:11:32.959" video="mainVideo" id=subtitle]]
+[[!template text="because there's this" start="00:11:34.880" video="mainVideo" id=subtitle]]
+[[!template text="nice formal one instead." start="00:11:35.519" video="mainVideo" id=subtitle]]
+[[!template text="Another thing that it's" start="00:11:38.000" video="mainVideo" id=subtitle]]
+[[!template text="really good at is extensibility," start="00:11:38.880" video="mainVideo" id=subtitle]]
+[[!template text="we saw some of that with" start="00:11:40.959" video="mainVideo" id=subtitle]]
+[[!template text="the emms-player example earlier." start="00:11:42.160" video="mainVideo" id=subtitle]]
+[[!template text="But here's another thing I think" start="00:11:44.800" video="mainVideo" id=subtitle]]
+[[!template text="it would be interesting to explore." start="00:11:46.160" video="mainVideo" id=subtitle]]
+[[!template text="Emacs has this idea of derived modes" start="00:11:48.720" video="mainVideo" id=subtitle]]
+[[!template text="where you have a mode that's based on" start="00:11:51.279" video="mainVideo" id=subtitle]]
+[[!template text="another, and that's a pretty clear" start="00:11:52.639" video="mainVideo" id=subtitle]]
+[[!template text="inheritance pattern straight out of OOP" start="00:11:54.639" video="mainVideo" id=subtitle]]
+[[!template text="as far as I'm concerned." start="00:11:57.040" video="mainVideo" id=subtitle]]
+[[!template text="What would it look like" start="00:11:58.560" video="mainVideo" id=subtitle]]
+[[!template text="if major modes were EIEIO classes," start="00:12:00.079" video="mainVideo" id=subtitle]]
+[[!template text="and you could extend your mode" start="00:12:02.959" video="mainVideo" id=subtitle]]
+[[!template text="by extending the class." start="00:12:04.800" video="mainVideo" id=subtitle]]
+[[!template text="I think that's a really interesting idea," start="00:12:06.399" video="mainVideo" id=subtitle]]
+[[!template text="and I'd like to explore that more." start="00:12:08.240" video="mainVideo" id=subtitle]]
+[[!template text="In conclusion, I think EIEIO is amazing," start="00:12:10.880" video="mainVideo" id=subtitle]]
+[[!template text="and I had no idea that such a powerful" start="00:12:14.079" video="mainVideo" id=subtitle]]
+[[!template text="object orientation system" start="00:12:16.079" video="mainVideo" id=subtitle]]
+[[!template text="was available in the Emacs." start="00:12:18.079" video="mainVideo" id=subtitle]]
+[[!template text="My goal with this talk" start="00:12:20.160" video="mainVideo" id=subtitle]]
+[[!template text="is for anyone who writes Emacs Lisp," start="00:12:21.519" video="mainVideo" id=subtitle]]
+[[!template text="to look at these classes of problems," start="00:12:23.519" video="mainVideo" id=subtitle]]
+[[!template text="encapsulation, abstraction," start="00:12:25.360" video="mainVideo" id=subtitle]]
+[[!template text="and extensibility," start="00:12:27.360" video="mainVideo" id=subtitle]]
+[[!template text="and if you run into" start="00:12:28.639" video="mainVideo" id=subtitle]]
+[[!template text="those problems in your code," start="00:12:29.600" video="mainVideo" id=subtitle]]
+[[!template text="instead of immediately reaching" start="00:12:31.279" video="mainVideo" id=subtitle]]
+[[!template text="and building your own system," start="00:12:33.279" video="mainVideo" id=subtitle]]
+[[!template text="I want you to think:" start="00:12:34.959" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Oh there's a thing for that," start="00:12:35.760" video="mainVideo" id=subtitle]]
+[[!template text="and I can just use it.&quot;" start="00:12:37.279" video="mainVideo" id=subtitle]]
+[[!template text="That's my talk, thanks." start="00:12:39.040" video="mainVideo" id=subtitle]]
+[[!template text="Hack on!" start="00:12:40.560" video="mainVideo" id=subtitle]]
+[[!template text="captions by bhavin192 (Bhavin Gandhi)" start="00:12:41.560" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/freedom.md b/2021/captions/freedom.md
new file mode 100644
index 00000000..9244def4
--- /dev/null
+++ b/2021/captions/freedom.md
@@ -0,0 +1,840 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello EmacsConf! Hello world!" start="00:00:11.610" video="mainVideo" id=subtitle]]
+[[!template text="Today I will talk to you about" start="00:00:13.974" video="mainVideo" id=subtitle]]
+[[!template text="how Emacs made me appreciate" start="00:00:15.940" video="mainVideo" id=subtitle]]
+[[!template text="software freedom." start="00:00:19.040" video="mainVideo" id=subtitle]]
+[[!template text="My name is Protesilaos, also known as &quot;Prot&quot;." start="00:00:20.900" video="mainVideo" id=subtitle]]
+[[!template text="I am joining you from the mountains of Cyprus." start="00:00:24.180" video="mainVideo" id=subtitle]]
+[[!template text="Cyprus is an island" start="00:00:28.430" video="mainVideo" id=subtitle]]
+[[!template text="in the Eastern Mediterranean Sea." start="00:00:30.274" video="mainVideo" id=subtitle]]
+[[!template text="So let's remove this header" start="00:00:32.940" video="mainVideo" id=subtitle]]
+[[!template text="from the top of the presentation" start="00:00:35.107" video="mainVideo" id=subtitle]]
+[[!template text="and proceed with today's talk." start="00:00:37.174" video="mainVideo" id=subtitle]]
+[[!template text="In that header, you can find a link" start="00:00:40.307" video="mainVideo" id=subtitle]]
+[[!template text="to my website, protesilaos.com ." start="00:00:41.907" video="mainVideo" id=subtitle]]
+[[!template new="1" text="My presentation focuses on the intersection" start="00:00:45.974" video="mainVideo" id=subtitle]]
+[[!template text="between software freedom" start="00:00:50.207" video="mainVideo" id=subtitle]]
+[[!template text="and what we find in the Emacs milieu." start="00:00:52.210" video="mainVideo" id=subtitle]]
+[[!template text="Here &quot;the Emacs milieu&quot;" start="00:00:55.890" video="mainVideo" id=subtitle]]
+[[!template text="encompasses two magnitudes:" start="00:00:57.640" video="mainVideo" id=subtitle]]
+[[!template text="(i) the program we use and" start="00:01:00.507" video="mainVideo" id=subtitle]]
+[[!template text="(ii) the diverse, global community of people" start="00:01:03.320" video="mainVideo" id=subtitle]]
+[[!template text="that has grown organically around it." start="00:01:06.740" video="mainVideo" id=subtitle]]
+[[!template text="I will talk to you about" start="00:01:10.530" video="mainVideo" id=subtitle]]
+[[!template text="how Emacs made me appreciate" start="00:01:12.007" video="mainVideo" id=subtitle]]
+[[!template text="software freedom" start="00:01:13.707" video="mainVideo" id=subtitle]]
+[[!template text="and helped me exercise it" start="00:01:14.940" video="mainVideo" id=subtitle]]
+[[!template text="to its full potential." start="00:01:16.674" video="mainVideo" id=subtitle]]
+[[!template text="Personal anecdotes are not" start="00:01:19.830" video="mainVideo" id=subtitle]]
+[[!template text="the main focus of this talk." start="00:01:21.440" video="mainVideo" id=subtitle]]
+[[!template text="Rather, they serve the ancillary role" start="00:01:23.650" video="mainVideo" id=subtitle]]
+[[!template text="of making certain insights more relatable." start="00:01:26.740" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The presentation is theoretical in nature" start="00:01:31.470" video="mainVideo" id=subtitle]]
+[[!template text="and targeted at a general audience." start="00:01:34.574" video="mainVideo" id=subtitle]]
+[[!template text="No knowledge of programming is required." start="00:01:38.430" video="mainVideo" id=subtitle]]
+[[!template text="It is assumed, however," start="00:01:42.020" video="mainVideo" id=subtitle]]
+[[!template text="that you are familiar" start="00:01:43.840" video="mainVideo" id=subtitle]]
+[[!template text="with some basic concepts," start="00:01:45.374" video="mainVideo" id=subtitle]]
+[[!template text="such as the fact that Emacs is extended" start="00:01:47.074" video="mainVideo" id=subtitle]]
+[[!template text="with the Emacs Lisp programming language," start="00:01:50.707" video="mainVideo" id=subtitle]]
+[[!template text="or that Emacs is a GNU project" start="00:01:53.507" video="mainVideo" id=subtitle]]
+[[!template text="that champions end-user software freedom." start="00:01:56.807" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's start with a few words about me" start="00:02:02.450" video="mainVideo" id=subtitle]]
+[[!template text="before elaborating further." start="00:02:04.574" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I was born in Greece in 1988" start="00:02:07.280" video="mainVideo" id=subtitle]]
+[[!template text="and was raised there." start="00:02:11.540" video="mainVideo" id=subtitle]]
+[[!template text="As a kid I was not into" start="00:02:13.379" video="mainVideo" id=subtitle]]
+[[!template text="tech-related activities. Not at all." start="00:02:16.307" video="mainVideo" id=subtitle]]
+[[!template text="All I cared about was playing football" start="00:02:20.480" video="mainVideo" id=subtitle]]
+[[!template text="(association football, also known as soccer)" start="00:02:22.973" video="mainVideo" id=subtitle]]
+[[!template text="and staying outdoors." start="00:02:26.440" video="mainVideo" id=subtitle]]
+[[!template text="My formal education is in the humanities" start="00:02:29.840" video="mainVideo" id=subtitle]]
+[[!template text="(or else, the liberal arts)." start="00:02:33.074" video="mainVideo" id=subtitle]]
+[[!template text="I had a career in politics." start="00:02:35.690" video="mainVideo" id=subtitle]]
+[[!template text="I lived in Brussels, Belgium" start="00:02:38.040" video="mainVideo" id=subtitle]]
+[[!template text="where I worked at the" start="00:02:41.107" video="mainVideo" id=subtitle]]
+[[!template text="European Parliament, among others." start="00:02:42.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="After some intense soul-searching," start="00:02:46.050" video="mainVideo" id=subtitle]]
+[[!template text="I realised I did not want to be" start="00:02:49.774" video="mainVideo" id=subtitle]]
+[[!template text="a political operator any more" start="00:02:52.607" video="mainVideo" id=subtitle]]
+[[!template text="and made radical changes in my life." start="00:02:55.040" video="mainVideo" id=subtitle]]
+[[!template text="I have since come to terms with the fact" start="00:02:59.950" video="mainVideo" id=subtitle]]
+[[!template text="that I am a philosopher." start="00:03:02.207" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I am not a programmer." start="00:03:04.709" video="mainVideo" id=subtitle]]
+[[!template text="Neither by trade nor education." start="00:03:07.640" video="mainVideo" id=subtitle]]
+[[!template text="I code for leisure." start="00:03:10.709" video="mainVideo" id=subtitle]]
+[[!template text="I was not tech-savvy until my mid-20s." start="00:03:13.140" video="mainVideo" id=subtitle]]
+[[!template text="I have been using GNU/Linux distributions" start="00:03:17.370" video="mainVideo" id=subtitle]]
+[[!template text="since the summer of 2016." start="00:03:20.740" video="mainVideo" id=subtitle]]
+[[!template text="While I switched to Emacs full-time" start="00:03:24.180" video="mainVideo" id=subtitle]]
+[[!template text="in the summer of 2019." start="00:03:26.374" video="mainVideo" id=subtitle]]
+[[!template text="Before that switch, I was running" start="00:03:30.190" video="mainVideo" id=subtitle]]
+[[!template text="a bespoke environment" start="00:03:31.840" video="mainVideo" id=subtitle]]
+[[!template text="that involved several standalone programs" start="00:03:33.774" video="mainVideo" id=subtitle]]
+[[!template text="like Vim, Tmux, and a tiling window manager." start="00:03:36.907" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I am the creator and maintainer" start="00:03:41.360" video="mainVideo" id=subtitle]]
+[[!template text="of the modus-themes package." start="00:03:44.874" video="mainVideo" id=subtitle]]
+[[!template text="The themes are modus-operandi" start="00:03:47.340" video="mainVideo" id=subtitle]]
+[[!template text="and modus-vivendi," start="00:03:50.707" video="mainVideo" id=subtitle]]
+[[!template text="but they are grouped together" start="00:03:52.440" video="mainVideo" id=subtitle]]
+[[!template text="in the package called modus-themes." start="00:03:53.874" video="mainVideo" id=subtitle]]
+[[!template text="These are designed to conform" start="00:03:57.760" video="mainVideo" id=subtitle]]
+[[!template text="with the highest accessibility standard" start="00:03:59.274" video="mainVideo" id=subtitle]]
+[[!template text="for legibility, and optionally" start="00:04:01.840" video="mainVideo" id=subtitle]]
+[[!template text="support the needs of users" start="00:04:05.007" video="mainVideo" id=subtitle]]
+[[!template text="with red-green colour deficiency" start="00:04:07.007" video="mainVideo" id=subtitle]]
+[[!template text="(deuteranopia, as it is known)." start="00:04:09.269" video="mainVideo" id=subtitle]]
+[[!template text="The themes are built into" start="00:04:12.307" video="mainVideo" id=subtitle]]
+[[!template text="Emacs version 28 or higher." start="00:04:14.940" video="mainVideo" id=subtitle]]
+[[!template text="A section of my website" start="00:04:17.579" video="mainVideo" id=subtitle]]
+[[!template text="is dedicated to them" start="00:04:19.574" video="mainVideo" id=subtitle]]
+[[!template text="as well as to all my other" start="00:04:21.307" video="mainVideo" id=subtitle]]
+[[!template text="Emacs-related contributions." start="00:04:23.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="For the remainder of this 40-minute talk," start="00:04:27.620" video="mainVideo" id=subtitle]]
+[[!template text="I will explain how Emacs" start="00:04:30.274" video="mainVideo" id=subtitle]]
+[[!template text="made me appreciate software freedom," start="00:04:31.907" video="mainVideo" id=subtitle]]
+[[!template text="how it empowers me" start="00:04:34.240" video="mainVideo" id=subtitle]]
+[[!template text="in my day-to-day computing," start="00:04:36.374" video="mainVideo" id=subtitle]]
+[[!template text="and the lessons I have drawn" start="00:04:38.924" video="mainVideo" id=subtitle]]
+[[!template text="from that liberating experience." start="00:04:40.374" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's proceed to the body" start="00:04:44.207" video="mainVideo" id=subtitle]]
+[[!template text="of this presentation," start="00:04:47.174" video="mainVideo" id=subtitle]]
+[[!template text="and the first section is titled:" start="00:04:48.407" video="mainVideo" id=subtitle]]
+[[!template text="&quot;The inherent Emacs qualities" start="00:04:51.740" video="mainVideo" id=subtitle]]
+[[!template text="for an autodidact.&quot;" start="00:04:54.807" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs has this reputation" start="00:04:56.860" video="mainVideo" id=subtitle]]
+[[!template text="of being extremely hard to learn" start="00:05:00.440" video="mainVideo" id=subtitle]]
+[[!template text="and difficult to get started with." start="00:05:02.774" video="mainVideo" id=subtitle]]
+[[!template text="So how does someone like me," start="00:05:06.469" video="mainVideo" id=subtitle]]
+[[!template text="who was not even tech-literate" start="00:05:08.140" video="mainVideo" id=subtitle]]
+[[!template text="a few years ago," start="00:05:10.607" video="mainVideo" id=subtitle]]
+[[!template text="go on to use Emacs effectively?" start="00:05:11.907" video="mainVideo" id=subtitle]]
+[[!template text="How do you start from zero," start="00:05:15.120" video="mainVideo" id=subtitle]]
+[[!template text="with no knowledge of ELisp" start="00:05:16.640" video="mainVideo" id=subtitle]]
+[[!template text="and with only a rudimentary understanding" start="00:05:19.140" video="mainVideo" id=subtitle]]
+[[!template text="of programming," start="00:05:22.174" video="mainVideo" id=subtitle]]
+[[!template text="to eventually maintain packages for Emacs," start="00:05:23.474" video="mainVideo" id=subtitle]]
+[[!template text="and even contribute directly to emacs.git" start="00:05:25.974" video="mainVideo" id=subtitle]]
+[[!template text="and other sources?" start="00:05:29.430" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The answer to these and related questions" start="00:05:32.710" video="mainVideo" id=subtitle]]
+[[!template text="lies in the very description of Emacs" start="00:05:35.207" video="mainVideo" id=subtitle]]
+[[!template text="as a &quot;self-documenting&quot; piece of software." start="00:05:37.974" video="mainVideo" id=subtitle]]
+[[!template text="It means that Emacs has a robust Help system" start="00:05:41.539" video="mainVideo" id=subtitle]]
+[[!template text="which informs you about the state" start="00:05:45.574" video="mainVideo" id=subtitle]]
+[[!template text="of a given construct." start="00:05:48.207" video="mainVideo" id=subtitle]]
+[[!template text="Such as what the original and current values" start="00:05:50.930" video="mainVideo" id=subtitle]]
+[[!template text="of a variable are." start="00:05:53.574" video="mainVideo" id=subtitle]]
+[[!template text="Or whether some function is being &quot;advised&quot;," start="00:05:56.430" video="mainVideo" id=subtitle]]
+[[!template text="as it is known," start="00:05:58.574" video="mainVideo" id=subtitle]]
+[[!template text="else, dynamically adjusted," start="00:05:59.640" video="mainVideo" id=subtitle]]
+[[!template text="by another function," start="00:06:02.440" video="mainVideo" id=subtitle]]
+[[!template text="and what that advice amounts to." start="00:06:04.074" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The self-documenting nature of Emacs" start="00:06:08.939" video="mainVideo" id=subtitle]]
+[[!template text="is combined with the fact" start="00:06:10.907" video="mainVideo" id=subtitle]]
+[[!template text="that it consists of free software." start="00:06:12.407" video="mainVideo" id=subtitle]]
+[[!template text="Not only do we get information" start="00:06:16.319" video="mainVideo" id=subtitle]]
+[[!template text="about what Emacs knows," start="00:06:18.040" video="mainVideo" id=subtitle]]
+[[!template text="but have the underlying code" start="00:06:19.540" video="mainVideo" id=subtitle]]
+[[!template text="readily available to us." start="00:06:22.009" video="mainVideo" id=subtitle]]
+[[!template text="For example, every Help buffer" start="00:06:24.099" video="mainVideo" id=subtitle]]
+[[!template text="provides a link to the source" start="00:06:26.840" video="mainVideo" id=subtitle]]
+[[!template text="of the item it references." start="00:06:29.107" video="mainVideo" id=subtitle]]
+[[!template text="We can study that and edit it as we wish." start="00:06:31.490" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Self-documentation and free software" start="00:06:37.960" video="mainVideo" id=subtitle]]
+[[!template text="are blended together" start="00:06:39.340" video="mainVideo" id=subtitle]]
+[[!template text="with a third quality of Emacs:" start="00:06:41.307" video="mainVideo" id=subtitle]]
+[[!template text="its implementation as a Lisp machine," start="00:06:45.007" video="mainVideo" id=subtitle]]
+[[!template text="or else, its ability to evaluate Lisp code" start="00:06:48.174" video="mainVideo" id=subtitle]]
+[[!template text="and make use of it directly." start="00:06:52.440" video="mainVideo" id=subtitle]]
+[[!template text="The ubiquity and uniformity" start="00:06:56.129" video="mainVideo" id=subtitle]]
+[[!template text="of the Lisp interpreter," start="00:06:58.774" video="mainVideo" id=subtitle]]
+[[!template text="together with the immediacy of its results" start="00:07:00.307" video="mainVideo" id=subtitle]]
+[[!template text="help one learn how to use Emacs" start="00:07:04.007" video="mainVideo" id=subtitle]]
+[[!template text="and how to write Emacs Lisp expressions." start="00:07:06.580" video="mainVideo" id=subtitle]]
+[[!template text="For someone who is self-taught like me" start="00:07:10.360" video="mainVideo" id=subtitle]]
+[[!template text="and who often learns through" start="00:07:13.474" video="mainVideo" id=subtitle]]
+[[!template text="a process of trial and error," start="00:07:15.307" video="mainVideo" id=subtitle]]
+[[!template text="this is of great value." start="00:07:17.507" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Learning how to use Emacs" start="00:07:20.589" video="mainVideo" id=subtitle]]
+[[!template text="and how to write in ELisp" start="00:07:23.074" video="mainVideo" id=subtitle]]
+[[!template text="is the basic skillset you need" start="00:07:25.007" video="mainVideo" id=subtitle]]
+[[!template text="to also start extending Emacs" start="00:07:27.707" video="mainVideo" id=subtitle]]
+[[!template text="for your own use," start="00:07:30.474" video="mainVideo" id=subtitle]]
+[[!template text="or even for publishing packages" start="00:07:32.140" video="mainVideo" id=subtitle]]
+[[!template text="and making contributions" start="00:07:34.807" video="mainVideo" id=subtitle]]
+[[!template text="to emacs.git directly." start="00:07:36.607" video="mainVideo" id=subtitle]]
+[[!template text="That is because the skills you acquire" start="00:07:40.490" video="mainVideo" id=subtitle]]
+[[!template text="by tinkering with your init.el as a beginner" start="00:07:42.840" video="mainVideo" id=subtitle]]
+[[!template text="will always stay with you" start="00:07:46.974" video="mainVideo" id=subtitle]]
+[[!template text="throughout your time as an Emacs user." start="00:07:49.207" video="mainVideo" id=subtitle]]
+[[!template text="That is empowering in itself." start="00:07:53.550" video="mainVideo" id=subtitle]]
+[[!template text="It rewards your investment" start="00:07:56.210" video="mainVideo" id=subtitle]]
+[[!template text="in time and effort." start="00:07:58.593" video="mainVideo" id=subtitle]]
+[[!template text="The more you learn," start="00:08:00.270" video="mainVideo" id=subtitle]]
+[[!template text="the more capable you become" start="00:08:01.374" video="mainVideo" id=subtitle]]
+[[!template text="to enact change," start="00:08:03.340" video="mainVideo" id=subtitle]]
+[[!template text="to configure things to your liking" start="00:08:06.007" video="mainVideo" id=subtitle]]
+[[!template text="and develop the exact workflow that you want" start="00:08:08.074" video="mainVideo" id=subtitle]]
+[[!template text="without making any compromises." start="00:08:11.974" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Compare that to, say," start="00:08:16.569" video="mainVideo" id=subtitle]]
+[[!template text="my tiling window manager." start="00:08:18.507" video="mainVideo" id=subtitle]]
+[[!template text="I can configure it with a shell script." start="00:08:21.449" video="mainVideo" id=subtitle]]
+[[!template text="So I learn POSIX shell or, let's say, Bash." start="00:08:24.479" video="mainVideo" id=subtitle]]
+[[!template text="But my knowledge of the shell" start="00:08:29.689" video="mainVideo" id=subtitle]]
+[[!template text="does not extend to modifying" start="00:08:31.804" video="mainVideo" id=subtitle]]
+[[!template text="the behaviour of the window manager as such," start="00:08:34.072" video="mainVideo" id=subtitle]]
+[[!template text="because that is not implemented" start="00:08:37.593" video="mainVideo" id=subtitle]]
+[[!template text="as a shell script," start="00:08:40.471" video="mainVideo" id=subtitle]]
+[[!template text="but in another language." start="00:08:42.140" video="mainVideo" id=subtitle]]
+[[!template text="So for an autodidact like me," start="00:08:44.250" video="mainVideo" id=subtitle]]
+[[!template text="it is more difficult to learn" start="00:08:46.942" video="mainVideo" id=subtitle]]
+[[!template text="yet another paradigm" start="00:08:49.634" video="mainVideo" id=subtitle]]
+[[!template text="before I can achieve what I want." start="00:08:51.430" video="mainVideo" id=subtitle]]
+[[!template text="How do you make that extra step" start="00:08:54.860" video="mainVideo" id=subtitle]]
+[[!template text="without self-documentation" start="00:08:57.342" video="mainVideo" id=subtitle]]
+[[!template text="and the immediacy as well as transparency" start="00:08:59.437" video="mainVideo" id=subtitle]]
+[[!template text="that you get from" start="00:09:02.605" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs Lisp interpreter?" start="00:09:04.307" video="mainVideo" id=subtitle]]
+[[!template text="It is more demanding," start="00:09:06.850" video="mainVideo" id=subtitle]]
+[[!template text="which makes Emacs comparatively easier" start="00:09:10.029" video="mainVideo" id=subtitle]]
+[[!template text="when we account for" start="00:09:12.843" video="mainVideo" id=subtitle]]
+[[!template text="the longer-term effort involved." start="00:09:14.274" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's move to the next section:" start="00:09:17.107" video="mainVideo" id=subtitle]]
+[[!template text="&quot;The interconnectedness of the Emacs space.&quot;" start="00:09:21.410" video="mainVideo" id=subtitle]]
+[[!template new="1" text="As I already mentioned," start="00:09:24.640" video="mainVideo" id=subtitle]]
+[[!template text="Emacs rewards you" start="00:09:27.607" video="mainVideo" id=subtitle]]
+[[!template text="for the investment in time and effort" start="00:09:28.874" video="mainVideo" id=subtitle]]
+[[!template text="you put into it." start="00:09:31.374" video="mainVideo" id=subtitle]]
+[[!template text="In my experience," start="00:09:33.649" video="mainVideo" id=subtitle]]
+[[!template text="this makes it easier to master" start="00:09:34.891" video="mainVideo" id=subtitle]]
+[[!template text="than a combination" start="00:09:36.707" video="mainVideo" id=subtitle]]
+[[!template text="of otherwise disparate tools," start="00:09:38.007" video="mainVideo" id=subtitle]]
+[[!template text="each with its own paradigm" start="00:09:40.434" video="mainVideo" id=subtitle]]
+[[!template text="of interaction and particularities" start="00:09:42.649" video="mainVideo" id=subtitle]]
+[[!template text="of implementation." start="00:09:45.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Before switching to Emacs," start="00:09:48.350" video="mainVideo" id=subtitle]]
+[[!template text="I was using a combination" start="00:09:50.035" video="mainVideo" id=subtitle]]
+[[!template text="of standalone programs" start="00:09:51.507" video="mainVideo" id=subtitle]]
+[[!template text="as part of a bespoke computing environment" start="00:09:53.640" video="mainVideo" id=subtitle]]
+[[!template text="that I had pieced together." start="00:09:56.274" video="mainVideo" id=subtitle]]
+[[!template text="The program called &quot;Mutt&quot;" start="00:09:58.860" video="mainVideo" id=subtitle]]
+[[!template text="would handle my emails," start="00:10:00.507" video="mainVideo" id=subtitle]]
+[[!template text="Newsboat dealt with my RSS feeds," start="00:10:02.140" video="mainVideo" id=subtitle]]
+[[!template text="the Music Player Daemon" start="00:10:06.440" video="mainVideo" id=subtitle]]
+[[!template text="took care of my music collection," start="00:10:08.407" video="mainVideo" id=subtitle]]
+[[!template text="while I was doing work" start="00:10:10.907" video="mainVideo" id=subtitle]]
+[[!template text="inside of a terminal emulator" start="00:10:12.207" video="mainVideo" id=subtitle]]
+[[!template text="which was running a multiplexer (tmux)" start="00:10:14.507" video="mainVideo" id=subtitle]]
+[[!template text="and Vim for on-the-fly text editing." start="00:10:17.707" video="mainVideo" id=subtitle]]
+[[!template text="Each of these, and others related to them," start="00:10:22.959" video="mainVideo" id=subtitle]]
+[[!template text="are fine in their own right." start="00:10:25.707" video="mainVideo" id=subtitle]]
+[[!template text="But their gestalt, their combined form," start="00:10:29.290" video="mainVideo" id=subtitle]]
+[[!template text="leaves something to be desired." start="00:10:32.507" video="mainVideo" id=subtitle]]
+[[!template text="Their lack of homogeneity" start="00:10:35.680" video="mainVideo" id=subtitle]]
+[[!template text="meant that I could not develop" start="00:10:38.174" video="mainVideo" id=subtitle]]
+[[!template text="portable skills between them." start="00:10:40.800" video="mainVideo" id=subtitle]]
+[[!template text="There is no inter-operability." start="00:10:43.240" video="mainVideo" id=subtitle]]
+[[!template text="What holds true in Vim" start="00:10:46.329" video="mainVideo" id=subtitle]]
+[[!template text="does not apply to the multiplexer." start="00:10:48.140" video="mainVideo" id=subtitle]]
+[[!template text="The prevalent methods in the email client" start="00:10:50.210" video="mainVideo" id=subtitle]]
+[[!template text="cannot be used in the RSS reader, and so on." start="00:10:53.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Whereas everything" start="00:10:59.140" video="mainVideo" id=subtitle]]
+[[!template text="that is implemented in ELisp" start="00:10:59.940" video="mainVideo" id=subtitle]]
+[[!template text="partakes in the same environment" start="00:11:02.207" video="mainVideo" id=subtitle]]
+[[!template text="automatically." start="00:11:04.440" video="mainVideo" id=subtitle]]
+[[!template text="If, say, you know how to" start="00:11:05.540" video="mainVideo" id=subtitle]]
+[[!template text="use keyboard macros to edit code," start="00:11:08.574" video="mainVideo" id=subtitle]]
+[[!template text="you already know how to" start="00:11:10.174" video="mainVideo" id=subtitle]]
+[[!template text="use the exact same skill to," start="00:11:12.274" video="mainVideo" id=subtitle]]
+[[!template text="for example, create and delete windows" start="00:11:13.507" video="mainVideo" id=subtitle]]
+[[!template text="in a process that involves text editing" start="00:11:19.221" video="mainVideo" id=subtitle]]
+[[!template text="and some elaborate" start="00:11:23.219" video="mainVideo" id=subtitle]]
+[[!template text="file management operations" start="00:11:25.107" video="mainVideo" id=subtitle]]
+[[!template text="with Emacs's directory editor program," start="00:11:27.340" video="mainVideo" id=subtitle]]
+[[!template text="or file manager, Dired." start="00:11:30.607" video="mainVideo" id=subtitle]]
+[[!template text="If you have a command" start="00:11:33.107" video="mainVideo" id=subtitle]]
+[[!template text="that scrolls down half a screen," start="00:11:35.307" video="mainVideo" id=subtitle]]
+[[!template text="it immediately works in all your buffers," start="00:11:38.374" video="mainVideo" id=subtitle]]
+[[!template text="regardless of whether their major mode" start="00:11:40.174" video="mainVideo" id=subtitle]]
+[[!template text="is about reading emails, editing text," start="00:11:44.140" video="mainVideo" id=subtitle]]
+[[!template text="enqueuing songs to a playlist, and so on." start="00:11:46.674" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs provides a level of integration" start="00:11:51.269" video="mainVideo" id=subtitle]]
+[[!template text="that I consider peerless." start="00:11:55.582" video="mainVideo" id=subtitle]]
+[[!template text="Everything the user deals with" start="00:11:58.420" video="mainVideo" id=subtitle]]
+[[!template text="is implemented in ELisp." start="00:12:00.471" video="mainVideo" id=subtitle]]
+[[!template text="And all the user edits" start="00:12:02.060" video="mainVideo" id=subtitle]]
+[[!template text="is ultimately done with ELisp." start="00:12:04.402" video="mainVideo" id=subtitle]]
+[[!template text="As such, the environment itself" start="00:12:07.459" video="mainVideo" id=subtitle]]
+[[!template text="provides the conditions for drawing" start="00:12:10.463" video="mainVideo" id=subtitle]]
+[[!template text="linkages between different," start="00:12:13.749" video="mainVideo" id=subtitle]]
+[[!template text="yet consubstantial," start="00:12:15.774" video="mainVideo" id=subtitle]]
+[[!template text="modes of interaction." start="00:12:18.540" video="mainVideo" id=subtitle]]
+[[!template text="For example, I use bongo.el" start="00:12:21.339" video="mainVideo" id=subtitle]]
+[[!template text="to play back songs" start="00:12:25.040" video="mainVideo" id=subtitle]]
+[[!template text="from my music collection." start="00:12:26.406" video="mainVideo" id=subtitle]]
+[[!template text="My ~/Music directory" start="00:12:29.110" video="mainVideo" id=subtitle]]
+[[!template text="is configured to have a special minor mode," start="00:12:30.340" video="mainVideo" id=subtitle]]
+[[!template text="so when I access it with dired," start="00:12:33.440" video="mainVideo" id=subtitle]]
+[[!template text="it has commands that allow me" start="00:12:36.440" video="mainVideo" id=subtitle]]
+[[!template text="to enqueue albums/songs" start="00:12:38.407" video="mainVideo" id=subtitle]]
+[[!template text="to a playlist," start="00:12:41.140" video="mainVideo" id=subtitle]]
+[[!template text="create playlists, et cetera." start="00:12:42.074" video="mainVideo" id=subtitle]]
+[[!template text="Also, I have an org-capture template" start="00:12:44.999" video="mainVideo" id=subtitle]]
+[[!template text="which lets me store the details" start="00:12:48.307" video="mainVideo" id=subtitle]]
+[[!template text="of the currently playing track" start="00:12:51.174" video="mainVideo" id=subtitle]]
+[[!template text="and tag it accordingly." start="00:12:53.274" video="mainVideo" id=subtitle]]
+[[!template text="Continuing with the example of Bongo," start="00:12:57.189" video="mainVideo" id=subtitle]]
+[[!template text="I make it interface" start="00:12:59.603" video="mainVideo" id=subtitle]]
+[[!template text="with my RSS reader, elfeed.el," start="00:13:00.810" video="mainVideo" id=subtitle]]
+[[!template text="by having the latter add" start="00:13:04.210" video="mainVideo" id=subtitle]]
+[[!template text="podcast and video links" start="00:13:06.953" video="mainVideo" id=subtitle]]
+[[!template text="to the former's playback queue." start="00:13:09.469" video="mainVideo" id=subtitle]]
+[[!template text="All this is done" start="00:13:12.720" video="mainVideo" id=subtitle]]
+[[!template text="by simply re-using" start="00:13:14.131" video="mainVideo" id=subtitle]]
+[[!template text="the same Emacs Lisp skills I learnt" start="00:13:15.709" video="mainVideo" id=subtitle]]
+[[!template text="while configuring and extending Emacs." start="00:13:18.283" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The interconnectedness of the Emacs space" start="00:13:23.120" video="mainVideo" id=subtitle]]
+[[!template text="empowers the end-user." start="00:13:26.989" video="mainVideo" id=subtitle]]
+[[!template text="It makes such emergent workflows possible." start="00:13:29.160" video="mainVideo" id=subtitle]]
+[[!template text="And the best part is" start="00:13:33.149" video="mainVideo" id=subtitle]]
+[[!template text="there are no dirty hacks involved:" start="00:13:35.359" video="mainVideo" id=subtitle]]
+[[!template text="it is an innate feature of the system." start="00:13:38.334" video="mainVideo" id=subtitle]]
+[[!template text="You are leveraging the freedom" start="00:13:41.690" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs gives you" start="00:13:43.840" video="mainVideo" id=subtitle]]
+[[!template text="in a way that confers agency on you." start="00:13:45.107" video="mainVideo" id=subtitle]]
+[[!template text="You assume the initiative." start="00:13:49.240" video="mainVideo" id=subtitle]]
+[[!template text="It gives you confidence" start="00:13:50.970" video="mainVideo" id=subtitle]]
+[[!template text="to continue honing your skills" start="00:13:53.707" video="mainVideo" id=subtitle]]
+[[!template text="in anticipation of further optimising---" start="00:13:55.340" video="mainVideo" id=subtitle]]
+[[!template text="and controlling in full---" start="00:13:58.807" video="mainVideo" id=subtitle]]
+[[!template text="your own integrated computing environment." start="00:13:59.807" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Next section:" start="00:14:07.874" video="mainVideo" id=subtitle]]
+[[!template text="the documentation culture" start="00:14:09.600" video="mainVideo" id=subtitle]]
+[[!template text="of the Emacs community." start="00:14:12.629" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If what I have mentioned thus far" start="00:14:15.309" video="mainVideo" id=subtitle]]
+[[!template text="was all there was" start="00:14:17.107" video="mainVideo" id=subtitle]]
+[[!template text="to the Emacs experience," start="00:14:19.140" video="mainVideo" id=subtitle]]
+[[!template text="there would still be" start="00:14:20.007" video="mainVideo" id=subtitle]]
+[[!template text="something to be desired." start="00:14:21.440" video="mainVideo" id=subtitle]]
+[[!template text="Because while self-documentation is great," start="00:14:24.209" video="mainVideo" id=subtitle]]
+[[!template text="it is meant to draw from---" start="00:14:26.721" video="mainVideo" id=subtitle]]
+[[!template text="and be a complement to---" start="00:14:28.808" video="mainVideo" id=subtitle]]
+[[!template text="some hand-written material." start="00:14:30.741" video="mainVideo" id=subtitle]]
+[[!template text="Both new and existing users" start="00:14:32.829" video="mainVideo" id=subtitle]]
+[[!template text="must be able to read" start="00:14:35.807" video="mainVideo" id=subtitle]]
+[[!template text="what something is supposed to do," start="00:14:37.380" video="mainVideo" id=subtitle]]
+[[!template text="what its main points of entry are," start="00:14:41.740" video="mainVideo" id=subtitle]]
+[[!template text="how it relates to other parts, and so on." start="00:14:42.774" video="mainVideo" id=subtitle]]
+[[!template text="This is about the human aspect of Emacs," start="00:14:47.279" video="mainVideo" id=subtitle]]
+[[!template text="the strong documentation culture" start="00:14:50.181" video="mainVideo" id=subtitle]]
+[[!template text="of its community," start="00:14:52.280" video="mainVideo" id=subtitle]]
+[[!template text="rather than an irreducible feature" start="00:14:53.425" video="mainVideo" id=subtitle]]
+[[!template text="of the program we use." start="00:14:55.589" video="mainVideo" id=subtitle]]
+[[!template new="1" text="As a matter of packaging etiquette," start="00:14:58.839" video="mainVideo" id=subtitle]]
+[[!template text="every non-trivial form in an Elisp library" start="00:15:02.393" video="mainVideo" id=subtitle]]
+[[!template text="must have a documentation string." start="00:15:06.552" video="mainVideo" id=subtitle]]
+[[!template text="What a variable or function does" start="00:15:09.920" video="mainVideo" id=subtitle]]
+[[!template text="needs to be spelt out in clear terms." start="00:15:12.785" video="mainVideo" id=subtitle]]
+[[!template text="Furthermore, the best" start="00:15:16.189" video="mainVideo" id=subtitle]]
+[[!template text="and most well-maintained packages," start="00:15:17.788" video="mainVideo" id=subtitle]]
+[[!template text="whether those are built into Emacs" start="00:15:20.333" video="mainVideo" id=subtitle]]
+[[!template text="or distributed via" start="00:15:22.507" video="mainVideo" id=subtitle]]
+[[!template text="an Emacs Lisp Package Archive," start="00:15:24.440" video="mainVideo" id=subtitle]]
+[[!template text="also known as ELPA," start="00:15:27.540" video="mainVideo" id=subtitle]]
+[[!template text="come with their own Info manual." start="00:15:28.674" video="mainVideo" id=subtitle]]
+[[!template text="Unlike a generic README," start="00:15:33.350" video="mainVideo" id=subtitle]]
+[[!template text="those manuals are more like" start="00:15:34.944" video="mainVideo" id=subtitle]]
+[[!template text="fully fledged books," start="00:15:37.112" video="mainVideo" id=subtitle]]
+[[!template text="with a table of contents, cross-references," start="00:15:38.738" video="mainVideo" id=subtitle]]
+[[!template text="and indices for concepts, functions," start="00:15:42.146" video="mainVideo" id=subtitle]]
+[[!template text="variables, key bindings..." start="00:15:45.107" video="mainVideo" id=subtitle]]
+[[!template text="In short, there is a tradition" start="00:15:47.189" video="mainVideo" id=subtitle]]
+[[!template text="around programming with Emacs Lisp" start="00:15:49.555" video="mainVideo" id=subtitle]]
+[[!template text="which values informative," start="00:15:52.262" video="mainVideo" id=subtitle]]
+[[!template text="high-quality guidelines" start="00:15:55.387" video="mainVideo" id=subtitle]]
+[[!template text="intended for end-users." start="00:15:58.451" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Apart from what" start="00:16:01.389" video="mainVideo" id=subtitle]]
+[[!template text="each individual package does," start="00:16:02.274" video="mainVideo" id=subtitle]]
+[[!template text="Emacs itself ships with" start="00:16:04.684" video="mainVideo" id=subtitle]]
+[[!template text="a helpful tutorial for newcomers," start="00:16:06.712" video="mainVideo" id=subtitle]]
+[[!template text="a comprehensive manual," start="00:16:10.174" video="mainVideo" id=subtitle]]
+[[!template text="a book targeted at non-programmers" start="00:16:11.374" video="mainVideo" id=subtitle]]
+[[!template text="titled &quot;An Introduction to" start="00:16:14.940" video="mainVideo" id=subtitle]]
+[[!template text="Programming in Emacs Lisp&quot;," start="00:16:17.474" video="mainVideo" id=subtitle]]
+[[!template text="as well as a reference manual" start="00:16:20.107" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs Lisp itself." start="00:16:21.307" video="mainVideo" id=subtitle]]
+[[!template text="All this material," start="00:16:24.290" video="mainVideo" id=subtitle]]
+[[!template text="all that wealth of knowledge," start="00:16:25.999" video="mainVideo" id=subtitle]]
+[[!template text="is readily available to the end-user" start="00:16:28.699" video="mainVideo" id=subtitle]]
+[[!template text="through the built-in Info reader." start="00:16:31.605" video="mainVideo" id=subtitle]]
+[[!template text="The details on how to access the Info reader" start="00:16:34.350" video="mainVideo" id=subtitle]]
+[[!template text="are already explained" start="00:16:37.936" video="mainVideo" id=subtitle]]
+[[!template text="in the initial learn-by-doing tutorial." start="00:16:40.512" video="mainVideo" id=subtitle]]
+[[!template text="For people like me who are self-taught," start="00:16:45.080" video="mainVideo" id=subtitle]]
+[[!template text="the documentation culture of the community" start="00:16:47.440" video="mainVideo" id=subtitle]]
+[[!template text="ensures that we are not left behind." start="00:16:51.408" video="mainVideo" id=subtitle]]
+[[!template text="It gives us the chance" start="00:16:55.600" video="mainVideo" id=subtitle]]
+[[!template text="to learn from the experts" start="00:16:56.840" video="mainVideo" id=subtitle]]
+[[!template text="and to become better ourselves." start="00:16:59.011" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Writing concise and clear documentation" start="00:17:03.639" video="mainVideo" id=subtitle]]
+[[!template text="is also beneficial for those who do it:" start="00:17:06.340" video="mainVideo" id=subtitle]]
+[[!template text="it helps them clarify their ideas" start="00:17:09.474" video="mainVideo" id=subtitle]]
+[[!template text="and improve their communication skills." start="00:17:10.707" video="mainVideo" id=subtitle]]
+[[!template text="These contribute to fostering" start="00:17:17.250" video="mainVideo" id=subtitle]]
+[[!template text="a more humane social element." start="00:17:19.868" video="mainVideo" id=subtitle]]
+[[!template text="In my experience, the Emacs community" start="00:17:22.399" video="mainVideo" id=subtitle]]
+[[!template text="has a propensity against" start="00:17:25.774" video="mainVideo" id=subtitle]]
+[[!template text="becoming elitist." start="00:17:30.646" video="mainVideo" id=subtitle]]
+[[!template text="It helps integrate new members" start="00:17:32.149" video="mainVideo" id=subtitle]]
+[[!template text="by not hiding anything from them," start="00:17:34.907" video="mainVideo" id=subtitle]]
+[[!template text="on top of Emacs' inherent" start="00:17:37.732" video="mainVideo" id=subtitle]]
+[[!template text="emancipatory qualities, as described before" start="00:17:39.040" video="mainVideo" id=subtitle]]
+[[!template text="(self-documentation, Elisp interpreter," start="00:17:43.470" video="mainVideo" id=subtitle]]
+[[!template text="free software)." start="00:17:46.374" video="mainVideo" id=subtitle]]
+[[!template text="At the same time," start="00:17:47.960" video="mainVideo" id=subtitle]]
+[[!template text="the community strives for excellence," start="00:17:49.807" video="mainVideo" id=subtitle]]
+[[!template text="so it expects newcomers" start="00:17:52.899" video="mainVideo" id=subtitle]]
+[[!template text="to do their part in reading" start="00:17:54.840" video="mainVideo" id=subtitle]]
+[[!template text="what is generously offered to them." start="00:17:56.940" video="mainVideo" id=subtitle]]
+[[!template text="There is a difference between" start="00:18:00.680" video="mainVideo" id=subtitle]]
+[[!template text="sharing knowledge" start="00:18:01.940" video="mainVideo" id=subtitle]]
+[[!template text="and spoon-feeding it to users." start="00:18:03.240" video="mainVideo" id=subtitle]]
+[[!template text="The latter method, that of spoon-feeding," start="00:18:06.740" video="mainVideo" id=subtitle]]
+[[!template text="keeps users dependent on it" start="00:18:09.140" video="mainVideo" id=subtitle]]
+[[!template text="and is thus detrimental to them" start="00:18:11.499" video="mainVideo" id=subtitle]]
+[[!template text="in the long run." start="00:18:14.574" video="mainVideo" id=subtitle]]
+[[!template text="The Emacs community" start="00:18:15.940" video="mainVideo" id=subtitle]]
+[[!template text="disseminates what it knows" start="00:18:18.374" video="mainVideo" id=subtitle]]
+[[!template text="and wants newcomers to assume agency" start="00:18:20.507" video="mainVideo" id=subtitle]]
+[[!template text="and be responsible for doing their part" start="00:18:23.974" video="mainVideo" id=subtitle]]
+[[!template text="in learning how things work." start="00:18:26.907" video="mainVideo" id=subtitle]]
+[[!template text="The community's documentation culture" start="00:18:30.740" video="mainVideo" id=subtitle]]
+[[!template text="and uncompromising standards" start="00:18:33.307" video="mainVideo" id=subtitle]]
+[[!template text="ensure that even" start="00:18:36.074" video="mainVideo" id=subtitle]]
+[[!template text="once-unskilled users like me" start="00:18:37.674" video="mainVideo" id=subtitle]]
+[[!template text="can become productive with Emacs" start="00:18:41.174" video="mainVideo" id=subtitle]]
+[[!template text="and unleash its full potential." start="00:18:43.707" video="mainVideo" id=subtitle]]
+[[!template text="What newcomers need is commitment" start="00:18:46.574" video="mainVideo" id=subtitle]]
+[[!template text="and an open mind to study what they have." start="00:18:50.488" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Next section:" start="00:18:55.040" video="mainVideo" id=subtitle]]
+[[!template text="&quot;The Promethean Ideal" start="00:18:58.269" video="mainVideo" id=subtitle]]
+[[!template text="of freeing know-how and expertise.&quot;" start="00:18:59.707" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The documentation culture" start="00:19:05.230" video="mainVideo" id=subtitle]]
+[[!template text="of the Emacs community" start="00:19:06.807" video="mainVideo" id=subtitle]]
+[[!template text="springs from a consideration" start="00:19:08.074" video="mainVideo" id=subtitle]]
+[[!template text="of practicality." start="00:19:10.307" video="mainVideo" id=subtitle]]
+[[!template text="When you explain what your program does," start="00:19:12.840" video="mainVideo" id=subtitle]]
+[[!template text="it is more likely" start="00:19:15.351" video="mainVideo" id=subtitle]]
+[[!template text="that others will show interest in it" start="00:19:16.505" video="mainVideo" id=subtitle]]
+[[!template text="and incorporate it in their workflow," start="00:19:19.477" video="mainVideo" id=subtitle]]
+[[!template text="whereas freed source code" start="00:19:22.450" video="mainVideo" id=subtitle]]
+[[!template text="that is distributed" start="00:19:24.674" video="mainVideo" id=subtitle]]
+[[!template text="without any accompanying documentation" start="00:19:26.085" video="mainVideo" id=subtitle]]
+[[!template text="will most likely only attract" start="00:19:29.309" video="mainVideo" id=subtitle]]
+[[!template text="a handful of enthusiastic hackers." start="00:19:32.300" video="mainVideo" id=subtitle]]
+[[!template text="Still good, but could be better." start="00:19:35.690" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Apart from its practical use though," start="00:19:39.460" video="mainVideo" id=subtitle]]
+[[!template text="writing documentation for the end-user" start="00:19:41.640" video="mainVideo" id=subtitle]]
+[[!template text="shows a spirit of altruism," start="00:19:44.407" video="mainVideo" id=subtitle]]
+[[!template text="an ethos of caring for others" start="00:19:47.140" video="mainVideo" id=subtitle]]
+[[!template text="and wanting to empower them" start="00:19:50.274" video="mainVideo" id=subtitle]]
+[[!template text="in their endeavours." start="00:19:52.540" video="mainVideo" id=subtitle]]
+[[!template text="It essentially is the same" start="00:19:55.130" video="mainVideo" id=subtitle]]
+[[!template text="as helping someone;" start="00:19:57.774" video="mainVideo" id=subtitle]]
+[[!template text="helping them escape from the ignorance" start="00:19:58.674" video="mainVideo" id=subtitle]]
+[[!template text="that contributes" start="00:20:02.607" video="mainVideo" id=subtitle]]
+[[!template text="to their sense of powerlessness." start="00:20:03.907" video="mainVideo" id=subtitle]]
+[[!template text="I experienced this myself:" start="00:20:07.810" video="mainVideo" id=subtitle]]
+[[!template text="by reading the docs," start="00:20:09.974" video="mainVideo" id=subtitle]]
+[[!template text="I was able to go from" start="00:20:12.007" video="mainVideo" id=subtitle]]
+[[!template text="an unskilled rookie" start="00:20:13.450" video="mainVideo" id=subtitle]]
+[[!template text="to a competent Emacs user." start="00:20:15.274" video="mainVideo" id=subtitle]]
+[[!template text="Part of that competence consists in" start="00:20:17.909" video="mainVideo" id=subtitle]]
+[[!template text="maintaining Elisp packages" start="00:20:20.839" video="mainVideo" id=subtitle]]
+[[!template text="and contributing code directly" start="00:20:23.037" video="mainVideo" id=subtitle]]
+[[!template text="to emacs.git." start="00:20:25.480" video="mainVideo" id=subtitle]]
+[[!template text="Writing documentation" start="00:20:28.760" video="mainVideo" id=subtitle]]
+[[!template text="is about disseminating" start="00:20:29.740" video="mainVideo" id=subtitle]]
+[[!template text="knowledge and expertise," start="00:20:31.207" video="mainVideo" id=subtitle]]
+[[!template text="not keeping it an exclusive right" start="00:20:34.015" video="mainVideo" id=subtitle]]
+[[!template text="of some elite." start="00:20:36.707" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Allow me then to liken this" start="00:20:39.919" video="mainVideo" id=subtitle]]
+[[!template text="to the ancient Greek myth of Prometheas" start="00:20:42.928" video="mainVideo" id=subtitle]]
+[[!template text="(Prometheus)." start="00:20:47.120" video="mainVideo" id=subtitle]]
+[[!template text="Prometheas was a titan, or else a deity," start="00:20:48.559" video="mainVideo" id=subtitle]]
+[[!template text="who decided to teach" start="00:20:52.972" video="mainVideo" id=subtitle]]
+[[!template text="the know-how of handling fire" start="00:20:54.988" video="mainVideo" id=subtitle]]
+[[!template text="to humanity." start="00:20:57.772" video="mainVideo" id=subtitle]]
+[[!template text="The art of fire" start="00:20:59.020" video="mainVideo" id=subtitle]]
+[[!template text="is an allegory about know-how in general," start="00:21:00.447" video="mainVideo" id=subtitle]]
+[[!template text="not specifically pyrotechnics." start="00:21:04.192" video="mainVideo" id=subtitle]]
+[[!template text="So Prometheas liberated that key knowledge" start="00:21:06.840" video="mainVideo" id=subtitle]]
+[[!template text="by taking it away" start="00:21:11.571" video="mainVideo" id=subtitle]]
+[[!template text="from the exclusivity of the gods" start="00:21:13.215" video="mainVideo" id=subtitle]]
+[[!template text="and bringing it" start="00:21:16.231" video="mainVideo" id=subtitle]]
+[[!template text="into the domain of humankind" start="00:21:17.693" video="mainVideo" id=subtitle]]
+[[!template text="as a libre resource." start="00:21:21.512" video="mainVideo" id=subtitle]]
+[[!template text="This act of altruism" start="00:21:24.390" video="mainVideo" id=subtitle]]
+[[!template text="propelled humanity to new heights." start="00:21:26.507" video="mainVideo" id=subtitle]]
+[[!template text="Every field of expertise" start="00:21:30.029" video="mainVideo" id=subtitle]]
+[[!template text="is about handling &quot;fire&quot;," start="00:21:32.590" video="mainVideo" id=subtitle]]
+[[!template text="in the figurative sense" start="00:21:35.255" video="mainVideo" id=subtitle]]
+[[!template text="of implementing essential know-how." start="00:21:38.681" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Why would Prometheas, an exalted being," start="00:21:43.679" video="mainVideo" id=subtitle]]
+[[!template text="ever bother with" start="00:21:47.123" video="mainVideo" id=subtitle]]
+[[!template text="the fallible and frail humanity?" start="00:21:48.586" video="mainVideo" id=subtitle]]
+[[!template text="Why did a god want to empower humans" start="00:21:52.250" video="mainVideo" id=subtitle]]
+[[!template text="instead of, say, making them dependent" start="00:21:56.007" video="mainVideo" id=subtitle]]
+[[!template text="on the know-how of &quot;fire&quot;?" start="00:22:00.077" video="mainVideo" id=subtitle]]
+[[!template text="If we look at the world around us," start="00:22:02.970" video="mainVideo" id=subtitle]]
+[[!template text="we witness how its overlords" start="00:22:05.747" video="mainVideo" id=subtitle]]
+[[!template text="are unscrupulously trying" start="00:22:07.970" video="mainVideo" id=subtitle]]
+[[!template text="to enclose the commons" start="00:22:10.186" video="mainVideo" id=subtitle]]
+[[!template text="and take advantage of expertise" start="00:22:12.274" video="mainVideo" id=subtitle]]
+[[!template text="in order to exploit us." start="00:22:16.076" video="mainVideo" id=subtitle]]
+[[!template text="Why would Prometheas not do the same thing" start="00:22:18.809" video="mainVideo" id=subtitle]]
+[[!template text="and enslave us for the rest of eternity?" start="00:22:22.700" video="mainVideo" id=subtitle]]
+[[!template text="The answer is that" start="00:22:27.570" video="mainVideo" id=subtitle]]
+[[!template text="unlike this world's aspiring tyrants," start="00:22:29.343" video="mainVideo" id=subtitle]]
+[[!template text="Prometheas represents a higher conscience," start="00:22:32.891" video="mainVideo" id=subtitle]]
+[[!template text="one that is not corrupted by egocentrism" start="00:22:36.842" video="mainVideo" id=subtitle]]
+[[!template text="and the greed of short-term profiteering." start="00:22:40.640" video="mainVideo" id=subtitle]]
+[[!template text="This higher conscience" start="00:22:45.510" video="mainVideo" id=subtitle]]
+[[!template text="makes sense of the bigger picture" start="00:22:47.490" video="mainVideo" id=subtitle]]
+[[!template text="and can foresee" start="00:22:50.332" video="mainVideo" id=subtitle]]
+[[!template text="that the distribution of know-how" start="00:22:51.710" video="mainVideo" id=subtitle]]
+[[!template text="empowers those who access it freely" start="00:22:54.260" video="mainVideo" id=subtitle]]
+[[!template text="to reach their potential." start="00:22:56.960" video="mainVideo" id=subtitle]]
+[[!template text="It is no coincidence that the ancient sages" start="00:23:00.530" video="mainVideo" id=subtitle]]
+[[!template text="used the name &quot;Prometheas&quot;," start="00:23:04.650" video="mainVideo" id=subtitle]]
+[[!template text="meaning the &quot;prescient one&quot;, the &quot;foreseer&quot;." start="00:23:09.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This is a lesson on the outlook" start="00:23:16.659" video="mainVideo" id=subtitle]]
+[[!template text="we ought to maintain," start="00:23:19.765" video="mainVideo" id=subtitle]]
+[[!template text="where we aspire to our highest." start="00:23:21.791" video="mainVideo" id=subtitle]]
+[[!template text="We want to be the best version of ourselves," start="00:23:25.330" video="mainVideo" id=subtitle]]
+[[!template text="by being more like Prometheas." start="00:23:28.501" video="mainVideo" id=subtitle]]
+[[!template text="We want our actions to be guided" start="00:23:31.710" video="mainVideo" id=subtitle]]
+[[!template text="by this Promethean Ideal" start="00:23:33.940" video="mainVideo" id=subtitle]]
+[[!template text="of liberating know-how," start="00:23:36.674" video="mainVideo" id=subtitle]]
+[[!template text="of making expertise readily available," start="00:23:39.097" video="mainVideo" id=subtitle]]
+[[!template text="and of providing others" start="00:23:42.307" video="mainVideo" id=subtitle]]
+[[!template text="with the chance to prosper." start="00:23:44.507" video="mainVideo" id=subtitle]]
+[[!template text="When we all do so," start="00:23:48.350" video="mainVideo" id=subtitle]]
+[[!template text="we are collectively better-off." start="00:23:49.927" video="mainVideo" id=subtitle]]
+[[!template text="Free software is a microcosm" start="00:23:52.500" video="mainVideo" id=subtitle]]
+[[!template text="of that principle." start="00:23:56.340" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's move on to the next section:" start="00:23:59.529" video="mainVideo" id=subtitle]]
+[[!template text="&quot;The 'killer apps' of Emacs.&quot;" start="00:24:02.940" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's be a bit more practical now." start="00:24:08.020" video="mainVideo" id=subtitle]]
+[[!template text="Many new users are attracted to Emacs" start="00:24:10.860" video="mainVideo" id=subtitle]]
+[[!template text="because it has one or a few" start="00:24:13.789" video="mainVideo" id=subtitle]]
+[[!template text="immensely useful applications" start="00:24:16.066" video="mainVideo" id=subtitle]]
+[[!template text="they would like to use." start="00:24:18.858" video="mainVideo" id=subtitle]]
+[[!template text="This typically covers Org" start="00:24:21.000" video="mainVideo" id=subtitle]]
+[[!template text="and/or one of its numerous accoutrements," start="00:24:23.019" video="mainVideo" id=subtitle]]
+[[!template text="though there are other excellent packages" start="00:24:27.090" video="mainVideo" id=subtitle]]
+[[!template text="like Magit." start="00:24:33.023" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The fact that Emacs has" start="00:24:34.760" video="mainVideo" id=subtitle]]
+[[!template text="such killer apps is good." start="00:24:36.107" video="mainVideo" id=subtitle]]
+[[!template text="It shows that its extensibility" start="00:24:38.870" video="mainVideo" id=subtitle]]
+[[!template text="is not some theoretical upside" start="00:24:41.535" video="mainVideo" id=subtitle]]
+[[!template text="of the Lisp interpreter." start="00:24:44.200" video="mainVideo" id=subtitle]]
+[[!template text="It has tangible utility to a wide user base," start="00:24:46.340" video="mainVideo" id=subtitle]]
+[[!template text="including those who do not" start="00:24:49.816" video="mainVideo" id=subtitle]]
+[[!template text="write Elisp themselves." start="00:24:51.940" video="mainVideo" id=subtitle]]
+[[!template text="Furthermore, those killer apps are good" start="00:24:54.850" video="mainVideo" id=subtitle]]
+[[!template text="as they help bring newcomers" start="00:24:57.927" video="mainVideo" id=subtitle]]
+[[!template text="and potential contributors to the fold," start="00:25:00.418" video="mainVideo" id=subtitle]]
+[[!template text="while they provide real value" start="00:25:04.370" video="mainVideo" id=subtitle]]
+[[!template text="to the existing members of the community." start="00:25:06.968" video="mainVideo" id=subtitle]]
+[[!template text="The more people we have" start="00:25:10.519" video="mainVideo" id=subtitle]]
+[[!template text="and the happier they are with Emacs," start="00:25:12.339" video="mainVideo" id=subtitle]]
+[[!template text="the higher the chances that we receive" start="00:25:15.330" video="mainVideo" id=subtitle]]
+[[!template text="some new ideas or code from them." start="00:25:18.726" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The notion of a killer app does, however," start="00:25:21.600" video="mainVideo" id=subtitle]]
+[[!template text="come with a latent downside" start="00:25:26.305" video="mainVideo" id=subtitle]]
+[[!template text="when targeted at outsiders" start="00:25:29.519" video="mainVideo" id=subtitle]]
+[[!template text="to the Emacs milieu." start="00:25:32.040" video="mainVideo" id=subtitle]]
+[[!template text="And that is because" start="00:25:34.470" video="mainVideo" id=subtitle]]
+[[!template text="packages like Org and Magit" start="00:25:36.307" video="mainVideo" id=subtitle]]
+[[!template text="do not have a standalone presence." start="00:25:39.362" video="mainVideo" id=subtitle]]
+[[!template text="They are always used in Emacs or, rather," start="00:25:42.000" video="mainVideo" id=subtitle]]
+[[!template text="together with the rest of Emacs," start="00:25:46.770" video="mainVideo" id=subtitle]]
+[[!template text="which means that the user has to know" start="00:25:50.840" video="mainVideo" id=subtitle]]
+[[!template text="what to expect from Emacs." start="00:25:54.470" video="mainVideo" id=subtitle]]
+[[!template new="1" text="You may be aware of the type of user" start="00:25:57.120" video="mainVideo" id=subtitle]]
+[[!template text="who proclaims that they want to" start="00:25:59.986" video="mainVideo" id=subtitle]]
+[[!template text="boost their productivity" start="00:26:02.680" video="mainVideo" id=subtitle]]
+[[!template text="but who also expects immediate results." start="00:26:04.785" video="mainVideo" id=subtitle]]
+[[!template text="When you bring the &quot;killer app&quot; rhetoric" start="00:26:08.070" video="mainVideo" id=subtitle]]
+[[!template text="to such a crowd," start="00:26:11.152" video="mainVideo" id=subtitle]]
+[[!template text="you run the risk of misleading them" start="00:26:12.581" video="mainVideo" id=subtitle]]
+[[!template text="into a false sense of self-confidence" start="00:26:15.608" video="mainVideo" id=subtitle]]
+[[!template text="and concomitant expectations of success." start="00:26:18.720" video="mainVideo" id=subtitle]]
+[[!template text="Such users may be tempted" start="00:26:24.330" video="mainVideo" id=subtitle]]
+[[!template text="to try Org, Magit, and others" start="00:26:26.655" video="mainVideo" id=subtitle]]
+[[!template text="but are most likely going to endure" start="00:26:29.249" video="mainVideo" id=subtitle]]
+[[!template text="a frustrating experience overall." start="00:26:32.470" video="mainVideo" id=subtitle]]
+[[!template text="The reason is that they are oblivious" start="00:26:36.179" video="mainVideo" id=subtitle]]
+[[!template text="to what Emacs is" start="00:26:39.834" video="mainVideo" id=subtitle]]
+[[!template text="and what is required" start="00:26:41.598" video="mainVideo" id=subtitle]]
+[[!template text="to get started with it" start="00:26:44.874" video="mainVideo" id=subtitle]]
+[[!template text="on a sustainable basis." start="00:26:46.540" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Org, Magit, and friends" start="00:26:47.820" video="mainVideo" id=subtitle]]
+[[!template text="are fantastic tools in their own right." start="00:26:50.874" video="mainVideo" id=subtitle]]
+[[!template text="But they still are part of Emacs." start="00:26:54.899" video="mainVideo" id=subtitle]]
+[[!template text="To use them effectively," start="00:26:57.399" video="mainVideo" id=subtitle]]
+[[!template text="you have to develop" start="00:26:59.406" video="mainVideo" id=subtitle]]
+[[!template text="at least a modicum of understanding" start="00:27:01.109" video="mainVideo" id=subtitle]]
+[[!template text="on what Emacs does." start="00:27:04.090" video="mainVideo" id=subtitle]]
+[[!template text="You must be patient" start="00:27:06.340" video="mainVideo" id=subtitle]]
+[[!template text="and approach this endeavour" start="00:27:07.692" video="mainVideo" id=subtitle]]
+[[!template text="with an open mind." start="00:27:09.519" video="mainVideo" id=subtitle]]
+[[!template text="Go through the tutorial," start="00:27:12.500" video="mainVideo" id=subtitle]]
+[[!template text="familiarise yourself with the Help system," start="00:27:14.372" video="mainVideo" id=subtitle]]
+[[!template text="make a habit out of reading Info manuals," start="00:27:18.939" video="mainVideo" id=subtitle]]
+[[!template text="and take things slowly." start="00:27:23.401" video="mainVideo" id=subtitle]]
+[[!template text="No killer app can ever be a substitute" start="00:27:26.820" video="mainVideo" id=subtitle]]
+[[!template text="for commitment to a cause;" start="00:27:30.358" video="mainVideo" id=subtitle]]
+[[!template text="no vaunted life hack" start="00:27:33.132" video="mainVideo" id=subtitle]]
+[[!template text="will ever provide a direct conduit" start="00:27:35.621" video="mainVideo" id=subtitle]]
+[[!template text="to some fountain of wisdom." start="00:27:39.771" video="mainVideo" id=subtitle]]
+[[!template new="1" text="With regard to software freedom" start="00:27:44.419" video="mainVideo" id=subtitle]]
+[[!template text="and user empowerment," start="00:27:46.597" video="mainVideo" id=subtitle]]
+[[!template text="what I have learnt is that" start="00:27:48.094" video="mainVideo" id=subtitle]]
+[[!template text="the impulse for the killer app" start="00:27:50.024" video="mainVideo" id=subtitle]]
+[[!template text="ought to emanate" start="00:27:52.240" video="mainVideo" id=subtitle]]
+[[!template text="from a position of knowledge." start="00:27:53.974" video="mainVideo" id=subtitle]]
+[[!template text="You need to know what you are searching for," start="00:27:56.707" video="mainVideo" id=subtitle]]
+[[!template text="and you need to know" start="00:27:58.974" video="mainVideo" id=subtitle]]
+[[!template text="where you will implement that." start="00:28:00.107" video="mainVideo" id=subtitle]]
+[[!template text="First, we need to temper our expectations" start="00:28:01.840" video="mainVideo" id=subtitle]]
+[[!template text="and prefer propitious growth in learning" start="00:28:06.571" video="mainVideo" id=subtitle]]
+[[!template text="over instant gratification." start="00:28:10.340" video="mainVideo" id=subtitle]]
+[[!template text="With Emacs, we have a strong foundation" start="00:28:14.159" video="mainVideo" id=subtitle]]
+[[!template text="for our computing freedom:" start="00:28:17.323" video="mainVideo" id=subtitle]]
+[[!template text="it consists of the inherent qualities" start="00:28:19.245" video="mainVideo" id=subtitle]]
+[[!template text="of the program" start="00:28:21.951" video="mainVideo" id=subtitle]]
+[[!template text="together with the documentation culture" start="00:28:23.367" video="mainVideo" id=subtitle]]
+[[!template text="and creativity of the community." start="00:28:27.051" video="mainVideo" id=subtitle]]
+[[!template text="Once we learn how to benefit from those," start="00:28:30.169" video="mainVideo" id=subtitle]]
+[[!template text="we have everything we need" start="00:28:32.670" video="mainVideo" id=subtitle]]
+[[!template text="to become proficient" start="00:28:34.174" video="mainVideo" id=subtitle]]
+[[!template text="in all the modes of interaction" start="00:28:35.893" video="mainVideo" id=subtitle]]
+[[!template text="that are available to us." start="00:28:38.592" video="mainVideo" id=subtitle]]
+[[!template text="Think of it as choosing Emacs and Org," start="00:28:42.330" video="mainVideo" id=subtitle]]
+[[!template text="Emacs and Magit," start="00:28:46.889" video="mainVideo" id=subtitle]]
+[[!template text="Emacs and Org and Magit, et cetera." start="00:28:48.876" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Next section:" start="00:28:53.140" video="mainVideo" id=subtitle]]
+[[!template text="&quot;You can't be an Emacs tourist.&quot;" start="00:28:56.889" video="mainVideo" id=subtitle]]
+[[!template new="1" text="What I just talked about implies that" start="00:29:01.899" video="mainVideo" id=subtitle]]
+[[!template text="you cannot simply switch to Emacs" start="00:29:04.521" video="mainVideo" id=subtitle]]
+[[!template text="over the weekend or on a whimsy." start="00:29:06.799" video="mainVideo" id=subtitle]]
+[[!template text="You can't use it opportunistically" start="00:29:09.960" video="mainVideo" id=subtitle]]
+[[!template text="to run a quick demo" start="00:29:12.915" video="mainVideo" id=subtitle]]
+[[!template text="with which to impress your peers" start="00:29:14.603" video="mainVideo" id=subtitle]]
+[[!template text="and win some inane &quot;nerd cred&quot;." start="00:29:18.901" video="mainVideo" id=subtitle]]
+[[!template text="Forget about such frivolous" start="00:29:22.940" video="mainVideo" id=subtitle]]
+[[!template text="superficialities." start="00:29:24.907" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is a sophisticated tool" start="00:29:26.170" video="mainVideo" id=subtitle]]
+[[!template text="intended for some serious work." start="00:29:29.000" video="mainVideo" id=subtitle]]
+[[!template text="It has been around for several decades" start="00:29:32.600" video="mainVideo" id=subtitle]]
+[[!template text="and it incorporates the knowledge" start="00:29:35.436" video="mainVideo" id=subtitle]]
+[[!template text="of a diverse group of contributors." start="00:29:38.116" video="mainVideo" id=subtitle]]
+[[!template text="Even if you want to use Emacs" start="00:29:41.639" video="mainVideo" id=subtitle]]
+[[!template text="just for Org mode or whatever killer app," start="00:29:43.616" video="mainVideo" id=subtitle]]
+[[!template text="you still have to try" start="00:29:46.766" video="mainVideo" id=subtitle]]
+[[!template text="to learn things in earnest." start="00:29:48.605" video="mainVideo" id=subtitle]]
+[[!template text="You still need to read" start="00:29:51.059" video="mainVideo" id=subtitle]]
+[[!template text="the relevant Info manual," start="00:29:52.140" video="mainVideo" id=subtitle]]
+[[!template text="understand how to make changes" start="00:29:54.196" video="mainVideo" id=subtitle]]
+[[!template text="to the plethora of user options on offer," start="00:29:56.663" video="mainVideo" id=subtitle]]
+[[!template text="and generally don't feel lost" start="00:30:00.006" video="mainVideo" id=subtitle]]
+[[!template text="while working with Emacs." start="00:30:03.117" video="mainVideo" id=subtitle]]
+[[!template text="This is more so if you use Emacs" start="00:30:05.710" video="mainVideo" id=subtitle]]
+[[!template text="to its full potential" start="00:30:08.264" video="mainVideo" id=subtitle]]
+[[!template text="as an integrated computing environment;" start="00:30:09.967" video="mainVideo" id=subtitle]]
+[[!template text="as your general purpose interface" start="00:30:13.297" video="mainVideo" id=subtitle]]
+[[!template text="to the computer," start="00:30:16.127" video="mainVideo" id=subtitle]]
+[[!template text="where you handle uniformly" start="00:30:17.460" video="mainVideo" id=subtitle]]
+[[!template text="coding and writing prose," start="00:30:19.633" video="mainVideo" id=subtitle]]
+[[!template text="your email correspondence," start="00:30:21.726" video="mainVideo" id=subtitle]]
+[[!template text="your RSS feeds," start="00:30:23.820" video="mainVideo" id=subtitle]]
+[[!template text="your music collection," start="00:30:25.022" video="mainVideo" id=subtitle]]
+[[!template text="your agenda and to-do lists," start="00:30:26.908" video="mainVideo" id=subtitle]]
+[[!template text="and so on." start="00:30:30.626" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The difficulty of Emacs" start="00:30:31.909" video="mainVideo" id=subtitle]]
+[[!template text="is much higher for those who approach it" start="00:30:33.872" video="mainVideo" id=subtitle]]
+[[!template text="without understanding" start="00:30:37.144" video="mainVideo" id=subtitle]]
+[[!template text="what they are getting themselves into," start="00:30:38.667" video="mainVideo" id=subtitle]]
+[[!template text="or for those who are naive enough" start="00:30:41.299" video="mainVideo" id=subtitle]]
+[[!template text="to believe that they can cheat their way" start="00:30:43.711" video="mainVideo" id=subtitle]]
+[[!template text="out of learning the fundamentals." start="00:30:47.294" video="mainVideo" id=subtitle]]
+[[!template text="The gist is that" start="00:30:50.340" video="mainVideo" id=subtitle]]
+[[!template text="you cannot be an Emacs tourist." start="00:30:51.574" video="mainVideo" id=subtitle]]
+[[!template text="You can't go into Emacsland" start="00:30:54.940" video="mainVideo" id=subtitle]]
+[[!template text="thinking that you will spend" start="00:30:57.165" video="mainVideo" id=subtitle]]
+[[!template text="a couple of memorable days there" start="00:30:59.469" video="mainVideo" id=subtitle]]
+[[!template text="and head back home" start="00:31:02.475" video="mainVideo" id=subtitle]]
+[[!template text="to regale others" start="00:31:04.206" video="mainVideo" id=subtitle]]
+[[!template text="with stories about your adventures." start="00:31:05.755" video="mainVideo" id=subtitle]]
+[[!template text="It does not work that way." start="00:31:08.580" video="mainVideo" id=subtitle]]
+[[!template text="You commit to Emacs for the long-term," start="00:31:11.850" video="mainVideo" id=subtitle]]
+[[!template text="for the freedom it offers you." start="00:31:15.250" video="mainVideo" id=subtitle]]
+[[!template text="Freedom in the moral sense" start="00:31:17.990" video="mainVideo" id=subtitle]]
+[[!template text="but also in the very practical ways" start="00:31:20.142" video="mainVideo" id=subtitle]]
+[[!template text="in which you can mould and extend" start="00:31:23.123" video="mainVideo" id=subtitle]]
+[[!template text="your personal workflows" start="00:31:25.851" video="mainVideo" id=subtitle]]
+[[!template text="with precision." start="00:31:27.907" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now you may wonder" start="00:31:31.160" video="mainVideo" id=subtitle]]
+[[!template text="why do I mention those things?" start="00:31:32.773" video="mainVideo" id=subtitle]]
+[[!template text="Shouldn't we make Emacs easier for everyone?" start="00:31:35.320" video="mainVideo" id=subtitle]]
+[[!template text="Yes, we should make everything" start="00:31:39.169" video="mainVideo" id=subtitle]]
+[[!template text="as simple as possible." start="00:31:42.333" video="mainVideo" id=subtitle]]
+[[!template text="Though that still does not refashion Emacs" start="00:31:44.760" video="mainVideo" id=subtitle]]
+[[!template text="into something entirely different." start="00:31:48.031" video="mainVideo" id=subtitle]]
+[[!template text="We continue to have" start="00:31:51.460" video="mainVideo" id=subtitle]]
+[[!template text="a potent tool at our disposal" start="00:31:52.740" video="mainVideo" id=subtitle]]
+[[!template text="that we must treat" start="00:31:55.829" video="mainVideo" id=subtitle]]
+[[!template text="with the requisite respect." start="00:31:57.040" video="mainVideo" id=subtitle]]
+[[!template text="Take, for instance, the various frameworks" start="00:32:00.020" video="mainVideo" id=subtitle]]
+[[!template text="that set up Emacs in an opinionated way" start="00:32:03.954" video="mainVideo" id=subtitle]]
+[[!template text="so that newcomers get everything" start="00:32:07.571" video="mainVideo" id=subtitle]]
+[[!template text="set up for them out-of-the-box." start="00:32:10.465" video="mainVideo" id=subtitle]]
+[[!template text="There is nothing wrong" start="00:32:13.360" video="mainVideo" id=subtitle]]
+[[!template text="with those frameworks." start="00:32:14.507" video="mainVideo" id=subtitle]]
+[[!template text="In fact, a large part of the community" start="00:32:16.220" video="mainVideo" id=subtitle]]
+[[!template text="uses them to great effect." start="00:32:19.417" video="mainVideo" id=subtitle]]
+[[!template text="However, the point stands:" start="00:32:21.690" video="mainVideo" id=subtitle]]
+[[!template text="even after every package" start="00:32:24.105" video="mainVideo" id=subtitle]]
+[[!template text="has been set up for you," start="00:32:26.342" video="mainVideo" id=subtitle]]
+[[!template text="you still have to put in the work" start="00:32:28.490" video="mainVideo" id=subtitle]]
+[[!template text="in making use" start="00:32:30.174" video="mainVideo" id=subtitle]]
+[[!template text="of your newfound computing freedom." start="00:32:31.507" video="mainVideo" id=subtitle]]
+[[!template new="1" text="But, you may insist," start="00:32:35.360" video="mainVideo" id=subtitle]]
+[[!template text="is that not some sort of gate-keeping?" start="00:32:37.648" video="mainVideo" id=subtitle]]
+[[!template text="Are you not being an elitist" start="00:32:41.789" video="mainVideo" id=subtitle]]
+[[!template text="by telling people how they must" start="00:32:43.750" video="mainVideo" id=subtitle]]
+[[!template text="invest time and effort" start="00:32:45.972" video="mainVideo" id=subtitle]]
+[[!template text="in making the best" start="00:32:48.009" video="mainVideo" id=subtitle]]
+[[!template text="out of their Emacs experience?" start="00:32:49.804" video="mainVideo" id=subtitle]]
+[[!template text="No, I think this is not elitism." start="00:32:52.639" video="mainVideo" id=subtitle]]
+[[!template text="There are no secrets here," start="00:32:56.830" video="mainVideo" id=subtitle]]
+[[!template text="no artificial barriers to entry," start="00:32:59.358" video="mainVideo" id=subtitle]]
+[[!template text="no impediments to making progress," start="00:33:02.530" video="mainVideo" id=subtitle]]
+[[!template text="no tricks and gimmicks." start="00:33:06.562" video="mainVideo" id=subtitle]]
+[[!template text="It just is a statement of fact." start="00:33:09.409" video="mainVideo" id=subtitle]]
+[[!template text="Freedom entails responsibility." start="00:33:13.460" video="mainVideo" id=subtitle]]
+[[!template text="It requires people to take the initiative" start="00:33:16.309" video="mainVideo" id=subtitle]]
+[[!template text="and assert control over the factors" start="00:33:20.481" video="mainVideo" id=subtitle]]
+[[!template text="that are within their reach." start="00:33:23.728" video="mainVideo" id=subtitle]]
+[[!template text="Freedom ultimately means" start="00:33:26.420" video="mainVideo" id=subtitle]]
+[[!template text="that we no longer remain dependent" start="00:33:29.267" video="mainVideo" id=subtitle]]
+[[!template text="on being spoon-fed." start="00:33:33.254" video="mainVideo" id=subtitle]]
+[[!template text="We assume agency." start="00:33:35.419" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And with this, I want to come to" start="00:33:39.174" video="mainVideo" id=subtitle]]
+[[!template text="the final section of this presentation." start="00:33:41.540" video="mainVideo" id=subtitle]]
+[[!template text="The title is:" start="00:33:44.940" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Emacs as a champion of software freedom.&quot;" start="00:33:46.407" video="mainVideo" id=subtitle]]
+[[!template new="1" text="To my mind, Emacs is the embodiment" start="00:33:52.250" video="mainVideo" id=subtitle]]
+[[!template text="of the GNU project's ethos." start="00:33:56.272" video="mainVideo" id=subtitle]]
+[[!template text="Everything you expect from a program" start="00:33:59.289" video="mainVideo" id=subtitle]]
+[[!template text="that is underpinned by the values" start="00:34:01.245" video="mainVideo" id=subtitle]]
+[[!template text="of software freedom" start="00:34:02.990" video="mainVideo" id=subtitle]]
+[[!template text="is found in Emacs." start="00:34:05.342" video="mainVideo" id=subtitle]]
+[[!template text="What you get is not merely an ethical tool," start="00:34:07.460" video="mainVideo" id=subtitle]]
+[[!template text="important though that is," start="00:34:10.962" video="mainVideo" id=subtitle]]
+[[!template text="but also a gift that will keep on giving;" start="00:34:13.032" video="mainVideo" id=subtitle]]
+[[!template text="a gift for you to further empower yourself" start="00:34:17.405" video="mainVideo" id=subtitle]]
+[[!template text="as a computer user." start="00:34:20.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I understood that freedom of software" start="00:34:24.020" video="mainVideo" id=subtitle]]
+[[!template text="is not about liberating the code itself." start="00:34:27.457" video="mainVideo" id=subtitle]]
+[[!template text="It is about sharing libre code" start="00:34:31.600" video="mainVideo" id=subtitle]]
+[[!template text="in order to emancipate the user." start="00:34:34.950" video="mainVideo" id=subtitle]]
+[[!template text="The best way to achieve that" start="00:34:38.410" video="mainVideo" id=subtitle]]
+[[!template text="is by emulating Prometheas:" start="00:34:40.899" video="mainVideo" id=subtitle]]
+[[!template text="don't just give people the so-called &quot;fire&quot;;" start="00:34:43.302" video="mainVideo" id=subtitle]]
+[[!template text="offer them the underlying know-how." start="00:34:47.187" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs taught me" start="00:34:50.907" video="mainVideo" id=subtitle]]
+[[!template text="the virtues of software freedom" start="00:34:52.940" video="mainVideo" id=subtitle]]
+[[!template text="in a way that nothing else" start="00:34:54.378" video="mainVideo" id=subtitle]]
+[[!template text="in the GNU/Linux space ever did." start="00:34:57.362" video="mainVideo" id=subtitle]]
+[[!template text="Here's an example from a few years ago." start="00:35:01.150" video="mainVideo" id=subtitle]]
+[[!template text="I needed a Markdown editor." start="00:35:04.210" video="mainVideo" id=subtitle]]
+[[!template text="I wanted it to centre" start="00:35:07.050" video="mainVideo" id=subtitle]]
+[[!template text="the body of the text on display." start="00:35:09.099" video="mainVideo" id=subtitle]]
+[[!template text="It should have configurable font families" start="00:35:12.080" video="mainVideo" id=subtitle]]
+[[!template text="and point sizes." start="00:35:15.384" video="mainVideo" id=subtitle]]
+[[!template text="Spell checking for Greek and English" start="00:35:17.030" video="mainVideo" id=subtitle]]
+[[!template text="should be included." start="00:35:19.646" video="mainVideo" id=subtitle]]
+[[!template text="The colours had to be editable as well," start="00:35:20.990" video="mainVideo" id=subtitle]]
+[[!template text="so I could adjust them" start="00:35:25.007" video="mainVideo" id=subtitle]]
+[[!template text="to a level of legibility" start="00:35:26.940" video="mainVideo" id=subtitle]]
+[[!template text="I was comfortable with." start="00:35:30.064" video="mainVideo" id=subtitle]]
+[[!template text="While there were plenty of libre programs," start="00:35:32.760" video="mainVideo" id=subtitle]]
+[[!template text="I did not find one" start="00:35:35.657" video="mainVideo" id=subtitle]]
+[[!template text="I could control and inspect" start="00:35:37.174" video="mainVideo" id=subtitle]]
+[[!template text="to the extent I can with Emacs." start="00:35:39.905" video="mainVideo" id=subtitle]]
+[[!template text="Which made me feel that I had stagnated:" start="00:35:43.190" video="mainVideo" id=subtitle]]
+[[!template text="there was an indelible line" start="00:35:46.982" video="mainVideo" id=subtitle]]
+[[!template text="dividing users from developers." start="00:35:49.572" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Whereas Emacs invites you" start="00:35:53.500" video="mainVideo" id=subtitle]]
+[[!template text="to blur the distinction" start="00:35:55.899" video="mainVideo" id=subtitle]]
+[[!template text="between user and the developer." start="00:35:58.106" video="mainVideo" id=subtitle]]
+[[!template text="It furnishes the means to become" start="00:36:00.590" video="mainVideo" id=subtitle]]
+[[!template text="proficient in it," start="00:36:03.837" video="mainVideo" id=subtitle]]
+[[!template text="while the community complements those" start="00:36:05.510" video="mainVideo" id=subtitle]]
+[[!template text="with its documentation culture" start="00:36:07.717" video="mainVideo" id=subtitle]]
+[[!template text="and overall creativity." start="00:36:10.744" video="mainVideo" id=subtitle]]
+[[!template text="You start off as a complete ignoramus," start="00:36:12.990" video="mainVideo" id=subtitle]]
+[[!template text="but soon pick up skills that remain useful" start="00:36:15.679" video="mainVideo" id=subtitle]]
+[[!template text="for as long as you work with Emacs." start="00:36:19.190" video="mainVideo" id=subtitle]]
+[[!template text="And if you really want to" start="00:36:22.200" video="mainVideo" id=subtitle]]
+[[!template text="take it a step further," start="00:36:23.574" video="mainVideo" id=subtitle]]
+[[!template text="you know where to look" start="00:36:25.150" video="mainVideo" id=subtitle]]
+[[!template text="for inspiration and guidance." start="00:36:27.569" video="mainVideo" id=subtitle]]
+[[!template text="Before you realise it," start="00:36:30.620" video="mainVideo" id=subtitle]]
+[[!template text="you start writing code in ELisp" start="00:36:32.722" video="mainVideo" id=subtitle]]
+[[!template text="and can one day share it with others." start="00:36:35.556" video="mainVideo" id=subtitle]]
+[[!template new="1" text="What I have learnt over the past 2.5 years" start="00:36:39.030" video="mainVideo" id=subtitle]]
+[[!template text="as an Emacs user" start="00:36:42.060" video="mainVideo" id=subtitle]]
+[[!template text="is that if you go from scratch" start="00:36:43.331" video="mainVideo" id=subtitle]]
+[[!template text="and are meticulous in your approach," start="00:36:45.661" video="mainVideo" id=subtitle]]
+[[!template text="you will need a few days or weeks" start="00:36:48.442" video="mainVideo" id=subtitle]]
+[[!template text="before everything starts to make sense." start="00:36:51.379" video="mainVideo" id=subtitle]]
+[[!template text="After that initial awkward phase" start="00:36:54.750" video="mainVideo" id=subtitle]]
+[[!template text="during which you familiarise yourself" start="00:36:57.477" video="mainVideo" id=subtitle]]
+[[!template text="with the basics," start="00:37:00.428" video="mainVideo" id=subtitle]]
+[[!template text="everything else will become easier to learn." start="00:37:01.748" video="mainVideo" id=subtitle]]
+[[!template text="It is a matter of gaining more experience," start="00:37:06.050" video="mainVideo" id=subtitle]]
+[[!template text="one step at a time." start="00:37:09.524" video="mainVideo" id=subtitle]]
+[[!template text="As with every field of expertise," start="00:37:11.060" video="mainVideo" id=subtitle]]
+[[!template text="Emacs expects you to work for it" start="00:37:13.537" video="mainVideo" id=subtitle]]
+[[!template text="and to earn it." start="00:37:15.870" video="mainVideo" id=subtitle]]
+[[!template text="For me, that is worth it." start="00:37:19.110" video="mainVideo" id=subtitle]]
+[[!template text="In terms of being malleable" start="00:37:21.240" video="mainVideo" id=subtitle]]
+[[!template text="in a consistent way" start="00:37:23.655" video="mainVideo" id=subtitle]]
+[[!template text="and transparent in what it does," start="00:37:25.294" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is in a league of its own." start="00:37:28.388" video="mainVideo" id=subtitle]]
+[[!template new="1" text="In conclusion, folks," start="00:37:31.390" video="mainVideo" id=subtitle]]
+[[!template text="Emacs allowed me to assert control" start="00:37:33.707" video="mainVideo" id=subtitle]]
+[[!template text="over a great portion" start="00:37:36.898" video="mainVideo" id=subtitle]]
+[[!template text="of my quotidian computing." start="00:37:39.260" video="mainVideo" id=subtitle]]
+[[!template text="It helped me grow out of" start="00:37:42.780" video="mainVideo" id=subtitle]]
+[[!template text="the state of ignorance I was in;" start="00:37:44.827" video="mainVideo" id=subtitle]]
+[[!template text="a state that rendered me" start="00:37:47.448" video="mainVideo" id=subtitle]]
+[[!template text="powerless to use the computer" start="00:37:49.811" video="mainVideo" id=subtitle]]
+[[!template text="exactly how I wanted." start="00:37:52.528" video="mainVideo" id=subtitle]]
+[[!template text="For that I am grateful." start="00:37:54.430" video="mainVideo" id=subtitle]]
+[[!template text="I now consider it my duty" start="00:37:57.910" video="mainVideo" id=subtitle]]
+[[!template text="to contribute back to" start="00:38:00.071" video="mainVideo" id=subtitle]]
+[[!template text="this wonderful project" start="00:38:02.025" video="mainVideo" id=subtitle]]
+[[!template text="and this awesome community." start="00:38:04.007" video="mainVideo" id=subtitle]]
+[[!template text="So thank you very much for your attention" start="00:38:06.390" video="mainVideo" id=subtitle]]
+[[!template text="in watching today's presentation." start="00:38:09.174" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Special thanks to" start="00:38:12.690" video="mainVideo" id=subtitle]]
+[[!template text="the EmacsConf organizers and volunteers." start="00:38:13.874" video="mainVideo" id=subtitle]]
+[[!template text="This is all from my side, folks." start="00:38:18.207" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much. Goodbye." start="00:38:20.574" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/frownies.md b/2021/captions/frownies.md
new file mode 100644
index 00000000..7ed28392
--- /dev/null
+++ b/2021/captions/frownies.md
@@ -0,0 +1,520 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi everyone! My name is Case Duckworth" start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="and I've been using Emacs" start="00:00:02.770" video="mainVideo" id=subtitle]]
+[[!template text="for about a year and a half." start="00:00:04.070" video="mainVideo" id=subtitle]]
+[[!template text="If you do the math," start="00:00:05.536" video="mainVideo" id=subtitle]]
+[[!template text="you'll see that was pretty soon" start="00:00:06.736" video="mainVideo" id=subtitle]]
+[[!template text="after the pandemic hit us in the U.S." start="00:00:08.403" video="mainVideo" id=subtitle]]
+[[!template text="While I was busy making bread" start="00:00:11.470" video="mainVideo" id=subtitle]]
+[[!template text="and walking my dogs," start="00:00:13.970" video="mainVideo" id=subtitle]]
+[[!template text="trying not to drive myself crazy" start="00:00:14.970" video="mainVideo" id=subtitle]]
+[[!template text="in the house," start="00:00:17.936" video="mainVideo" id=subtitle]]
+[[!template text="I tried Emacs again." start="00:00:18.970" video="mainVideo" id=subtitle]]
+[[!template text="I don't know if I was successful in that," start="00:00:20.603" video="mainVideo" id=subtitle]]
+[[!template text="going crazy... I mean, I still use Emacs." start="00:00:23.270" video="mainVideo" id=subtitle]]
+[[!template text="But I have been able to enjoy" start="00:00:26.936" video="mainVideo" id=subtitle]]
+[[!template text="the infinitely-malleable," start="00:00:30.436" video="mainVideo" id=subtitle]]
+[[!template text="immensely enjoyable," start="00:00:31.670" video="mainVideo" id=subtitle]]
+[[!template text="and sublimely parenthetical world" start="00:00:32.870" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs the editor," start="00:00:34.936" video="mainVideo" id=subtitle]]
+[[!template text="the community," start="00:00:36.470" video="mainVideo" id=subtitle]]
+[[!template text="and of course, the Lisp language." start="00:00:37.570" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So. And in this I'm going to" start="00:00:39.470" video="mainVideo" id=subtitle]]
+[[!template text="explore just a little anecdote of that," start="00:00:42.270" video="mainVideo" id=subtitle]]
+[[!template text="a little nugget of what I think" start="00:00:46.103" video="mainVideo" id=subtitle]]
+[[!template text="makes Emacs so great," start="00:00:48.536" video="mainVideo" id=subtitle]]
+[[!template text="using the lens of a package that I wrote" start="00:00:50.870" video="mainVideo" id=subtitle]]
+[[!template text="about a month ago now" start="00:00:53.703" video="mainVideo" id=subtitle]]
+[[!template text="called frowny.el." start="00:00:57.370" video="mainVideo" id=subtitle]]
+[[!template text="So yeah, let's go ahead and jump in." start="00:00:59.536" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, before the beginning," start="00:01:01.570" video="mainVideo" id=subtitle]]
+[[!template text="I want to talk about" start="00:01:08.236" video="mainVideo" id=subtitle]]
+[[!template text="my very beginning with Linux." start="00:01:09.036" video="mainVideo" id=subtitle]]
+[[!template text="I first installed Linux" start="00:01:10.770" video="mainVideo" id=subtitle]]
+[[!template text="for the first time" start="00:01:12.136" video="mainVideo" id=subtitle]]
+[[!template text="as a freshman in college, way back in 2008." start="00:01:13.170" video="mainVideo" id=subtitle]]
+[[!template text="I don't know if you were around," start="00:01:15.703" video="mainVideo" id=subtitle]]
+[[!template text="but 2008 was not" start="00:01:17.703" video="mainVideo" id=subtitle]]
+[[!template text="the year of the Linux desktop." start="00:01:19.503" video="mainVideo" id=subtitle]]
+[[!template text="WiFi was weird. Sound was weird." start="00:01:21.570" video="mainVideo" id=subtitle]]
+[[!template text="Everything was odd and strange and weird." start="00:01:26.803" video="mainVideo" id=subtitle]]
+[[!template text="I mean, it wasn't good." start="00:01:30.136" video="mainVideo" id=subtitle]]
+[[!template text="So, at that time," start="00:01:31.670" video="mainVideo" id=subtitle]]
+[[!template text="I knew absolutely nothing about anything." start="00:01:33.603" video="mainVideo" id=subtitle]]
+[[!template text="I installed this terrible" start="00:01:36.203" video="mainVideo" id=subtitle]]
+[[!template text="distro called gOS." start="00:01:41.203" video="mainVideo" id=subtitle]]
+[[!template text="I always forget what it's called" start="00:01:43.470" video="mainVideo" id=subtitle]]
+[[!template text="and then I looked it up." start="00:01:44.803" video="mainVideo" id=subtitle]]
+[[!template text="And this is what I looked at" start="00:01:45.703" video="mainVideo" id=subtitle]]
+[[!template text="when I signed in." start="00:01:47.636" video="mainVideo" id=subtitle]]
+[[!template text="It wasn't good." start="00:01:49.836" video="mainVideo" id=subtitle]]
+[[!template text="I think it was trying to" start="00:01:51.903" video="mainVideo" id=subtitle]]
+[[!template text="integrate better with Google tools?" start="00:01:53.203" video="mainVideo" id=subtitle]]
+[[!template text="So I was, like, oh, yeah, you know," start="00:01:57.003" video="mainVideo" id=subtitle]]
+[[!template text="Gmail and Google Calendar," start="00:01:58.870" video="mainVideo" id=subtitle]]
+[[!template text="so this will have it all there." start="00:02:00.870" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, the company's defunct now" start="00:02:02.436" video="mainVideo" id=subtitle]]
+[[!template text="and it's pretty obvious why." start="00:02:04.536" video="mainVideo" id=subtitle]]
+[[!template text="It was really bad." start="00:02:07.003" video="mainVideo" id=subtitle]]
+[[!template text="So I thought to myself," start="00:02:07.636" video="mainVideo" id=subtitle]]
+[[!template text="I'll delete the partition." start="00:02:08.903" video="mainVideo" id=subtitle]]
+[[!template text="Easy peasy. So I did," start="00:02:11.670" video="mainVideo" id=subtitle]]
+[[!template text="and I rebooted," start="00:02:12.903" video="mainVideo" id=subtitle]]
+[[!template text="and the Master Boot Record was gone," start="00:02:13.770" video="mainVideo" id=subtitle]]
+[[!template text="so I couldn't boot Windows," start="00:02:15.336" video="mainVideo" id=subtitle]]
+[[!template text="and it was all, bleah, and I was like," start="00:02:16.370" video="mainVideo" id=subtitle]]
+[[!template text="oh, shit, I have to do my schoolwork." start="00:02:17.936" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So I thought I was terribly hosed" start="00:02:24.536" video="mainVideo" id=subtitle]]
+[[!template text="so I just installed Linux." start="00:02:26.203" video="mainVideo" id=subtitle]]
+[[!template text="I think I installed Crunchbang Linux first." start="00:02:28.870" video="mainVideo" id=subtitle]]
+[[!template text="It looked like this." start="00:02:31.970" video="mainVideo" id=subtitle]]
+[[!template text="It's not super exciting." start="00:02:33.270" video="mainVideo" id=subtitle]]
+[[!template text="It was an Openbox-based, Debian-based distro" start="00:02:35.203" video="mainVideo" id=subtitle]]
+[[!template text="run by this one guy out in England." start="00:02:41.303" video="mainVideo" id=subtitle]]
+[[!template text="It was great. I really enjoyed it." start="00:02:43.403" video="mainVideo" id=subtitle]]
+[[!template text="The forums were amazing." start="00:02:46.570" video="mainVideo" id=subtitle]]
+[[!template text="It still kind of lives on" start="00:02:47.970" video="mainVideo" id=subtitle]]
+[[!template text="through a project called BunsenLabs" start="00:02:50.603" video="mainVideo" id=subtitle]]
+[[!template text="so go check them out if you want." start="00:02:53.003" video="mainVideo" id=subtitle]]
+[[!template text="It was a good time. Anyway." start="00:02:54.936" video="mainVideo" id=subtitle]]
+[[!template text="I was using that for a long time," start="00:02:56.170" video="mainVideo" id=subtitle]]
+[[!template text="and, you know, probably familiar" start="00:02:58.803" video="mainVideo" id=subtitle]]
+[[!template text="to many of you," start="00:03:00.436" video="mainVideo" id=subtitle]]
+[[!template text="I hopped around" start="00:03:01.670" video="mainVideo" id=subtitle]]
+[[!template text="from distro to distro," start="00:03:02.903" video="mainVideo" id=subtitle]]
+[[!template text="from WM to DE, just on and on and on," start="00:03:03.836" video="mainVideo" id=subtitle]]
+[[!template text="trying different things." start="00:03:08.970" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I'm not a programmer." start="00:03:10.270" video="mainVideo" id=subtitle]]
+[[!template text="I actually went to school" start="00:03:12.003" video="mainVideo" id=subtitle]]
+[[!template text="for English writing," start="00:03:12.736" video="mainVideo" id=subtitle]]
+[[!template text="and so I learned programming" start="00:03:15.136" video="mainVideo" id=subtitle]]
+[[!template text="mostly from configuring" start="00:03:17.536" video="mainVideo" id=subtitle]]
+[[!template text="different window managers." start="00:03:19.636" video="mainVideo" id=subtitle]]
+[[!template text="I learned Lua with AwesomeWM." start="00:03:20.836" video="mainVideo" id=subtitle]]
+[[!template text="I learned Haskell with Xmonad." start="00:03:23.803" video="mainVideo" id=subtitle]]
+[[!template text="Sort of Haskell. I mean, I liked Haskell." start="00:03:25.836" video="mainVideo" id=subtitle]]
+[[!template text="I like Haskell a lot," start="00:03:28.070" video="mainVideo" id=subtitle]]
+[[!template text="at least the syntax." start="00:03:30.770" video="mainVideo" id=subtitle]]
+[[!template text="It looks like words." start="00:03:32.536" video="mainVideo" id=subtitle]]
+[[!template text="You can define functions multiple times" start="00:03:36.070" video="mainVideo" id=subtitle]]
+[[!template text="for different inputs." start="00:03:40.103" video="mainVideo" id=subtitle]]
+[[!template text="It has that really great pattern matching." start="00:03:41.670" video="mainVideo" id=subtitle]]
+[[!template text="The thing I really didn't get was monads." start="00:03:42.703" video="mainVideo" id=subtitle]]
+[[!template text="What is a monad?" start="00:03:45.270" video="mainVideo" id=subtitle]]
+[[!template text="Is it a burrito? Is it a box?" start="00:03:46.570" video="mainVideo" id=subtitle]]
+[[!template text="Is it a burrito inside of a box?" start="00:03:48.103" video="mainVideo" id=subtitle]]
+[[!template text="Is it a box inside of a burrito?" start="00:03:49.770" video="mainVideo" id=subtitle]]
+[[!template text="Is there a cat involved," start="00:03:51.370" video="mainVideo" id=subtitle]]
+[[!template text="or a superposition of such?" start="00:03:53.203" video="mainVideo" id=subtitle]]
+[[!template text="I don't know. Anyway, it got confusing." start="00:03:55.336" video="mainVideo" id=subtitle]]
+[[!template text="That's really where I lost me." start="00:03:58.936" video="mainVideo" id=subtitle]]
+[[!template text="Again, you know, if you like Haskell," start="00:04:01.436" video="mainVideo" id=subtitle]]
+[[!template text="if you write Haskell," start="00:04:05.170" video="mainVideo" id=subtitle]]
+[[!template text="more power to you." start="00:04:05.970" video="mainVideo" id=subtitle]]
+[[!template text="It didn't fit my brain right." start="00:04:08.136" video="mainVideo" id=subtitle]]
+[[!template text="So that was that," start="00:04:11.370" video="mainVideo" id=subtitle]]
+[[!template text="but it kinda ruined me" start="00:04:14.403" video="mainVideo" id=subtitle]]
+[[!template text="for a lot of other programming languages," start="00:04:15.436" video="mainVideo" id=subtitle]]
+[[!template text="because the functional style" start="00:04:17.003" video="mainVideo" id=subtitle]]
+[[!template text="I really get. That part I did get." start="00:04:19.970" video="mainVideo" id=subtitle]]
+[[!template text="And stuff like Python, really," start="00:04:22.403" video="mainVideo" id=subtitle]]
+[[!template text="object orientation..." start="00:04:25.703" video="mainVideo" id=subtitle]]
+[[!template text="I would always get way too into classes" start="00:04:27.070" video="mainVideo" id=subtitle]]
+[[!template text="and figuring out this and that." start="00:04:32.570" video="mainVideo" id=subtitle]]
+[[!template text="It just didn't work for me." start="00:04:34.703" video="mainVideo" id=subtitle]]
+[[!template text="I was kind of floating." start="00:04:35.870" video="mainVideo" id=subtitle]]
+[[!template text="Learned Bash, which is, you know, Bash." start="00:04:37.870" video="mainVideo" id=subtitle]]
+[[!template text="It's fine, but it's Bash." start="00:04:41.503" video="mainVideo" id=subtitle]]
+[[!template text="It wasn't great either." start="00:04:43.603" video="mainVideo" id=subtitle]]
+[[!template text="Anyway. That was six years or so," start="00:04:46.703" video="mainVideo" id=subtitle]]
+[[!template text="just kind of did that, right." start="00:04:51.470" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And yes, I was using Vim." start="00:04:52.936" video="mainVideo" id=subtitle]]
+[[!template text="I mean... Keeps you clean, right?" start="00:04:55.870" video="mainVideo" id=subtitle]]
+[[!template text="I'm just kidding." start="00:04:58.370" video="mainVideo" id=subtitle]]
+[[!template text="I was using Vim, the editor." start="00:04:59.636" video="mainVideo" id=subtitle]]
+[[!template text="It was fine." start="00:05:02.536" video="mainVideo" id=subtitle]]
+[[!template text="It was great. I mean..." start="00:05:03.470" video="mainVideo" id=subtitle]]
+[[!template text="Emacs and Vim, they go head to head" start="00:05:05.936" video="mainVideo" id=subtitle]]
+[[!template text="because they're both 40 years old." start="00:05:08.203" video="mainVideo" id=subtitle]]
+[[!template text="They both are super powerful." start="00:05:10.536" video="mainVideo" id=subtitle]]
+[[!template text="They both have their own paradigms." start="00:05:13.270" video="mainVideo" id=subtitle]]
+[[!template text="If you get into it, then it's like" start="00:05:15.336" video="mainVideo" id=subtitle]]
+[[!template text="powpowpow, you're doing all this stuff" start="00:05:16.836" video="mainVideo" id=subtitle]]
+[[!template text="it's great." start="00:05:19.236" video="mainVideo" id=subtitle]]
+[[!template text="I wrote some plugins with Vim," start="00:05:20.503" video="mainVideo" id=subtitle]]
+[[!template text="a couple of themes, this and that," start="00:05:22.036" video="mainVideo" id=subtitle]]
+[[!template text="but you know, VimScript is not great." start="00:05:25.536" video="mainVideo" id=subtitle]]
+[[!template text="I think one of the common" start="00:05:28.636" video="mainVideo" id=subtitle]]
+[[!template text="criticisms of Elisp" start="00:05:31.803" video="mainVideo" id=subtitle]]
+[[!template text="it's like, oh, it's this weird kind of..." start="00:05:34.936" video="mainVideo" id=subtitle]]
+[[!template text="It's written for (inaudible)..." start="00:05:37.170" video="mainVideo" id=subtitle]]
+[[!template text="Tell you, it's way less than" start="00:05:38.536" video="mainVideo" id=subtitle]]
+[[!template text="VimScript is. Oof." start="00:05:43.336" video="mainVideo" id=subtitle]]
+[[!template text="Anyway. That, also, really terminal-first," start="00:05:44.470" video="mainVideo" id=subtitle]]
+[[!template text="which I used for a long time and then" start="00:05:49.670" video="mainVideo" id=subtitle]]
+[[!template text="I only think I started noticing" start="00:05:52.570" video="mainVideo" id=subtitle]]
+[[!template text="now that I'm using Emacs more," start="00:05:54.436" video="mainVideo" id=subtitle]]
+[[!template text="like, that terminal-first workflow," start="00:05:56.236" video="mainVideo" id=subtitle]]
+[[!template text="again, for my brain," start="00:05:57.803" video="mainVideo" id=subtitle]]
+[[!template text="it doesn't super work for me." start="00:06:01.136" video="mainVideo" id=subtitle]]
+[[!template text="I always had this Platonic ideal" start="00:06:02.803" video="mainVideo" id=subtitle]]
+[[!template text="of what a workflow should look like," start="00:06:06.636" video="mainVideo" id=subtitle]]
+[[!template text="and I was always working towards it." start="00:06:08.470" video="mainVideo" id=subtitle]]
+[[!template text="I would run into this problem" start="00:06:10.836" video="mainVideo" id=subtitle]]
+[[!template text="and I wouldn't know how to solve it." start="00:06:12.803" video="mainVideo" id=subtitle]]
+[[!template text="so I kind of quit. Do something else." start="00:06:14.003" video="mainVideo" id=subtitle]]
+[[!template text="I think that's part of why" start="00:06:15.736" video="mainVideo" id=subtitle]]
+[[!template text="I had so much churn" start="00:06:17.003" video="mainVideo" id=subtitle]]
+[[!template text="for such a long time." start="00:06:17.836" video="mainVideo" id=subtitle]]
+[[!template text="Because at the end of the day," start="00:06:18.670" video="mainVideo" id=subtitle]]
+[[!template text="window managing, you're just" start="00:06:20.336" video="mainVideo" id=subtitle]]
+[[!template text="moving around little boxes on your screen." start="00:06:23.936" video="mainVideo" id=subtitle]]
+[[!template text="So I was spinning wheels" start="00:06:26.567" video="mainVideo" id=subtitle]]
+[[!template text="for a long time." start="00:06:30.536" video="mainVideo" id=subtitle]]
+[[!template text="But yes. And it wasn't like" start="00:06:31.203" video="mainVideo" id=subtitle]]
+[[!template text="it was all bad." start="00:06:36.203" video="mainVideo" id=subtitle]]
+[[!template text="Most of this stuff" start="00:06:36.803" video="mainVideo" id=subtitle]]
+[[!template text="just came out now that" start="00:06:38.036" video="mainVideo" id=subtitle]]
+[[!template text="I'm thinking about it," start="00:06:39.603" video="mainVideo" id=subtitle]]
+[[!template text="now that I'm kind of going through this" start="00:06:40.236" video="mainVideo" id=subtitle]]
+[[!template text="in my head, like, that part of it wasn't great." start="00:06:42.970" video="mainVideo" id=subtitle]]
+[[!template text="I was having a good time." start="00:06:45.736" video="mainVideo" id=subtitle]]
+[[!template text="I was still... Open source," start="00:06:46.703" video="mainVideo" id=subtitle]]
+[[!template text="I was getting in the community." start="00:06:48.670" video="mainVideo" id=subtitle]]
+[[!template text="I was doing all this stuff." start="00:06:49.936" video="mainVideo" id=subtitle]]
+[[!template text="It was all great." start="00:06:50.603" video="mainVideo" id=subtitle]]
+[[!template new="1" text="But anyway, the pandemic hit, obviously," start="00:06:51.803" video="mainVideo" id=subtitle]]
+[[!template text="really hard, last spring, in the US." start="00:06:56.336" video="mainVideo" id=subtitle]]
+[[!template text="And here we are," start="00:06:58.736" video="mainVideo" id=subtitle]]
+[[!template text="talking about the pandemic in 2021." start="00:07:00.870" video="mainVideo" id=subtitle]]
+[[!template text="Can you imagine?" start="00:07:03.070" video="mainVideo" id=subtitle]]
+[[!template text="So, I didn't lose my job." start="00:07:04.370" video="mainVideo" id=subtitle]]
+[[!template text="Thank goodness." start="00:07:05.836" video="mainVideo" id=subtitle]]
+[[!template text="But I did... I work for the government," start="00:07:06.903" video="mainVideo" id=subtitle]]
+[[!template text="I was sent home for two months." start="00:07:09.236" video="mainVideo" id=subtitle]]
+[[!template text="I had all this free time on my hands." start="00:07:10.236" video="mainVideo" id=subtitle]]
+[[!template text="I got into baking," start="00:07:11.803" video="mainVideo" id=subtitle]]
+[[!template text="I bought a 50-pound bag of flour." start="00:07:13.903" video="mainVideo" id=subtitle]]
+[[!template text="I started a bread-themed tilde server," start="00:07:16.236" video="mainVideo" id=subtitle]]
+[[!template text="you know, those shared Unix servers" start="00:07:18.470" video="mainVideo" id=subtitle]]
+[[!template text="all the cool kids talk about?" start="00:07:20.436" video="mainVideo" id=subtitle]]
+[[!template text="Yeah, it's breadpunk.club, go check it out!" start="00:07:21.803" video="mainVideo" id=subtitle]]
+[[!template text="Join if you want. Anyway. Yeah." start="00:07:26.970" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So I decided to try Emacs again." start="00:07:29.770" video="mainVideo" id=subtitle]]
+[[!template text="Kind of on a whim, I think." start="00:07:32.703" video="mainVideo" id=subtitle]]
+[[!template text="I don't super remember, but I think I did." start="00:07:33.803" video="mainVideo" id=subtitle]]
+[[!template text="I tried Spacemacs. It didn't stick." start="00:07:36.170" video="mainVideo" id=subtitle]]
+[[!template text="Spacemacs was trying to be Vim," start="00:07:42.103" video="mainVideo" id=subtitle]]
+[[!template text="but enough things didn't fit in" start="00:07:44.036" video="mainVideo" id=subtitle]]
+[[!template text="with what I was expecting" start="00:07:46.403" video="mainVideo" id=subtitle]]
+[[!template text="with my Vim workflow." start="00:07:48.636" video="mainVideo" id=subtitle]]
+[[!template text="All sorts of plugins that did certain things" start="00:07:50.603" video="mainVideo" id=subtitle]]
+[[!template text="and I didn't know to just get into Spacemacs." start="00:07:53.836" video="mainVideo" id=subtitle]]
+[[!template text="It just didn't work for me." start="00:07:57.270" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I tried Emacs. This time, it stuck." start="00:08:01.070" video="mainVideo" id=subtitle]]
+[[!template text="I started out just vanilla," start="00:08:05.436" video="mainVideo" id=subtitle]]
+[[!template text="basic no init.el," start="00:08:07.370" video="mainVideo" id=subtitle]]
+[[!template text="then I wrote an init.el," start="00:08:09.470" video="mainVideo" id=subtitle]]
+[[!template text="and then I rewrote my init.el," start="00:08:11.103" video="mainVideo" id=subtitle]]
+[[!template text="and then I took my init.el, crumpled it up," start="00:08:12.636" video="mainVideo" id=subtitle]]
+[[!template text="threw it in the trash can," start="00:08:16.570" video="mainVideo" id=subtitle]]
+[[!template text="wrote it again from scratch." start="00:08:17.736" video="mainVideo" id=subtitle]]
+[[!template text="I'm actually currently" start="00:08:19.603" video="mainVideo" id=subtitle]]
+[[!template text="in the middle of Bankruptcy #8," start="00:08:21.203" video="mainVideo" id=subtitle]]
+[[!template text="which I think I really got this time." start="00:08:23.036" video="mainVideo" id=subtitle]]
+[[!template text="It's either that or Number 9." start="00:08:25.136" video="mainVideo" id=subtitle]]
+[[!template text="So I have 1700-ish commits." start="00:08:29.036" video="mainVideo" id=subtitle]]
+[[!template text="I also have like, 3 or 4 .emacs repositories" start="00:08:32.936" video="mainVideo" id=subtitle]]
+[[!template text="around my various Git hosting platforms" start="00:08:37.536" video="mainVideo" id=subtitle]]
+[[!template text="that I use." start="00:08:41.500" video="mainVideo" id=subtitle]]
+[[!template text="I was on GitHub, GitLab, ~/git..." start="00:08:42.270" video="mainVideo" id=subtitle]]
+[[!template text="I don't use Git very well." start="00:08:44.103" video="mainVideo" id=subtitle]]
+[[!template text="I'm very much amateur in that entire thing." start="00:08:47.403" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Anyway, that is all to say" start="00:08:50.003" video="mainVideo" id=subtitle]]
+[[!template text="I got into it, right." start="00:08:52.970" video="mainVideo" id=subtitle]]
+[[!template text="Like, really into it." start="00:08:55.170" video="mainVideo" id=subtitle]]
+[[!template text="I was watching" start="00:08:57.470" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Conference videos. Live." start="00:08:59.000" video="mainVideo" id=subtitle]]
+[[!template text="I was reading /r/emacs." start="00:09:02.136" video="mainVideo" id=subtitle]]
+[[!template text="I was reading Planet Emacs." start="00:09:06.003" video="mainVideo" id=subtitle]]
+[[!template text="I subscribed to both." start="00:09:07.036" video="mainVideo" id=subtitle]]
+[[!template text="I have other blogs that I read." start="00:09:09.036" video="mainVideo" id=subtitle]]
+[[!template text="All the greats." start="00:09:11.603" video="mainVideo" id=subtitle]]
+[[!template text="Everyone who's presenting here, probably." start="00:09:13.570" video="mainVideo" id=subtitle]]
+[[!template text="I started watching people on YouTube" start="00:09:16.203" video="mainVideo" id=subtitle]]
+[[!template text="like Prot, like David Wilson" start="00:09:18.836" video="mainVideo" id=subtitle]]
+[[!template text="who does System Crafters." start="00:09:20.803" video="mainVideo" id=subtitle]]
+[[!template text="I was already on IRC" start="00:09:23.003" video="mainVideo" id=subtitle]]
+[[!template text="with the tildeverse," start="00:09:25.336" video="mainVideo" id=subtitle]]
+[[!template text="and so I hopped over to #emacs on Freenode" start="00:09:26.836" video="mainVideo" id=subtitle]]
+[[!template text="(remember Freenode?)." start="00:09:29.670" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, it was a good time." start="00:09:30.936" video="mainVideo" id=subtitle]]
+[[!template text="So I was doing all this stuff." start="00:09:34.403" video="mainVideo" id=subtitle]]
+[[!template text="And... oh yeah. Right." start="00:09:36.003" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, so that's all to say..." start="00:09:38.236" video="mainVideo" id=subtitle]]
+[[!template text="Frowns. I was on #systemcrafters channel" start="00:09:40.636" video="mainVideo" id=subtitle]]
+[[!template text="on libera.chat," start="00:09:46.736" video="mainVideo" id=subtitle]]
+[[!template text="the channel for the YouTube channel" start="00:09:47.970" video="mainVideo" id=subtitle]]
+[[!template text="System Crafters by David Wilson." start="00:09:51.203" video="mainVideo" id=subtitle]]
+[[!template text="I think he's on later." start="00:09:53.403" video="mainVideo" id=subtitle]]
+[[!template text="I'm sure he'll talk about it." start="00:09:55.436" video="mainVideo" id=subtitle]]
+[[!template text="I don't know what he's talking about." start="00:09:57.070" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, one day we were chatting" start="00:09:58.370" video="mainVideo" id=subtitle]]
+[[!template text="and this guy alphapapa, who also" start="00:10:01.270" video="mainVideo" id=subtitle]]
+[[!template text="has written a lot of these packages, said" start="00:10:02.770" video="mainVideo" id=subtitle]]
+[[!template text="&quot;electric-pair-mode messes up" start="00:10:08.236" video="mainVideo" id=subtitle]]
+[[!template text="my frowny faces sometimes.&quot;" start="00:10:09.370" video="mainVideo" id=subtitle]]
+[[!template text="You can see here" start="00:10:10.733" video="mainVideo" id=subtitle]]
+[[!template text="this frowny, what is this..." start="00:10:14.036" video="mainVideo" id=subtitle]]
+[[!template text="You can see it there on the screen." start="00:10:15.170" video="mainVideo" id=subtitle]]
+[[!template text="What is that, right?" start="00:10:23.136" video="mainVideo" id=subtitle]]
+[[!template text="It's terrifying." start="00:10:24.303" video="mainVideo" id=subtitle]]
+[[!template text="What is this?" start="00:10:27.070" video="mainVideo" id=subtitle]]
+[[!template text="What is that?" start="00:10:28.203" video="mainVideo" id=subtitle]]
+[[!template text="I don't know." start="00:10:30.970" video="mainVideo" id=subtitle]]
+[[!template text="I don't know what that is." start="00:10:31.803" video="mainVideo" id=subtitle]]
+[[!template text="And then I said, you know," start="00:10:32.736" video="mainVideo" id=subtitle]]
+[[!template text="&quot;I have a hook" start="00:10:34.736" video="mainVideo" id=subtitle]]
+[[!template text="that disables electric-pair-mode" start="00:10:35.567" video="mainVideo" id=subtitle]]
+[[!template text="for chat buffers.&quot;" start="00:10:36.536" video="mainVideo" id=subtitle]]
+[[!template text="Which, actually, fun fact," start="00:10:37.970" video="mainVideo" id=subtitle]]
+[[!template text="I was lying." start="00:10:39.136" video="mainVideo" id=subtitle]]
+[[!template text="Not that that matters." start="00:10:40.167" video="mainVideo" id=subtitle]]
+[[!template text="I have a hook." start="00:10:41.836" video="mainVideo" id=subtitle]]
+[[!template text="You could have a hook" start="00:10:43.370" video="mainVideo" id=subtitle]]
+[[!template text="that just disables electric-pair-mode" start="00:10:44.436" video="mainVideo" id=subtitle]]
+[[!template text="in chat buffers." start="00:10:46.203" video="mainVideo" id=subtitle]]
+[[!template text="To which he replied," start="00:10:46.800" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Yeah, but I want electric-pair-mode" start="00:10:47.803" video="mainVideo" id=subtitle]]
+[[!template text="everywhere, except for" start="00:10:50.667" video="mainVideo" id=subtitle]]
+[[!template text="when I type a frowny face.&quot;" start="00:10:51.900" video="mainVideo" id=subtitle]]
+[[!template text="And this sandwich face. What is that?" start="00:10:53.670" video="mainVideo" id=subtitle]]
+[[!template text="He said, &quot;I could stop typing frowny faces.&quot;" start="00:10:56.503" video="mainVideo" id=subtitle]]
+[[!template text="And then I said, &quot;Hmm...&quot;" start="00:10:59.870" video="mainVideo" id=subtitle]]
+[[!template text="And then I said, &quot;I feel like" start="00:11:01.270" video="mainVideo" id=subtitle]]
+[[!template text="you're in the best position" start="00:11:02.533" video="mainVideo" id=subtitle]]
+[[!template text="to write a package, like frowny.el,&quot;" start="00:11:03.200" video="mainVideo" id=subtitle]]
+[[!template text="I said as a joke." start="00:11:05.336" video="mainVideo" id=subtitle]]
+[[!template text="And then conversation went on," start="00:11:07.270" video="mainVideo" id=subtitle]]
+[[!template text="we talked about... made some jokes" start="00:11:10.636" video="mainVideo" id=subtitle]]
+[[!template text="about Lisp and all that stuff" start="00:11:12.636" video="mainVideo" id=subtitle]]
+[[!template text="So anyway, went on, went on," start="00:11:14.670" video="mainVideo" id=subtitle]]
+[[!template text="and then apparently," start="00:11:18.370" video="mainVideo" id=subtitle]]
+[[!template text="23 minutes later," start="00:11:20.503" video="mainVideo" id=subtitle]]
+[[!template text="I had a frowny.el package" start="00:11:21.703" video="mainVideo" id=subtitle]]
+[[!template text="just wrote up real quick." start="00:11:24.603" video="mainVideo" id=subtitle]]
+[[!template text="And yeah. That was it." start="00:11:26.770" video="mainVideo" id=subtitle]]
+[[!template text="I said, you know, buddy," start="00:11:30.903" video="mainVideo" id=subtitle]]
+[[!template text="anyway..." start="00:11:31.803" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So now we're going to look at" start="00:11:33.070" video="mainVideo" id=subtitle]]
+[[!template text="the package that I wrote." start="00:11:34.270" video="mainVideo" id=subtitle]]
+[[!template text="frowny.el." start="00:11:35.803" video="mainVideo" id=subtitle]]
+[[!template text="It was actually pretty easy." start="00:11:36.970" video="mainVideo" id=subtitle]]
+[[!template text="Let's see here." start="00:11:40.070" video="mainVideo" id=subtitle]]
+[[!template text="This is it now." start="00:11:41.936" video="mainVideo" id=subtitle]]
+[[!template text="I kind of want to go back into..." start="00:11:44.170" video="mainVideo" id=subtitle]]
+[[!template text="Let's go back to the very beginning." start="00:11:50.203" video="mainVideo" id=subtitle]]
+[[!template text="We'll see what we have here." start="00:11:53.236" video="mainVideo" id=subtitle]]
+[[!template text="Here's our very first," start="00:11:56.536" video="mainVideo" id=subtitle]]
+[[!template text="my very first commit." start="00:11:57.303" video="mainVideo" id=subtitle]]
+[[!template text="I already had all of this crap." start="00:11:59.370" video="mainVideo" id=subtitle]]
+[[!template text="Oh, I already did have a..." start="00:12:03.370" video="mainVideo" id=subtitle]]
+[[!template text="I had a defgroup, I had frowny-eyes..." start="00:12:05.736" video="mainVideo" id=subtitle]]
+[[!template text="This is basically the way I thought it was." start="00:12:08.336" video="mainVideo" id=subtitle]]
+[[!template text="You want to insert a frowny face." start="00:12:11.236" video="mainVideo" id=subtitle]]
+[[!template text="You type in the colon," start="00:12:14.736" video="mainVideo" id=subtitle]]
+[[!template text="or the equal sign, or whatever." start="00:12:16.670" video="mainVideo" id=subtitle]]
+[[!template text="for the eyes," start="00:12:18.670" video="mainVideo" id=subtitle]]
+[[!template text="and then you type the open parenthesis" start="00:12:19.836" video="mainVideo" id=subtitle]]
+[[!template text="for the frown." start="00:12:21.436" video="mainVideo" id=subtitle]]
+[[!template text="And the problem is that" start="00:12:22.836" video="mainVideo" id=subtitle]]
+[[!template text="the parenthesis then triggers" start="00:12:25.703" video="mainVideo" id=subtitle]]
+[[!template text="electric-pair-mode." start="00:12:27.870" video="mainVideo" id=subtitle]]
+[[!template text="It's like, oh, no, I got" start="00:12:29.170" video="mainVideo" id=subtitle]]
+[[!template text="a close parenthesis." start="00:12:30.303" video="mainVideo" id=subtitle]]
+[[!template text="So we just short-circuit that" start="00:12:32.503" video="mainVideo" id=subtitle]]
+[[!template text="whenever there's a thing," start="00:12:33.836" video="mainVideo" id=subtitle]]
+[[!template text="a colon or equals sign before," start="00:12:36.270" video="mainVideo" id=subtitle]]
+[[!template text="and just insert the thing." start="00:12:38.636" video="mainVideo" id=subtitle]]
+[[!template text="Where did it go?" start="00:12:40.136" video="mainVideo" id=subtitle]]
+[[!template text="That's kind of what I did." start="00:12:41.736" video="mainVideo" id=subtitle]]
+[[!template text="So I wrote out... This is it." start="00:12:43.303" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This is the whole package." start="00:12:45.370" video="mainVideo" id=subtitle]]
+[[!template text="It's one function, one minor mode," start="00:12:46.603" video="mainVideo" id=subtitle]]
+[[!template text="one defcustom, and one group. That's it." start="00:12:49.803" video="mainVideo" id=subtitle]]
+[[!template text="Super simple." start="00:12:52.536" video="mainVideo" id=subtitle]]
+[[!template text="Basically, all it does is" start="00:12:54.303" video="mainVideo" id=subtitle]]
+[[!template text="it inserts a frowny" start="00:12:56.970" video="mainVideo" id=subtitle]]
+[[!template text="if it looks back and sees frowny eyes" start="00:12:59.803" video="mainVideo" id=subtitle]]
+[[!template text="which are up here." start="00:13:04.603" video="mainVideo" id=subtitle]]
+[[!template text="The eyes are up here." start="00:13:07.536" video="mainVideo" id=subtitle]]
+[[!template text="Colon, equals sign..." start="00:13:08.136" video="mainVideo" id=subtitle]]
+[[!template text="and then it inserts it" start="00:13:11.536" video="mainVideo" id=subtitle]]
+[[!template text="or it does a self insert command." start="00:13:13.336" video="mainVideo" id=subtitle]]
+[[!template text="That simple." start="00:13:15.970" video="mainVideo" id=subtitle]]
+[[!template text="self-insert-command is what" start="00:13:17.636" video="mainVideo" id=subtitle]]
+[[!template text="electric-pair-mode hooks into." start="00:13:18.803" video="mainVideo" id=subtitle]]
+[[!template text="So that's it." start="00:13:22.770" video="mainVideo" id=subtitle]]
+[[!template text="And then the minor mode" start="00:13:24.370" video="mainVideo" id=subtitle]]
+[[!template text="just makes it a minor mode." start="00:13:25.503" video="mainVideo" id=subtitle]]
+[[!template text="So that was that." start="00:13:27.070" video="mainVideo" id=subtitle]]
+[[!template text="And you know, that worked just fine." start="00:13:28.503" video="mainVideo" id=subtitle]]
+[[!template text="That's the thing. It works just fine." start="00:13:32.436" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Of course, after that," start="00:13:35.670" video="mainVideo" id=subtitle]]
+[[!template text="I had it do a couple of different things." start="00:13:37.270" video="mainVideo" id=subtitle]]
+[[!template text="I added a mascot." start="00:13:39.103" video="mainVideo" id=subtitle]]
+[[!template text="I had to add a README." start="00:13:40.236" video="mainVideo" id=subtitle]]
+[[!template text="I added a global-frowny-mode" start="00:13:42.370" video="mainVideo" id=subtitle]]
+[[!template text="which was kind of interesting" start="00:13:45.070" video="mainVideo" id=subtitle]]
+[[!template text="because I had to figure out" start="00:13:49.036" video="mainVideo" id=subtitle]]
+[[!template text="turn on the frowny mode," start="00:13:49.870" video="mainVideo" id=subtitle]]
+[[!template text="I wrote this define-globalized-minor-mode" start="00:13:51.603" video="mainVideo" id=subtitle]]
+[[!template text="which... is that the one" start="00:13:56.336" video="mainVideo" id=subtitle]]
+[[!template text="No, that one's not super new." start="00:13:58.603" video="mainVideo" id=subtitle]]
+[[!template text="There was another one. Something else" start="00:14:00.870" video="mainVideo" id=subtitle]]
+[[!template text="that was actually for 28 or 27," start="00:14:04.203" video="mainVideo" id=subtitle]]
+[[!template text="and I tried using it at work," start="00:14:07.170" video="mainVideo" id=subtitle]]
+[[!template text="where I have Windows" start="00:14:09.036" video="mainVideo" id=subtitle]]
+[[!template text="and it was 27," start="00:14:10.970" video="mainVideo" id=subtitle]]
+[[!template text="so it must have been for 28." start="00:14:13.436" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, something didn't work" start="00:14:14.670" video="mainVideo" id=subtitle]]
+[[!template text="and I had to do all this stuff." start="00:14:16.103" video="mainVideo" id=subtitle]]
+[[!template text="Oops, sorry." start="00:14:17.170" video="mainVideo" id=subtitle]]
+[[!template text="I added some customization options," start="00:14:20.870" video="mainVideo" id=subtitle]]
+[[!template text="made package-lint happy..." start="00:14:23.070" video="mainVideo" id=subtitle]]
+[[!template text="So yeah, let's see." start="00:14:25.370" video="mainVideo" id=subtitle]]
+[[!template text="That's 0.1." start="00:14:27.336" video="mainVideo" id=subtitle]]
+[[!template text="This version 0.1 was basically" start="00:14:30.170" video="mainVideo" id=subtitle]]
+[[!template text="basic information." start="00:14:33.370" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So then somebody... I put it on GitHub," start="00:14:36.770" video="mainVideo" id=subtitle]]
+[[!template text="good to go." start="00:14:39.670" video="mainVideo" id=subtitle]]
+[[!template text="It actually got some traction on Reddit." start="00:14:40.270" video="mainVideo" id=subtitle]]
+[[!template text="alphapapa, shout out to you" start="00:14:43.103" video="mainVideo" id=subtitle]]
+[[!template text="who posted it there." start="00:14:45.903" video="mainVideo" id=subtitle]]
+[[!template text="But then I got an issue." start="00:14:47.303" video="mainVideo" id=subtitle]]
+[[!template text="Somebody said, hey, could you add" start="00:14:50.636" video="mainVideo" id=subtitle]]
+[[!template text="smiley support?" start="00:14:51.770" video="mainVideo" id=subtitle]]
+[[!template text="I was, like, well," start="00:14:52.936" video="mainVideo" id=subtitle]]
+[[!template text="I don't really understand" start="00:14:54.403" video="mainVideo" id=subtitle]]
+[[!template text="why that's important." start="00:14:55.070" video="mainVideo" id=subtitle]]
+[[!template text="Well, you know, why not?" start="00:14:56.003" video="mainVideo" id=subtitle]]
+[[!template text="They had a use case for it, I forget," start="00:14:58.236" video="mainVideo" id=subtitle]]
+[[!template text="but they had a use case for it." start="00:15:01.270" video="mainVideo" id=subtitle]]
+[[!template text="So, okay, fine." start="00:15:02.270" video="mainVideo" id=subtitle]]
+[[!template text="So I added smiley support right here." start="00:15:03.770" video="mainVideo" id=subtitle]]
+[[!template text="Oh, and I added some more eyes" start="00:15:05.270" video="mainVideo" id=subtitle]]
+[[!template text="at some point." start="00:15:12.570" video="mainVideo" id=subtitle]]
+[[!template text="Now you have... you can do a tear." start="00:15:13.670" video="mainVideo" id=subtitle]]
+[[!template text="You can do a nose." start="00:15:16.736" video="mainVideo" id=subtitle]]
+[[!template text="Let's see..." start="00:15:18.103" video="mainVideo" id=subtitle]]
+[[!template text="I had to change frowny-self-insert" start="00:15:23.603" video="mainVideo" id=subtitle]]
+[[!template text="to frowny-insert-character," start="00:15:27.270" video="mainVideo" id=subtitle]]
+[[!template text="I added frowny-self-insert-frowny" start="00:15:28.803" video="mainVideo" id=subtitle]]
+[[!template text="right here." start="00:15:33.400" video="mainVideo" id=subtitle]]
+[[!template text="I added... I had an obsolete function alias." start="00:15:34.170" video="mainVideo" id=subtitle]]
+[[!template text="That was super fun." start="00:15:38.536" video="mainVideo" id=subtitle]]
+[[!template text="That was a cool thing to do." start="00:15:39.503" video="mainVideo" id=subtitle]]
+[[!template text="I have insert-smiley as well." start="00:15:40.870" video="mainVideo" id=subtitle]]
+[[!template text="They're both very similar." start="00:15:43.970" video="mainVideo" id=subtitle]]
+[[!template text="They're all still there." start="00:15:45.536" video="mainVideo" id=subtitle]]
+[[!template text="I added a keymap." start="00:15:47.336" video="mainVideo" id=subtitle]]
+[[!template text="That was pretty much it." start="00:15:49.403" video="mainVideo" id=subtitle]]
+[[!template text="And you know, again," start="00:15:50.833" video="mainVideo" id=subtitle]]
+[[!template text="super simple, very small." start="00:15:51.303" video="mainVideo" id=subtitle]]
+[[!template text="Let me try this again." start="00:15:54.203" video="mainVideo" id=subtitle]]
+[[!template text="I added comments and docstrings." start="00:15:56.270" video="mainVideo" id=subtitle]]
+[[!template new="1" text="At some point, I decided" start="00:15:58.336" video="mainVideo" id=subtitle]]
+[[!template text="let me try to make a frowny prog mode" start="00:15:59.170" video="mainVideo" id=subtitle]]
+[[!template text="that only works in programming modes," start="00:16:03.870" video="mainVideo" id=subtitle]]
+[[!template text="that only works in strings" start="00:16:06.236" video="mainVideo" id=subtitle]]
+[[!template text="and in comments, but..." start="00:16:07.536" video="mainVideo" id=subtitle]]
+[[!template text="There's still a branch for it," start="00:16:09.303" video="mainVideo" id=subtitle]]
+[[!template text="if you want to go check it out." start="00:16:11.803" video="mainVideo" id=subtitle]]
+[[!template text="It wasn't super useful," start="00:16:14.003" video="mainVideo" id=subtitle]]
+[[!template text="and I think, actually," start="00:16:15.303" video="mainVideo" id=subtitle]]
+[[!template text="electric-pair-mode already does that." start="00:16:16.336" video="mainVideo" id=subtitle]]
+[[!template text="I'm not a hundred percent sure." start="00:16:18.136" video="mainVideo" id=subtitle]]
+[[!template text="I got a pull request" start="00:16:19.070" video="mainVideo" id=subtitle]]
+[[!template text="from alphapapa, adding HISTORY.org." start="00:16:21.503" video="mainVideo" id=subtitle]]
+[[!template text="So you can go read the IRC logs about it." start="00:16:23.903" video="mainVideo" id=subtitle]]
+[[!template text="There's... Let's see..." start="00:16:26.170" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And then just recently," start="00:16:29.703" video="mainVideo" id=subtitle]]
+[[!template text="I actually had to add frowny-inhibit-modes" start="00:16:31.236" video="mainVideo" id=subtitle]]
+[[!template text="because with dired, I kept getting this..." start="00:16:33.636" video="mainVideo" id=subtitle]]
+[[!template text="I would try to hit open parenthesis" start="00:16:39.603" video="mainVideo" id=subtitle]]
+[[!template text="which is my dired-hide-details-mode," start="00:16:43.236" video="mainVideo" id=subtitle]]
+[[!template text="but it kept saying, hey," start="00:16:47.536" video="mainVideo" id=subtitle]]
+[[!template text="it's a read-only buffer. I'm, like, what?" start="00:16:50.536" video="mainVideo" id=subtitle]]
+[[!template text="Oh yeah! Right! It's Emacs. I can C-h k" start="00:16:51.903" video="mainVideo" id=subtitle]]
+[[!template text="and then (, and oh, frowny-self-insert." start="00:16:55.303" video="mainVideo" id=subtitle]]
+[[!template text="Oh, duh. So I had to add" start="00:16:59.703" video="mainVideo" id=subtitle]]
+[[!template text="this little frowny-inhibit-modes bit." start="00:17:01.636" video="mainVideo" id=subtitle]]
+[[!template text="So now there's a little custom in here." start="00:17:05.036" video="mainVideo" id=subtitle]]
+[[!template text="Right now, it just defaults to special-mode." start="00:17:06.836" video="mainVideo" id=subtitle]]
+[[!template text="I added dired myself on my config." start="00:17:09.136" video="mainVideo" id=subtitle]]
+[[!template text="I might add that as a default as well." start="00:17:12.170" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to think about it." start="00:17:14.236" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And then, yeah. So now we're at version 0.3," start="00:17:15.270" video="mainVideo" id=subtitle]]
+[[!template text="that's where we're at now." start="00:17:21.536" video="mainVideo" id=subtitle]]
+[[!template text="I just updated the README with the last one." start="00:17:23.470" video="mainVideo" id=subtitle]]
+[[!template text="Basically, lots of functionality," start="00:17:26.070" video="mainVideo" id=subtitle]]
+[[!template text="plus this frowny-inhibit-mode," start="00:17:28.603" video="mainVideo" id=subtitle]]
+[[!template text="and yeah, now it is just..." start="00:17:30.303" video="mainVideo" id=subtitle]]
+[[!template text="This is it. This is the whole thing" start="00:17:32.836" video="mainVideo" id=subtitle]]
+[[!template text="right here. It's pretty short." start="00:17:34.503" video="mainVideo" id=subtitle]]
+[[!template text="I think it's a total of 113 lines." start="00:17:36.736" video="mainVideo" id=subtitle]]
+[[!template text="But you know what, it's got..." start="00:17:39.103" video="mainVideo" id=subtitle]]
+[[!template text="It's useful for people," start="00:17:42.203" video="mainVideo" id=subtitle]]
+[[!template text="and it's something where" start="00:17:43.803" video="mainVideo" id=subtitle]]
+[[!template text="I never thought I would write" start="00:17:45.136" video="mainVideo" id=subtitle]]
+[[!template text="software that people would use." start="00:17:47.770" video="mainVideo" id=subtitle]]
+[[!template text="As I said, I'm not a programmer." start="00:17:49.470" video="mainVideo" id=subtitle]]
+[[!template text="I'm just this guy." start="00:17:51.136" video="mainVideo" id=subtitle]]
+[[!template text="I like using Emacs" start="00:17:54.003" video="mainVideo" id=subtitle]]
+[[!template text="because I'm kind of a nerd." start="00:17:55.070" video="mainVideo" id=subtitle]]
+[[!template text="I like tinkering around" start="00:17:56.103" video="mainVideo" id=subtitle]]
+[[!template text="and doing things the hard way." start="00:17:57.436" video="mainVideo" id=subtitle]]
+[[!template text="I don't... I could use Microsoft Word." start="00:17:58.436" video="mainVideo" id=subtitle]]
+[[!template text="I should. I was trying to" start="00:18:02.570" video="mainVideo" id=subtitle]]
+[[!template text="write this presentation up" start="00:18:04.136" video="mainVideo" id=subtitle]]
+[[!template text="and my wife said, &quot;Why don't you just" start="00:18:06.136" video="mainVideo" id=subtitle]]
+[[!template text="write it in Google Docs?&quot;" start="00:18:07.500" video="mainVideo" id=subtitle]]
+[[!template text="And I said, &quot;I don't want to.&quot;" start="00:18:08.903" video="mainVideo" id=subtitle]]
+[[!template text="I mean, that's really it." start="00:18:11.503" video="mainVideo" id=subtitle]]
+[[!template text="Isn't that why we're all here?" start="00:18:13.036" video="mainVideo" id=subtitle]]
+[[!template text="So yeah, you know," start="00:18:15.036" video="mainVideo" id=subtitle]]
+[[!template text="so anyway, that's the story about frowny" start="00:18:18.936" video="mainVideo" id=subtitle]]
+[[!template text="That's the story about me," start="00:18:21.003" video="mainVideo" id=subtitle]]
+[[!template text="my journey to Emacs," start="00:18:22.270" video="mainVideo" id=subtitle]]
+[[!template text="my journey to this conference," start="00:18:25.436" video="mainVideo" id=subtitle]]
+[[!template text="and the journey of this package." start="00:18:27.136" video="mainVideo" id=subtitle]]
+[[!template text="I think it's about done." start="00:18:30.636" video="mainVideo" id=subtitle]]
+[[!template text="I'm not sure what else needs to go in there." start="00:18:32.536" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If you have any suggestions," start="00:18:36.136" video="mainVideo" id=subtitle]]
+[[!template text="pull requests, comments," start="00:18:38.103" video="mainVideo" id=subtitle]]
+[[!template text="there's a GitHub right here," start="00:18:39.803" video="mainVideo" id=subtitle]]
+[[!template text="frowny.el." start="00:18:43.370" video="mainVideo" id=subtitle]]
+[[!template text="Let's see if I can pull it up." start="00:18:45.436" video="mainVideo" id=subtitle]]
+[[!template text="frowny.el." start="00:18:49.236" video="mainVideo" id=subtitle]]
+[[!template text="I'll put it on (inaudible)." start="00:18:52.370" video="mainVideo" id=subtitle]]
+[[!template text="That's something I still don't understand." start="00:18:55.236" video="mainVideo" id=subtitle]]
+[[!template text="Packages, the whole keywords thing..." start="00:18:57.336" video="mainVideo" id=subtitle]]
+[[!template text="I'm still confused on that." start="00:18:59.203" video="mainVideo" id=subtitle]]
+[[!template text="But yeah. Just requires Emacs 24." start="00:19:00.236" video="mainVideo" id=subtitle]]
+[[!template text="That's it. So anyway," start="00:19:04.636" video="mainVideo" id=subtitle]]
+[[!template text="I'm not sure if I'm going to be" start="00:19:09.970" video="mainVideo" id=subtitle]]
+[[!template text="live for questions." start="00:19:12.470" video="mainVideo" id=subtitle]]
+[[!template text="I'm recording this, obviously," start="00:19:13.803" video="mainVideo" id=subtitle]]
+[[!template text="a bit before," start="00:19:14.736" video="mainVideo" id=subtitle]]
+[[!template text="and I will be travelling that weekend," start="00:19:15.903" video="mainVideo" id=subtitle]]
+[[!template text="this weekend, when you're watching this," start="00:19:18.636" video="mainVideo" id=subtitle]]
+[[!template text="so I'm going to... But right now," start="00:19:20.303" video="mainVideo" id=subtitle]]
+[[!template text="I'm recording it, I'm not 100% sure." start="00:19:25.236" video="mainVideo" id=subtitle]]
+[[!template text="I will know obviously by then." start="00:19:26.836" video="mainVideo" id=subtitle]]
+[[!template text="So maybe I'll talk to you" start="00:19:28.636" video="mainVideo" id=subtitle]]
+[[!template text="in a moment, maybe not." start="00:19:30.003" video="mainVideo" id=subtitle]]
+[[!template text="Otherwise, have a" start="00:19:31.070" video="mainVideo" id=subtitle]]
+[[!template text="great conference, everybody." start="00:19:33.300" video="mainVideo" id=subtitle]]
+[[!template text="I'm really excited to see everyone's talks." start="00:19:34.336" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/gregorian.md b/2021/captions/gregorian.md
new file mode 100644
index 00000000..9d382bc4
--- /dev/null
+++ b/2021/captions/gregorian.md
@@ -0,0 +1,277 @@
+<a name="transcript"></a>
+
+# Transcript
+
+[[!template text="Hello, everyone, my name is Spencer," start="00:00:00.240" video="mainVideo" id=subtitle]]
+[[!template text="and today I'm going to tell you all" start="00:00:02.320" video="mainVideo" id=subtitle]]
+[[!template text="a little bit about how to typeset" start="00:00:03.600" video="mainVideo" id=subtitle]]
+[[!template text="Gregorian chant sheet music" start="00:00:05.296" video="mainVideo" id=subtitle]]
+[[!template text="using Emacs and a tool called Gregorio." start="00:00:06.640" video="mainVideo" id=subtitle]]
+[[!template text="Now I expect many, if not all, of you" start="00:00:10.000" video="mainVideo" id=subtitle]]
+[[!template text="are unfamiliar with Gregorio," start="00:00:12.160" video="mainVideo" id=subtitle]]
+[[!template text="so we'll start off" start="00:00:14.000" video="mainVideo" id=subtitle]]
+[[!template text="with a brief overview of the tool" start="00:00:14.719" video="mainVideo" id=subtitle]]
+[[!template text="and the appropriate syntax." start="00:00:16.240" video="mainVideo" id=subtitle]]
+[[!template text="Next, I'll show you how I've automated" start="00:00:18.080" video="mainVideo" id=subtitle]]
+[[!template text="some of the workflow" start="00:00:19.760" video="mainVideo" id=subtitle]]
+[[!template text="using some Emacs Lisp functions" start="00:00:20.720" video="mainVideo" id=subtitle]]
+[[!template text="which I've slowly been turning into" start="00:00:22.480" video="mainVideo" id=subtitle]]
+[[!template text="a package called `gregorian-mode`." start="00:00:23.920" video="mainVideo" id=subtitle]]
+[[!template text="This will include" start="00:00:26.080" video="mainVideo" id=subtitle]]
+[[!template text="some live typesetting examples" start="00:00:26.720" video="mainVideo" id=subtitle]]
+[[!template text="to give you a better idea" start="00:00:28.320" video="mainVideo" id=subtitle]]
+[[!template text="of how this all works." start="00:00:29.359" video="mainVideo" id=subtitle]]
+[[!template text="Finally, I'll share" start="00:00:31.279" video="mainVideo" id=subtitle]]
+[[!template text="some information with you" start="00:00:32.079" video="mainVideo" id=subtitle]]
+[[!template text="about how you can contribute" start="00:00:33.120" video="mainVideo" id=subtitle]]
+[[!template text="to the package if you'd like," start="00:00:34.480" video="mainVideo" id=subtitle]]
+[[!template text="and how you can learn more about" start="00:00:35.680" video="mainVideo" id=subtitle]]
+[[!template text="both Gregorio and `gregorian-mode`." start="00:00:38.000" video="mainVideo" id=subtitle]]
+[[!template text="And of course, all of the examples" start="00:00:39.600" video="mainVideo" id=subtitle]]
+[[!template text="from this presentation today" start="00:00:41.120" video="mainVideo" id=subtitle]]
+[[!template text="have been available online" start="00:00:42.320" video="mainVideo" id=subtitle]]
+[[!template text="so you can review them" start="00:00:44.079" video="mainVideo" id=subtitle]]
+[[!template text="all at your own pace." start="00:00:44.879" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Gregorio is a tool that takes" start="00:00:46.800" video="mainVideo" id=subtitle]]
+[[!template text="a `gabc` text file and compiles it" start="00:00:49.440" video="mainVideo" id=subtitle]]
+[[!template text="into a LaTeX document." start="00:00:51.500" video="mainVideo" id=subtitle]]
+[[!template text="Gregorio is included by default" start="00:00:52.879" video="mainVideo" id=subtitle]]
+[[!template text="with many LaTeX distributions," start="00:00:54.719" video="mainVideo" id=subtitle]]
+[[!template text="so you may already have it installed" start="00:00:56.559" video="mainVideo" id=subtitle]]
+[[!template text="on your machine if you are a user of LaTeX." start="00:00:58.079" video="mainVideo" id=subtitle]]
+[[!template text="You can see here on the left an example" start="00:01:01.120" video="mainVideo" id=subtitle]]
+[[!template text="of some input `gabc` text," start="00:01:02.879" video="mainVideo" id=subtitle]]
+[[!template text="and on the right," start="00:01:04.960" video="mainVideo" id=subtitle]]
+[[!template text="what the compiled score will look like." start="00:01:05.600" video="mainVideo" id=subtitle]]
+[[!template text="Looking at the `gabc`, we can see that" start="00:01:08.080" video="mainVideo" id=subtitle]]
+[[!template text="it starts with the clef in parentheses," start="00:01:10.080" video="mainVideo" id=subtitle]]
+[[!template text="and then following this" start="00:01:12.640" video="mainVideo" id=subtitle]]
+[[!template text="are the syllables of the lyrics" start="00:01:13.600" video="mainVideo" id=subtitle]]
+[[!template text="and the corresponding notes in parentheses." start="00:01:15.119" video="mainVideo" id=subtitle]]
+[[!template text="For example, you can see that &quot;EX,&quot;" start="00:01:18.080" video="mainVideo" id=subtitle]]
+[[!template text="the first syllable," start="00:01:21.119" video="mainVideo" id=subtitle]]
+[[!template text="corresponds to a `d` note" start="00:01:22.240" video="mainVideo" id=subtitle]]
+[[!template text="in parentheses there," start="00:01:24.080" video="mainVideo" id=subtitle]]
+[[!template text="and if you look at the right," start="00:01:25.920" video="mainVideo" id=subtitle]]
+[[!template text="you can easily verify that" start="00:01:27.119" video="mainVideo" id=subtitle]]
+[[!template text="in the output." start="00:01:28.560" video="mainVideo" id=subtitle]]
+[[!template text="Now the last thing" start="00:01:30.320" video="mainVideo" id=subtitle]]
+[[!template text="that I want to note here" start="00:01:31.040" video="mainVideo" id=subtitle]]
+[[!template text="is that `gabc` files are all plain text," start="00:01:31.680" video="mainVideo" id=subtitle]]
+[[!template text="meaning they can easily be shared" start="00:01:34.079" video="mainVideo" id=subtitle]]
+[[!template text="and can easily be tracked using" start="00:01:36.320" video="mainVideo" id=subtitle]]
+[[!template text="your favorite version-control software." start="00:01:38.000" video="mainVideo" id=subtitle]]
+[[!template text="Since these are plain text," start="00:01:40.400" video="mainVideo" id=subtitle]]
+[[!template text="it's really pretty easy to integrate" start="00:01:41.920" video="mainVideo" id=subtitle]]
+[[!template text="them into your existing workflows." start="00:01:43.520" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The `gabc` format also supports" start="00:01:46.079" video="mainVideo" id=subtitle]]
+[[!template text="many optional header fields" start="00:01:48.079" video="mainVideo" id=subtitle]]
+[[!template text="for adding more information" start="00:01:49.439" video="mainVideo" id=subtitle]]
+[[!template text="about your score." start="00:01:50.560" video="mainVideo" id=subtitle]]
+[[!template text="You can see all the supported fields" start="00:01:51.920" video="mainVideo" id=subtitle]]
+[[!template text="listed below, along with" start="00:01:53.520" video="mainVideo" id=subtitle]]
+[[!template text="some placeholder text." start="00:01:54.799" video="mainVideo" id=subtitle]]
+[[!template text="These fields are placed" start="00:01:56.479" video="mainVideo" id=subtitle]]
+[[!template text="at the top of a file" start="00:01:57.360" video="mainVideo" id=subtitle]]
+[[!template text="and are separated from the actual score" start="00:01:58.399" video="mainVideo" id=subtitle]]
+[[!template text="by the two percent symbols" start="00:02:01.000" video="mainVideo" id=subtitle]]
+[[!template text="seen at the bottom." start="00:02:01.439" video="mainVideo" id=subtitle]]
+[[!template text="After these symbols, you would have the" start="00:02:03.000" video="mainVideo" id=subtitle]]
+[[!template text="lines of your score," start="00:02:04.399" video="mainVideo" id=subtitle]]
+[[!template text="similar to what you saw" start="00:02:05.600" video="mainVideo" id=subtitle]]
+[[!template text="on the previous slide." start="00:02:07.080" video="mainVideo" id=subtitle]]
+[[!template new="1" text="As I said earlier," start="00:02:08.560" video="mainVideo" id=subtitle]]
+[[!template text="I've automated some of" start="00:02:09.599" video="mainVideo" id=subtitle]]
+[[!template text="the score build steps using Emacs Lisp," start="00:02:10.560" video="mainVideo" id=subtitle]]
+[[!template text="and have started turning them" start="00:02:12.959" video="mainVideo" id=subtitle]]
+[[!template text="into a package called `gregorian-mode`." start="00:02:14.000" video="mainVideo" id=subtitle]]
+[[!template text="This is my first Emacs package," start="00:02:16.480" video="mainVideo" id=subtitle]]
+[[!template text="so the code is rather messy at the moment," start="00:02:18.160" video="mainVideo" id=subtitle]]
+[[!template text="and for the most part is just a wrapper" start="00:02:20.400" video="mainVideo" id=subtitle]]
+[[!template text="around the Gregorio build process." start="00:02:22.160" video="mainVideo" id=subtitle]]
+[[!template text="However, I have made some" start="00:02:24.319" video="mainVideo" id=subtitle]]
+[[!template text="quality-of-life improvements" start="00:02:25.536" video="mainVideo" id=subtitle]]
+[[!template text="to the score writing," start="00:02:26.720" video="mainVideo" id=subtitle]]
+[[!template text="and have some more planned for the future." start="00:02:27.920" video="mainVideo" id=subtitle]]
+[[!template text="You'll get to see some of that" start="00:02:30.239" video="mainVideo" id=subtitle]]
+[[!template text="in some live examples" start="00:02:31.360" video="mainVideo" id=subtitle]]
+[[!template text="in just a little bit." start="00:02:32.480" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This package is not currently on MELPA" start="00:02:34.319" video="mainVideo" id=subtitle]]
+[[!template text="at the time of recording," start="00:02:36.000" video="mainVideo" id=subtitle]]
+[[!template text="so if you want it," start="00:02:37.760" video="mainVideo" id=subtitle]]
+[[!template text="you will have to clone it manually" start="00:02:38.640" video="mainVideo" id=subtitle]]
+[[!template text="from GitHub, but it is planned" start="00:02:40.000" video="mainVideo" id=subtitle]]
+[[!template text="to be on MELPA in the near future." start="00:02:41.920" video="mainVideo" id=subtitle]]
+[[!template text="It just needs to go through" start="00:02:44.080" video="mainVideo" id=subtitle]]
+[[!template text="a little more rigorous cleanup" start="00:02:44.959" video="mainVideo" id=subtitle]]
+[[!template text="and testing." start="00:02:46.400" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now that we've covered the basics," start="00:02:48.640" video="mainVideo" id=subtitle]]
+[[!template text="let's take a look at an actual example." start="00:02:50.400" video="mainVideo" id=subtitle]]
+[[!template text="In this example, I'm assuming that" start="00:02:52.560" video="mainVideo" id=subtitle]]
+[[!template text="my `gregorian-mode` package is installed." start="00:02:54.319" video="mainVideo" id=subtitle]]
+[[!template text="However, there is nothing in these steps" start="00:02:56.480" video="mainVideo" id=subtitle]]
+[[!template text="that cannot be done manually" start="00:02:57.920" video="mainVideo" id=subtitle]]
+[[!template text="by just following the official" start="00:02:59.200" video="mainVideo" id=subtitle]]
+[[!template text="Gregorio documentation." start="00:03:01.120" video="mainVideo" id=subtitle]]
+[[!template text="So if you don't want to use a package," start="00:03:02.480" video="mainVideo" id=subtitle]]
+[[!template text="you can do all of this pretty easily" start="00:03:04.000" video="mainVideo" id=subtitle]]
+[[!template text="on your own just by following" start="00:03:05.840" video="mainVideo" id=subtitle]]
+[[!template text="their documentation." start="00:03:07.280" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So first we'll open up Emacs," start="00:03:10.000" video="mainVideo" id=subtitle]]
+[[!template text="and in my case," start="00:03:11.680" video="mainVideo" id=subtitle]]
+[[!template text="I'm using the GUI version." start="00:03:12.480" video="mainVideo" id=subtitle]]
+[[!template text="So now that Emacs is open, we can call" start="00:03:14.560" video="mainVideo" id=subtitle]]
+[[!template text="the function `gregorian-create-new-gabc`," start="00:03:16.640" video="mainVideo" id=subtitle]]
+[[!template text="and this will prompt us for a file name." start="00:03:21.440" video="mainVideo" id=subtitle]]
+[[!template text="So we need to pick out a name" start="00:03:23.680" video="mainVideo" id=subtitle]]
+[[!template text="for our new score." start="00:03:25.599" video="mainVideo" id=subtitle]]
+[[!template text="So I think I'm going to go ahead" start="00:03:26.799" video="mainVideo" id=subtitle]]
+[[!template text="and name ours `emacsconf2021`." start="00:03:28.239" video="mainVideo" id=subtitle]]
+[[!template text="So you can see here that we now have" start="00:03:33.280" video="mainVideo" id=subtitle]]
+[[!template text="a new `gabc` file with all of the" start="00:03:34.959" video="mainVideo" id=subtitle]]
+[[!template text="optional header fields added," start="00:03:36.879" video="mainVideo" id=subtitle]]
+[[!template text="and we can keep whichever of these" start="00:03:38.720" video="mainVideo" id=subtitle]]
+[[!template text="that we would like," start="00:03:40.400" video="mainVideo" id=subtitle]]
+[[!template text="and we can modify them as needed." start="00:03:41.120" video="mainVideo" id=subtitle]]
+[[!template text="So for right now, all I'm going to change" start="00:03:43.200" video="mainVideo" id=subtitle]]
+[[!template text="is this commentary; I'm going to update" start="00:03:45.360" video="mainVideo" id=subtitle]]
+[[!template text="this source of words to `emacsconf`," start="00:03:47.360" video="mainVideo" id=subtitle]]
+[[!template text="and then at the bottom here," start="00:03:52.560" video="mainVideo" id=subtitle]]
+[[!template text="this is where we'd go ahead" start="00:03:53.760" video="mainVideo" id=subtitle]]
+[[!template text="and add our score." start="00:03:55.040" video="mainVideo" id=subtitle]]
+[[!template text="So I don't have time today to typeset" start="00:03:56.959" video="mainVideo" id=subtitle]]
+[[!template text="an entire score, and I think that would" start="00:03:58.799" video="mainVideo" id=subtitle]]
+[[!template text="probably be rather boring" start="00:04:01.040" video="mainVideo" id=subtitle]]
+[[!template text="for most of you to watch," start="00:04:02.239" video="mainVideo" id=subtitle]]
+[[!template text="so I'll just demonstrate very briefly" start="00:04:03.760" video="mainVideo" id=subtitle]]
+[[!template text="with a few syllables and notes here." start="00:04:05.680" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so now that we have our first few" start="00:04:15.840" video="mainVideo" id=subtitle]]
+[[!template text="syllables and notes down, let's take a" start="00:04:17.680" video="mainVideo" id=subtitle]]
+[[!template text="look at what our score actually looks" start="00:04:19.840" video="mainVideo" id=subtitle]]
+[[!template text="like so far." start="00:04:21.759" video="mainVideo" id=subtitle]]
+[[!template text="So in order to do this, we're going to" start="00:04:23.520" video="mainVideo" id=subtitle]]
+[[!template text="call the function `gregorian-build`," start="00:04:25.040" video="mainVideo" id=subtitle]]
+[[!template text="and what this function does is" start="00:04:29.600" video="mainVideo" id=subtitle]]
+[[!template text="it takes this score" start="00:04:31.199" video="mainVideo" id=subtitle]]
+[[!template text="and creates a LaTeX file for it" start="00:04:32.320" video="mainVideo" id=subtitle]]
+[[!template text="and then goes ahead and compiles it" start="00:04:33.680" video="mainVideo" id=subtitle]]
+[[!template text="into a PDF file that we can actually" start="00:04:36.080" video="mainVideo" id=subtitle]]
+[[!template text="take a look at." start="00:04:38.160" video="mainVideo" id=subtitle]]
+[[!template text="And this does take a few seconds to run..." start="00:04:39.840" video="mainVideo" id=subtitle]]
+[[!template text="and there it goes..." start="00:04:42.479" video="mainVideo" id=subtitle]]
+[[!template text="so we can see here we have a new buffer" start="00:04:44.320" video="mainVideo" id=subtitle]]
+[[!template text="with all of the output" start="00:04:47.040" video="mainVideo" id=subtitle]]
+[[!template text="from that build process," start="00:04:48.560" video="mainVideo" id=subtitle]]
+[[!template text="but what we really care about" start="00:04:50.320" video="mainVideo" id=subtitle]]
+[[!template text="is that PDF." start="00:04:51.840" video="mainVideo" id=subtitle]]
+[[!template text="So opening that up, you can see" start="00:04:56.080" video="mainVideo" id=subtitle]]
+[[!template text="we have a very short score." start="00:04:58.479" video="mainVideo" id=subtitle]]
+[[!template text="So far we haven't done a whole lot," start="00:05:00.560" video="mainVideo" id=subtitle]]
+[[!template text="but if you go ahead and compare the" start="00:05:02.320" video="mainVideo" id=subtitle]]
+[[!template text="score on the right" start="00:05:03.919" video="mainVideo" id=subtitle]]
+[[!template text="with the file on the left," start="00:05:05.000" video="mainVideo" id=subtitle]]
+[[!template text="you can really pretty clearly see that" start="00:05:06.479" video="mainVideo" id=subtitle]]
+[[!template text="those are, in fact, the lyrics" start="00:05:08.080" video="mainVideo" id=subtitle]]
+[[!template text="that we wrote." start="00:05:10.080" video="mainVideo" id=subtitle]]
+[[!template text="You can see at the top right there," start="00:05:11.199" video="mainVideo" id=subtitle]]
+[[!template text="the source has, in fact," start="00:05:13.280" video="mainVideo" id=subtitle]]
+[[!template text="changed to `emacsconf`" start="00:05:14.300" video="mainVideo" id=subtitle]]
+[[!template text="so at this point, we could go ahead" start="00:05:16.000" video="mainVideo" id=subtitle]]
+[[!template text="and just keep adding more lines," start="00:05:18.240" video="mainVideo" id=subtitle]]
+[[!template text="more notes, and so on," start="00:05:20.000" video="mainVideo" id=subtitle]]
+[[!template text="and we would end up with" start="00:05:22.240" video="mainVideo" id=subtitle]]
+[[!template text="a completed score." start="00:05:24.080" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now this process is great and all," start="00:05:25.919" video="mainVideo" id=subtitle]]
+[[!template text="but as you can imagine," start="00:05:27.919" video="mainVideo" id=subtitle]]
+[[!template text="more complex `gabc` files" start="00:05:29.120" video="mainVideo" id=subtitle]]
+[[!template text="can quickly become pretty difficult" start="00:05:30.880" video="mainVideo" id=subtitle]]
+[[!template text="to read with the notes and the syllables" start="00:05:32.720" video="mainVideo" id=subtitle]]
+[[!template text="all bunched together." start="00:05:34.479" video="mainVideo" id=subtitle]]
+[[!template text="So to get around this, I've been playing" start="00:05:36.080" video="mainVideo" id=subtitle]]
+[[!template text="around with an alternative format" start="00:05:37.840" video="mainVideo" id=subtitle]]
+[[!template text="called a `greg` file." start="00:05:39.840" video="mainVideo" id=subtitle]]
+[[!template text="I have an example of that" start="00:05:41.000" video="mainVideo" id=subtitle]]
+[[!template text="for you right here." start="00:05:42.160" video="mainVideo" id=subtitle]]
+[[!template text="So here we can see there are" start="00:05:43.919" video="mainVideo" id=subtitle]]
+[[!template text="two files side-by-side:" start="00:05:45.919" video="mainVideo" id=subtitle]]
+[[!template text="on the left, we have a `gabc` file," start="00:05:48.000" video="mainVideo" id=subtitle]]
+[[!template text="and then on the right," start="00:05:50.000" video="mainVideo" id=subtitle]]
+[[!template text="we have a `greg` file," start="00:05:51.022" video="mainVideo" id=subtitle]]
+[[!template text="both of them for the same score." start="00:05:52.000" video="mainVideo" id=subtitle]]
+[[!template text="Now in my opinion, the `gabc` on the left" start="00:05:53.360" video="mainVideo" id=subtitle]]
+[[!template text="is really rather difficult to read" start="00:05:55.600" video="mainVideo" id=subtitle]]
+[[!template text="at a glance." start="00:05:57.199" video="mainVideo" id=subtitle]]
+[[!template text="You can see there" start="00:05:58.319" video="mainVideo" id=subtitle]]
+[[!template text="the notes and the syllables" start="00:05:59.280" video="mainVideo" id=subtitle]]
+[[!template text="are really all grouped together" start="00:06:00.880" video="mainVideo" id=subtitle]]
+[[!template text="pretty tightly." start="00:06:02.160" video="mainVideo" id=subtitle]]
+[[!template text="Looking at the `greg` on the right," start="00:06:03.919" video="mainVideo" id=subtitle]]
+[[!template text="you can see that all of the" start="00:06:05.520" video="mainVideo" id=subtitle]]
+[[!template text="header information is the same," start="00:06:06.560" video="mainVideo" id=subtitle]]
+[[!template text="but the score itself" start="00:06:08.479" video="mainVideo" id=subtitle]]
+[[!template text="is split across several lines." start="00:06:09.680" video="mainVideo" id=subtitle]]
+[[!template text="The idea here is that" start="00:06:11.840" video="mainVideo" id=subtitle]]
+[[!template text="the notes and the corresponding syllables" start="00:06:13.039" video="mainVideo" id=subtitle]]
+[[!template text="will be on separate lines," start="00:06:15.039" video="mainVideo" id=subtitle]]
+[[!template text="one after the other," start="00:06:16.560" video="mainVideo" id=subtitle]]
+[[!template text="to help improve readability." start="00:06:17.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now the `greg` file format" start="00:06:20.639" video="mainVideo" id=subtitle]]
+[[!template text="is still a work-in-progress." start="00:06:21.906" video="mainVideo" id=subtitle]]
+[[!template text="It's really not" start="00:06:23.800" video="mainVideo" id=subtitle]]
+[[!template text="set in stone at all," start="00:06:24.960" video="mainVideo" id=subtitle]]
+[[!template text="but already I think this is a pretty" start="00:06:27.520" video="mainVideo" id=subtitle]]
+[[!template text="substantial quality-of-life improvement," start="00:06:29.840" video="mainVideo" id=subtitle]]
+[[!template text="and already `gregorian-mode` can, in fact," start="00:06:32.560" video="mainVideo" id=subtitle]]
+[[!template text="build scores from `greg` files" start="00:06:34.720" video="mainVideo" id=subtitle]]
+[[!template text="as long as they follow the conventions" start="00:06:36.720" video="mainVideo" id=subtitle]]
+[[!template text="that you see in this file here," start="00:06:38.300" video="mainVideo" id=subtitle]]
+[[!template text="and I'm planning to have that" start="00:06:40.400" video="mainVideo" id=subtitle]]
+[[!template text="quite a bit more well-defined" start="00:06:42.560" video="mainVideo" id=subtitle]]
+[[!template text="moving forward." start="00:06:44.240" video="mainVideo" id=subtitle]]
+[[!template text="Like I said, this is really still" start="00:06:45.360" video="mainVideo" id=subtitle]]
+[[!template text="a work-in-progress." start="00:06:47.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Finally, I want to end today" start="00:06:49.520" video="mainVideo" id=subtitle]]
+[[!template text="by sharing some resources" start="00:06:51.039" video="mainVideo" id=subtitle]]
+[[!template text="where you can learn more." start="00:06:52.319" video="mainVideo" id=subtitle]]
+[[!template text="First, you can learn more about" start="00:06:53.840" video="mainVideo" id=subtitle]]
+[[!template text="the Gregorio project" start="00:06:55.039" video="mainVideo" id=subtitle]]
+[[!template text="on their official website," start="00:06:56.319" video="mainVideo" id=subtitle]]
+[[!template text="and I have the link for that" start="00:06:57.500" video="mainVideo" id=subtitle]]
+[[!template text="on this slide here," start="00:06:58.960" video="mainVideo" id=subtitle]]
+[[!template text="and this site has several detailed examples" start="00:07:00.720" video="mainVideo" id=subtitle]]
+[[!template text="and a lot of additional information" start="00:07:02.319" video="mainVideo" id=subtitle]]
+[[!template text="about the project" start="00:07:04.080" video="mainVideo" id=subtitle]]
+[[!template text="and about chant notation in general." start="00:07:05.840" video="mainVideo" id=subtitle]]
+[[!template text="It goes into much more depth" start="00:07:07.500" video="mainVideo" id=subtitle]]
+[[!template text="than what we covered in this presentation," start="00:07:09.500" video="mainVideo" id=subtitle]]
+[[!template text="and overall, it's really" start="00:07:12.000" video="mainVideo" id=subtitle]]
+[[!template text="a fantastic resource" start="00:07:13.199" video="mainVideo" id=subtitle]]
+[[!template text="for learning more about how to use" start="00:07:14.960" video="mainVideo" id=subtitle]]
+[[!template text="the Gregorio software and more about" start="00:07:16.560" video="mainVideo" id=subtitle]]
+[[!template text="the specifics of chant notation." start="00:07:19.360" video="mainVideo" id=subtitle]]
+[[!template text="Second, if you're interested in using" start="00:07:21.840" video="mainVideo" id=subtitle]]
+[[!template text="or contributing to `gregorian-mode`," start="00:07:23.680" video="mainVideo" id=subtitle]]
+[[!template text="you can check out the project on GitHub" start="00:07:25.840" video="mainVideo" id=subtitle]]
+[[!template text="with the link here on this slide." start="00:07:28.240" video="mainVideo" id=subtitle]]
+[[!template text="And if you're interested in helping out" start="00:07:30.400" video="mainVideo" id=subtitle]]
+[[!template text="in any way, feel free to open an issue," start="00:07:31.919" video="mainVideo" id=subtitle]]
+[[!template text="and we can discuss further." start="00:07:34.080" video="mainVideo" id=subtitle]]
+[[!template text="And finally, all of the examples" start="00:07:36.560" video="mainVideo" id=subtitle]]
+[[!template text="from today are also available on GitHub," start="00:07:38.160" video="mainVideo" id=subtitle]]
+[[!template text="and that's the last link on this slide," start="00:07:40.400" video="mainVideo" id=subtitle]]
+[[!template text="and you can feel free to experiment" start="00:07:42.479" video="mainVideo" id=subtitle]]
+[[!template text="with these and really just use them" start="00:07:44.160" video="mainVideo" id=subtitle]]
+[[!template text="in any way that you'd like." start="00:07:45.919" video="mainVideo" id=subtitle]]
+[[!template text="Now that's all that I had for today," start="00:07:48.560" video="mainVideo" id=subtitle]]
+[[!template text="but I do want to take a moment" start="00:07:50.319" video="mainVideo" id=subtitle]]
+[[!template text="to thank you all" start="00:07:51.360" video="mainVideo" id=subtitle]]
+[[!template text="for checking out my presentation," start="00:07:52.000" video="mainVideo" id=subtitle]]
+[[!template text="and I want to thank the organizers" start="00:07:54.160" video="mainVideo" id=subtitle]]
+[[!template text="for giving me some time" start="00:07:55.680" video="mainVideo" id=subtitle]]
+[[!template text="to speak with you all." start="00:07:56.400" video="mainVideo" id=subtitle]]
+[[!template text="I hope that this was at least" start="00:07:57.759" video="mainVideo" id=subtitle]]
+[[!template text="a little bit interesting to some of you," start="00:07:59.120" video="mainVideo" id=subtitle]]
+[[!template text="and I hope that you all enjoy" start="00:08:01.120" video="mainVideo" id=subtitle]]
+[[!template text="the rest of the conference." start="00:08:02.319" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for your time today." start="00:08:02.800" video="mainVideo" id=subtitle]]
+[[!template text="captions by Hannah Miller" start="00:08:06.520" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/imaginary.md b/2021/captions/imaginary.md
new file mode 100644
index 00000000..ede0901a
--- /dev/null
+++ b/2021/captions/imaginary.md
@@ -0,0 +1,235 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi everyone!" start="00:00:01.920" video="mainVideo" id=subtitle]]
+[[!template text="My name is Shane," start="00:00:03.280" video="mainVideo" id=subtitle]]
+[[!template text="and it's truly a real honor to be" start="00:00:04.400" video="mainVideo" id=subtitle]]
+[[!template text="able to speak at EmacsConf." start="00:00:09.679" video="mainVideo" id=subtitle]]
+[[!template text="I love Emacs. I love Emacs Lisp," start="00:00:14.480" video="mainVideo" id=subtitle]]
+[[!template text="and this is also another topic" start="00:00:16.880" video="mainVideo" id=subtitle]]
+[[!template text="that really excites me ever since" start="00:00:19.279" video="mainVideo" id=subtitle]]
+[[!template text="I got my hands on OpenAI's GPT-3." start="00:00:22.233" video="mainVideo" id=subtitle]]
+[[!template text="Six months ago, I knew that it was" start="00:00:28.160" video="mainVideo" id=subtitle]]
+[[!template text="important to research this for Emacs," start="00:00:29.920" video="mainVideo" id=subtitle]]
+[[!template text="you know, asides from being somebody" start="00:00:33.920" video="mainVideo" id=subtitle]]
+[[!template text="who never wants to leave Emacs myself," start="00:00:35.980" video="mainVideo" id=subtitle]]
+[[!template text="and I hope that…." start="00:00:39.040" video="mainVideo" id=subtitle]]
+[[!template text="Being one of the few Emacs users," start="00:00:41.440" video="mainVideo" id=subtitle]]
+[[!template text="possibly the only one that had" start="00:00:43.120" video="mainVideo" id=subtitle]]
+[[!template text="access to GPT-3 for this long," start="00:00:45.360" video="mainVideo" id=subtitle]]
+[[!template text="I hope that I can contribute." start="00:00:48.160" video="mainVideo" id=subtitle]]
+[[!template text="So, Emacs, sorry." start="00:00:52.559" video="mainVideo" id=subtitle]]
+[[!template text="Imaginary programming is…," start="00:00:55.199" video="mainVideo" id=subtitle]]
+[[!template text="it's based on prompt engineering currently," start="00:00:58.960" video="mainVideo" id=subtitle]]
+[[!template text="but it's an abstraction over" start="00:01:01.280" video="mainVideo" id=subtitle]]
+[[!template text="prompt engineering." start="00:01:02.559" video="mainVideo" id=subtitle]]
+[[!template text="You can read about prompt engineering" start="00:01:03.359" video="mainVideo" id=subtitle]]
+[[!template text="and language models," start="00:01:06.479" video="mainVideo" id=subtitle]]
+[[!template text="that's quite easy to google for." start="00:01:08.560" video="mainVideo" id=subtitle]]
+[[!template text="And imaginary programming is a subfield" start="00:01:13.040" video="mainVideo" id=subtitle]]
+[[!template text="of imaginary computing," start="00:01:15.520" video="mainVideo" id=subtitle]]
+[[!template text="which is just the larger domain" start="00:01:17.360" video="mainVideo" id=subtitle]]
+[[!template text="of employing of computing" start="00:01:19.424" video="mainVideo" id=subtitle]]
+[[!template text="that's based on imagination," start="00:01:21.420" video="mainVideo" id=subtitle]]
+[[!template text="artificial imagination," start="00:01:24.240" video="mainVideo" id=subtitle]]
+[[!template text="so, basically, dreaming up user interfaces" start="00:01:25.600" video="mainVideo" id=subtitle]]
+[[!template text="instead of…, or at least partially" start="00:01:29.920" video="mainVideo" id=subtitle]]
+[[!template text="dreaming them up." start="00:01:32.159" video="mainVideo" id=subtitle]]
+[[!template text="I suppose that it's a fringe paradigm," start="00:01:34.079" video="mainVideo" id=subtitle]]
+[[!template text="but it's extremely useful." start="00:01:41.439" video="mainVideo" id=subtitle]]
+[[!template text="Imaginary computing," start="00:01:43.759" video="mainVideo" id=subtitle]]
+[[!template text="if you're willing to call it that," start="00:01:47.759" video="mainVideo" id=subtitle]]
+[[!template text="would be what's used to" start="00:01:49.200" video="mainVideo" id=subtitle]]
+[[!template text="imagine simulations" start="00:01:51.920" video="mainVideo" id=subtitle]]
+[[!template text="for self-driving cars," start="00:01:53.413" video="mainVideo" id=subtitle]]
+[[!template text="as they're trained for example." start="00:01:54.320" video="mainVideo" id=subtitle]]
+[[!template text="But this technology finds" start="00:01:57.840" video="mainVideo" id=subtitle]]
+[[!template text="its way to the public," start="00:01:58.984" video="mainVideo" id=subtitle]]
+[[!template text="and it should be in the public domain." start="00:02:00.960" video="mainVideo" id=subtitle]]
+[[!template text="So, Demis Hassabis" start="00:02:04.880" video="mainVideo" id=subtitle]]
+[[!template text="he's the founder of DeepMind," start="00:02:06.799" video="mainVideo" id=subtitle]]
+[[!template text="and he did his Ph.D. in human imagination," start="00:02:08.959" video="mainVideo" id=subtitle]]
+[[!template text="now he's working on artificial imagination." start="00:02:12.400" video="mainVideo" id=subtitle]]
+[[!template text="So, just a couple of days ago" start="00:02:16.900" video="mainVideo" id=subtitle]]
+[[!template text="I took AlephAlpha's world model API" start="00:02:20.239" video="mainVideo" id=subtitle]]
+[[!template text="and I plugged it into Emacs's eww browser," start="00:02:25.040" video="mainVideo" id=subtitle]]
+[[!template text="and now I have a way of generating" start="00:02:28.080" video="mainVideo" id=subtitle]]
+[[!template text="text for the images instead of actually…," start="00:02:30.800" video="mainVideo" id=subtitle]]
+[[!template text="so I can stay in my text only Emacs," start="00:02:33.840" video="mainVideo" id=subtitle]]
+[[!template text="which is the way it should be." start="00:02:38.072" video="mainVideo" id=subtitle]]
+[[!template text="Intelligent NFTs, I'll leave this" start="00:02:42.560" video="mainVideo" id=subtitle]]
+[[!template text="for you guys to look at." start="00:02:45.636" video="mainVideo" id=subtitle]]
+[[!template text="Information bubbles." start="00:02:47.360" video="mainVideo" id=subtitle]]
+[[!template text="So, there's some potential bad outcomes" start="00:02:49.280" video="mainVideo" id=subtitle]]
+[[!template text="from the runaway empowering of these" start="00:02:55.360" video="mainVideo" id=subtitle]]
+[[!template text="large language models and other models" start="00:03:05.680" video="mainVideo" id=subtitle]]
+[[!template text="in commercial hands." start="00:03:08.959" video="mainVideo" id=subtitle]]
+[[!template text="It's causing information bubbles and" start="00:03:10.000" video="mainVideo" id=subtitle]]
+[[!template text="ways of controlling people." start="00:03:13.680" video="mainVideo" id=subtitle]]
+[[!template text="So, for example," start="00:03:15.680" video="mainVideo" id=subtitle]]
+[[!template text="micro tasks and stuff that…," start="00:03:19.440" video="mainVideo" id=subtitle]]
+[[!template text="furthermore just automating away," start="00:03:21.680" video="mainVideo" id=subtitle]]
+[[!template text="or abstracting away the role" start="00:03:23.650" video="mainVideo" id=subtitle]]
+[[!template text="of a programmer," start="00:03:26.000" video="mainVideo" id=subtitle]]
+[[!template text="and the automating more and more" start="00:03:27.680" video="mainVideo" id=subtitle]]
+[[!template text="increasingly abstract tasks," start="00:03:29.360" video="mainVideo" id=subtitle]]
+[[!template text="and I think the solution is to" start="00:03:32.319" video="mainVideo" id=subtitle]]
+[[!template text="decentralize and break up these tasks." start="00:03:33.659" video="mainVideo" id=subtitle]]
+[[!template text="I have a potential way of doing that," start="00:03:36.319" video="mainVideo" id=subtitle]]
+[[!template text="but firstly I'll talk about" start="00:03:39.120" video="mainVideo" id=subtitle]]
+[[!template text="the imaginary web briefly" start="00:03:40.693" video="mainVideo" id=subtitle]]
+[[!template text="because the thing about these" start="00:03:42.400" video="mainVideo" id=subtitle]]
+[[!template text="language models is," start="00:03:44.720" video="mainVideo" id=subtitle]]
+[[!template text="they can replace basically" start="00:03:48.000" video="mainVideo" id=subtitle]]
+[[!template text="everything on the internet." start="00:03:49.280" video="mainVideo" id=subtitle]]
+[[!template text="So, like, replace your Wikipedia," start="00:03:52.159" video="mainVideo" id=subtitle]]
+[[!template text="or Stack Overflow," start="00:03:55.280" video="mainVideo" id=subtitle]]
+[[!template text="replace conversation if you want it with," start="00:03:57.680" video="mainVideo" id=subtitle]]
+[[!template text="from real people to chatbots instead," start="00:04:01.519" video="mainVideo" id=subtitle]]
+[[!template text="replace basically anything there's" start="00:04:05.920" video="mainVideo" id=subtitle]]
+[[!template text="a website for." start="00:04:13.120" video="mainVideo" id=subtitle]]
+[[!template text="And that means that rich media has gone" start="00:04:14.959" video="mainVideo" id=subtitle]]
+[[!template text="from becoming images and video" start="00:04:17.280" video="mainVideo" id=subtitle]]
+[[!template text="and even from paywalls" start="00:04:20.639" video="mainVideo" id=subtitle]]
+[[!template text="now into intelligent and truthful," start="00:04:22.560" video="mainVideo" id=subtitle]]
+[[!template text="because generating fictional websites" start="00:04:26.400" video="mainVideo" id=subtitle]]
+[[!template text="is going to become a very easy thing to do," start="00:04:29.520" video="mainVideo" id=subtitle]]
+[[!template text="and actually the best way to do it," start="00:04:31.919" video="mainVideo" id=subtitle]]
+[[!template text="and the most useful way to do it," start="00:04:35.120" video="mainVideo" id=subtitle]]
+[[!template text="so then you need a source of truth." start="00:04:37.440" video="mainVideo" id=subtitle]]
+[[!template text="The imaginary web is a thing," start="00:04:40.560" video="mainVideo" id=subtitle]]
+[[!template text="imaginary interpreters are a thing," start="00:04:43.759" video="mainVideo" id=subtitle]]
+[[!template text="so you imagine your interpreter," start="00:04:46.000" video="mainVideo" id=subtitle]]
+[[!template text="or you overlay prompting on top of" start="00:04:50.000" video="mainVideo" id=subtitle]]
+[[!template text="a real interpreter to see" start="00:04:53.759" video="mainVideo" id=subtitle]]
+[[!template text="what you might want to do" start="00:04:55.520" video="mainVideo" id=subtitle]]
+[[!template text="in an interpreter," start="00:04:57.440" video="mainVideo" id=subtitle]]
+[[!template text="and what you might want to say to somebody" start="00:04:58.800" video="mainVideo" id=subtitle]]
+[[!template text="if you're talking to them." start="00:05:01.039" video="mainVideo" id=subtitle]]
+[[!template text="If you're inside, say," start="00:05:01.919" video="mainVideo" id=subtitle]]
+[[!template text="ERC in Emacs, an IRC client," start="00:05:03.199" video="mainVideo" id=subtitle]]
+[[!template text="and you prompt after somebody" start="00:05:05.840" video="mainVideo" id=subtitle]]
+[[!template text="says something," start="00:05:07.440" video="mainVideo" id=subtitle]]
+[[!template text="then the prompt will probably suggest," start="00:05:08.479" video="mainVideo" id=subtitle]]
+[[!template text="what you might say in return," start="00:05:10.400" video="mainVideo" id=subtitle]]
+[[!template text="and then you can prompt like a multiverse," start="00:05:13.120" video="mainVideo" id=subtitle]]
+[[!template text="and you can pick from them." start="00:05:15.199" video="mainVideo" id=subtitle]]
+[[!template text="There's a bunch of crazy utilities" start="00:05:18.800" video="mainVideo" id=subtitle]]
+[[!template text="for these language models." start="00:05:23.912" video="mainVideo" id=subtitle]]
+[[!template text="Paracosm vs Metaverse." start="00:05:26.560" video="mainVideo" id=subtitle]]
+[[!template text="So, Mark Zuck wants you to live in" start="00:05:28.960" video="mainVideo" id=subtitle]]
+[[!template text="his virtual reality as defined by him," start="00:05:30.828" video="mainVideo" id=subtitle]]
+[[!template text="and he's going to do it" start="00:05:34.320" video="mainVideo" id=subtitle]]
+[[!template text="by using these models to make you" start="00:05:36.160" video="mainVideo" id=subtitle]]
+[[!template text="a fictional world that you can live in." start="00:05:40.539" video="mainVideo" id=subtitle]]
+[[!template text="You can do that," start="00:05:42.639" video="mainVideo" id=subtitle]]
+[[!template text="or you can use them yourself," start="00:05:43.280" video="mainVideo" id=subtitle]]
+[[!template text="and you build your own Paracosm." start="00:05:46.400" video="mainVideo" id=subtitle]]
+[[!template text="And I think that's an important" start="00:05:50.000" video="mainVideo" id=subtitle]]
+[[!template text="ability to be able to have," start="00:05:51.440" video="mainVideo" id=subtitle]]
+[[!template text="otherwise we will be like the borg," start="00:05:53.440" video="mainVideo" id=subtitle]]
+[[!template text="and we'll be connected to Mark Zuckerberg." start="00:05:56.880" video="mainVideo" id=subtitle]]
+[[!template text="Truth is a hot topic." start="00:06:01.520" video="mainVideo" id=subtitle]]
+[[!template text="So, the way that I think we should do this" start="00:06:06.400" video="mainVideo" id=subtitle]]
+[[!template text="to decentralize the language models is," start="00:06:08.880" video="mainVideo" id=subtitle]]
+[[!template text="to use Structuralism." start="00:06:10.720" video="mainVideo" id=subtitle]]
+[[!template text="Universal grammar," start="00:06:13.199" video="mainVideo" id=subtitle]]
+[[!template text="template metaprogramming, and GPT-3" start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="what do they have in common?" start="00:06:21.680" video="mainVideo" id=subtitle]]
+[[!template text="Well, you have some kind of basis," start="00:06:23.919" video="mainVideo" id=subtitle]]
+[[!template text="like, you train your GPT-3," start="00:06:27.759" video="mainVideo" id=subtitle]]
+[[!template text="and then you do all your prompting" start="00:06:31.408" video="mainVideo" id=subtitle]]
+[[!template text="on top of it." start="00:06:32.663" video="mainVideo" id=subtitle]]
+[[!template text="Like a person is born with this grammar," start="00:06:33.360" video="mainVideo" id=subtitle]]
+[[!template text="and then they quickly learn language," start="00:06:35.840" video="mainVideo" id=subtitle]]
+[[!template text="and like with C++ templates," start="00:06:37.759" video="mainVideo" id=subtitle]]
+[[!template text="you pre-process and then" start="00:06:40.240" video="mainVideo" id=subtitle]]
+[[!template text="the run time runs on that." start="00:06:42.080" video="mainVideo" id=subtitle]]
+[[!template text="So, anyway, that was a slide." start="00:06:44.800" video="mainVideo" id=subtitle]]
+[[!template text="Structuralism." start="00:06:48.000" video="mainVideo" id=subtitle]]
+[[!template text="I think you can decompile…," start="00:06:50.479" video="mainVideo" id=subtitle]]
+[[!template text="think you can break," start="00:06:52.080" video="mainVideo" id=subtitle]]
+[[!template text="so you can decompose" start="00:06:52.880" video="mainVideo" id=subtitle]]
+[[!template text="the language models into units," start="00:06:53.840" video="mainVideo" id=subtitle]]
+[[!template text="but those units won't look like neurons," start="00:06:55.840" video="mainVideo" id=subtitle]]
+[[!template text="they would look like these," start="00:06:57.759" video="mainVideo" id=subtitle]]
+[[!template text="and you put them onto a blockchain." start="00:06:59.440" video="mainVideo" id=subtitle]]
+[[!template text="But you can look at that later" start="00:07:01.759" video="mainVideo" id=subtitle]]
+[[!template text="if you want anyway." start="00:07:02.744" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to skip straight to ilambda," start="00:07:03.840" video="mainVideo" id=subtitle]]
+[[!template text="running out of time." start="00:07:07.199" video="mainVideo" id=subtitle]]
+[[!template text="I'll just quickly show you" start="00:07:09.919" video="mainVideo" id=subtitle]]
+[[!template text="the ilambda primitive in ilambda." start="00:07:12.240" video="mainVideo" id=subtitle]]
+[[!template text="So, it evaluates instead of run," start="00:07:15.199" video="mainVideo" id=subtitle]]
+[[!template text="for example, here's the reduced function," start="00:07:19.199" video="mainVideo" id=subtitle]]
+[[!template text="and you've defined your" start="00:07:21.680" video="mainVideo" id=subtitle]]
+[[!template text="imaginary lambda here." start="00:07:22.632" video="mainVideo" id=subtitle]]
+[[!template text="And it doesn't have a body," start="00:07:25.520" video="mainVideo" id=subtitle]]
+[[!template text="it's just got the comment" start="00:07:26.560" video="mainVideo" id=subtitle]]
+[[!template text="and the parameters," start="00:07:31.599" video="mainVideo" id=subtitle]]
+[[!template text="and that's enough for…." start="00:07:33.120" video="mainVideo" id=subtitle]]
+[[!template text="Once you have that ilambda" start="00:07:36.560" video="mainVideo" id=subtitle]]
+[[!template text="that runs now as a function," start="00:07:38.720" video="mainVideo" id=subtitle]]
+[[!template text="you can stick it into" start="00:07:40.080" video="mainVideo" id=subtitle]]
+[[!template text="a reduced function, for example," start="00:07:40.800" video="mainVideo" id=subtitle]]
+[[!template text="and it'll reduce this list." start="00:07:42.720" video="mainVideo" id=subtitle]]
+[[!template text="You could even remove…, yeah," start="00:07:46.240" video="mainVideo" id=subtitle]]
+[[!template text="so you kind of need the comment" start="00:07:50.560" video="mainVideo" id=subtitle]]
+[[!template text="otherwise it's too hard to imagine" start="00:07:51.759" video="mainVideo" id=subtitle]]
+[[!template text="what would happen next," start="00:07:56.048" video="mainVideo" id=subtitle]]
+[[!template text="but for a function you can literally" start="00:07:57.360" video="mainVideo" id=subtitle]]
+[[!template text="have an idefun even without" start="00:08:01.520" video="mainVideo" id=subtitle]]
+[[!template text="the argument list." start="00:08:03.360" video="mainVideo" id=subtitle]]
+[[!template text="It was just like generate-fib-sequence," start="00:08:04.639" video="mainVideo" id=subtitle]]
+[[!template text="and most likely when you run that defun," start="00:08:06.319" video="mainVideo" id=subtitle]]
+[[!template text="it would work the way you want it." start="00:08:09.919" video="mainVideo" id=subtitle]]
+[[!template text="The more information you give the idefun," start="00:08:13.759" video="mainVideo" id=subtitle]]
+[[!template text="the imaginary defun," start="00:08:16.000" video="mainVideo" id=subtitle]]
+[[!template text="the better it would capture the task" start="00:08:17.840" video="mainVideo" id=subtitle]]
+[[!template text="which you're trying to do," start="00:08:20.879" video="mainVideo" id=subtitle]]
+[[!template text="in this case you want to generate" start="00:08:22.000" video="mainVideo" id=subtitle]]
+[[!template text="a Fibonacci sequence." start="00:08:23.039" video="mainVideo" id=subtitle]]
+[[!template text="And yeah, you can define functions" start="00:08:24.080" video="mainVideo" id=subtitle]]
+[[!template text="without having a body," start="00:08:28.319" video="mainVideo" id=subtitle]]
+[[!template text="and they run an inference instead." start="00:08:30.560" video="mainVideo" id=subtitle]]
+[[!template text="Here's a way of overriding" start="00:08:32.640" video="mainVideo" id=subtitle]]
+[[!template text="the language model that's used," start="00:08:34.159" video="mainVideo" id=subtitle]]
+[[!template text="for example, using dynamic scope." start="00:08:36.000" video="mainVideo" id=subtitle]]
+[[!template text="So, under the hood," start="00:08:40.640" video="mainVideo" id=subtitle]]
+[[!template text="idefun just uses an ilambda." start="00:08:41.863" video="mainVideo" id=subtitle]]
+[[!template text="This function here just doubles things." start="00:08:47.040" video="mainVideo" id=subtitle]]
+[[!template text="So, here's a function that gets you" start="00:08:50.959" video="mainVideo" id=subtitle]]
+[[!template text="a hexadecimal color just from the name." start="00:08:53.752" video="mainVideo" id=subtitle]]
+[[!template text="And you can create" start="00:08:59.279" video="mainVideo" id=subtitle]]
+[[!template text="arbitrary functions like this," start="00:09:00.160" video="mainVideo" id=subtitle]]
+[[!template text="so, what we need is like a library" start="00:09:02.160" video="mainVideo" id=subtitle]]
+[[!template text="of imaginary functions, I think," start="00:09:04.268" video="mainVideo" id=subtitle]]
+[[!template text="that match a language model." start="00:09:07.200" video="mainVideo" id=subtitle]]
+[[!template text="Macros on the other hand," start="00:09:12.800" video="mainVideo" id=subtitle]]
+[[!template text="as different from functions," start="00:09:15.760" video="mainVideo" id=subtitle]]
+[[!template text="they actually macro expand" start="00:09:18.160" video="mainVideo" id=subtitle]]
+[[!template text="and generate code." start="00:09:20.000" video="mainVideo" id=subtitle]]
+[[!template text="So, when you macro expand this," start="00:09:21.360" video="mainVideo" id=subtitle]]
+[[!template text="you'll get this," start="00:09:23.279" video="mainVideo" id=subtitle]]
+[[!template text="and that's because this has an arity of 3," start="00:09:26.320" video="mainVideo" id=subtitle]]
+[[!template text="and then when you macro expand" start="00:09:30.000" video="mainVideo" id=subtitle]]
+[[!template text="that underlying macro," start="00:09:31.839" video="mainVideo" id=subtitle]]
+[[!template text="it generates the actual source code." start="00:09:32.959" video="mainVideo" id=subtitle]]
+[[!template text="You can actually run these macros," start="00:09:35.120" video="mainVideo" id=subtitle]]
+[[!template text="and it will cache the output…," start="00:09:37.839" video="mainVideo" id=subtitle]]
+[[!template text="it will catch the source code," start="00:09:41.279" video="mainVideo" id=subtitle]]
+[[!template text="so the macro runs the same" start="00:09:42.480" video="mainVideo" id=subtitle]]
+[[!template text="every single time," start="00:09:44.240" video="mainVideo" id=subtitle]]
+[[!template text="or generates the same code," start="00:09:45.839" video="mainVideo" id=subtitle]]
+[[!template text="but you can just use it" start="00:09:47.519" video="mainVideo" id=subtitle]]
+[[!template text="to generate code really easily" start="00:09:48.560" video="mainVideo" id=subtitle]]
+[[!template text="while you're programming." start="00:09:49.920" video="mainVideo" id=subtitle]]
+[[!template text="I hope that this has been informative," start="00:09:52.000" video="mainVideo" id=subtitle]]
+[[!template text="it wasn't too much time," start="00:09:55.920" video="mainVideo" id=subtitle]]
+[[!template text="but there's plenty of material" start="00:09:57.600" video="mainVideo" id=subtitle]]
+[[!template text="for you to dig into it more" start="00:10:00.312" video="mainVideo" id=subtitle]]
+[[!template text="if you're interested." start="00:10:01.680" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much" start="00:10:04.000" video="mainVideo" id=subtitle]]
+[[!template text="for letting me talk today." start="00:10:04.959" video="mainVideo" id=subtitle]]
+[[!template text="Peace out!" start="00:10:09.519" video="mainVideo" id=subtitle]]
+[[!template text="captions by bhavin192 (Bhavin Gandhi)" start="00:10:15.680" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/invoice.md b/2021/captions/invoice.md
new file mode 100644
index 00000000..27b0bcc0
--- /dev/null
+++ b/2021/captions/invoice.md
@@ -0,0 +1,236 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="What is an invoice?" start="00:00:10.290" video="mainVideo" id=subtitle]]
+[[!template text="Invoice is a document" start="00:00:22.480" video="mainVideo" id=subtitle]]
+[[!template text="that you give it to your customer" start="00:00:25.630" video="mainVideo" id=subtitle]]
+[[!template text="so that they can pay you" start="00:00:28.660" video="mainVideo" id=subtitle]]
+[[!template text="for your service or your goods." start="00:00:30.416" video="mainVideo" id=subtitle]]
+[[!template text="But you are a professor and consultant." start="00:00:31.450" video="mainVideo" id=subtitle]]
+[[!template text="Why do you need to generate invoices?" start="00:00:35.720" video="mainVideo" id=subtitle]]
+[[!template text="Well..." start="00:00:38.730" video="mainVideo" id=subtitle]]
+[[!template text="I do a service for my clients" start="00:00:39.730" video="mainVideo" id=subtitle]]
+[[!template text="if I'm a consultant," start="00:00:46.640" video="mainVideo" id=subtitle]]
+[[!template text="and when I'm a professor," start="00:00:47.884" video="mainVideo" id=subtitle]]
+[[!template text="I'm teaching students," start="00:00:48.999" video="mainVideo" id=subtitle]]
+[[!template text="so I have to generate an invoice." start="00:00:51.530" video="mainVideo" id=subtitle]]
+[[!template text="Why not use Excel or something simple" start="00:00:54.910" video="mainVideo" id=subtitle]]
+[[!template text="to generate your invoices?" start="00:00:58.420" video="mainVideo" id=subtitle]]
+[[!template text="I've tried that." start="00:01:00.079" video="mainVideo" id=subtitle]]
+[[!template text="It's no good, when it... particularly," start="00:01:01.079" video="mainVideo" id=subtitle]]
+[[!template text="when there are many clients," start="00:01:04.609" video="mainVideo" id=subtitle]]
+[[!template text="managing Excels and templates" start="00:01:07.150" video="mainVideo" id=subtitle]]
+[[!template text="becomes very very tricky." start="00:01:09.035" video="mainVideo" id=subtitle]]
+[[!template text="Why don't you hire someone, you know, professional" start="00:01:10.799" video="mainVideo" id=subtitle]]
+[[!template text="to do these for you?" start="00:01:15.725" video="mainVideo" id=subtitle]]
+[[!template text="I've tried it." start="00:01:17.350" video="mainVideo" id=subtitle]]
+[[!template text="I have to give them lots of information." start="00:01:18.428" video="mainVideo" id=subtitle]]
+[[!template text="Not that there's anything wrong with them," start="00:01:22.381" video="mainVideo" id=subtitle]]
+[[!template text="just that I found it to be a bit too tricky." start="00:01:25.140" video="mainVideo" id=subtitle]]
+[[!template text="Professional software?" start="00:01:30.130" video="mainVideo" id=subtitle]]
+[[!template text="Good point. I've tried that too." start="00:01:31.250" video="mainVideo" id=subtitle]]
+[[!template text="But, what's the fun in that, right?" start="00:01:33.902" video="mainVideo" id=subtitle]]
+[[!template text="So what did you do?" start="00:01:36.900" video="mainVideo" id=subtitle]]
+[[!template text="Haa.. this is the interesting part!" start="00:01:38.850" video="mainVideo" id=subtitle]]
+[[!template text="I took a software called Emacs Org mode" start="00:01:40.869" video="mainVideo" id=subtitle]]
+[[!template text="and with that, I added Python code to it." start="00:01:45.600" video="mainVideo" id=subtitle]]
+[[!template text="I added so many other things to it," start="00:01:50.640" video="mainVideo" id=subtitle]]
+[[!template text="and then it became a really nice" start="00:01:52.418" video="mainVideo" id=subtitle]]
+[[!template text="customizable way to generate invoices." start="00:01:56.168" video="mainVideo" id=subtitle]]
+[[!template text="Whoa whoa whoa... Just slow it down, bro." start="00:01:59.640" video="mainVideo" id=subtitle]]
+[[!template text="Give me the story." start="00:02:04.549" video="mainVideo" id=subtitle]]
+[[!template text="Hey. Okay... Okay... I will." start="00:02:06.659" video="mainVideo" id=subtitle]]
+[[!template text="Story." start="00:02:10.170" video="mainVideo" id=subtitle]]
+[[!template text="Uh.. Story is simple." start="00:02:11.170" video="mainVideo" id=subtitle]]
+[[!template text="The client wanted an invoice." start="00:02:14.620" video="mainVideo" id=subtitle]]
+[[!template text="So, I generated an invoice." start="00:02:16.590" video="mainVideo" id=subtitle]]
+[[!template text="It wasn't good enough." start="00:02:19.900" video="mainVideo" id=subtitle]]
+[[!template text="So, I hacked some little bit of it." start="00:02:21.419" video="mainVideo" id=subtitle]]
+[[!template text="I changed every time a new client came." start="00:02:24.959" video="mainVideo" id=subtitle]]
+[[!template text="I had to do it all over again." start="00:02:28.480" video="mainVideo" id=subtitle]]
+[[!template text="I did that. I did it." start="00:02:29.848" video="mainVideo" id=subtitle]]
+[[!template text="Then I got really tired of it." start="00:02:30.989" video="mainVideo" id=subtitle]]
+[[!template text="And that's what led me to all these customizations." start="00:02:33.110" video="mainVideo" id=subtitle]]
+[[!template text="I want features." start="00:02:36.760" video="mainVideo" id=subtitle]]
+[[!template text="So, rapid fire questions. Ready? Yep." start="00:02:38.632" video="mainVideo" id=subtitle]]
+[[!template text="Project management? Yep." start="00:02:43.249" video="mainVideo" id=subtitle]]
+[[!template text="Format customization? Yes." start="00:02:46.079" video="mainVideo" id=subtitle]]
+[[!template text="PDF export? Yes." start="00:02:48.079" video="mainVideo" id=subtitle]]
+[[!template text="Multi-client support? Yes." start="00:02:50.079" video="mainVideo" id=subtitle]]
+[[!template text="Washing my clothes?" start="00:02:52.079" video="mainVideo" id=subtitle]]
+[[!template text="Yes... No." start="00:02:53.579" video="mainVideo" id=subtitle]]
+[[!template text="Haa. I was just testing you," start="00:02:54.959" video="mainVideo" id=subtitle]]
+[[!template text="if you're paying attention or not." start="00:02:57.013" video="mainVideo" id=subtitle]]
+[[!template text="Logo and signature customization? Yes." start="00:03:00.900" video="mainVideo" id=subtitle]]
+[[!template text="Multi-currency support? Yes." start="00:03:04.659" video="mainVideo" id=subtitle]]
+[[!template text="Okay, enough talky or it's just..." start="00:03:06.730" video="mainVideo" id=subtitle]]
+[[!template text="Can you show me a demo that you did?" start="00:03:08.930" video="mainVideo" id=subtitle]]
+[[!template text="Or is it just talky." start="00:03:10.930" video="mainVideo" id=subtitle]]
+[[!template text="Yes, of course. Demo." start="00:03:12.950" video="mainVideo" id=subtitle]]
+[[!template text="Okay, demo time." start="00:03:15.239" video="mainVideo" id=subtitle]]
+[[!template text="Some ingredients for invoicing." start="00:03:16.969" video="mainVideo" id=subtitle]]
+[[!template text="Org mode, of course." start="00:03:18.909" video="mainVideo" id=subtitle]]
+[[!template text="Python environment and libraries for Python:" start="00:03:21.069" video="mainVideo" id=subtitle]]
+[[!template text="pandas, tabulate, numbers." start="00:03:23.849" video="mainVideo" id=subtitle]]
+[[!template text="yasnippet package, very useful." start="00:03:25.930" video="mainVideo" id=subtitle]]
+[[!template text="And I use for LaTeX, MikTeX packages." start="00:03:28.260" video="mainVideo" id=subtitle]]
+[[!template text="So, I have a project already set up." start="00:03:30.969" video="mainVideo" id=subtitle]]
+[[!template text="This is what we have." start="00:03:34.090" video="mainVideo" id=subtitle]]
+[[!template text="The project is Teaching 2021" start="00:03:36.540" video="mainVideo" id=subtitle]]
+[[!template text="and you can set all this up." start="00:03:38.673" video="mainVideo" id=subtitle]]
+[[!template text="So let's start with the first and foremost." start="00:03:41.239" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so we're going to use" start="00:03:43.819" video="mainVideo" id=subtitle]]
+[[!template text="the yasnippet package." start="00:03:46.849" video="mainVideo" id=subtitle]]
+[[!template text="uh.. um.. sorry, the invoice, okay." start="00:03:49.209" video="mainVideo" id=subtitle]]
+[[!template text="This one introduced, it gives you this whole..." start="00:03:52.219" video="mainVideo" id=subtitle]]
+[[!template text="generates this whole bunch of code" start="00:03:54.550" video="mainVideo" id=subtitle]]
+[[!template text="based on a template." start="00:03:56.377" video="mainVideo" id=subtitle]]
+[[!template text="All you're going to do" start="00:03:57.150" video="mainVideo" id=subtitle]]
+[[!template text="is to type out the client's name." start="00:03:58.371" video="mainVideo" id=subtitle]]
+[[!template text="Okay and that's it." start="00:04:00.939" video="mainVideo" id=subtitle]]
+[[!template text="That's all there is to it." start="00:04:02.797" video="mainVideo" id=subtitle]]
+[[!template text="Okay there's a whole bunch of instructions" start="00:04:04.469" video="mainVideo" id=subtitle]]
+[[!template text="that you can follow." start="00:04:06.446" video="mainVideo" id=subtitle]]
+[[!template text="If it's for the first time," start="00:04:07.199" video="mainVideo" id=subtitle]]
+[[!template text="use bankinfo.org." start="00:04:09.284" video="mainVideo" id=subtitle]]
+[[!template text="Let's check out what bankinfo.org involves." start="00:04:10.549" video="mainVideo" id=subtitle]]
+[[!template text="Okay so you can copy this template" start="00:04:14.409" video="mainVideo" id=subtitle]]
+[[!template text="from my GitHub repository." start="00:04:16.819" video="mainVideo" id=subtitle]]
+[[!template text="It's basically setup of the LaTeX tags," start="00:04:19.269" video="mainVideo" id=subtitle]]
+[[!template text="and particularly this text file," start="00:04:24.300" video="mainVideo" id=subtitle]]
+[[!template text="which is a template." start="00:04:26.854" video="mainVideo" id=subtitle]]
+[[!template text="There's some personal info" start="00:04:28.620" video="mainVideo" id=subtitle]]
+[[!template text="for all the details that you want." start="00:04:30.469" video="mainVideo" id=subtitle]]
+[[!template text="Bank information." start="00:04:32.125" video="mainVideo" id=subtitle]]
+[[!template text="You can look at it in detail" start="00:04:33.814" video="mainVideo" id=subtitle]]
+[[!template text="from my repo. The tax invoice..." start="00:04:35.580" video="mainVideo" id=subtitle]]
+[[!template text="There are some basic constructs." start="00:04:40.330" video="mainVideo" id=subtitle]]
+[[!template text="You can totally change any of these" start="00:04:42.840" video="mainVideo" id=subtitle]]
+[[!template text="to your liking." start="00:04:45.809" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so that's bank info." start="00:04:47.620" video="mainVideo" id=subtitle]]
+[[!template text="Go back. That's the first part." start="00:04:50.320" video="mainVideo" id=subtitle]]
+[[!template text="The second part is creating a client name." start="00:04:52.200" video="mainVideo" id=subtitle]]
+[[!template text="So let's look at this setup," start="00:04:55.540" video="mainVideo" id=subtitle]]
+[[!template text="and I have one created already." start="00:04:58.420" video="mainVideo" id=subtitle]]
+[[!template text="So, in order to create this," start="00:05:00.710" video="mainVideo" id=subtitle]]
+[[!template text="all you need to do" start="00:05:02.804" video="mainVideo" id=subtitle]]
+[[!template text="is to use the inv-setup" start="00:05:03.880" video="mainVideo" id=subtitle]]
+[[!template text="invoice setup for your client," start="00:05:06.610" video="mainVideo" id=subtitle]]
+[[!template text="and it will give you all the information." start="00:05:10.300" video="mainVideo" id=subtitle]]
+[[!template text="All you need to do is type in here" start="00:05:12.230" video="mainVideo" id=subtitle]]
+[[!template text="and then type in the client's name," start="00:05:14.790" video="mainVideo" id=subtitle]]
+[[!template text="exactly the same that you see" start="00:05:16.410" video="mainVideo" id=subtitle]]
+[[!template text="as the file name." start="00:05:18.785" video="mainVideo" id=subtitle]]
+[[!template text="Okay, client one. And that's it." start="00:05:20.210" video="mainVideo" id=subtitle]]
+[[!template text="You're all set for you." start="00:05:22.620" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so that's what it looks like." start="00:05:24.250" video="mainVideo" id=subtitle]]
+[[!template text="All the address and stuff" start="00:05:26.218" video="mainVideo" id=subtitle]]
+[[!template text="filled out here." start="00:05:28.043" video="mainVideo" id=subtitle]]
+[[!template text="Okay. And then the next one" start="00:05:29.710" video="mainVideo" id=subtitle]]
+[[!template text="is to use the... One time," start="00:05:32.131" video="mainVideo" id=subtitle]]
+[[!template text="you're going to do the invoice item," start="00:05:37.010" video="mainVideo" id=subtitle]]
+[[!template text="which is the rate table." start="00:05:38.890" video="mainVideo" id=subtitle]]
+[[!template text="So let's do the invoice." start="00:05:40.590" video="mainVideo" id=subtitle]]
+[[!template text="Invoice item..." start="00:05:42.490" video="mainVideo" id=subtitle]]
+[[!template text="This is item master." start="00:05:44.400" video="mainVideo" id=subtitle]]
+[[!template text="So here again, another place" start="00:05:47.080" video="mainVideo" id=subtitle]]
+[[!template text="where you have to enter the client name," start="00:05:50.320" video="mainVideo" id=subtitle]]
+[[!template text="and your rate table is ready for use." start="00:05:53.060" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So that was..." start="00:05:56.780" video="mainVideo" id=subtitle]]
+[[!template text="Now we go to step two," start="00:05:58.891" video="mainVideo" id=subtitle]]
+[[!template text="which is clock table for reference." start="00:06:00.749" video="mainVideo" id=subtitle]]
+[[!template text="Okay. Let's go to the clock table." start="00:06:02.510" video="mainVideo" id=subtitle]]
+[[!template text="I already set up this for ACMEClient1," start="00:06:04.150" video="mainVideo" id=subtitle]]
+[[!template text="and I give it a tag: billable." start="00:06:09.660" video="mainVideo" id=subtitle]]
+[[!template text="Okay. We will see that..." start="00:06:12.030" video="mainVideo" id=subtitle]]
+[[!template text="Where have I done that?" start="00:06:13.260" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so that's the client, you know," start="00:06:17.470" video="mainVideo" id=subtitle]]
+[[!template text="ACMEClient1 table teaching 2021." start="00:06:23.890" video="mainVideo" id=subtitle]]
+[[!template text="I've clocked it for the previous month." start="00:06:25.360" video="mainVideo" id=subtitle]]
+[[!template text="That's what you will see." start="00:06:29.090" video="mainVideo" id=subtitle]]
+[[!template text="Let's see it again." start="00:06:30.090" video="mainVideo" id=subtitle]]
+[[!template text="Okay. That's... Let's put the instructions." start="00:06:31.090" video="mainVideo" id=subtitle]]
+[[!template text="And then you go to clock table" start="00:06:34.840" video="mainVideo" id=subtitle]]
+[[!template text="to generate the clock table for the client." start="00:06:38.110" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So clock table..." start="00:06:40.490" video="mainVideo" id=subtitle]]
+[[!template text="This is only for your reference," start="00:06:42.342" video="mainVideo" id=subtitle]]
+[[!template text="not going to be exported." start="00:06:44.335" video="mainVideo" id=subtitle]]
+[[!template text="Here we get a clock table. All right." start="00:06:45.484" video="mainVideo" id=subtitle]]
+[[!template text="So with this, you get the clock table." start="00:06:50.586" video="mainVideo" id=subtitle]]
+[[!template text="Okay. Now go into the items part." start="00:06:53.150" video="mainVideo" id=subtitle]]
+[[!template text="You will see two Python blocks," start="00:06:55.670" video="mainVideo" id=subtitle]]
+[[!template text="which is what the next instruction says." start="00:06:59.810" video="mainVideo" id=subtitle]]
+[[!template text="Go into the python block" start="00:07:01.500" video="mainVideo" id=subtitle]]
+[[!template text="and do Control-c c (C-c c)." start="00:07:03.526" video="mainVideo" id=subtitle]]
+[[!template text="Go to the control python source block," start="00:07:06.180" video="mainVideo" id=subtitle]]
+[[!template text="second one, and do Ctrl-c c..." start="00:07:09.860" video="mainVideo" id=subtitle]]
+[[!template text="Ctrl-c Ctrl-c (C-c C-c) rather." start="00:07:12.413" video="mainVideo" id=subtitle]]
+[[!template text="and then finally come back" start="00:07:14.490" video="mainVideo" id=subtitle]]
+[[!template text="to Raise Invoice and do dispatcher" start="00:07:16.028" video="mainVideo" id=subtitle]]
+[[!template text="which is exported into PDF." start="00:07:18.765" video="mainVideo" id=subtitle]]
+[[!template text="Okay, let's do that." start="00:07:21.270" video="mainVideo" id=subtitle]]
+[[!template text="First one is... I just run this code," start="00:07:22.718" video="mainVideo" id=subtitle]]
+[[!template text="and it generated this table for me." start="00:07:27.853" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So it has all the details." start="00:07:30.950" video="mainVideo" id=subtitle]]
+[[!template text="Now we go in" start="00:07:34.160" video="mainVideo" id=subtitle]]
+[[!template text="the second source code block," start="00:07:35.253" video="mainVideo" id=subtitle]]
+[[!template text="and does all this..." start="00:07:39.560" video="mainVideo" id=subtitle]]
+[[!template text="And it has generated this stuff." start="00:07:41.700" video="mainVideo" id=subtitle]]
+[[!template text="Plus, you should note that for beancount," start="00:07:43.530" video="mainVideo" id=subtitle]]
+[[!template text="it has also generated the block for that." start="00:07:46.335" video="mainVideo" id=subtitle]]
+[[!template text="It's all in the code." start="00:07:50.795" video="mainVideo" id=subtitle]]
+[[!template text="You can customize it if you're on Ledger." start="00:07:51.775" video="mainVideo" id=subtitle]]
+[[!template text="You can customize it" start="00:07:53.820" video="mainVideo" id=subtitle]]
+[[!template text="to the way you want," start="00:07:54.782" video="mainVideo" id=subtitle]]
+[[!template text="any accounts that you want to change." start="00:07:55.390" video="mainVideo" id=subtitle]]
+[[!template text="It's all customizable." start="00:07:56.978" video="mainVideo" id=subtitle]]
+[[!template text="Here, even the currency symbols" start="00:07:58.870" video="mainVideo" id=subtitle]]
+[[!template text="can be changed from INR and Rupees" start="00:08:00.710" video="mainVideo" id=subtitle]]
+[[!template text="to whatever currency you have" start="00:08:02.840" video="mainVideo" id=subtitle]]
+[[!template text="can be changed accordingly." start="00:08:04.681" video="mainVideo" id=subtitle]]
+[[!template text="I have org-babel-tangle-append code" start="00:08:07.190" video="mainVideo" id=subtitle]]
+[[!template text="that I will share in the..." start="00:08:11.304" video="mainVideo" id=subtitle]]
+[[!template text="I've borrowed it" start="00:08:12.650" video="mainVideo" id=subtitle]]
+[[!template text="from somebody on the Internet," start="00:08:13.872" video="mainVideo" id=subtitle]]
+[[!template text="so I'll share that as well" start="00:08:14.889" video="mainVideo" id=subtitle]]
+[[!template text="in my GitHub repo." start="00:08:16.440" video="mainVideo" id=subtitle]]
+[[!template text="Lastly, I just want to share that" start="00:08:18.650" video="mainVideo" id=subtitle]]
+[[!template text="you can fill your GST website" start="00:08:20.830" video="mainVideo" id=subtitle]]
+[[!template text="with these info," start="00:08:23.730" video="mainVideo" id=subtitle]]
+[[!template text="so you can... You can even put in" start="00:08:24.988" video="mainVideo" id=subtitle]]
+[[!template text="as many entries as you want" start="00:08:26.171" video="mainVideo" id=subtitle]]
+[[!template text="in your yasnippet." start="00:08:27.590" video="mainVideo" id=subtitle]]
+[[!template text="Customize it the way you want." start="00:08:29.370" video="mainVideo" id=subtitle]]
+[[!template text="I also added a month later" start="00:08:30.560" video="mainVideo" id=subtitle]]
+[[!template text="due date reminder," start="00:08:32.590" video="mainVideo" id=subtitle]]
+[[!template text="saying if the invoice is paid or not." start="00:08:33.820" video="mainVideo" id=subtitle]]
+[[!template text="Okay." start="00:08:36.239" video="mainVideo" id=subtitle]]
+[[!template text="So, a few tips to end this demo." start="00:08:37.209" video="mainVideo" id=subtitle]]
+[[!template text="You can customize currency symbol" start="00:08:42.051" video="mainVideo" id=subtitle]]
+[[!template text="and currency words" start="00:08:44.990" video="mainVideo" id=subtitle]]
+[[!template text="according to your own currency." start="00:08:45.860" video="mainVideo" id=subtitle]]
+[[!template text="I use the European/Indian date format" start="00:08:47.540" video="mainVideo" id=subtitle]]
+[[!template text="which is %d-%m-%Y. You can also..." start="00:08:51.269" video="mainVideo" id=subtitle]]
+[[!template text="The language is Indian English," start="00:08:54.980" video="mainVideo" id=subtitle]]
+[[!template text="so it will change according--" start="00:08:56.816" video="mainVideo" id=subtitle]]
+[[!template text="the numerals change according to the" start="00:08:57.998" video="mainVideo" id=subtitle]]
+[[!template text="Indian format. Numbering format" start="00:08:59.860" video="mainVideo" id=subtitle]]
+[[!template text="for invoice number is today's date" start="00:09:02.180" video="mainVideo" id=subtitle]]
+[[!template text="followed by client name." start="00:09:04.959" video="mainVideo" id=subtitle]]
+[[!template text="That's my default." start="00:09:06.620" video="mainVideo" id=subtitle]]
+[[!template text="You can customize that as well." start="00:09:07.959" video="mainVideo" id=subtitle]]
+[[!template text="Let's try and export this" start="00:09:11.120" video="mainVideo" id=subtitle]]
+[[!template text="to the subtree. Ctrl-s." start="00:09:13.574" video="mainVideo" id=subtitle]]
+[[!template text="So that's step number seven." start="00:09:17.325" video="mainVideo" id=subtitle]]
+[[!template text="And there it is," start="00:09:20.579" video="mainVideo" id=subtitle]]
+[[!template text="the tax invoice" start="00:09:22.029" video="mainVideo" id=subtitle]]
+[[!template text="for Dr. Wile E. Coyote," start="00:09:23.339" video="mainVideo" id=subtitle]]
+[[!template text="and with a lovely signature as well." start="00:09:25.870" video="mainVideo" id=subtitle]]
+[[!template text="Interviewer: Well, that's great!" start="00:09:27.810" video="mainVideo" id=subtitle]]
+[[!template text="If I were to try this out, what do I do?" start="00:09:29.990" video="mainVideo" id=subtitle]]
+[[!template text="Go to github.com, into my repository." start="00:09:34.309" video="mainVideo" id=subtitle]]
+[[!template text="I'll leave my GitHub URL." start="00:09:36.779" video="mainVideo" id=subtitle]]
+[[!template text="You can download it use it," start="00:09:38.915" video="mainVideo" id=subtitle]]
+[[!template text="and let me know" start="00:09:42.790" video="mainVideo" id=subtitle]]
+[[!template text="how it pans out for you." start="00:09:43.848" video="mainVideo" id=subtitle]]
+[[!template text="Interviewer: I have spent" start="00:09:46.829" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/janitor.md b/2021/captions/janitor.md
new file mode 100644
index 00000000..3e7bdc3c
--- /dev/null
+++ b/2021/captions/janitor.md
@@ -0,0 +1,596 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, my name is Stefan Monnier," start="00:00:01.520" video="mainVideo" id=subtitle]]
+[[!template text="and I'm going to talk to you about--" start="00:00:04.400" video="mainVideo" id=subtitle]]
+[[!template text="well, I'm going to present a bit" start="00:00:06.799" video="mainVideo" id=subtitle]]
+[[!template text="of the life of a janitor." start="00:00:08.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So by and large, there's just" start="00:00:11.840" video="mainVideo" id=subtitle]]
+[[!template text="nothing to see here," start="00:00:14.050" video="mainVideo" id=subtitle]]
+[[!template text="and that's probably" start="00:00:16.299" video="mainVideo" id=subtitle]]
+[[!template text="not super interesting," start="00:00:17.199" video="mainVideo" id=subtitle]]
+[[!template text="but some of you might actually like to" start="00:00:18.240" video="mainVideo" id=subtitle]]
+[[!template text="see how I work, so I figured why not." start="00:00:19.920" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Usually what I do just doesn't make any" start="00:00:25.359" video="mainVideo" id=subtitle]]
+[[!template text="any significant difference," start="00:00:27.279" video="mainVideo" id=subtitle]]
+[[!template text="and so I basically take existing code" start="00:00:29.920" video="mainVideo" id=subtitle]]
+[[!template text="that's working, and I try to change it" start="00:00:32.160" video="mainVideo" id=subtitle]]
+[[!template text="hopefully without breaking it too much" start="00:00:35.040" video="mainVideo" id=subtitle]]
+[[!template text="and make it slightly more..." start="00:00:37.680" video="mainVideo" id=subtitle]]
+[[!template text="you know, following some of the more" start="00:00:40.079" video="mainVideo" id=subtitle]]
+[[!template text="modern style, let's say," start="00:00:42.719" video="mainVideo" id=subtitle]]
+[[!template text="and sometimes along the way," start="00:00:44.640" video="mainVideo" id=subtitle]]
+[[!template text="it actually fixes some bugs." start="00:00:46.719" video="mainVideo" id=subtitle]]
+[[!template new="1" text="More concretely, the kind of things" start="00:00:50.399" video="mainVideo" id=subtitle]]
+[[!template text="that I do is basically activate" start="00:00:51.983" video="mainVideo" id=subtitle]]
+[[!template text="lexical scoping--" start="00:00:54.079" video="mainVideo" id=subtitle]]
+[[!template text="that's really my main goal usually--" start="00:00:54.480" video="mainVideo" id=subtitle]]
+[[!template text="but also do things like convert" start="00:00:56.239" video="mainVideo" id=subtitle]]
+[[!template text="from `cl` to `cl-lib`," start="00:00:58.960" video="mainVideo" id=subtitle]]
+[[!template text="sometimes I have to" start="00:01:00.719" video="mainVideo" id=subtitle]]
+[[!template text="fix some compilation dependencies," start="00:01:01.440" video="mainVideo" id=subtitle]]
+[[!template text="I might convert from `defadvice` to `advice-add`," start="00:01:03.760" video="mainVideo" id=subtitle]]
+[[!template text="and many of the things--" start="00:01:07.280" video="mainVideo" id=subtitle]]
+[[!template text="in terms of number of changes," start="00:01:11.439" video="mainVideo" id=subtitle]]
+[[!template text="most of them are actually" start="00:01:13.119" video="mainVideo" id=subtitle]]
+[[!template text="changing `quote fun` to `hash quote fun`" start="00:01:14.000" video="mainVideo" id=subtitle]]
+[[!template text="because I prefer it," start="00:01:16.560" video="mainVideo" id=subtitle]]
+[[!template text="but also it often helps me" start="00:01:17.360" video="mainVideo" id=subtitle]]
+[[!template text="have a better understanding" start="00:01:19.920" video="mainVideo" id=subtitle]]
+[[!template text="of which function is called where," start="00:01:21.439" video="mainVideo" id=subtitle]]
+[[!template text="and so the warnings I get from it" start="00:01:23.920" video="mainVideo" id=subtitle]]
+[[!template text="sometimes help me. You look concretely..." start="00:01:26.799" video="mainVideo" id=subtitle]]
+[[!template text="it's not nothing really clear;" start="00:01:28.799" video="mainVideo" id=subtitle]]
+[[!template text="it's more in terms of helping me" start="00:01:30.880" video="mainVideo" id=subtitle]]
+[[!template text="have a mental image" start="00:01:33.360" video="mainVideo" id=subtitle]]
+[[!template text="of how the package works." start="00:01:35.759" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's take a look." start="00:01:39.439" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to start with" start="00:01:42.880" video="mainVideo" id=subtitle]]
+[[!template text="the package `heap`," start="00:01:45.840" video="mainVideo" id=subtitle]]
+[[!template text="which I saw had a few weird things in it," start="00:01:46.799" video="mainVideo" id=subtitle]]
+[[!template text="so I'm going to compile it." start="00:01:50.560" video="mainVideo" id=subtitle]]
+[[!template text="That's basically the way the way I work," start="00:01:53.680" video="mainVideo" id=subtitle]]
+[[!template text="right. I take a package." start="00:01:55.600" video="mainVideo" id=subtitle]]
+[[!template text="I just pass it to the byte compiler." start="00:01:57.840" video="mainVideo" id=subtitle]]
+[[!template text="I do that by just having" start="00:02:00.479" video="mainVideo" id=subtitle]]
+[[!template text="a clone of the whole" start="00:02:02.159" video="mainVideo" id=subtitle]]
+[[!template text="GNU ELPA repository," start="00:02:04.560" video="mainVideo" id=subtitle]]
+[[!template text="and so that's why I built them." start="00:02:06.799" video="mainVideo" id=subtitle]]
+[[!template text="I use the build rules" start="00:02:10.000" video="mainVideo" id=subtitle]]
+[[!template text="from the GNU ELPA repository." start="00:02:11.520" video="mainVideo" id=subtitle]]
+[[!template new="1" text="These build rules enforce--" start="00:02:15.120" video="mainVideo" id=subtitle]]
+[[!template text="make sure that the files" start="00:02:16.720" video="mainVideo" id=subtitle]]
+[[!template text="are compiled in a clean environment" start="00:02:17.680" video="mainVideo" id=subtitle]]
+[[!template text="so you get fairly good warnings." start="00:02:19.680" video="mainVideo" id=subtitle]]
+[[!template text="If you look at the warnings you see here," start="00:02:21.920" video="mainVideo" id=subtitle]]
+[[!template text="there's a lot of things" start="00:02:23.680" video="mainVideo" id=subtitle]]
+[[!template text="which are completely irrelevant," start="00:02:24.720" video="mainVideo" id=subtitle]]
+[[!template text="which are due to details" start="00:02:26.480" video="mainVideo" id=subtitle]]
+[[!template text="of the way I have my Emacs set up" start="00:02:28.400" video="mainVideo" id=subtitle]]
+[[!template text="and some of the local changes" start="00:02:30.319" video="mainVideo" id=subtitle]]
+[[!template text="I had in it so, you know," start="00:02:31.599" video="mainVideo" id=subtitle]]
+[[!template text="there's no point" start="00:02:34.319" video="mainVideo" id=subtitle]]
+[[!template text="paying too much attention to it," start="00:02:35.280" video="mainVideo" id=subtitle]]
+[[!template text="but here we have a first warning." start="00:02:37.920" video="mainVideo" id=subtitle]]
+[[!template text="We see that this is using `cl`," start="00:02:40.400" video="mainVideo" id=subtitle]]
+[[!template text="so we want to change this to `cl-lib`," start="00:02:42.959" video="mainVideo" id=subtitle]]
+[[!template text="but that also means" start="00:02:45.040" video="mainVideo" id=subtitle]]
+[[!template text="that we may have a new dependency" start="00:02:46.879" video="mainVideo" id=subtitle]]
+[[!template text="on the `cl-lib` package," start="00:02:48.400" video="mainVideo" id=subtitle]]
+[[!template text="so we have to go check" start="00:02:49.920" video="mainVideo" id=subtitle]]
+[[!template text="the start of the file" start="00:02:51.120" video="mainVideo" id=subtitle]]
+[[!template text="to see if it already declares" start="00:02:52.000" video="mainVideo" id=subtitle]]
+[[!template text="some dependency, and we see it doesn't," start="00:02:54.080" video="mainVideo" id=subtitle]]
+[[!template text="not even on a on a recent-enough Emacs," start="00:02:56.800" video="mainVideo" id=subtitle]]
+[[!template text="so we have to add--" start="00:03:00.640" video="mainVideo" id=subtitle]]
+[[!template text="sorry, that's not going very well..." start="00:03:02.325" video="mainVideo" id=subtitle]]
+[[!template text="oh..." start="00:03:05.360" video="mainVideo" id=subtitle]]
+[[!template text="okay, we're going to get there somewhere..." start="00:03:06.480" video="mainVideo" id=subtitle]]
+[[!template text="somehow..." start="00:03:08.560" video="mainVideo" id=subtitle]]
+[[!template text="oh, that still wasn't it, wow, okay--" start="00:03:13.200" video="mainVideo" id=subtitle]]
+[[!template text="and along the way..." start="00:03:20.480" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Of course, since we converted to `cl-lib`," start="00:03:22.159" video="mainVideo" id=subtitle]]
+[[!template text="we have to update the uses" start="00:03:24.159" video="mainVideo" id=subtitle]]
+[[!template text="so `defstruct` shouldn't be used anymore." start="00:03:26.159" video="mainVideo" id=subtitle]]
+[[!template text="We may want to reindent this" start="00:03:29.840" video="mainVideo" id=subtitle]]
+[[!template text="to get something a bit cleaner." start="00:03:31.599" video="mainVideo" id=subtitle]]
+[[!template text="We have here a missing quote..." start="00:03:37.040" video="mainVideo" id=subtitle]]
+[[!template text="hash, sorry." start="00:03:40.589" video="mainVideo" id=subtitle]]
+[[!template text="We have `decf`, so `decf` is here," start="00:03:41.920" video="mainVideo" id=subtitle]]
+[[!template text="and that needs to be replaced" start="00:03:46.480" video="mainVideo" id=subtitle]]
+[[!template text="with `cl-decf`." start="00:03:48.000" video="mainVideo" id=subtitle]]
+[[!template text="Sometimes it's worth doing" start="00:03:49.920" video="mainVideo" id=subtitle]]
+[[!template text="a search-and-replace." start="00:03:51.120" video="mainVideo" id=subtitle]]
+[[!template text="Here I see there's only two," start="00:03:53.360" video="mainVideo" id=subtitle]]
+[[!template text="so it's not worth the trouble;" start="00:03:54.799" video="mainVideo" id=subtitle]]
+[[!template text="I just do it by hand, and that's it." start="00:03:57.760" video="mainVideo" id=subtitle]]
+[[!template text="Well, that was easy." start="00:04:00.711" video="mainVideo" id=subtitle]]
+[[!template text="So let's recompile, see what it says." start="00:04:02.000" video="mainVideo" id=subtitle]]
+[[!template text="Ah, this is clean. Perfect!" start="00:04:10.159" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's.. we can go see..." start="00:04:12.959" video="mainVideo" id=subtitle]]
+[[!template text="There is another one I had." start="00:04:15.000" video="mainVideo" id=subtitle]]
+[[!template text="Was it `counsel`, I think. Yes." start="00:04:17.280" video="mainVideo" id=subtitle]]
+[[!template text="So also I saw some funny things" start="00:04:20.239" video="mainVideo" id=subtitle]]
+[[!template text="going on here." start="00:04:24.160" video="mainVideo" id=subtitle]]
+[[!template text="So I'm going to do" start="00:04:24.320" video="mainVideo" id=subtitle]]
+[[!template text="the same procedure as before:" start="00:04:26.479" video="mainVideo" id=subtitle]]
+[[!template text="I just compile the file" start="00:04:31.040" video="mainVideo" id=subtitle]]
+[[!template text="and look at the warnings." start="00:04:32.800" video="mainVideo" id=subtitle]]
+[[!template text="Oh, we have many more here." start="00:04:38.000" video="mainVideo" id=subtitle]]
+[[!template text="So let's see..." start="00:04:40.479" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so we have missing quotes--" start="00:04:43.120" video="mainVideo" id=subtitle]]
+[[!template text="oh, hashes. They're not really missing;" start="00:04:46.504" video="mainVideo" id=subtitle]]
+[[!template text="it's just a personal preference." start="00:04:49.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Oh, here... here's an important one:" start="00:04:54.639" video="mainVideo" id=subtitle]]
+[[!template text="so as you know," start="00:04:57.440" video="mainVideo" id=subtitle]]
+[[!template text="if you look at the top of the file," start="00:04:59.280" video="mainVideo" id=subtitle]]
+[[!template text="you see that here" start="00:05:00.639" video="mainVideo" id=subtitle]]
+[[!template text="it says it's using lexical binding," start="00:05:02.240" video="mainVideo" id=subtitle]]
+[[!template text="yet it's not fully using lexical binding," start="00:05:04.960" video="mainVideo" id=subtitle]]
+[[!template text="because as we just saw," start="00:05:07.120" video="mainVideo" id=subtitle]]
+[[!template text="there's a call to the `eval` function" start="00:05:08.960" video="mainVideo" id=subtitle]]
+[[!template text="with only one argument," start="00:05:11.039" video="mainVideo" id=subtitle]]
+[[!template text="which means the second argument is nil," start="00:05:11.680" video="mainVideo" id=subtitle]]
+[[!template text="which means that the expression read" start="00:05:13.280" video="mainVideo" id=subtitle]]
+[[!template text="by `read` here is going to be evaluated" start="00:05:16.880" video="mainVideo" id=subtitle]]
+[[!template text="using the old dialects," start="00:05:19.520" video="mainVideo" id=subtitle]]
+[[!template text="which is only dynamic scoping." start="00:05:22.160" video="mainVideo" id=subtitle]]
+[[!template text="So here I like to just change this" start="00:05:24.240" video="mainVideo" id=subtitle]]
+[[!template text="to use lexical scoping," start="00:05:25.680" video="mainVideo" id=subtitle]]
+[[!template text="which in most cases" start="00:05:26.800" video="mainVideo" id=subtitle]]
+[[!template text="just doesn't make any difference." start="00:05:28.080" video="mainVideo" id=subtitle]]
+[[!template text="It just makes me feel better." start="00:05:29.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So there's lots of those hashes" start="00:05:35.919" video="mainVideo" id=subtitle]]
+[[!template text="all over the place." start="00:05:40.160" video="mainVideo" id=subtitle]]
+[[!template text="It's not strictly necessary, as you know," start="00:05:43.680" video="mainVideo" id=subtitle]]
+[[!template text="but I'm just going to add them anyway." start="00:05:45.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Here we see" start="00:05:52.479" video="mainVideo" id=subtitle]]
+[[!template text="it's not going to warn me here" start="00:05:53.199" video="mainVideo" id=subtitle]]
+[[!template text="because it doesn't know" start="00:05:54.800" video="mainVideo" id=subtitle]]
+[[!template text="that `ivy-make-magic-action`" start="00:05:55.759" video="mainVideo" id=subtitle]]
+[[!template text="takes a function," start="00:05:57.600" video="mainVideo" id=subtitle]]
+[[!template text="but it's a pretty good guess that it does." start="00:05:58.400" video="mainVideo" id=subtitle]]
+[[!template text="And here's some more." start="00:06:12.319" video="mainVideo" id=subtitle]]
+[[!template text="What else do we have?" start="00:06:14.479" video="mainVideo" id=subtitle]]
+[[!template text="Is that all we have here?" start="00:06:16.080" video="mainVideo" id=subtitle]]
+[[!template text="Well, looks like it. Oh, I see a few..." start="00:06:19.120" video="mainVideo" id=subtitle]]
+[[!template text="a few more here..." start="00:06:21.440" video="mainVideo" id=subtitle]]
+[[!template text="and one more." start="00:06:27.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And oh, this is more interesting." start="00:06:30.639" video="mainVideo" id=subtitle]]
+[[!template text="So here we have a use of `defadvice`," start="00:06:33.039" video="mainVideo" id=subtitle]]
+[[!template text="so if we go back" start="00:06:35.280" video="mainVideo" id=subtitle]]
+[[!template text="to the beginning of the file," start="00:06:37.440" video="mainVideo" id=subtitle]]
+[[!template text="we see that it actually depends" start="00:06:40.720" video="mainVideo" id=subtitle]]
+[[!template text="on Emacs 24.5, so it actually has" start="00:06:42.880" video="mainVideo" id=subtitle]]
+[[!template text="the new advice system available" start="00:06:47.360" video="mainVideo" id=subtitle]]
+[[!template text="without having to add any dependency," start="00:06:49.280" video="mainVideo" id=subtitle]]
+[[!template text="so there's really no good reason" start="00:06:51.520" video="mainVideo" id=subtitle]]
+[[!template text="to keep this." start="00:06:53.599" video="mainVideo" id=subtitle]]
+[[!template text="So we just convert this" start="00:06:54.880" video="mainVideo" id=subtitle]]
+[[!template text="to an `advice-add`," start="00:06:56.160" video="mainVideo" id=subtitle]]
+[[!template text="so it just says, you know," start="00:06:58.560" video="mainVideo" id=subtitle]]
+[[!template text="this is the function that's advised." start="00:06:59.840" video="mainVideo" id=subtitle]]
+[[!template text="This was a `before` advice." start="00:07:02.319" video="mainVideo" id=subtitle]]
+[[!template text="The `before` advice, sometimes," start="00:07:04.560" video="mainVideo" id=subtitle]]
+[[!template text="when we convert it to `advice-add`," start="00:07:05.500" video="mainVideo" id=subtitle]]
+[[!template text="need to be converted to `around` advice." start="00:07:08.479" video="mainVideo" id=subtitle]]
+[[!template text="This is when the function" start="00:07:11.199" video="mainVideo" id=subtitle]]
+[[!template text="looks or modifies the argument." start="00:07:13.280" video="mainVideo" id=subtitle]]
+[[!template text="In this case, if I look at it," start="00:07:15.840" video="mainVideo" id=subtitle]]
+[[!template text="I see it doesn't seem to be using" start="00:07:18.639" video="mainVideo" id=subtitle]]
+[[!template text="the arguments at all." start="00:07:20.319" video="mainVideo" id=subtitle]]
+[[!template text="So I'm just going to keep it" start="00:07:21.280" video="mainVideo" id=subtitle]]
+[[!template text="as a `before` advice." start="00:07:25.280" video="mainVideo" id=subtitle]]
+[[!template text="And we have to give it a name." start="00:07:27.520" video="mainVideo" id=subtitle]]
+[[!template text="Well, we don't really have to," start="00:07:28.672" video="mainVideo" id=subtitle]]
+[[!template text="but it's convenient to give it a name" start="00:07:30.880" video="mainVideo" id=subtitle]]
+[[!template text="to the new function." start="00:07:32.800" video="mainVideo" id=subtitle]]
+[[!template text="So here, they actually had" start="00:07:34.800" video="mainVideo" id=subtitle]]
+[[!template text="given a name to the advice," start="00:07:36.880" video="mainVideo" id=subtitle]]
+[[!template text="so we're going to keep it," start="00:07:38.080" video="mainVideo" id=subtitle]]
+[[!template text="and indeed it's the only function." start="00:07:39.599" video="mainVideo" id=subtitle]]
+[[!template text="This name is not used as a function," start="00:07:41.440" video="mainVideo" id=subtitle]]
+[[!template text="so we can use it" start="00:07:43.360" video="mainVideo" id=subtitle]]
+[[!template text="as the name of the function." start="00:07:44.160" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to add a dash here" start="00:07:46.960" video="mainVideo" id=subtitle]]
+[[!template text="because I think this function" start="00:07:49.039" video="mainVideo" id=subtitle]]
+[[!template text="is really fundamentally" start="00:07:51.120" video="mainVideo" id=subtitle]]
+[[!template text="an internal function." start="00:07:53.039" video="mainVideo" id=subtitle]]
+[[!template text="So here I just said I add the advice," start="00:07:54.639" video="mainVideo" id=subtitle]]
+[[!template text="but I still need to actually" start="00:07:56.720" video="mainVideo" id=subtitle]]
+[[!template text="define the function." start="00:07:58.000" video="mainVideo" id=subtitle]]
+[[!template text="So that's what I do here," start="00:08:02.879" video="mainVideo" id=subtitle]]
+[[!template text="and we need here to list the arguments" start="00:08:04.160" video="mainVideo" id=subtitle]]
+[[!template text="that are going to be taken." start="00:08:06.500" video="mainVideo" id=subtitle]]
+[[!template text="I don't know what these are," start="00:08:08.240" video="mainVideo" id=subtitle]]
+[[!template text="but I know we're not using them," start="00:08:09.199" video="mainVideo" id=subtitle]]
+[[!template text="so we'll just accept anything," start="00:08:10.960" video="mainVideo" id=subtitle]]
+[[!template text="and that will do the trick." start="00:08:13.759" video="mainVideo" id=subtitle]]
+[[!template text="It's a future-proof as well," start="00:08:16.560" video="mainVideo" id=subtitle]]
+[[!template text="so that should work." start="00:08:19.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Oh, here we have another, so it's" start="00:08:22.240" video="mainVideo" id=subtitle]]
+[[!template text="basically the same story, I think." start="00:08:24.160" video="mainVideo" id=subtitle]]
+[[!template text="It's a `before` advice as well." start="00:08:29.919" video="mainVideo" id=subtitle]]
+[[!template text="It doesn't seem to be using" start="00:08:31.599" video="mainVideo" id=subtitle]]
+[[!template text="the argument at all," start="00:08:32.959" video="mainVideo" id=subtitle]]
+[[!template text="and let's see if this name is not taken." start="00:08:35.599" video="mainVideo" id=subtitle]]
+[[!template text="Yeah, good, so we can just do the same:" start="00:08:38.596" video="mainVideo" id=subtitle]]
+[[!template text="turn this into an `advice-add`..." start="00:08:43.360" video="mainVideo" id=subtitle]]
+[[!template text="`before`..." start="00:08:46.880" video="mainVideo" id=subtitle]]
+[[!template text="I just add a dash here." start="00:08:53.040" video="mainVideo" id=subtitle]]
+[[!template text="And same thing--" start="00:09:02.480" video="mainVideo" id=subtitle]]
+[[!template text="a function that just takes..." start="00:09:05.440" video="mainVideo" id=subtitle]]
+[[!template text="because I don't know which arguments" start="00:09:06.959" video="mainVideo" id=subtitle]]
+[[!template text="these are so..." start="00:09:08.240" video="mainVideo" id=subtitle]]
+[[!template text="I think that should do the trick." start="00:09:10.480" video="mainVideo" id=subtitle]]
+[[!template text="Actually, we see that this function" start="00:09:14.640" video="mainVideo" id=subtitle]]
+[[!template text="is very similar to the other one." start="00:09:16.080" video="mainVideo" id=subtitle]]
+[[!template text="Let's look at the two side-by-side..." start="00:09:18.560" video="mainVideo" id=subtitle]]
+[[!template text="...it really is--" start="00:09:31.519" video="mainVideo" id=subtitle]]
+[[!template text="oh, it's not exactly identical..." start="00:09:33.055" video="mainVideo" id=subtitle]]
+[[!template text="it's, you know, we could try" start="00:09:36.097" video="mainVideo" id=subtitle]]
+[[!template text="to merge them into a single function," start="00:09:39.120" video="mainVideo" id=subtitle]]
+[[!template text="but it's probably not worth the trouble" start="00:09:41.680" video="mainVideo" id=subtitle]]
+[[!template text="so we can keep it this way." start="00:09:43.279" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, next warning: an `eval` again," start="00:09:45.920" video="mainVideo" id=subtitle]]
+[[!template text="so I could just add `t` here," start="00:09:48.720" video="mainVideo" id=subtitle]]
+[[!template text="but if you look at it a bit more," start="00:09:50.640" video="mainVideo" id=subtitle]]
+[[!template text="you see that the code" start="00:09:55.120" video="mainVideo" id=subtitle]]
+[[!template text="we're going to evaluate" start="00:09:56.000" video="mainVideo" id=subtitle]]
+[[!template text="using either lexical scoping" start="00:09:57.760" video="mainVideo" id=subtitle]]
+[[!template text="or dynamic scoping" start="00:09:59.279" video="mainVideo" id=subtitle]]
+[[!template text="is actually just evaluating a symbol," start="00:10:00.560" video="mainVideo" id=subtitle]]
+[[!template text="since we just call an `intern` here." start="00:10:03.440" video="mainVideo" id=subtitle]]
+[[!template text="So instead of replacing this" start="00:10:06.240" video="mainVideo" id=subtitle]]
+[[!template text="by adding an argument," start="00:10:07.839" video="mainVideo" id=subtitle]]
+[[!template text="I'm just going to call `symbol-value`" start="00:10:09.279" video="mainVideo" id=subtitle]]
+[[!template text="because that's exactly" start="00:10:11.680" video="mainVideo" id=subtitle]]
+[[!template text="what we need to do here, right." start="00:10:12.640" video="mainVideo" id=subtitle]]
+[[!template text="I call this &quot;strength reduction,&quot;" start="00:10:14.480" video="mainVideo" id=subtitle]]
+[[!template text="and I'm using" start="00:10:16.320" video="mainVideo" id=subtitle]]
+[[!template text="a more primitive function instead," start="00:10:17.200" video="mainVideo" id=subtitle]]
+[[!template text="which does just what we need," start="00:10:19.680" video="mainVideo" id=subtitle]]
+[[!template text="and this one knows that it has to be" start="00:10:23.200" video="mainVideo" id=subtitle]]
+[[!template text="accessed by dynamic scoping, of course." start="00:10:25.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Here I have a `kmacro-ring`," start="00:10:30.640" video="mainVideo" id=subtitle]]
+[[!template text="so here I have a function that uses--" start="00:10:32.959" video="mainVideo" id=subtitle]]
+[[!template text="`kmacro-ring` comes from" start="00:10:35.600" video="mainVideo" id=subtitle]]
+[[!template text="the `kmacro` package, obviously," start="00:10:37.360" video="mainVideo" id=subtitle]]
+[[!template text="and we probably don't want to" start="00:10:39.760" video="mainVideo" id=subtitle]]
+[[!template text="`require` `kmacro` package" start="00:10:41.600" video="mainVideo" id=subtitle]]
+[[!template text="all over the place in `counsel` itself," start="00:10:42.959" video="mainVideo" id=subtitle]]
+[[!template text="because `counsel` can be used" start="00:10:48.560" video="mainVideo" id=subtitle]]
+[[!template text="without `kmacro`." start="00:10:50.240" video="mainVideo" id=subtitle]]
+[[!template text="So I think we're just going to add" start="00:10:53.279" video="mainVideo" id=subtitle]]
+[[!template text="a `defvar` to silence the warning." start="00:10:55.200" video="mainVideo" id=subtitle]]
+[[!template text="And we have several more. So we have" start="00:11:05.519" video="mainVideo" id=subtitle]]
+[[!template text="`initial-counter-value`. (Sorry.)" start="00:11:10.720" video="mainVideo" id=subtitle]]
+[[!template text="We have `kmacro-counter`." start="00:11:20.480" video="mainVideo" id=subtitle]]
+[[!template text="Do we have more?" start="00:11:23.360" video="mainVideo" id=subtitle]]
+[[!template text="Oh, yes, we do." start="00:11:25.760" video="mainVideo" id=subtitle]]
+[[!template text="We have `kmacro-counter-value-start`" start="00:11:28.560" video="mainVideo" id=subtitle]]
+[[!template text="and `kmacro-counter-format-start`." start="00:11:35.040" video="mainVideo" id=subtitle]]
+[[!template text="Okay." start="00:11:40.839" video="mainVideo" id=subtitle]]
+[[!template text="I hope this is it." start="00:11:45.040" video="mainVideo" id=subtitle]]
+[[!template text="`kmacro-ring`, `counter`, `ring`..." start="00:11:50.160" video="mainVideo" id=subtitle]]
+[[!template text="blah blah blah." start="00:11:52.880" video="mainVideo" id=subtitle]]
+[[!template text="Here we have another one, `quote`." start="00:11:54.959" video="mainVideo" id=subtitle]]
+[[!template text="Here we have another hash missing." start="00:12:00.240" video="mainVideo" id=subtitle]]
+[[!template text="It's not missing..." start="00:12:03.279" video="mainVideo" id=subtitle]]
+[[!template text="but same thing here." start="00:12:06.079" video="mainVideo" id=subtitle]]
+[[!template text="Okay, this is a function from `kmacro`." start="00:12:12.079" video="mainVideo" id=subtitle]]
+[[!template text="We could declare it" start="00:12:16.560" video="mainVideo" id=subtitle]]
+[[!template text="just to silence the warning" start="00:12:18.079" video="mainVideo" id=subtitle]]
+[[!template text="although we don't actually..." start="00:12:20.880" video="mainVideo" id=subtitle]]
+[[!template text="normally, when we declare such things--" start="00:12:22.320" video="mainVideo" id=subtitle]]
+[[!template text="same thing with variables--" start="00:12:24.480" video="mainVideo" id=subtitle]]
+[[!template text="we should try to make sure that indeed" start="00:12:25.279" video="mainVideo" id=subtitle]]
+[[!template text="by the time the code is executed," start="00:12:27.300" video="mainVideo" id=subtitle]]
+[[!template text="the function will be available," start="00:12:28.760" video="mainVideo" id=subtitle]]
+[[!template text="and then very often is" start="00:12:30.800" video="mainVideo" id=subtitle]]
+[[!template text="because there's a `require`" start="00:12:32.800" video="mainVideo" id=subtitle]]
+[[!template text="sometimes inside a function," start="00:12:34.320" video="mainVideo" id=subtitle]]
+[[!template text="and so we should put" start="00:12:35.680" video="mainVideo" id=subtitle]]
+[[!template text="the `declare` function" start="00:12:36.399" video="mainVideo" id=subtitle]]
+[[!template text="right after the `require`," start="00:12:37.680" video="mainVideo" id=subtitle]]
+[[!template text="but I don't think it's the case here." start="00:12:39.920" video="mainVideo" id=subtitle]]
+[[!template text="So I'm just going to to add this." start="00:12:41.839" video="mainVideo" id=subtitle]]
+[[!template text="I know this comes from `kmacro`," start="00:12:46.399" video="mainVideo" id=subtitle]]
+[[!template text="and I could actually check the arguments." start="00:12:49.040" video="mainVideo" id=subtitle]]
+[[!template text="It's just taking an optional argument" start="00:12:56.320" video="mainVideo" id=subtitle]]
+[[!template text="so I'm going to put it there," start="00:12:58.480" video="mainVideo" id=subtitle]]
+[[!template text="so we have it complete." start="00:13:00.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, we can just recompile," start="00:13:06.720" video="mainVideo" id=subtitle]]
+[[!template text="see what is left" start="00:13:10.800" video="mainVideo" id=subtitle]]
+[[!template text="from those warnings we've fixed," start="00:13:14.800" video="mainVideo" id=subtitle]]
+[[!template text="and we may have new warnings, in any case," start="00:13:17.760" video="mainVideo" id=subtitle]]
+[[!template text="because especially when we add the hashes," start="00:13:21.360" video="mainVideo" id=subtitle]]
+[[!template text="it tends to give us more warnings." start="00:13:25.440" video="mainVideo" id=subtitle]]
+[[!template text="So we have two more functions" start="00:13:29.519" video="mainVideo" id=subtitle]]
+[[!template text="which are not known." start="00:13:31.200" video="mainVideo" id=subtitle]]
+[[!template text="You can just add them here..." start="00:13:34.560" video="mainVideo" id=subtitle]]
+[[!template text="`set-format &quot;kmacro&quot;`" start="00:13:39.440" video="mainVideo" id=subtitle]]
+[[!template text="and same thing for `set-counter`." start="00:13:44.720" video="mainVideo" id=subtitle]]
+[[!template text="Okay, whatever." start="00:13:48.160" video="mainVideo" id=subtitle]]
+[[!template text="This just takes a `format` argument," start="00:13:54.959" video="mainVideo" id=subtitle]]
+[[!template text="and this one just takes an `arg` argument." start="00:13:57.120" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so let's see what this says now." start="00:14:05.920" video="mainVideo" id=subtitle]]
+[[!template text="Hopefully, there's no warnings anymore." start="00:14:10.800" video="mainVideo" id=subtitle]]
+[[!template text="We're done. Okay!" start="00:14:15.519" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, the last one we're going to see" start="00:14:17.839" video="mainVideo" id=subtitle]]
+[[!template text="is in `enwc`, I saw the other day..." start="00:14:20.079" video="mainVideo" id=subtitle]]
+[[!template text="I think I have it here..." start="00:14:23.440" video="mainVideo" id=subtitle]]
+[[!template text="here we go, yes..." start="00:14:27.760" video="mainVideo" id=subtitle]]
+[[!template text="so `enwc` is an interesting package here" start="00:14:29.680" video="mainVideo" id=subtitle]]
+[[!template text="because it has-- as you can see it has--" start="00:14:32.800" video="mainVideo" id=subtitle]]
+[[!template text="it's lexical binding," start="00:14:35.680" video="mainVideo" id=subtitle]]
+[[!template text="but actually some of the files in it" start="00:14:37.760" video="mainVideo" id=subtitle]]
+[[!template text="do not use lexical binding," start="00:14:39.760" video="mainVideo" id=subtitle]]
+[[!template text="so it has been partly converted" start="00:14:42.320" video="mainVideo" id=subtitle]]
+[[!template text="but not completely." start="00:14:44.320" video="mainVideo" id=subtitle]]
+[[!template text="So here I'm going to" start="00:14:46.160" video="mainVideo" id=subtitle]]
+[[!template text="enable lexical binding." start="00:14:49.920" video="mainVideo" id=subtitle]]
+[[!template text="I have also, I think, in `cm`..." start="00:14:54.160" video="mainVideo" id=subtitle]]
+[[!template text="yes..." start="00:14:58.880" video="mainVideo" id=subtitle]]
+[[!template text="so I enable it here," start="00:15:01.199" video="mainVideo" id=subtitle]]
+[[!template text="and also, I think, `test`." start="00:15:04.000" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The test files are often" start="00:15:07.360" video="mainVideo" id=subtitle]]
+[[!template text="somewhat problematic" start="00:15:09.360" video="mainVideo" id=subtitle]]
+[[!template text="because very often they're not quite" start="00:15:11.839" video="mainVideo" id=subtitle]]
+[[!template text="as heavily tested themselves, actually," start="00:15:15.199" video="mainVideo" id=subtitle]]
+[[!template text="or they only run" start="00:15:18.880" video="mainVideo" id=subtitle]]
+[[!template text="in very specific contexts," start="00:15:20.320" video="mainVideo" id=subtitle]]
+[[!template text="and so they may have problems" start="00:15:22.160" video="mainVideo" id=subtitle]]
+[[!template text="with missing `requires` or using packages" start="00:15:24.399" video="mainVideo" id=subtitle]]
+[[!template text="which are not explicitly in the dependencies" start="00:15:27.360" video="mainVideo" id=subtitle]]
+[[!template text="and those kinds of things." start="00:15:29.199" video="mainVideo" id=subtitle]]
+[[!template text="I think this is not the case here," start="00:15:31.279" video="mainVideo" id=subtitle]]
+[[!template text="but we'll see." start="00:15:33.360" video="mainVideo" id=subtitle]]
+[[!template text="`enwc`..." start="00:15:35.440" video="mainVideo" id=subtitle]]
+[[!template text="Yes, I want to save this one and that one." start="00:15:38.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's see what it says." start="00:15:42.320" video="mainVideo" id=subtitle]]
+[[!template text="Okay, unused lexical variable `x`..." start="00:15:47.199" video="mainVideo" id=subtitle]]
+[[!template text="`x`..." start="00:15:51.440" video="mainVideo" id=subtitle]]
+[[!template text="Yes, so here we have an unused variable," start="00:15:52.240" video="mainVideo" id=subtitle]]
+[[!template text="and indeed, it's not used." start="00:15:57.120" video="mainVideo" id=subtitle]]
+[[!template text="It probably had to be named before" start="00:15:58.320" video="mainVideo" id=subtitle]]
+[[!template text="because it was..." start="00:16:00.880" video="mainVideo" id=subtitle]]
+[[!template text="with dynamic scoping," start="00:16:04.079" video="mainVideo" id=subtitle]]
+[[!template text="the `dotimes` requires" start="00:16:05.120" video="mainVideo" id=subtitle]]
+[[!template text="the variable to be named, actually," start="00:16:06.399" video="mainVideo" id=subtitle]]
+[[!template text="because it's used internally somehow," start="00:16:08.160" video="mainVideo" id=subtitle]]
+[[!template text="but with lexical scoping," start="00:16:10.399" video="mainVideo" id=subtitle]]
+[[!template text="that's not the case," start="00:16:11.600" video="mainVideo" id=subtitle]]
+[[!template text="so we can just put an underscore." start="00:16:12.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I'm going to change this" start="00:16:14.079" video="mainVideo" id=subtitle]]
+[[!template text="because I really don't like" start="00:16:15.199" video="mainVideo" id=subtitle]]
+[[!template text="this three-part `dotimes`." start="00:16:16.880" video="mainVideo" id=subtitle]]
+[[!template text="I prefer to have" start="00:16:19.000" video="mainVideo" id=subtitle]]
+[[!template text="the return value at the end." start="00:16:21.360" video="mainVideo" id=subtitle]]
+[[!template text="It's sort of stashed hidden in the middle." start="00:16:23.040" video="mainVideo" id=subtitle]]
+[[!template text="That's just a personal preference." start="00:16:26.480" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, what else... we have a `widget`." start="00:16:29.680" video="mainVideo" id=subtitle]]
+[[!template text="Okay, this argument here says that" start="00:16:31.920" video="mainVideo" id=subtitle]]
+[[!template text="it's not used, so if we look at..." start="00:16:34.000" video="mainVideo" id=subtitle]]
+[[!template text="We were here, right? Yes. Right here." start="00:16:44.320" video="mainVideo" id=subtitle]]
+[[!template text="Indeed, `widget` is really not used." start="00:16:47.040" video="mainVideo" id=subtitle]]
+[[!template text="(Sorry.)" start="00:16:50.480" video="mainVideo" id=subtitle]]
+[[!template text="Here's what I get for using" start="00:16:53.600" video="mainVideo" id=subtitle]]
+[[!template text="a somewhat vanilla configuration of Emacs," start="00:16:55.279" video="mainVideo" id=subtitle]]
+[[!template text="compared to the one I use..." start="00:16:58.320" video="mainVideo" id=subtitle]]
+[[!template text="the personally tricked one." start="00:17:01.279" video="mainVideo" id=subtitle]]
+[[!template text="Actually, I can..." start="00:17:04.000" video="mainVideo" id=subtitle]]
+[[!template text="so we can just mark this argument" start="00:17:05.439" video="mainVideo" id=subtitle]]
+[[!template text="as unused," start="00:17:07.919" video="mainVideo" id=subtitle]]
+[[!template text="and we don't want to remove the argument" start="00:17:09.360" video="mainVideo" id=subtitle]]
+[[!template text="probably, or maybe we could;" start="00:17:11.199" video="mainVideo" id=subtitle]]
+[[!template text="we could see where the function is used," start="00:17:12.480" video="mainVideo" id=subtitle]]
+[[!template text="and here we see that it's passed" start="00:17:15.679" video="mainVideo" id=subtitle]]
+[[!template text="to a higher-order function," start="00:17:18.542" video="mainVideo" id=subtitle]]
+[[!template text="basically, so it's going to be..." start="00:17:20.959" video="mainVideo" id=subtitle]]
+[[!template text="We can't really change" start="00:17:24.480" video="mainVideo" id=subtitle]]
+[[!template text="the calling convention" start="00:17:25.360" video="mainVideo" id=subtitle]]
+[[!template text="so we have to mark the argument" start="00:17:25.760" video="mainVideo" id=subtitle]]
+[[!template text="as being just an unused argument," start="00:17:27.120" video="mainVideo" id=subtitle]]
+[[!template text="but we're going to still receive it." start="00:17:29.600" video="mainVideo" id=subtitle]]
+[[!template text="And here it says same thing:" start="00:17:34.000" video="mainVideo" id=subtitle]]
+[[!template text="that `widget` is not used in this function." start="00:17:35.360" video="mainVideo" id=subtitle]]
+[[!template text="Let's take a look at the function." start="00:17:38.240" video="mainVideo" id=subtitle]]
+[[!template text="Indeed it seems it's not used," start="00:17:40.000" video="mainVideo" id=subtitle]]
+[[!template text="and so we're just going to mark it" start="00:17:42.400" video="mainVideo" id=subtitle]]
+[[!template text="as unused." start="00:17:44.000" video="mainVideo" id=subtitle]]
+[[!template text="This is the part of the conversion" start="00:17:46.480" video="mainVideo" id=subtitle]]
+[[!template text="to lexical scoping" start="00:17:48.320" video="mainVideo" id=subtitle]]
+[[!template text="that's somewhat tricky sometimes" start="00:17:49.200" video="mainVideo" id=subtitle]]
+[[!template text="because we don't really know" start="00:17:51.280" video="mainVideo" id=subtitle]]
+[[!template text="whether this variable should be using" start="00:17:53.760" video="mainVideo" id=subtitle]]
+[[!template text="lexical scoping or dynamic scoping." start="00:17:56.240" video="mainVideo" id=subtitle]]
+[[!template text="The fact that it's not used" start="00:17:58.559" video="mainVideo" id=subtitle]]
+[[!template text="is a hint that there's probably" start="00:18:00.480" video="mainVideo" id=subtitle]]
+[[!template text="something going on," start="00:18:02.320" video="mainVideo" id=subtitle]]
+[[!template text="so either it's not used" start="00:18:03.679" video="mainVideo" id=subtitle]]
+[[!template text="because it should be using" start="00:18:04.960" video="mainVideo" id=subtitle]]
+[[!template text="dynamic scoping--" start="00:18:06.400" video="mainVideo" id=subtitle]]
+[[!template text="it is going to be used" start="00:18:07.200" video="mainVideo" id=subtitle]]
+[[!template text="by some other code somewhere else--" start="00:18:08.080" video="mainVideo" id=subtitle]]
+[[!template text="or it's really not used" start="00:18:10.480" video="mainVideo" id=subtitle]]
+[[!template text="because it's just not used, right," start="00:18:11.840" video="mainVideo" id=subtitle]]
+[[!template text="and so we need to distinguish the two," start="00:18:14.000" video="mainVideo" id=subtitle]]
+[[!template text="and for that, I basically use" start="00:18:16.320" video="mainVideo" id=subtitle]]
+[[!template text="my own judgment." start="00:18:20.880" video="mainVideo" id=subtitle]]
+[[!template text="This is based typically on the fact that" start="00:18:22.240" video="mainVideo" id=subtitle]]
+[[!template text="this is just a very short name," start="00:18:24.880" video="mainVideo" id=subtitle]]
+[[!template text="and most local identifiers use short names," start="00:18:27.760" video="mainVideo" id=subtitle]]
+[[!template text="whereas item values used for dynamic scoping" start="00:18:32.000" video="mainVideo" id=subtitle]]
+[[!template text="typically have a package prefix" start="00:18:34.400" video="mainVideo" id=subtitle]]
+[[!template text="or something like this." start="00:18:36.720" video="mainVideo" id=subtitle]]
+[[!template text="So the fact that it's a short name" start="00:18:37.679" video="mainVideo" id=subtitle]]
+[[!template text="gives me a good idea." start="00:18:38.960" video="mainVideo" id=subtitle]]
+[[!template text="Here in this case," start="00:18:40.880" video="mainVideo" id=subtitle]]
+[[!template text="I actually look at the code," start="00:18:41.520" video="mainVideo" id=subtitle]]
+[[!template text="and we see that there's nothing in here" start="00:18:42.640" video="mainVideo" id=subtitle]]
+[[!template text="that may actually refer" start="00:18:45.600" video="mainVideo" id=subtitle]]
+[[!template text="to this variable `widget`," start="00:18:47.039" video="mainVideo" id=subtitle]]
+[[!template text="so I think it's safe," start="00:18:48.080" video="mainVideo" id=subtitle]]
+[[!template text="but in the general case," start="00:18:49.280" video="mainVideo" id=subtitle]]
+[[!template text="we may look here and be surprised," start="00:18:51.360" video="mainVideo" id=subtitle]]
+[[!template text="or, you know, you may call out" start="00:18:54.400" video="mainVideo" id=subtitle]]
+[[!template text="the functions which may themselves end up" start="00:18:55.760" video="mainVideo" id=subtitle]]
+[[!template text="referring to this variable." start="00:18:58.320" video="mainVideo" id=subtitle]]
+[[!template text="So sometimes we need to investigate a" start="00:19:00.080" video="mainVideo" id=subtitle]]
+[[!template text="little more." start="00:19:02.640" video="mainVideo" id=subtitle]]
+[[!template text="We are most of the time not completely sure" start="00:19:03.840" video="mainVideo" id=subtitle]]
+[[!template text="whether the result is correct or not," start="00:19:05.919" video="mainVideo" id=subtitle]]
+[[!template text="of course, so the other thing" start="00:19:07.520" video="mainVideo" id=subtitle]]
+[[!template text="you may want to check" start="00:19:09.520" video="mainVideo" id=subtitle]]
+[[!template text="is also uses of things" start="00:19:10.640" video="mainVideo" id=subtitle]]
+[[!template text="like `eval` or `symbol-value`." start="00:19:12.160" video="mainVideo" id=subtitle]]
+[[!template text="So it's often a good idea to search," start="00:19:14.400" video="mainVideo" id=subtitle]]
+[[!template text="and you do a search of `eval`," start="00:19:17.200" video="mainVideo" id=subtitle]]
+[[!template text="and you see here it's using `eval`." start="00:19:18.799" video="mainVideo" id=subtitle]]
+[[!template text="Hmmm... Okay, so what does this `eval` do?" start="00:19:21.490" video="mainVideo" id=subtitle]]
+[[!template text="It's evaluating expressions" start="00:19:24.160" video="mainVideo" id=subtitle]]
+[[!template text="that appear in `args` here" start="00:19:25.760" video="mainVideo" id=subtitle]]
+[[!template text="so you can see where those args come from," start="00:19:28.240" video="mainVideo" id=subtitle]]
+[[!template text="and we see here, these are expressions" start="00:19:31.840" video="mainVideo" id=subtitle]]
+[[!template text="that don't do anything very special." start="00:19:35.120" video="mainVideo" id=subtitle]]
+[[!template text="It's just using `make-supplicant-choice`," start="00:19:36.840" video="mainVideo" id=subtitle]]
+[[!template text="and `make-supplicant-choice` itself" start="00:19:41.520" video="mainVideo" id=subtitle]]
+[[!template text="just doesn't refer to `widget`, for example," start="00:19:44.960" video="mainVideo" id=subtitle]]
+[[!template text="so you know we should be safe," start="00:19:47.120" video="mainVideo" id=subtitle]]
+[[!template text="but while I'm here..." start="00:19:50.000" video="mainVideo" id=subtitle]]
+[[!template text="okay, well, then we can do that later." start="00:19:52.559" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Well, that's actually the next warning," start="00:19:53.840" video="mainVideo" id=subtitle]]
+[[!template text="exactly. So here we see that this is" start="00:19:55.679" video="mainVideo" id=subtitle]]
+[[!template text="using the dynamically-scoped dialect," start="00:19:58.080" video="mainVideo" id=subtitle]]
+[[!template text="so we convert it to lexical-scoped." start="00:20:00.000" video="mainVideo" id=subtitle]]
+[[!template text="Of course, this may introduce errors," start="00:20:02.799" video="mainVideo" id=subtitle]]
+[[!template text="but we hope it doesn't." start="00:20:04.559" video="mainVideo" id=subtitle]]
+[[!template text="And actually, it was a good change here," start="00:20:07.200" video="mainVideo" id=subtitle]]
+[[!template text="because if you see again," start="00:20:08.880" video="mainVideo" id=subtitle]]
+[[!template text="this actually evals expressions" start="00:20:12.080" video="mainVideo" id=subtitle]]
+[[!template text="that appear here in `args`," start="00:20:14.240" video="mainVideo" id=subtitle]]
+[[!template text="and so these are expressions" start="00:20:16.159" video="mainVideo" id=subtitle]]
+[[!template text="that are passed here." start="00:20:18.480" video="mainVideo" id=subtitle]]
+[[!template text="So this expression here used to be" start="00:20:21.039" video="mainVideo" id=subtitle]]
+[[!template text="evaluated with dynamic scoping," start="00:20:23.679" video="mainVideo" id=subtitle]]
+[[!template text="even though it appears to be normal code" start="00:20:24.480" video="mainVideo" id=subtitle]]
+[[!template text="within this file, which says" start="00:20:28.000" video="mainVideo" id=subtitle]]
+[[!template text="it's using lexical scoping," start="00:20:29.760" video="mainVideo" id=subtitle]]
+[[!template text="and so there are some remnants" start="00:20:32.559" video="mainVideo" id=subtitle]]
+[[!template text="of dynamic scoping all over the place" start="00:20:34.400" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs still, because we have" start="00:20:36.640" video="mainVideo" id=subtitle]]
+[[!template text="those calls of `eval` with a nil argument." start="00:20:37.840" video="mainVideo" id=subtitle]]
+[[!template text="Here we have `cons`..." start="00:20:44.880" video="mainVideo" id=subtitle]]
+[[!template text="that needs to be `hash quoted`." start="00:20:47.039" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Oh, and we have a reference" start="00:20:52.400" video="mainVideo" id=subtitle]]
+[[!template text="to this variable `enwc-edit-id'." start="00:20:54.080" video="mainVideo" id=subtitle]]
+[[!template text="So this is clearly" start="00:20:56.720" video="mainVideo" id=subtitle]]
+[[!template text="a dynamic-scoped variable." start="00:20:57.520" video="mainVideo" id=subtitle]]
+[[!template text="We can either add a `defvar`" start="00:21:00.400" video="mainVideo" id=subtitle]]
+[[!template text="to silence the warning," start="00:21:02.000" video="mainVideo" id=subtitle]]
+[[!template text="or maybe we can `require` the package." start="00:21:03.440" video="mainVideo" id=subtitle]]
+[[!template text="The file that defines it..." start="00:21:06.799" video="mainVideo" id=subtitle]]
+[[!template text="So let's see where it's defined." start="00:21:14.080" video="mainVideo" id=subtitle]]
+[[!template text="Here it's defined in `enwc.el`," start="00:21:17.360" video="mainVideo" id=subtitle]]
+[[!template text="so I'm going to try just to add" start="00:21:21.200" video="mainVideo" id=subtitle]]
+[[!template text="the dependency." start="00:21:23.440" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to `require` here. This is risky." start="00:21:25.039" video="mainVideo" id=subtitle]]
+[[!template text="We'll see when we compile a file later," start="00:21:27.840" video="mainVideo" id=subtitle]]
+[[!template text="we may get a circular dependency" start="00:21:30.159" video="mainVideo" id=subtitle]]
+[[!template text="because of it." start="00:21:32.320" video="mainVideo" id=subtitle]]
+[[!template text="If that's the case, we're going to" start="00:21:34.720" video="mainVideo" id=subtitle]]
+[[!template text="have to remove this `require`" start="00:21:36.320" video="mainVideo" id=subtitle]]
+[[!template text="and instead put `defvar`s." start="00:21:38.320" video="mainVideo" id=subtitle]]
+[[!template text="Sometimes it's worth actually" start="00:21:42.000" video="mainVideo" id=subtitle]]
+[[!template text="looking further at the various files" start="00:21:42.559" video="mainVideo" id=subtitle]]
+[[!template text="to see how to redefine the dependencies" start="00:21:44.640" video="mainVideo" id=subtitle]]
+[[!template text="to break those circular dependencies," start="00:21:48.080" video="mainVideo" id=subtitle]]
+[[!template text="but it's often not really" start="00:21:49.840" video="mainVideo" id=subtitle]]
+[[!template text="worth the trouble." start="00:21:52.320" video="mainVideo" id=subtitle]]
+[[!template text="Oh, no, that's not what--" start="00:21:55.679" video="mainVideo" id=subtitle]]
+[[!template text="I'm not going to the right place..." start="00:21:58.400" video="mainVideo" id=subtitle]]
+[[!template text="Here I was. So here `edit-map`." start="00:22:01.440" video="mainVideo" id=subtitle]]
+[[!template text="Well, we can probably..." start="00:22:07.039" video="mainVideo" id=subtitle]]
+[[!template text="it may disappear or..." start="00:22:09.760" video="mainVideo" id=subtitle]]
+[[!template text="oh, I see." start="00:22:12.159" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so this `edit-map` actually is" start="00:22:13.760" video="mainVideo" id=subtitle]]
+[[!template text="defined in this very file." start="00:22:16.320" video="mainVideo" id=subtitle]]
+[[!template text="It's just that it's defined later." start="00:22:18.559" video="mainVideo" id=subtitle]]
+[[!template text="So all we need to do" start="00:22:20.240" video="mainVideo" id=subtitle]]
+[[!template text="is to move this definition" start="00:22:21.600" video="mainVideo" id=subtitle]]
+[[!template text="to before its first use," start="00:22:24.320" video="mainVideo" id=subtitle]]
+[[!template text="since otherwise it's going to be taken" start="00:22:27.200" video="mainVideo" id=subtitle]]
+[[!template text="as lexically-scoped, which we don't want." start="00:22:28.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And while I'm here, I see this `copy-keymap`." start="00:22:33.520" video="mainVideo" id=subtitle]]
+[[!template text="I don't like `copy-keymap`," start="00:22:35.360" video="mainVideo" id=subtitle]]
+[[!template text="so I'm going to change this" start="00:22:38.400" video="mainVideo" id=subtitle]]
+[[!template text="to a normal keymap," start="00:22:40.960" video="mainVideo" id=subtitle]]
+[[!template text="and then I'm just going to use" start="00:22:44.080" video="mainVideo" id=subtitle]]
+[[!template text="`set-keymap-parent` instead of `copy-keymap`" start="00:22:46.159" video="mainVideo" id=subtitle]]
+[[!template text="to get basically the same result," start="00:22:50.080" video="mainVideo" id=subtitle]]
+[[!template text="but without having copied anything." start="00:22:51.600" video="mainVideo" id=subtitle]]
+[[!template text="And this one will disappear..." start="00:22:55.280" video="mainVideo" id=subtitle]]
+[[!template text="this one as well-- or should hopefully," start="00:22:57.760" video="mainVideo" id=subtitle]]
+[[!template text="thanks to the `require`." start="00:23:00.240" video="mainVideo" id=subtitle]]
+[[!template text="Here we have a `hash` missing," start="00:23:03.360" video="mainVideo" id=subtitle]]
+[[!template text="and we have some functions" start="00:23:09.840" video="mainVideo" id=subtitle]]
+[[!template text="which are unknown," start="00:23:11.840" video="mainVideo" id=subtitle]]
+[[!template text="so let's see..." start="00:23:14.000" video="mainVideo" id=subtitle]]
+[[!template text="Where is this function defined?" start="00:23:14.666" video="mainVideo" id=subtitle]]
+[[!template text="Nowhere. Huh, wonderful, okay." start="00:23:18.240" video="mainVideo" id=subtitle]]
+[[!template text="So we'll just leave it like it is," start="00:23:21.679" video="mainVideo" id=subtitle]]
+[[!template text="and that's going to be" start="00:23:25.200" video="mainVideo" id=subtitle]]
+[[!template text="for the author of the package to fix." start="00:23:27.120" video="mainVideo" id=subtitle]]
+[[!template text="How about this one?" start="00:23:31.360" video="mainVideo" id=subtitle]]
+[[!template text="Oh, okay, so it's defined in `enwc.el`" start="00:23:37.120" video="mainVideo" id=subtitle]]
+[[!template text="so presumably," start="00:23:40.240" video="mainVideo" id=subtitle]]
+[[!template text="this is going to disappear as well." start="00:23:41.679" video="mainVideo" id=subtitle]]
+[[!template text="One more..." start="00:23:50.159" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so this one" start="00:23:56.159" video="mainVideo" id=subtitle]]
+[[!template text="is just like the previous one." start="00:23:58.640" video="mainVideo" id=subtitle]]
+[[!template text="We're going to leave it at that." start="00:23:59.919" video="mainVideo" id=subtitle]]
+[[!template text="And this is it! Huh, wonderful." start="00:24:04.000" video="mainVideo" id=subtitle]]
+[[!template text="So let's recompile." start="00:24:06.720" video="mainVideo" id=subtitle]]
+[[!template text="Oh, we have a warning for `fin`." start="00:24:16.080" video="mainVideo" id=subtitle]]
+[[!template text="This variable seems not to be used" start="00:24:25.679" video="mainVideo" id=subtitle]]
+[[!template text="anywhere in the file, so we're just" start="00:24:28.640" video="mainVideo" id=subtitle]]
+[[!template text="going to remove it." start="00:24:32.000" video="mainVideo" id=subtitle]]
+[[!template text="I leave it there just in case" start="00:24:33.440" video="mainVideo" id=subtitle]]
+[[!template text="someone needs later on" start="00:24:34.880" video="mainVideo" id=subtitle]]
+[[!template text="to look for a `fin` variable" start="00:24:36.000" video="mainVideo" id=subtitle]]
+[[!template text="to see where it used to be." start="00:24:37.679" video="mainVideo" id=subtitle]]
+[[!template text="Again, you know, maybe it's actually used..." start="00:24:39.760" video="mainVideo" id=subtitle]]
+[[!template text="yeah, dynamic scoping somehow," start="00:24:41.600" video="mainVideo" id=subtitle]]
+[[!template text="but given the short name," start="00:24:43.519" video="mainVideo" id=subtitle]]
+[[!template text="I presume this is not the case." start="00:24:46.159" video="mainVideo" id=subtitle]]
+[[!template text="Here, oh, that's the code removed" start="00:24:48.960" video="mainVideo" id=subtitle]]
+[[!template text="that had a hash missing." start="00:24:51.200" video="mainVideo" id=subtitle]]
+[[!template text="That's the one that's not defined." start="00:24:52.559" video="mainVideo" id=subtitle]]
+[[!template text="This one is not defined," start="00:24:54.159" video="mainVideo" id=subtitle]]
+[[!template text="and this is it." start="00:24:56.799" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's make a last recompilation" start="00:24:58.000" video="mainVideo" id=subtitle]]
+[[!template text="to see if we missed yet something else." start="00:25:03.039" video="mainVideo" id=subtitle]]
+[[!template text="Nope, and that's it, okay." start="00:25:06.080" video="mainVideo" id=subtitle]]
+[[!template text="Well, here we go; we're done." start="00:25:07.919" video="mainVideo" id=subtitle]]
+[[!template text="Okay so this was it." start="00:25:11.200" video="mainVideo" id=subtitle]]
+[[!template text="You've seen, I think," start="00:25:14.240" video="mainVideo" id=subtitle]]
+[[!template text="pretty much examples of all of those," start="00:25:15.440" video="mainVideo" id=subtitle]]
+[[!template text="and I hope you enjoyed it." start="00:25:18.000" video="mainVideo" id=subtitle]]
+[[!template text="Lessons to take home:" start="00:25:20.960" video="mainVideo" id=subtitle]]
+[[!template text="use the byte compiler." start="00:25:22.580" video="mainVideo" id=subtitle]]
+[[!template text="You can also use `flymake-mode` instead." start="00:25:23.919" video="mainVideo" id=subtitle]]
+[[!template text="I recommend enabling it as much as you can," start="00:25:26.000" video="mainVideo" id=subtitle]]
+[[!template text="and head the warnings." start="00:25:31.600" video="mainVideo" id=subtitle]]
+[[!template text="Follow the warnings. Try to fix them." start="00:25:33.520" video="mainVideo" id=subtitle]]
+[[!template text="If you can fix all of the warnings," start="00:25:35.440" video="mainVideo" id=subtitle]]
+[[!template text="it's always much better," start="00:25:37.200" video="mainVideo" id=subtitle]]
+[[!template text="because then the new warnings" start="00:25:38.080" video="mainVideo" id=subtitle]]
+[[!template text="really show up." start="00:25:39.200" video="mainVideo" id=subtitle]]
+[[!template text="And once you've done it, it's really" start="00:25:40.960" video="mainVideo" id=subtitle]]
+[[!template text="kind of-- because there's always" start="00:25:42.880" video="mainVideo" id=subtitle]]
+[[!template text="new things coming up." start="00:25:44.559" video="mainVideo" id=subtitle]]
+[[!template text="And I think this is it." start="00:25:46.799" video="mainVideo" id=subtitle]]
+[[!template text="I hope you liked it, and thank you" start="00:25:48.799" video="mainVideo" id=subtitle]]
+[[!template text="for attending this presentation. Bye." start="00:25:50.720" video="mainVideo" id=subtitle]]
+[[!template text="(captions by Hannah Miller)" start="00:25:56.000" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/maintainers.md b/2021/captions/maintainers.md
new file mode 100644
index 00000000..787165b5
--- /dev/null
+++ b/2021/captions/maintainers.md
@@ -0,0 +1,246 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!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]]
+[[!template text="how to help GNU Emacs maintainers in general." start="00:00:11.368" video="mainVideo" id=subtitle]]
+[[!template text="By GNU Emacs, I mean" start="00:00:14.400" video="mainVideo" id=subtitle]]
+[[!template text="the whole GNU Emacs ecosystem," start="00:00:15.519" video="mainVideo" id=subtitle]]
+[[!template text="including packages," start="00:00:18.080" video="mainVideo" id=subtitle]]
+[[!template text="not just the core GNU Emacs" start="00:00:19.520" video="mainVideo" id=subtitle]]
+[[!template text="that we all love." start="00:00:21.039" video="mainVideo" id=subtitle]]
+[[!template text="After a decade of dealing with" start="00:00:24.880" video="mainVideo" id=subtitle]]
+[[!template text="the Org community," start="00:00:28.268" video="mainVideo" id=subtitle]]
+[[!template text="my view of what a maintainer is changed." start="00:00:29.368" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to share some ideas with you" start="00:00:32.934" video="mainVideo" id=subtitle]]
+[[!template text="as I think they could be useful" start="00:00:35.101" video="mainVideo" id=subtitle]]
+[[!template text="to help Emacs maintainers in general." start="00:00:37.234" video="mainVideo" id=subtitle]]
+[[!template text="And hopefully, these ideas also apply" start="00:00:39.201" video="mainVideo" id=subtitle]]
+[[!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?<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="\- Acting both as a supersmart hacker" start="00:00:56.268" 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<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<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<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<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<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]]
+[[!template text="Why? Because our culture encourages" start="00:01:39.401" video="mainVideo" id=subtitle]]
+[[!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="“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 “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 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]]
+[[!template text="and it prevents contributors" start="00:02:14.134" video="mainVideo" id=subtitle]]
+[[!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="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:<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.<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.<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.<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@.<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.<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.<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.<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.<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.<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]]
+[[!template text="when they think of a maintainer:" start="00:03:31.801" video="mainVideo" id=subtitle]]
+[[!template text="it's all about hacking" start="00:03:34.201" video="mainVideo" id=subtitle]]
+[[!template text="and being an efficient hotline." start="00:03:35.534" video="mainVideo" id=subtitle]]
+[[!template text="But in fact, these tasks" start="00:03:37.734" video="mainVideo" id=subtitle]]
+[[!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="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]]
+[[!template text="Without a good product," start="00:03:58.801" video="mainVideo" id=subtitle]]
+[[!template text="there is little chance" start="00:04:00.834" video="mainVideo" id=subtitle]]
+[[!template text="you will have a good project," start="00:04:02.168" video="mainVideo" id=subtitle]]
+[[!template text="but maintaining a project requires thinking" start="00:04:03.401" video="mainVideo" id=subtitle]]
+[[!template text="in terms of infrastructure," start="00:04:07.534" video="mainVideo" id=subtitle]]
+[[!template text="not in terms of bugs," start="00:04:09.301" video="mainVideo" id=subtitle]]
+[[!template text="thinking in terms of resources" start="00:04:11.068" video="mainVideo" id=subtitle]]
+[[!template text="that enable both users and contributors," start="00:04:13.334" video="mainVideo" id=subtitle]]
+[[!template text="not in terms of commits." start="00:04:16.701" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let me try to define again" start="00:04:18.401" video="mainVideo" id=subtitle]]
+[[!template text="what a free software maintainer is" start="00:04:21.001" video="mainVideo" id=subtitle]]
+[[!template text="or should be." start="00:04:23.334" video="mainVideo" id=subtitle]]
+[[!template text="A free software maintainer" start="00:04:24.434" video="mainVideo" id=subtitle]]
+[[!template text="is someone who cares about" start="00:04:26.234" video="mainVideo" id=subtitle]]
+[[!template text="enabling users and contributors" start="00:04:28.368" video="mainVideo" id=subtitle]]
+[[!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="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="versus being a direct hotline for users," start="00:04:43.634" 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="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]]
+[[!template text="This is the HOT mindset of maintenance," start="00:05:15.234" video="mainVideo" id=subtitle]]
+[[!template text="where the maintainers are Headmasters Of Tweaks" start="00:05:19.568" video="mainVideo" id=subtitle]]
+[[!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 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 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 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 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 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]]
+[[!template text="that they need to tap into" start="00:06:22.068" video="mainVideo" id=subtitle]]
+[[!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 <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="“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="<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="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="<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 <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 <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="<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 <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="<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="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 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 <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="<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. 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]]
+[[!template text="is not immediately rewarding," start="00:09:09.839" video="mainVideo" id=subtitle]]
+[[!template text="whereas fixing a bug clearly, clearly is." start="00:09:12.080" video="mainVideo" id=subtitle]]
+[[!template text="But if you start thinking of the project" start="00:09:15.168" video="mainVideo" id=subtitle]]
+[[!template text="as something that enables you" start="00:09:17.701" video="mainVideo" id=subtitle]]
+[[!template text="to do amazing things, and I believe" start="00:09:19.301" video="mainVideo" id=subtitle]]
+[[!template text="Org is this kind of project," start="00:09:21.440" video="mainVideo" id=subtitle]]
+[[!template text="and if you start thinking" start="00:09:23.434" video="mainVideo" id=subtitle]]
+[[!template text="of the maintenance as something" start="00:09:25.034" video="mainVideo" id=subtitle]]
+[[!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 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 “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 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! 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/model.md b/2021/captions/model.md
new file mode 100644
index 00000000..eee55e06
--- /dev/null
+++ b/2021/captions/model.md
@@ -0,0 +1,228 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, everyone. My name is" start="00:00:06.399" video="mainVideo" id=subtitle]]
+[[!template text="Laszlo Krajnikovszkij," start="00:00:07.670" video="mainVideo" id=subtitle]]
+[[!template text="and today I would like to share" start="00:00:08.800" video="mainVideo" id=subtitle]]
+[[!template text="some ideas about extending" start="00:00:10.559" video="mainVideo" id=subtitle]]
+[[!template text="the model of Emacs to other applications." start="00:00:12.000" video="mainVideo" id=subtitle]]
+[[!template text="Brief introduction of myself:" start="00:00:15.200" video="mainVideo" id=subtitle]]
+[[!template text="I am from Budapest, Hungary;" start="00:00:16.720" video="mainVideo" id=subtitle]]
+[[!template text="and I have a background" start="00:00:18.400" video="mainVideo" id=subtitle]]
+[[!template text="in Financial Economics," start="00:00:20.320" video="mainVideo" id=subtitle]]
+[[!template text="but by occupation I run" start="00:00:21.760" video="mainVideo" id=subtitle]]
+[[!template text="a software development company" start="00:00:24.480" video="mainVideo" id=subtitle]]
+[[!template text="where I mostly do product management." start="00:00:26.320" video="mainVideo" id=subtitle]]
+[[!template text="I try to do most of my work from Emacs." start="00:00:29.119" video="mainVideo" id=subtitle]]
+[[!template text="I've been using it for the past" start="00:00:34.399" video="mainVideo" id=subtitle]]
+[[!template text="two or three years" start="00:00:36.160" video="mainVideo" id=subtitle]]
+[[!template text="as a computer science hobby" start="00:00:37.200" video="mainVideo" id=subtitle]]
+[[!template text="and this fascinating piece of software" start="00:00:39.120" video="mainVideo" id=subtitle]]
+[[!template text="taught me a lot of different concepts" start="00:00:41.280" video="mainVideo" id=subtitle]]
+[[!template text="about software architecture" start="00:00:44.239" video="mainVideo" id=subtitle]]
+[[!template text="and programming languages," start="00:00:46.000" video="mainVideo" id=subtitle]]
+[[!template text="and also raised a lot of" start="00:00:48.800" video="mainVideo" id=subtitle]]
+[[!template text="philosophical questions" start="00:00:51.440" video="mainVideo" id=subtitle]]
+[[!template text="about human-computer interaction." start="00:00:52.719" video="mainVideo" id=subtitle]]
+[[!template text="I've been mostly using it" start="00:00:55.760" video="mainVideo" id=subtitle]]
+[[!template text="for organizing my personal information," start="00:00:57.039" video="mainVideo" id=subtitle]]
+[[!template text="writing notes and tracking my agenda," start="00:00:59.680" video="mainVideo" id=subtitle]]
+[[!template text="but occasionally, I've also used it" start="00:01:03.600" video="mainVideo" id=subtitle]]
+[[!template text="for reading and writing code" start="00:01:05.519" video="mainVideo" id=subtitle]]
+[[!template text="and for also reading news, email," start="00:01:07.119" video="mainVideo" id=subtitle]]
+[[!template text="and browsing the web." start="00:01:09.360" video="mainVideo" id=subtitle]]
+[[!template text="What do I mean by the 'model' of Emacs?" start="00:01:12.479" video="mainVideo" id=subtitle]]
+[[!template text="For me, the 'model' of Emacs is about" start="00:01:16.400" video="mainVideo" id=subtitle]]
+[[!template text="the interaction model." start="00:01:18.479" video="mainVideo" id=subtitle]]
+[[!template text="And it's not... Emacs is just a tool" start="00:01:21.920" video="mainVideo" id=subtitle]]
+[[!template text="for interacting with the computer." start="00:01:24.880" video="mainVideo" id=subtitle]]
+[[!template text="It's sort of a universal interface" start="00:01:26.560" video="mainVideo" id=subtitle]]
+[[!template text="that allows for consistency" start="00:01:28.640" video="mainVideo" id=subtitle]]
+[[!template text="across different apps," start="00:01:31.119" video="mainVideo" id=subtitle]]
+[[!template text="because everything is brought down to" start="00:01:33.280" video="mainVideo" id=subtitle]]
+[[!template text="an Emacs buffer, which is a" start="00:01:36.240" video="mainVideo" id=subtitle]]
+[[!template text="text-oriented interface," start="00:01:39.200" video="mainVideo" id=subtitle]]
+[[!template text="but that can have consistent" start="00:01:42.399" video="mainVideo" id=subtitle]]
+[[!template text="keybinding scheme," start="00:01:44.005" video="mainVideo" id=subtitle]]
+[[!template text="they have consistent color scheme," start="00:01:44.880" video="mainVideo" id=subtitle]]
+[[!template text="and consistent workflow in general." start="00:01:46.960" video="mainVideo" id=subtitle]]
+[[!template text="Also, Emacs has a lot of functionality" start="00:01:50.640" video="mainVideo" id=subtitle]]
+[[!template text="and utilizes mnemonic key bindings" start="00:01:53.200" video="mainVideo" id=subtitle]]
+[[!template text="for calling functions," start="00:01:55.920" video="mainVideo" id=subtitle]]
+[[!template text="which is much more powerful than" start="00:01:57.680" video="mainVideo" id=subtitle]]
+[[!template text="navigating contextual menus" start="00:01:59.920" video="mainVideo" id=subtitle]]
+[[!template text="with a pointer," start="00:02:02.000" video="mainVideo" id=subtitle]]
+[[!template text="because the functions that are" start="00:02:03.840" video="mainVideo" id=subtitle]]
+[[!template text="repeated the most" start="00:02:07.119" video="mainVideo" id=subtitle]]
+[[!template text="are then ingrained in the muscle memory," start="00:02:08.239" video="mainVideo" id=subtitle]]
+[[!template text="therefore reducing the lag" start="00:02:10.640" video="mainVideo" id=subtitle]]
+[[!template text="between the thought that is occurring" start="00:02:12.879" video="mainVideo" id=subtitle]]
+[[!template text="in your mind, and its reflection" start="00:02:15.680" video="mainVideo" id=subtitle]]
+[[!template text="on your computer screen." start="00:02:17.520" video="mainVideo" id=subtitle]]
+[[!template text="And also, Emacs provides" start="00:02:21.280" video="mainVideo" id=subtitle]]
+[[!template text="a huge number of packages" start="00:02:23.040" video="mainVideo" id=subtitle]]
+[[!template text="that can all be inspected and modified," start="00:02:25.360" video="mainVideo" id=subtitle]]
+[[!template text="and extended, and recombined," start="00:02:28.560" video="mainVideo" id=subtitle]]
+[[!template text="and just provides the best-possible" start="00:02:30.640" video="mainVideo" id=subtitle]]
+[[!template text="malleable system experience" start="00:02:35.599" video="mainVideo" id=subtitle]]
+[[!template text="that can potentially lead to" start="00:02:37.840" video="mainVideo" id=subtitle]]
+[[!template text="almost any desired setup" start="00:02:42.080" video="mainVideo" id=subtitle]]
+[[!template text="for the end-user." start="00:02:44.080" video="mainVideo" id=subtitle]]
+[[!template text="So, Emacs is great," start="00:02:47.599" video="mainVideo" id=subtitle]]
+[[!template text="but I need to use a lot of" start="00:02:49.440" video="mainVideo" id=subtitle]]
+[[!template text="different other tools" start="00:02:52.239" video="mainVideo" id=subtitle]]
+[[!template text="to collaborate with my coworkers," start="00:02:53.280" video="mainVideo" id=subtitle]]
+[[!template text="with my clients and vendors." start="00:02:55.200" video="mainVideo" id=subtitle]]
+[[!template text="On a normal day, I would need to be" start="00:02:57.519" video="mainVideo" id=subtitle]]
+[[!template text="switching between five to six" start="00:03:00.080" video="mainVideo" id=subtitle]]
+[[!template text="different web applications" start="00:03:02.640" video="mainVideo" id=subtitle]]
+[[!template text="and chat applications." start="00:03:04.319" video="mainVideo" id=subtitle]]
+[[!template text="They all have the same flaws." start="00:03:07.840" video="mainVideo" id=subtitle]]
+[[!template text="They all lack customizability," start="00:03:11.840" video="mainVideo" id=subtitle]]
+[[!template text="because it was never intended" start="00:03:14.879" video="mainVideo" id=subtitle]]
+[[!template text="by the original developers of the app" start="00:03:16.560" video="mainVideo" id=subtitle]]
+[[!template text="that the end user can tinker" start="00:03:19.280" video="mainVideo" id=subtitle]]
+[[!template text="with the product they're creating." start="00:03:21.120" video="mainVideo" id=subtitle]]
+[[!template text="But also, those apps are cloud-based," start="00:03:24.239" video="mainVideo" id=subtitle]]
+[[!template text="and usually not very good for privacy," start="00:03:29.120" video="mainVideo" id=subtitle]]
+[[!template text="and this also creates limitations" start="00:03:33.599" video="mainVideo" id=subtitle]]
+[[!template text="for offline-based workflows," start="00:03:36.480" video="mainVideo" id=subtitle]]
+[[!template text="or for in general not relying on" start="00:03:40.080" video="mainVideo" id=subtitle]]
+[[!template text="the internet connection" start="00:03:43.599" video="mainVideo" id=subtitle]]
+[[!template text="to use something." start="00:03:44.560" video="mainVideo" id=subtitle]]
+[[!template text="All these applications," start="00:03:46.959" video="mainVideo" id=subtitle]]
+[[!template text="they create a situation" start="00:03:49.440" video="mainVideo" id=subtitle]]
+[[!template text="when there's a lot of context-switching" start="00:03:50.720" video="mainVideo" id=subtitle]]
+[[!template text="between different apps," start="00:03:53.040" video="mainVideo" id=subtitle]]
+[[!template text="and this context-switching" start="00:03:55.360" video="mainVideo" id=subtitle]]
+[[!template text="comes from different color schemes," start="00:03:56.959" video="mainVideo" id=subtitle]]
+[[!template text="different workflows in general" start="00:03:59.920" video="mainVideo" id=subtitle]]
+[[!template text="for different apps." start="00:04:03.280" video="mainVideo" id=subtitle]]
+[[!template text="So, there is always" start="00:04:04.879" video="mainVideo" id=subtitle]]
+[[!template text="this little frame of time" start="00:04:06.400" video="mainVideo" id=subtitle]]
+[[!template text="where you need to orient yourself" start="00:04:10.400" video="mainVideo" id=subtitle]]
+[[!template text="in this other application." start="00:04:13.599" video="mainVideo" id=subtitle]]
+[[!template text="Of course, over time," start="00:04:15.280" video="mainVideo" id=subtitle]]
+[[!template text="it gets more automated," start="00:04:17.280" video="mainVideo" id=subtitle]]
+[[!template text="but still, this context switching" start="00:04:18.799" video="mainVideo" id=subtitle]]
+[[!template text="is very bad for productivity." start="00:04:20.560" video="mainVideo" id=subtitle]]
+[[!template text="These apps don't support very well" start="00:04:26.720" video="mainVideo" id=subtitle]]
+[[!template text="the keyboard-driven workflows," start="00:04:30.080" video="mainVideo" id=subtitle]]
+[[!template text="because the default set of keybindings" start="00:04:31.759" video="mainVideo" id=subtitle]]
+[[!template text="is always limited," start="00:04:33.520" video="mainVideo" id=subtitle]]
+[[!template text="and you always need to resort to" start="00:04:34.479" video="mainVideo" id=subtitle]]
+[[!template text="mouse-driven workflows." start="00:04:39.280" video="mainVideo" id=subtitle]]
+[[!template text="But Emacs has some issues" start="00:04:44.160" video="mainVideo" id=subtitle]]
+[[!template text="as a tool for work as well." start="00:04:46.400" video="mainVideo" id=subtitle]]
+[[!template text="First of all, it lacks integration" start="00:04:48.320" video="mainVideo" id=subtitle]]
+[[!template text="with all these tools," start="00:04:50.800" video="mainVideo" id=subtitle]]
+[[!template text="so I constantly need to be switching" start="00:04:51.759" video="mainVideo" id=subtitle]]
+[[!template text="between Emacs and these applications," start="00:04:54.560" video="mainVideo" id=subtitle]]
+[[!template text="or basically, my web browser." start="00:04:57.759" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is very good for text input" start="00:04:59.919" video="mainVideo" id=subtitle]]
+[[!template text="and for editing text," start="00:05:03.039" video="mainVideo" id=subtitle]]
+[[!template text="but it's not always perfect" start="00:05:04.720" video="mainVideo" id=subtitle]]
+[[!template text="for reading information" start="00:05:07.039" video="mainVideo" id=subtitle]]
+[[!template text="from an Emacs buffer," start="00:05:09.440" video="mainVideo" id=subtitle]]
+[[!template text="because it doesn't" start="00:05:11.199" video="mainVideo" id=subtitle]]
+[[!template text="render images and HTML properly." start="00:05:12.080" video="mainVideo" id=subtitle]]
+[[!template text="Also, Emacs lacks performance" start="00:05:16.560" video="mainVideo" id=subtitle]]
+[[!template text="under heavy load," start="00:05:18.800" video="mainVideo" id=subtitle]]
+[[!template text="so when you try to run" start="00:05:19.919" video="mainVideo" id=subtitle]]
+[[!template text="too many things in parallel," start="00:05:21.840" video="mainVideo" id=subtitle]]
+[[!template text="the single-threaded nature of Emacs" start="00:05:23.280" video="mainVideo" id=subtitle]]
+[[!template text="just makes it hang." start="00:05:26.560" video="mainVideo" id=subtitle]]
+[[!template text="For this reason," start="00:05:28.880" video="mainVideo" id=subtitle]]
+[[!template text="I wouldn't rely on Emacs" start="00:05:30.960" video="mainVideo" id=subtitle]]
+[[!template text="to take care of all my system processes." start="00:05:32.560" video="mainVideo" id=subtitle]]
+[[!template text="And of course, it has some" start="00:05:38.320" video="mainVideo" id=subtitle]]
+[[!template text="legacy UI limitations" start="00:05:40.400" video="mainVideo" id=subtitle]]
+[[!template text="being a software that was written" start="00:05:42.240" video="mainVideo" id=subtitle]]
+[[!template text="40 years ago." start="00:05:46.400" video="mainVideo" id=subtitle]]
+[[!template text="This results in a very limited usability" start="00:05:49.039" video="mainVideo" id=subtitle]]
+[[!template text="on mobile and other touch devices." start="00:05:53.759" video="mainVideo" id=subtitle]]
+[[!template text="I've been thinking" start="00:05:59.680" video="mainVideo" id=subtitle]]
+[[!template text="about a hybrid approach" start="00:06:01.759" video="mainVideo" id=subtitle]]
+[[!template text="that you could still use Emacs" start="00:06:03.840" video="mainVideo" id=subtitle]]
+[[!template text="as a core of your life," start="00:06:05.840" video="mainVideo" id=subtitle]]
+[[!template text="and then extend it" start="00:06:10.080" video="mainVideo" id=subtitle]]
+[[!template text="with adjacent web applications" start="00:06:11.840" video="mainVideo" id=subtitle]]
+[[!template text="where Emacs can be used" start="00:06:15.120" video="mainVideo" id=subtitle]]
+[[!template text="as a text processing backend" start="00:06:16.960" video="mainVideo" id=subtitle]]
+[[!template text="and use Org mode files" start="00:06:21.600" video="mainVideo" id=subtitle]]
+[[!template text="as a universal format" start="00:06:24.080" video="mainVideo" id=subtitle]]
+[[!template text="for converting textual data," start="00:06:25.600" video="mainVideo" id=subtitle]]
+[[!template text="and then If emacs can be" start="00:06:29.600" video="mainVideo" id=subtitle]]
+[[!template text="connected with those applications" start="00:06:33.199" video="mainVideo" id=subtitle]]
+[[!template text="that I mentioned" start="00:06:36.639" video="mainVideo" id=subtitle]]
+[[!template text="a couple of slides before" start="00:06:37.520" video="mainVideo" id=subtitle]]
+[[!template text="through their API, and you can have" start="00:06:39.520" video="mainVideo" id=subtitle]]
+[[!template text="a two-way communication between them," start="00:06:41.280" video="mainVideo" id=subtitle]]
+[[!template text="and just export in JSON, let's say," start="00:06:43.199" video="mainVideo" id=subtitle]]
+[[!template text="and then convert to Org mode," start="00:06:46.000" video="mainVideo" id=subtitle]]
+[[!template text="and then use the Org mode" start="00:06:47.440" video="mainVideo" id=subtitle]]
+[[!template text="for these local web apps." start="00:06:49.039" video="mainVideo" id=subtitle]]
+[[!template text="Then you can use Emacs for editing," start="00:06:52.960" video="mainVideo" id=subtitle]]
+[[!template text="and Org mode, but then you can use" start="00:06:57.599" video="mainVideo" id=subtitle]]
+[[!template text="this adjacent web application" start="00:07:00.800" video="mainVideo" id=subtitle]]
+[[!template text="for viewing information," start="00:07:03.360" video="mainVideo" id=subtitle]]
+[[!template text="making small edits, and in general," start="00:07:05.039" video="mainVideo" id=subtitle]]
+[[!template text="possibly have an enhanced" start="00:07:08.720" video="mainVideo" id=subtitle]]
+[[!template text="user-defined UI that is" start="00:07:11.692" video="mainVideo" id=subtitle]]
+[[!template text="directly connected to Emacs." start="00:07:14.639" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Application Framework" start="00:07:17.039" video="mainVideo" id=subtitle]]
+[[!template text="is a project that tries to achieve" start="00:07:19.759" video="mainVideo" id=subtitle]]
+[[!template text="a common goal, but it tries to" start="00:07:21.520" video="mainVideo" id=subtitle]]
+[[!template text="achieve that through" start="00:07:23.840" video="mainVideo" id=subtitle]]
+[[!template text="displaying everything" start="00:07:24.639" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs buffer," start="00:07:25.520" video="mainVideo" id=subtitle]]
+[[!template text="whereas I'm thinking" start="00:07:27.840" video="mainVideo" id=subtitle]]
+[[!template text="if it can be displayed" start="00:07:28.840" video="mainVideo" id=subtitle]]
+[[!template text="in any web browser, but utilize" start="00:07:30.800" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Application Framework API" start="00:07:33.759" video="mainVideo" id=subtitle]]
+[[!template text="as a bridge between Elisp" start="00:07:36.560" video="mainVideo" id=subtitle]]
+[[!template text="and Python and Javascript," start="00:07:38.639" video="mainVideo" id=subtitle]]
+[[!template text="so you can use" start="00:07:40.960" video="mainVideo" id=subtitle]]
+[[!template text="the modern front-end frameworks" start="00:07:41.759" video="mainVideo" id=subtitle]]
+[[!template text="to create those web interfaces easier" start="00:07:44.879" video="mainVideo" id=subtitle]]
+[[!template text="and connect them" start="00:07:48.560" video="mainVideo" id=subtitle]]
+[[!template text="with Emacs functionality." start="00:07:49.280" video="mainVideo" id=subtitle]]
+[[!template text="These user-controlled web apps" start="00:07:53.919" video="mainVideo" id=subtitle]]
+[[!template text="would basically result in" start="00:07:57.280" video="mainVideo" id=subtitle]]
+[[!template text="the user connecting" start="00:08:04.126" video="mainVideo" id=subtitle]]
+[[!template text="to this external cloud-based tool," start="00:08:05.680" video="mainVideo" id=subtitle]]
+[[!template text="let's say Asana, but then" start="00:08:10.319" video="mainVideo" id=subtitle]]
+[[!template text="process everything through Org mode" start="00:08:13.759" video="mainVideo" id=subtitle]]
+[[!template text="and then display in an Org mode file" start="00:08:16.400" video="mainVideo" id=subtitle]]
+[[!template text="or display in this enhanced way" start="00:08:19.840" video="mainVideo" id=subtitle]]
+[[!template text="through the adjacent local web app," start="00:08:24.720" video="mainVideo" id=subtitle]]
+[[!template text="a front-end for which" start="00:08:28.960" video="mainVideo" id=subtitle]]
+[[!template text="could be written in any .js framework" start="00:08:31.280" video="mainVideo" id=subtitle]]
+[[!template text="for front-end development." start="00:08:34.080" video="mainVideo" id=subtitle]]
+[[!template text="I encourage everyone in the community" start="00:08:37.440" video="mainVideo" id=subtitle]]
+[[!template text="who is interested in similar questions" start="00:08:42.159" video="mainVideo" id=subtitle]]
+[[!template text="to share their opinion" start="00:08:45.279" video="mainVideo" id=subtitle]]
+[[!template text="about the potential risks and drawbacks," start="00:08:48.160" video="mainVideo" id=subtitle]]
+[[!template text="about any other ways" start="00:08:50.959" video="mainVideo" id=subtitle]]
+[[!template text="to achieve a similar goal," start="00:08:53.120" video="mainVideo" id=subtitle]]
+[[!template text="if anyone else is doing this already" start="00:08:54.640" video="mainVideo" id=subtitle]]
+[[!template text="that i might not know about," start="00:08:57.519" video="mainVideo" id=subtitle]]
+[[!template text="and in general, just share ideas" start="00:08:59.920" video="mainVideo" id=subtitle]]
+[[!template text="about what else can be done" start="00:09:02.399" video="mainVideo" id=subtitle]]
+[[!template text="to integrate Emacs with more stuff" start="00:09:03.760" video="mainVideo" id=subtitle]]
+[[!template text="and how Emacs can become" start="00:09:07.519" video="mainVideo" id=subtitle]]
+[[!template text="more approachable by non-technical users" start="00:09:10.640" video="mainVideo" id=subtitle]]
+[[!template text="because I would love to see" start="00:09:14.080" video="mainVideo" id=subtitle]]
+[[!template text="more people using Emacs, to be honest." start="00:09:16.160" video="mainVideo" id=subtitle]]
+[[!template text="Yeah. Thank you very much" start="00:09:20.080" video="mainVideo" id=subtitle]]
+[[!template text="for listening to this talk." start="00:09:21.680" video="mainVideo" id=subtitle]]
+[[!template text="I will be taking questions" start="00:09:23.440" video="mainVideo" id=subtitle]]
+[[!template text="and feedback in the pad" start="00:09:26.080" video="mainVideo" id=subtitle]]
+[[!template text="after the conference." start="00:09:27.600" video="mainVideo" id=subtitle]]
+[[!template text="You can reach me through this email" start="00:09:31.920" video="mainVideo" id=subtitle]]
+[[!template text="laszlo@laszlo.is ." start="00:09:33.920" video="mainVideo" id=subtitle]]
+[[!template text="I'll be posting" start="00:09:36.720" video="mainVideo" id=subtitle]]
+[[!template text="some more detailed articles" start="00:09:39.600" video="mainVideo" id=subtitle]]
+[[!template text="and description of this idea" start="00:09:41.760" video="mainVideo" id=subtitle]]
+[[!template text="that I was trying to present today." start="00:09:44.959" video="mainVideo" id=subtitle]]
+[[!template text="captions by Laszlo" start="00:09:47.166" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/mold.md b/2021/captions/mold.md
new file mode 100644
index 00000000..747d8c0e
--- /dev/null
+++ b/2021/captions/mold.md
@@ -0,0 +1,268 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Welcome to my talk," start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="Moldable Emacs: A Step Towards" start="00:00:01.200" video="mainVideo" id=subtitle]]
+[[!template text="Sustainable Software." start="00:00:02.680" video="mainVideo" id=subtitle]]
+[[!template text="Who am I?" start="00:00:03.800" video="mainVideo" id=subtitle]]
+[[!template text="I am Andrea." start="00:00:04.440" video="mainVideo" id=subtitle]]
+[[!template text="I work as a Clojure software engineer" start="00:00:05.280" video="mainVideo" id=subtitle]]
+[[!template text="somewhere in the middle of the UK." start="00:00:07.120" video="mainVideo" id=subtitle]]
+[[!template text="I inherited my passion for Emacs" start="00:00:09.280" video="mainVideo" id=subtitle]]
+[[!template text="from my Ph.D. supervisor," start="00:00:10.880" video="mainVideo" id=subtitle]]
+[[!template text="and from that moment on," start="00:00:12.480" video="mainVideo" id=subtitle]]
+[[!template text="I got in synergy with it." start="00:00:13.880" video="mainVideo" id=subtitle]]
+[[!template text="You can learn more about my interests" start="00:00:14.960" video="mainVideo" id=subtitle]]
+[[!template text="and my Emacs adventure" start="00:00:17.480" video="mainVideo" id=subtitle]]
+[[!template text="at ag91.github.io." start="00:00:19.200" video="mainVideo" id=subtitle]]
+[[!template text="So let's get in the talk." start="00:00:22.520" video="mainVideo" id=subtitle]]
+[[!template text="Why moldable development?" start="00:00:24.360" video="mainVideo" id=subtitle]]
+[[!template text="There is too much information to read it all." start="00:00:25.840" video="mainVideo" id=subtitle]]
+[[!template text="Reading is very difficult." start="00:00:28.400" video="mainVideo" id=subtitle]]
+[[!template text="It's a very slow activity." start="00:00:30.640" video="mainVideo" id=subtitle]]
+[[!template text="You need to go word by word" start="00:00:32.320" video="mainVideo" id=subtitle]]
+[[!template text="or paragraph by paragraph," start="00:00:33.960" video="mainVideo" id=subtitle]]
+[[!template text="if you speedread." start="00:00:35.520" video="mainVideo" id=subtitle]]
+[[!template text="But anyway, you take a lot of time" start="00:00:36.400" video="mainVideo" id=subtitle]]
+[[!template text="to absorb that information." start="00:00:39.320" video="mainVideo" id=subtitle]]
+[[!template text="And we urgently need" start="00:00:40.720" video="mainVideo" id=subtitle]]
+[[!template text="to stand on the shoulders of giants," start="00:00:43.160" video="mainVideo" id=subtitle]]
+[[!template text="so the idea is we should stop" start="00:00:44.960" video="mainVideo" id=subtitle]]
+[[!template text="doing always the same errors" start="00:00:46.880" video="mainVideo" id=subtitle]]
+[[!template text="and we should be able to" start="00:00:48.960" video="mainVideo" id=subtitle]]
+[[!template text="absorb as much of the good ideas" start="00:00:50.920" video="mainVideo" id=subtitle]]
+[[!template text="that the bright people around us generate." start="00:00:53.640" video="mainVideo" id=subtitle]]
+[[!template text="For example, if I create" start="00:00:56.600" video="mainVideo" id=subtitle]]
+[[!template text="a magnificent program in COBOL," start="00:00:59.840" video="mainVideo" id=subtitle]]
+[[!template text="and nobody knows any more" start="00:01:04.120" video="mainVideo" id=subtitle]]
+[[!template text="how to learn or read COBOL," start="00:01:06.000" video="mainVideo" id=subtitle]]
+[[!template text="(and in order to read," start="00:01:08.000" video="mainVideo" id=subtitle]]
+[[!template text="you take a lot of time)," start="00:01:09.120" video="mainVideo" id=subtitle]]
+[[!template text="well, that fantastic idea" start="00:01:10.960" video="mainVideo" id=subtitle]]
+[[!template text="should be easily translatable" start="00:01:13.040" video="mainVideo" id=subtitle]]
+[[!template text="to C, or to Clojure," start="00:01:15.360" video="mainVideo" id=subtitle]]
+[[!template text="or to Common Lisp," start="00:01:19.240" video="mainVideo" id=subtitle]]
+[[!template text="or to a language that will come after." start="00:01:20.280" video="mainVideo" id=subtitle]]
+[[!template text="The idea shouldn't be lost" start="00:01:22.240" video="mainVideo" id=subtitle]]
+[[!template text="in a codebase somewhere in an old mainframe." start="00:01:24.080" video="mainVideo" id=subtitle]]
+[[!template text="It should be still accessible." start="00:01:28.400" video="mainVideo" id=subtitle]]
+[[!template text="Let's get in practice. What does it mean?" start="00:01:31.080" video="mainVideo" id=subtitle]]
+[[!template text="It means that, for example," start="00:01:33.920" video="mainVideo" id=subtitle]]
+[[!template text="the proponents of moldable development" start="00:01:37.840" video="mainVideo" id=subtitle]]
+[[!template text="prepare this slide to give a sense." start="00:01:40.400" video="mainVideo" id=subtitle]]
+[[!template text="So the idea is... Look at this." start="00:01:42.440" video="mainVideo" id=subtitle]]
+[[!template text="What is here? You will see" start="00:01:45.080" video="mainVideo" id=subtitle]]
+[[!template text="that all these little things" start="00:01:46.640" video="mainVideo" id=subtitle]]
+[[!template text="look like the same." start="00:01:48.680" video="mainVideo" id=subtitle]]
+[[!template text="The first time I looked at it," start="00:01:49.680" video="mainVideo" id=subtitle]]
+[[!template text="this was looking like a class diagram." start="00:01:50.680" video="mainVideo" id=subtitle]]
+[[!template text="This is actually code" start="00:01:52.840" video="mainVideo" id=subtitle]]
+[[!template text="describing a little system." start="00:01:54.880" video="mainVideo" id=subtitle]]
+[[!template text="If you look and if you read," start="00:01:57.800" video="mainVideo" id=subtitle]]
+[[!template text="you can see that there is a numerator," start="00:01:59.520" video="mainVideo" id=subtitle]]
+[[!template text="a denominator... So this, you see," start="00:02:01.320" video="mainVideo" id=subtitle]]
+[[!template text="is interactive, because it's code." start="00:02:03.320" video="mainVideo" id=subtitle]]
+[[!template text="It's something that is running," start="00:02:05.720" video="mainVideo" id=subtitle]]
+[[!template text="and it's an object" start="00:02:06.520" video="mainVideo" id=subtitle]]
+[[!template text="because this is Smalltalk --" start="00:02:07.280" video="mainVideo" id=subtitle]]
+[[!template text="Pharo, a dialect of Smalltalk --" start="00:02:08.560" video="mainVideo" id=subtitle]]
+[[!template text="but in the next slide," start="00:02:11.440" video="mainVideo" id=subtitle]]
+[[!template text="since this is a moldable tool," start="00:02:13.040" video="mainVideo" id=subtitle]]
+[[!template text="you can see that you can..." start="00:02:15.160" video="mainVideo" id=subtitle]]
+[[!template text="there is a representation" start="00:02:16.760" video="mainVideo" id=subtitle]]
+[[!template text="of the same software" start="00:02:18.280" video="mainVideo" id=subtitle]]
+[[!template text="in a human way." start="00:02:20.000" video="mainVideo" id=subtitle]]
+[[!template text="So, for example," start="00:02:23.520" video="mainVideo" id=subtitle]]
+[[!template text="here you can see" start="00:02:24.640" video="mainVideo" id=subtitle]]
+[[!template text="there is a mathematical formula." start="00:02:25.880" video="mainVideo" id=subtitle]]
+[[!template text="The other object, the second one," start="00:02:27.280" video="mainVideo" id=subtitle]]
+[[!template text="was a file system kind of thing." start="00:02:29.080" video="mainVideo" id=subtitle]]
+[[!template text="The third one was an image." start="00:02:30.440" video="mainVideo" id=subtitle]]
+[[!template text="And the last one was sort of a graph." start="00:02:33.880" video="mainVideo" id=subtitle]]
+[[!template text="So you can see that" start="00:02:36.600" video="mainVideo" id=subtitle]]
+[[!template text="there is a better way to learn," start="00:02:37.640" video="mainVideo" id=subtitle]]
+[[!template text="to distinguish, to intuitively get a sense." start="00:02:40.840" video="mainVideo" id=subtitle]]
+[[!template text="And there is not only a single way." start="00:02:44.880" video="mainVideo" id=subtitle]]
+[[!template text="It's custom to what you need." start="00:02:47.200" video="mainVideo" id=subtitle]]
+[[!template text="For example, this is" start="00:02:49.480" video="mainVideo" id=subtitle]]
+[[!template text="a very general way" start="00:02:51.280" video="mainVideo" id=subtitle]]
+[[!template text="to understand what is this object about" start="00:02:52.680" video="mainVideo" id=subtitle]]
+[[!template text="and maybe you want to see" start="00:02:54.040" video="mainVideo" id=subtitle]]
+[[!template text="some other little things." start="00:02:55.560" video="mainVideo" id=subtitle]]
+[[!template text="For example, the documentation of the code," start="00:02:56.760" video="mainVideo" id=subtitle]]
+[[!template text="because you are interested" start="00:02:58.840" video="mainVideo" id=subtitle]]
+[[!template text="in developing with it." start="00:03:00.240" video="mainVideo" id=subtitle]]
+[[!template text="For example, an image," start="00:03:01.160" video="mainVideo" id=subtitle]]
+[[!template text="you can see there's a path" start="00:03:03.960" video="mainVideo" id=subtitle]]
+[[!template text="on the filesystem," start="00:03:05.240" video="mainVideo" id=subtitle]]
+[[!template text="or as a hexadecimal representation." start="00:03:06.840" video="mainVideo" id=subtitle]]
+[[!template text="In a sense, there is not only one view." start="00:03:10.520" video="mainVideo" id=subtitle]]
+[[!template text="You need to have the view" start="00:03:12.520" video="mainVideo" id=subtitle]]
+[[!template text="that you need at the moment," start="00:03:13.840" video="mainVideo" id=subtitle]]
+[[!template text="and your tool needs to" start="00:03:15.320" video="mainVideo" id=subtitle]]
+[[!template text="make this easy for you." start="00:03:16.840" video="mainVideo" id=subtitle]]
+[[!template text="So, why moldable Emacs?" start="00:03:19.680" video="mainVideo" id=subtitle]]
+[[!template text="I wanted to bring that idea" start="00:03:22.280" video="mainVideo" id=subtitle]]
+[[!template text="of having multiple view representations" start="00:03:24.680" video="mainVideo" id=subtitle]]
+[[!template text="of what you need" start="00:03:26.760" video="mainVideo" id=subtitle]]
+[[!template text="to understand better in Emacs." start="00:03:29.520" video="mainVideo" id=subtitle]]
+[[!template text="And so I want to create immediate story telling." start="00:03:33.280" video="mainVideo" id=subtitle]]
+[[!template text="Immediate, because it needs to be very quick," start="00:03:36.280" video="mainVideo" id=subtitle]]
+[[!template text="and story telling is" start="00:03:37.880" video="mainVideo" id=subtitle]]
+[[!template text="because you want to allow connection" start="00:03:38.840" video="mainVideo" id=subtitle]]
+[[!template text="from something that you needed" start="00:03:40.760" video="mainVideo" id=subtitle]]
+[[!template text="to develop it into something new." start="00:03:42.520" video="mainVideo" id=subtitle]]
+[[!template text="So you are really telling a story:" start="00:03:45.520" video="mainVideo" id=subtitle]]
+[[!template text="what is this mathematical formula" start="00:03:47.160" video="mainVideo" id=subtitle]]
+[[!template text="I created because I need this," start="00:03:49.040" video="mainVideo" id=subtitle]]
+[[!template text="or this numerator and denominator" start="00:03:51.120" video="mainVideo" id=subtitle]]
+[[!template text="produce this number." start="00:03:54.440" video="mainVideo" id=subtitle]]
+[[!template text="So this is a story that you are telling" start="00:03:55.520" video="mainVideo" id=subtitle]]
+[[!template text="in my mind." start="00:03:58.760" video="mainVideo" id=subtitle]]
+[[!template text="And I want multiple views for buffers." start="00:03:59.880" video="mainVideo" id=subtitle]]
+[[!template text="Buffers is the main concept in Emacs," start="00:04:04.000" video="mainVideo" id=subtitle]]
+[[!template text="and so buffers are what I want to" start="00:04:05.800" video="mainVideo" id=subtitle]]
+[[!template text="integrate in a story." start="00:04:09.160" video="mainVideo" id=subtitle]]
+[[!template text="I create a buffer" start="00:04:11.000" video="mainVideo" id=subtitle]]
+[[!template text="and I start manipulating it," start="00:04:12.280" video="mainVideo" id=subtitle]]
+[[!template text="creating a view and then another view" start="00:04:15.080" video="mainVideo" id=subtitle]]
+[[!template text="in order to tell something to myself," start="00:04:16.920" video="mainVideo" id=subtitle]]
+[[!template text="in order to learn," start="00:04:19.520" video="mainVideo" id=subtitle]]
+[[!template text="but also to tell something to others." start="00:04:20.720" video="mainVideo" id=subtitle]]
+[[!template text="So, for example, let's start" start="00:04:21.880" video="mainVideo" id=subtitle]]
+[[!template text="from a use case: learning better." start="00:04:23.960" video="mainVideo" id=subtitle]]
+[[!template text="I had, at work, a list of changes" start="00:04:25.840" video="mainVideo" id=subtitle]]
+[[!template text="for a pull request," start="00:04:29.640" video="mainVideo" id=subtitle]]
+[[!template text="so a code change," start="00:04:31.440" video="mainVideo" id=subtitle]]
+[[!template text="and I was very tired." start="00:04:32.040" video="mainVideo" id=subtitle]]
+[[!template text="I couldn't understand" start="00:04:33.920" video="mainVideo" id=subtitle]]
+[[!template text="what this much text was about." start="00:04:34.760" video="mainVideo" id=subtitle]]
+[[!template text="So what I generate," start="00:04:37.520" video="mainVideo" id=subtitle]]
+[[!template text="I create a value for myself" start="00:04:38.920" video="mainVideo" id=subtitle]]
+[[!template text="to understand it easily." start="00:04:41.120" video="mainVideo" id=subtitle]]
+[[!template text="And for me, understanding it easily," start="00:04:42.720" video="mainVideo" id=subtitle]]
+[[!template text="for example, was a little flow diagram." start="00:04:45.320" video="mainVideo" id=subtitle]]
+[[!template text="It showed me, okay, there is first" start="00:04:49.240" video="mainVideo" id=subtitle]]
+[[!template text="this, this, and this," start="00:04:50.963" video="mainVideo" id=subtitle]]
+[[!template text="and so I could follow." start="00:04:52.320" video="mainVideo" id=subtitle]]
+[[!template text="having it next to the change." start="00:04:54.960" video="mainVideo" id=subtitle]]
+[[!template text="Having this image next to the change." start="00:04:58.400" video="mainVideo" id=subtitle]]
+[[!template text="And this is describing" start="00:05:00.600" video="mainVideo" id=subtitle]]
+[[!template text="an Italian recipe for pasta with butter," start="00:05:02.360" video="mainVideo" id=subtitle]]
+[[!template text="so if you want to try, you're welcome." start="00:05:05.640" video="mainVideo" id=subtitle]]
+[[!template text="It's very tasty." start="00:05:07.840" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, the other thing that we can do" start="00:05:11.720" video="mainVideo" id=subtitle]]
+[[!template text="is query text -- structured text." start="00:05:13.840" video="mainVideo" id=subtitle]]
+[[!template text="So for example, this presentation" start="00:05:17.280" video="mainVideo" id=subtitle]]
+[[!template text="is an Org Mode buffer." start="00:05:20.680" video="mainVideo" id=subtitle]]
+[[!template text="So when I call the Playground" start="00:05:21.960" video="mainVideo" id=subtitle]]
+[[!template text="(that is one of the molds" start="00:05:24.040" video="mainVideo" id=subtitle]]
+[[!template text="that lets me write some Elisp to query" start="00:05:24.960" video="mainVideo" id=subtitle]]
+[[!template text="the original buffer,)" start="00:05:27.640" video="mainVideo" id=subtitle]]
+[[!template text="if I evaluate this," start="00:05:29.680" video="mainVideo" id=subtitle]]
+[[!template text="you will see that" start="00:05:31.640" video="mainVideo" id=subtitle]]
+[[!template text="I have just asked" start="00:05:33.280" video="mainVideo" id=subtitle]]
+[[!template text="my Org Mode buffer" start="00:05:33.880" video="mainVideo" id=subtitle]]
+[[!template text="to tell me the content length" start="00:05:35.200" video="mainVideo" id=subtitle]]
+[[!template text="of the headings" start="00:05:37.400" video="mainVideo" id=subtitle]]
+[[!template text="with some interesting content." start="00:05:38.280" video="mainVideo" id=subtitle]]
+[[!template text="So all the headings at third-level." start="00:05:40.240" video="mainVideo" id=subtitle]]
+[[!template text="Do you understand? I've just asked a file" start="00:05:44.280" video="mainVideo" id=subtitle]]
+[[!template text="to tell me its contents" start="00:05:48.080" video="mainVideo" id=subtitle]]
+[[!template text="without reading it." start="00:05:50.240" video="mainVideo" id=subtitle]]
+[[!template text="Or we can do something similar for code." start="00:05:51.240" video="mainVideo" id=subtitle]]
+[[!template text="We can do... I don't know..." start="00:05:56.320" video="mainVideo" id=subtitle]]
+[[!template text="No idea what is written there," start="00:05:58.840" video="mainVideo" id=subtitle]]
+[[!template text="but I want to know" start="00:06:00.920" video="mainVideo" id=subtitle]]
+[[!template text="which function is the most complex" start="00:06:02.000" video="mainVideo" id=subtitle]]
+[[!template text="or is overcomplicated." start="00:06:03.840" video="mainVideo" id=subtitle]]
+[[!template text="I have defined in red," start="00:06:06.800" video="mainVideo" id=subtitle]]
+[[!template text="(so again, I don't need to read the number" start="00:06:09.560" video="mainVideo" id=subtitle]]
+[[!template text="to know either what it is about!)" start="00:06:11.600" video="mainVideo" id=subtitle]]
+[[!template text="So, I've written in red," start="00:06:13.800" video="mainVideo" id=subtitle]]
+[[!template text="I've shown in red" start="00:06:15.280" video="mainVideo" id=subtitle]]
+[[!template text="the function with more complexity," start="00:06:18.120" video="mainVideo" id=subtitle]]
+[[!template text="and I can jump to it." start="00:06:20.320" video="mainVideo" id=subtitle]]
+[[!template text="So everything is very accessible" start="00:06:22.560" video="mainVideo" id=subtitle]]
+[[!template text="to facilitate my operation" start="00:06:24.160" video="mainVideo" id=subtitle]]
+[[!template text="and my understanding." start="00:06:26.280" video="mainVideo" id=subtitle]]
+[[!template text="Or I can take notes." start="00:06:27.160" video="mainVideo" id=subtitle]]
+[[!template text="For example, I can annotate something," start="00:06:29.880" video="mainVideo" id=subtitle]]
+[[!template text="and you see the note" start="00:06:36.160" video="mainVideo" id=subtitle]]
+[[!template text="is again structured text," start="00:06:37.240" video="mainVideo" id=subtitle]]
+[[!template text="because you will know" start="00:06:38.920" video="mainVideo" id=subtitle]]
+[[!template text="that I'm going to query my notes" start="00:06:40.120" video="mainVideo" id=subtitle]]
+[[!template text="at some point." start="00:06:42.320" video="mainVideo" id=subtitle]]
+[[!template text="For example, I can show all my notes," start="00:06:43.480" video="mainVideo" id=subtitle]]
+[[!template text="for example, by mode, or I can show" start="00:06:46.680" video="mainVideo" id=subtitle]]
+[[!template text="all the notes by mode in Org Mode." start="00:06:51.480" video="mainVideo" id=subtitle]]
+[[!template text="Because it's structured text," start="00:06:53.600" video="mainVideo" id=subtitle]]
+[[!template text="I can manipulate it very easily." start="00:06:56.440" video="mainVideo" id=subtitle]]
+[[!template text="So these are all my notes." start="00:06:57.840" video="mainVideo" id=subtitle]]
+[[!template text="Finally, the superpower" start="00:07:00.160" video="mainVideo" id=subtitle]]
+[[!template text="of this moldable Emacs" start="00:07:05.400" video="mainVideo" id=subtitle]]
+[[!template text="is the fact that you can compose molds." start="00:07:08.320" video="mainVideo" id=subtitle]]
+[[!template text="So, for example, let's go in" start="00:07:10.400" video="mainVideo" id=subtitle]]
+[[!template text="showing all my notes." start="00:07:13.000" video="mainVideo" id=subtitle]]
+[[!template text="Let me show you all my notes." start="00:07:17.480" video="mainVideo" id=subtitle]]
+[[!template text="And then let's say that I want to know" start="00:07:19.040" video="mainVideo" id=subtitle]]
+[[!template text="how they are... how many lines" start="00:07:21.520" video="mainVideo" id=subtitle]]
+[[!template text="are these notes?" start="00:07:26.720" video="mainVideo" id=subtitle]]
+[[!template text="Look, this is the answer." start="00:07:27.400" video="mainVideo" id=subtitle]]
+[[!template text="So of all the notes I take," start="00:07:30.360" video="mainVideo" id=subtitle]]
+[[!template text="I can actually query it and say" start="00:07:31.800" video="mainVideo" id=subtitle]]
+[[!template text="&quot;What are the lengths?&quot;" start="00:07:34.200" video="mainVideo" id=subtitle]]
+[[!template text="But let me show something more." start="00:07:38.360" video="mainVideo" id=subtitle]]
+[[!template text="Which one is the longest note?" start="00:07:40.040" video="mainVideo" id=subtitle]]
+[[!template text="Now there are lots of notes in there" start="00:07:41.680" video="mainVideo" id=subtitle]]
+[[!template text="so it's difficult to know" start="00:07:44.000" video="mainVideo" id=subtitle]]
+[[!template text="but what if I can, in a click," start="00:07:45.080" video="mainVideo" id=subtitle]]
+[[!template text="generate a view that is very immediate?" start="00:07:47.200" video="mainVideo" id=subtitle]]
+[[!template text="Look, there is a note that is very long." start="00:07:50.440" video="mainVideo" id=subtitle]]
+[[!template text="It's about 35 lines." start="00:07:52.240" video="mainVideo" id=subtitle]]
+[[!template text="Do you understand?" start="00:07:54.040" video="mainVideo" id=subtitle]]
+[[!template text="I didn't read any note." start="00:07:55.160" video="mainVideo" id=subtitle]]
+[[!template text="This is all coming from" start="00:07:56.760" video="mainVideo" id=subtitle]]
+[[!template text="being able to query your text" start="00:07:58.400" video="mainVideo" id=subtitle]]
+[[!template text="and having multiple representations." start="00:08:02.520" video="mainVideo" id=subtitle]]
+[[!template text="My presentation is very short." start="00:08:06.240" video="mainVideo" id=subtitle]]
+[[!template text="What is next?" start="00:08:08.360" video="mainVideo" id=subtitle]]
+[[!template text="Next is to integrate molds with other software" start="00:08:09.720" video="mainVideo" id=subtitle]]
+[[!template text="like code-compass." start="00:08:14.360" video="mainVideo" id=subtitle]]
+[[!template text="I did a presentation last year" start="00:08:15.360" video="mainVideo" id=subtitle]]
+[[!template text="and I want to make those nice diagrams" start="00:08:16.720" video="mainVideo" id=subtitle]]
+[[!template text="available for small molds" start="00:08:18.640" video="mainVideo" id=subtitle]]
+[[!template text="so that you can use them," start="00:08:21.320" video="mainVideo" id=subtitle]]
+[[!template text="for example, for notes" start="00:08:22.880" video="mainVideo" id=subtitle]]
+[[!template text="or text that you have." start="00:08:24.760" video="mainVideo" id=subtitle]]
+[[!template text="To integrate better" start="00:08:26.360" video="mainVideo" id=subtitle]]
+[[!template text="with Nyxt, the Common Lisp browser," start="00:08:28.200" video="mainVideo" id=subtitle]]
+[[!template text="because there's a lot of opportunity there" start="00:08:30.360" video="mainVideo" id=subtitle]]
+[[!template text="to make funny things," start="00:08:32.200" video="mainVideo" id=subtitle]]
+[[!template text="a browser accessible for molding," start="00:08:35.320" video="mainVideo" id=subtitle]]
+[[!template text="and then having some interaction with Smalltalk" start="00:08:38.040" video="mainVideo" id=subtitle]]
+[[!template text="through Glamorous Toolkit," start="00:08:41.240" video="mainVideo" id=subtitle]]
+[[!template text="so that we can have the best tools," start="00:08:42.840" video="mainVideo" id=subtitle]]
+[[!template text="Emacs and Glamorous Toolkit and Nyxt" start="00:08:44.080" video="mainVideo" id=subtitle]]
+[[!template text="and others, to work together" start="00:08:46.800" video="mainVideo" id=subtitle]]
+[[!template text="to make our learning easy." start="00:08:49.000" video="mainVideo" id=subtitle]]
+[[!template text="Then... You've seen the tool;" start="00:08:50.520" video="mainVideo" id=subtitle]]
+[[!template text="my molds that I have shown" start="00:08:52.480" video="mainVideo" id=subtitle]]
+[[!template text="were basically by buffer." start="00:08:53.840" video="mainVideo" id=subtitle]]
+[[!template text="I want project statistics." start="00:08:56.200" video="mainVideo" id=subtitle]]
+[[!template text="What about... Give me the complexity" start="00:08:58.600" video="mainVideo" id=subtitle]]
+[[!template text="of all the functions" start="00:09:00.480" video="mainVideo" id=subtitle]]
+[[!template text="in a project," start="00:09:01.800" video="mainVideo" id=subtitle]]
+[[!template text="of all the paragraphs, whatever." start="00:09:03.480" video="mainVideo" id=subtitle]]
+[[!template text="And then there is a nice issue on" start="00:09:06.120" video="mainVideo" id=subtitle]]
+[[!template text="my issue-tracker for moldable Emacs" start="00:09:08.120" video="mainVideo" id=subtitle]]
+[[!template text="is about: &quot;Emacs: tell me how can I" start="00:09:10.880" video="mainVideo" id=subtitle]]
+[[!template text="compose the molds that I have" start="00:09:13.920" video="mainVideo" id=subtitle]]
+[[!template text="to make new things?&quot;" start="00:09:15.080" video="mainVideo" id=subtitle]]
+[[!template text="It is a sort of a research-y thing" start="00:09:17.480" video="mainVideo" id=subtitle]]
+[[!template text="that is pretty cool." start="00:09:19.400" video="mainVideo" id=subtitle]]
+[[!template text="So if you want to learn more," start="00:09:20.680" video="mainVideo" id=subtitle]]
+[[!template text="just check out at ag91.github.io," start="00:09:22.400" video="mainVideo" id=subtitle]]
+[[!template text="check out moldable Emacs on GitHub," start="00:09:25.520" video="mainVideo" id=subtitle]]
+[[!template text="and enjoy the rest of the conference." start="00:09:28.000" video="mainVideo" id=subtitle]]
+[[!template text="Bye." start="00:09:30.840" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/molecular.md b/2021/captions/molecular.md
new file mode 100644
index 00000000..739d561f
--- /dev/null
+++ b/2021/captions/molecular.md
@@ -0,0 +1,212 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi, I'm Blaine Mooers." start="00:00:00.880" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to be talking about" start="00:00:02.446" video="mainVideo" id=subtitle]]
+[[!template text="the use of molecular graphics in Org" start="00:00:04.160" video="mainVideo" id=subtitle]]
+[[!template text="for the purpose of doing" start="00:00:07.919" video="mainVideo" id=subtitle]]
+[[!template text="reproducible research in structural biology." start="00:00:08.880" video="mainVideo" id=subtitle]]
+[[!template text="I'm an associate professor of biochemistry" start="00:00:11.840" video="mainVideo" id=subtitle]]
+[[!template text="and microbiology at the University of Oklahoma" start="00:00:13.722" video="mainVideo" id=subtitle]]
+[[!template text="Health Sciences Center in Oklahoma City." start="00:00:15.768" video="mainVideo" id=subtitle]]
+[[!template text="My laboratory uses X-ray crystallography" start="00:00:17.760" video="mainVideo" id=subtitle]]
+[[!template text="to determine the atomic structures" start="00:00:19.600" video="mainVideo" id=subtitle]]
+[[!template text="of proteins like this one" start="00:00:21.920" video="mainVideo" id=subtitle]]
+[[!template text="in the lower left, and of nucleic acids" start="00:00:23.439" video="mainVideo" id=subtitle]]
+[[!template text="important in human health." start="00:00:26.080" video="mainVideo" id=subtitle]]
+[[!template text="This is a crystal of an RNA," start="00:00:27.840" video="mainVideo" id=subtitle]]
+[[!template text="which we have placed in this" start="00:00:29.591" video="mainVideo" id=subtitle]]
+[[!template text="X-ray diffraction instrument." start="00:00:31.359" video="mainVideo" id=subtitle]]
+[[!template text="And after rotating the crystal" start="00:00:33.200" video="mainVideo" id=subtitle]]
+[[!template text="in the X-ray beam for two degrees," start="00:00:35.600" video="mainVideo" id=subtitle]]
+[[!template text="we obtain this following diffraction pattern," start="00:00:38.000" video="mainVideo" id=subtitle]]
+[[!template text="which has thousands of spots on it." start="00:00:40.480" video="mainVideo" id=subtitle]]
+[[!template text="We rotate the crystal for over 180 degrees," start="00:00:43.280" video="mainVideo" id=subtitle]]
+[[!template text="collecting 90 images to obtain all the data." start="00:00:47.840" video="mainVideo" id=subtitle]]
+[[!template text="We then process those images" start="00:00:51.760" video="mainVideo" id=subtitle]]
+[[!template text="and do an inverse Fourier transform" start="00:00:56.000" video="mainVideo" id=subtitle]]
+[[!template text="to obtain the electron density." start="00:00:57.752" video="mainVideo" id=subtitle]]
+[[!template text="This electron density map has been" start="00:00:59.920" video="mainVideo" id=subtitle]]
+[[!template text="contoured at the one-sigma level." start="00:01:01.888" video="mainVideo" id=subtitle]]
+[[!template text="That level's being shown by" start="00:01:04.344" video="mainVideo" id=subtitle]]
+[[!template text="this blue chicken wire mesh." start="00:01:06.116" video="mainVideo" id=subtitle]]
+[[!template text="Atomic models have been fitted" start="00:01:08.640" video="mainVideo" id=subtitle]]
+[[!template text="to this chicken wire." start="00:01:10.152" video="mainVideo" id=subtitle]]
+[[!template text="These lines represent bonds between atoms," start="00:01:11.119" video="mainVideo" id=subtitle]]
+[[!template text="atoms are being represented by points." start="00:01:14.240" video="mainVideo" id=subtitle]]
+[[!template text="And atoms are colored by atom type," start="00:01:16.240" video="mainVideo" id=subtitle]]
+[[!template text="red for oxygen, blue for nitrogen," start="00:01:18.640" video="mainVideo" id=subtitle]]
+[[!template text="and then in this case," start="00:01:21.280" video="mainVideo" id=subtitle]]
+[[!template text="carbon is colored cyan." start="00:01:23.040" video="mainVideo" id=subtitle]]
+[[!template text="We have fitted a drug molecule" start="00:01:24.720" video="mainVideo" id=subtitle]]
+[[!template text="to the central blob of electron density" start="00:01:27.203" video="mainVideo" id=subtitle]]
+[[!template text="which corresponds to that active site" start="00:01:29.360" video="mainVideo" id=subtitle]]
+[[!template text="of this protein, which is RET Kinase." start="00:01:32.400" video="mainVideo" id=subtitle]]
+[[!template text="It's important in lung cancer." start="00:01:35.759" video="mainVideo" id=subtitle]]
+[[!template text="When we're finished with model building," start="00:01:37.439" video="mainVideo" id=subtitle]]
+[[!template text="we will then examine" start="00:01:40.079" video="mainVideo" id=subtitle]]
+[[!template text="the result of the final structure" start="00:01:41.339" video="mainVideo" id=subtitle]]
+[[!template text="to prepare images for publication" start="00:01:43.006" video="mainVideo" id=subtitle]]
+[[!template text="using molecular graphics program." start="00:01:45.200" video="mainVideo" id=subtitle]]
+[[!template text="In this case," start="00:01:47.439" video="mainVideo" id=subtitle]]
+[[!template text="we've overlaid a number of structures," start="00:01:48.108" video="mainVideo" id=subtitle]]
+[[!template text="and we're examining the distance between" start="00:01:50.000" video="mainVideo" id=subtitle]]
+[[!template text="the side chain of an alanine" start="00:01:53.600" video="mainVideo" id=subtitle]]
+[[!template text="and one or two drug molecules." start="00:01:55.680" video="mainVideo" id=subtitle]]
+[[!template text="This alanine sidechain actually blocks" start="00:01:58.880" video="mainVideo" id=subtitle]]
+[[!template text="the binding of one of these drugs." start="00:02:00.719" video="mainVideo" id=subtitle]]
+[[!template text="The most popular program" start="00:02:02.159" video="mainVideo" id=subtitle]]
+[[!template text="for doing this kind of analysis" start="00:02:03.439" video="mainVideo" id=subtitle]]
+[[!template text="and for preparing images" start="00:02:06.320" video="mainVideo" id=subtitle]]
+[[!template text="for publication is PyMOL." start="00:02:07.280" video="mainVideo" id=subtitle]]
+[[!template text="PyMOL was used to prepare these images" start="00:02:09.520" video="mainVideo" id=subtitle]]
+[[!template text="on the covers of these featured journals." start="00:02:11.440" video="mainVideo" id=subtitle]]
+[[!template text="PyMOL is favored because" start="00:02:14.720" video="mainVideo" id=subtitle]]
+[[!template text="it has 500 commands" start="00:02:17.520" video="mainVideo" id=subtitle]]
+[[!template text="and 600 parameter settings" start="00:02:19.520" video="mainVideo" id=subtitle]]
+[[!template text="that provide exquisite control" start="00:02:22.128" video="mainVideo" id=subtitle]]
+[[!template text="over the appearance of the output." start="00:02:23.360" video="mainVideo" id=subtitle]]
+[[!template text="PyMOL has over 100,000 users," start="00:02:24.959" video="mainVideo" id=subtitle]]
+[[!template text="reflecting its popularity." start="00:02:28.480" video="mainVideo" id=subtitle]]
+[[!template text="This is the GUI for PyMOL." start="00:02:30.000" video="mainVideo" id=subtitle]]
+[[!template text="It shows in white the viewport area" start="00:02:31.599" video="mainVideo" id=subtitle]]
+[[!template text="where one interacts" start="00:02:35.120" video="mainVideo" id=subtitle]]
+[[!template text="with the loaded molecular object." start="00:02:36.080" video="mainVideo" id=subtitle]]
+[[!template text="We have rendered the same RET kinase" start="00:02:37.840" video="mainVideo" id=subtitle]]
+[[!template text="with a set of preset parameters" start="00:02:41.920" video="mainVideo" id=subtitle]]
+[[!template text="that have been named &quot;publication&quot;." start="00:02:49.788" video="mainVideo" id=subtitle]]
+[[!template text="The other way of applying" start="00:02:51.200" video="mainVideo" id=subtitle]]
+[[!template text="parameter settings and commands" start="00:02:52.720" video="mainVideo" id=subtitle]]
+[[!template text="is to enter them at the PyMOL prompt." start="00:02:54.319" video="mainVideo" id=subtitle]]
+[[!template text="Then the third way is to load and run scripts." start="00:02:56.720" video="mainVideo" id=subtitle]]
+[[!template text="PyMOL is actually written in C for speed," start="00:03:00.159" video="mainVideo" id=subtitle]]
+[[!template text="but it is wrapped in Python for extensibility." start="00:03:03.120" video="mainVideo" id=subtitle]]
+[[!template text="In fact, there are over 100 articles" start="00:03:06.159" video="mainVideo" id=subtitle]]
+[[!template text="about various plugins and scripts" start="00:03:09.680" video="mainVideo" id=subtitle]]
+[[!template text="that people have developed" start="00:03:11.599" video="mainVideo" id=subtitle]]
+[[!template text="to extend PyMOL for years." start="00:03:12.400" video="mainVideo" id=subtitle]]
+[[!template text="Here's some examples" start="00:03:15.120" video="mainVideo" id=subtitle]]
+[[!template text="from the snippet library that I developed." start="00:03:16.480" video="mainVideo" id=subtitle]]
+[[!template text="On the left is a default" start="00:03:18.959" video="mainVideo" id=subtitle]]
+[[!template text="cartoon representation of a RNA hairpin." start="00:03:21.280" video="mainVideo" id=subtitle]]
+[[!template text="I find this reduced representation" start="00:03:24.640" video="mainVideo" id=subtitle]]
+[[!template text="of the RNA hairpin to be too stark." start="00:03:27.040" video="mainVideo" id=subtitle]]
+[[!template text="I prefer these alternate ones" start="00:03:30.799" video="mainVideo" id=subtitle]]
+[[!template text="that I developed." start="00:03:32.319" video="mainVideo" id=subtitle]]
+[[!template text="So, these three to the right of this one" start="00:03:33.840" video="mainVideo" id=subtitle]]
+[[!template text="are not available through" start="00:03:37.519" video="mainVideo" id=subtitle]]
+[[!template text="pull downs in PyMOL." start="00:03:39.519" video="mainVideo" id=subtitle]]
+[[!template text="So why developed a PyMOL" start="00:03:40.720" video="mainVideo" id=subtitle]]
+[[!template text="snippet library for Org?" start="00:03:42.748" video="mainVideo" id=subtitle]]
+[[!template text="Well, Org provides great support" start="00:03:44.879" video="mainVideo" id=subtitle]]
+[[!template text="for literate programming," start="00:03:47.040" video="mainVideo" id=subtitle]]
+[[!template text="where you have code blocks" start="00:03:48.560" video="mainVideo" id=subtitle]]
+[[!template text="that contain code that's executable," start="00:03:49.840" video="mainVideo" id=subtitle]]
+[[!template text="and the output is shown" start="00:03:52.000" video="mainVideo" id=subtitle]]
+[[!template text="below that code block." start="00:03:53.040" video="mainVideo" id=subtitle]]
+[[!template text="And then you can fill" start="00:03:54.959" video="mainVideo" id=subtitle]]
+[[!template text="the surrounding area in the document" start="00:03:56.720" video="mainVideo" id=subtitle]]
+[[!template text="with the explanatory prose." start="00:03:58.959" video="mainVideo" id=subtitle]]
+[[!template text="Org has great support" start="00:04:00.799" video="mainVideo" id=subtitle]]
+[[!template text="for editing that explanatory prose." start="00:04:02.000" video="mainVideo" id=subtitle]]
+[[!template text="Org can run PyMOL through PyMOL's Python API." start="00:04:04.480" video="mainVideo" id=subtitle]]
+[[!template text="One of the uses of such an Org document" start="00:04:08.080" video="mainVideo" id=subtitle]]
+[[!template text="is to assemble a gallery of draft images." start="00:04:11.280" video="mainVideo" id=subtitle]]
+[[!template text="We often have to look at" start="00:04:14.487" video="mainVideo" id=subtitle]]
+[[!template text="dozens of candidate images" start="00:04:16.563" video="mainVideo" id=subtitle]]
+[[!template text="with the molecule in different orientations," start="00:04:19.840" video="mainVideo" id=subtitle]]
+[[!template text="different zoom settings," start="00:04:22.000" video="mainVideo" id=subtitle]]
+[[!template text="different representations," start="00:04:23.520" video="mainVideo" id=subtitle]]
+[[!template text="different colors, and so on." start="00:04:25.032" video="mainVideo" id=subtitle]]
+[[!template text="And to have those images along with…," start="00:04:27.280" video="mainVideo" id=subtitle]]
+[[!template text="adjacent to the code" start="00:04:30.639" video="mainVideo" id=subtitle]]
+[[!template text="that was used to generate them," start="00:04:31.840" video="mainVideo" id=subtitle]]
+[[!template text="can be very effective for" start="00:04:33.680" video="mainVideo" id=subtitle]]
+[[!template text="further editing the code" start="00:04:37.199" video="mainVideo" id=subtitle]]
+[[!template text="and improving the images." start="00:04:39.680" video="mainVideo" id=subtitle]]
+[[!template text="Once the final images have been selected," start="00:04:40.880" video="mainVideo" id=subtitle]]
+[[!template text="one can submit the code" start="00:04:44.080" video="mainVideo" id=subtitle]]
+[[!template text="as part of the supplemental material." start="00:04:46.320" video="mainVideo" id=subtitle]]
+[[!template text="Finally, one can use the journal package" start="00:04:48.479" video="mainVideo" id=subtitle]]
+[[!template text="to use the Org files as" start="00:04:52.400" video="mainVideo" id=subtitle]]
+[[!template text="an electronic laboratory notebook," start="00:04:54.608" video="mainVideo" id=subtitle]]
+[[!template text="which is illustrated with molecular images." start="00:04:57.120" video="mainVideo" id=subtitle]]
+[[!template text="This can be very useful" start="00:04:59.600" video="mainVideo" id=subtitle]]
+[[!template text="when assembling manuscripts" start="00:05:01.039" video="mainVideo" id=subtitle]]
+[[!template text="months or years later." start="00:05:04.080" video="mainVideo" id=subtitle]]
+[[!template text="This shows the YASnippet pull down" start="00:05:05.440" video="mainVideo" id=subtitle]]
+[[!template text="after my library has been installed." start="00:05:08.320" video="mainVideo" id=subtitle]]
+[[!template text="I have an Org file open," start="00:05:12.720" video="mainVideo" id=subtitle]]
+[[!template text="so I'm in Org mode." start="00:05:15.360" video="mainVideo" id=subtitle]]
+[[!template text="We have the Org mode submenu," start="00:05:17.120" video="mainVideo" id=subtitle]]
+[[!template text="and under it, all my snippets" start="00:05:20.880" video="mainVideo" id=subtitle]]
+[[!template text="are located in these sub-sub-menus" start="00:05:23.919" video="mainVideo" id=subtitle]]
+[[!template text="that are prepended with pymolpy." start="00:05:26.880" video="mainVideo" id=subtitle]]
+[[!template text="Under the molecular representations menu," start="00:05:30.880" video="mainVideo" id=subtitle]]
+[[!template text="there is a listing of snippets." start="00:05:33.840" video="mainVideo" id=subtitle]]
+[[!template text="The top one is for the ambient occlusion effect," start="00:05:36.479" video="mainVideo" id=subtitle]]
+[[!template text="which we're going to apply" start="00:05:38.563" video="mainVideo" id=subtitle]]
+[[!template text="in this Org file." start="00:05:39.840" video="mainVideo" id=subtitle]]
+[[!template text="So these lines of code were inserted after," start="00:05:41.039" video="mainVideo" id=subtitle]]
+[[!template text="as well as these flanking lines" start="00:05:44.240" video="mainVideo" id=subtitle]]
+[[!template text="that define the source block," start="00:05:48.479" video="mainVideo" id=subtitle]]
+[[!template text="were inserted by clicking on that line." start="00:05:50.240" video="mainVideo" id=subtitle]]
+[[!template text="Then I've added some additional code." start="00:05:53.280" video="mainVideo" id=subtitle]]
+[[!template text="So, the first line defines" start="00:05:55.120" video="mainVideo" id=subtitle]]
+[[!template text="the language that we're using." start="00:05:56.880" video="mainVideo" id=subtitle]]
+[[!template text="We're going to use" start="00:05:59.039" video="mainVideo" id=subtitle]]
+[[!template text="the jupyter-python language." start="00:05:59.768" video="mainVideo" id=subtitle]]
+[[!template text="Then you can define the session," start="00:06:02.639" video="mainVideo" id=subtitle]]
+[[!template text="and the name of this is arbitrary." start="00:06:04.560" video="mainVideo" id=subtitle]]
+[[!template text="Then the kernel is our means" start="00:06:06.400" video="mainVideo" id=subtitle]]
+[[!template text="by which we gain access" start="00:06:09.680" video="mainVideo" id=subtitle]]
+[[!template text="to the Python API of PyMOL." start="00:06:11.360" video="mainVideo" id=subtitle]]
+[[!template text="The remaining settings apply to the output." start="00:06:14.880" video="mainVideo" id=subtitle]]
+[[!template text="To execute this code" start="00:06:17.039" video="mainVideo" id=subtitle]]
+[[!template text="and to get the resulting image," start="00:06:18.319" video="mainVideo" id=subtitle]]
+[[!template text="you put the cursor inside this code block," start="00:06:21.199" video="mainVideo" id=subtitle]]
+[[!template text="or on the top line," start="00:06:25.120" video="mainVideo" id=subtitle]]
+[[!template text="and enter Control c Control c (C-c C-c)." start="00:06:26.560" video="mainVideo" id=subtitle]]
+[[!template text="This shows the resulting image" start="00:06:29.840" video="mainVideo" id=subtitle]]
+[[!template text="has been loaded up." start="00:06:32.240" video="mainVideo" id=subtitle]]
+[[!template text="It takes about 10 seconds for this to appear." start="00:06:33.600" video="mainVideo" id=subtitle]]
+[[!template text="So the downside of this is" start="00:06:37.280" video="mainVideo" id=subtitle]]
+[[!template text="if you have a large number of these," start="00:06:38.479" video="mainVideo" id=subtitle]]
+[[!template text="the Org file can lag quite a bit" start="00:06:40.729" video="mainVideo" id=subtitle]]
+[[!template text="when you try to scroll through it," start="00:06:43.919" video="mainVideo" id=subtitle]]
+[[!template text="so you need to close up these result drawers," start="00:06:45.120" video="mainVideo" id=subtitle]]
+[[!template text="and only open up the ones" start="00:06:48.319" video="mainVideo" id=subtitle]]
+[[!template text="that you're currently examining." start="00:06:50.960" video="mainVideo" id=subtitle]]
+[[!template text="These are features I think" start="00:06:53.199" video="mainVideo" id=subtitle]]
+[[!template text="are important in practical work." start="00:06:54.319" video="mainVideo" id=subtitle]]
+[[!template text="So, the plus is, a feature that's present," start="00:06:56.240" video="mainVideo" id=subtitle]]
+[[!template text="minus is absent." start="00:06:59.840" video="mainVideo" id=subtitle]]
+[[!template text="I think tab stops and tab triggers" start="00:07:01.120" video="mainVideo" id=subtitle]]
+[[!template text="are really important." start="00:07:03.199" video="mainVideo" id=subtitle]]
+[[!template text="Triggers are important for" start="00:07:04.800" video="mainVideo" id=subtitle]]
+[[!template text="the fast assertion code," start="00:07:05.680" video="mainVideo" id=subtitle]]
+[[!template text="tab stops are important for" start="00:07:06.720" video="mainVideo" id=subtitle]]
+[[!template text="complete, accurate editing of code." start="00:07:08.639" video="mainVideo" id=subtitle]]
+[[!template text="I already addressed the rendering speed" start="00:07:10.560" video="mainVideo" id=subtitle]]
+[[!template text="and scrolling issue." start="00:07:12.735" video="mainVideo" id=subtitle]]
+[[!template text="I think the way around this" start="00:07:14.560" video="mainVideo" id=subtitle]]
+[[!template text="is just to export the Org document to a PDF file" start="00:07:15.759" video="mainVideo" id=subtitle]]
+[[!template text="and do your evaluation of different images" start="00:07:19.199" video="mainVideo" id=subtitle]]
+[[!template text="by examining them in the PDF" start="00:07:23.360" video="mainVideo" id=subtitle]]
+[[!template text="rather than the Org file." start="00:07:25.199" video="mainVideo" id=subtitle]]
+[[!template text="The path to PDF is lightning fast in Emacs" start="00:07:26.560" video="mainVideo" id=subtitle]]
+[[!template text="compared to Jupyter," start="00:07:30.400" video="mainVideo" id=subtitle]]
+[[!template text="where it's cumbersome in comparison." start="00:07:32.240" video="mainVideo" id=subtitle]]
+[[!template text="This is a snapshot of my initialization file." start="00:07:35.280" video="mainVideo" id=subtitle]]
+[[!template text="These parts are relevant to doing this work." start="00:07:38.400" video="mainVideo" id=subtitle]]
+[[!template text="A full description of them" start="00:07:41.840" video="mainVideo" id=subtitle]]
+[[!template text="can be found in the README file" start="00:07:43.039" video="mainVideo" id=subtitle]]
+[[!template text="of this repository on GitHub." start="00:07:46.319" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to thank the" start="00:07:48.639" video="mainVideo" id=subtitle]]
+[[!template text="Nathan Shock Data Science Workshop" start="00:07:49.456" video="mainVideo" id=subtitle]]
+[[!template text="for feedback during presentations" start="00:07:51.840" video="mainVideo" id=subtitle]]
+[[!template text="I've made about this work." start="00:07:54.319" video="mainVideo" id=subtitle]]
+[[!template text="And I would also like to thank" start="00:07:56.160" video="mainVideo" id=subtitle]]
+[[!template text="the following funding sources for support." start="00:07:57.628" video="mainVideo" id=subtitle]]
+[[!template text="I will now take questions. Thank you." start="00:08:00.240" video="mainVideo" id=subtitle]]
+[[!template text="captions by Blaine Mooers and Bhavin Gandhi" start="00:08:03.879" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/montessori.md b/2021/captions/montessori.md
new file mode 100644
index 00000000..3fc9564f
--- /dev/null
+++ b/2021/captions/montessori.md
@@ -0,0 +1,277 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hello everyone. My name is Grant Shangreaux," start="00:00:04.960" video="mainVideo" id=subtitle]]
+[[!template text="and I'm happy to be back here at EmacsConf." start="00:00:07.680" video="mainVideo" id=subtitle]]
+[[!template text="So before I was a programmer professionally," start="00:00:10.719" video="mainVideo" id=subtitle]]
+[[!template text="I was a Montessori guide with young children," start="00:00:13.840" video="mainVideo" id=subtitle]]
+[[!template text="and now I'm a parent of a child" start="00:00:16.800" video="mainVideo" id=subtitle]]
+[[!template text="in a Montessori classroom." start="00:00:18.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I was thinking Emacs" start="00:00:20.320" video="mainVideo" id=subtitle]]
+[[!template text="and Montessori philosophy" start="00:00:21.600" video="mainVideo" id=subtitle]]
+[[!template text="are both fundamentally about respect." start="00:00:22.960" video="mainVideo" id=subtitle]]
+[[!template text="Respect children, for the child" start="00:00:25.760" video="mainVideo" id=subtitle]]
+[[!template text="is the parent to the adult." start="00:00:27.840" video="mainVideo" id=subtitle]]
+[[!template text="And we should respect users." start="00:00:29.760" video="mainVideo" id=subtitle]]
+[[!template text="Maybe the user is the parent" start="00:00:32.079" video="mainVideo" id=subtitle]]
+[[!template text="to the hacker. That was certainly my case." start="00:00:33.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So this talk is about the similarities" start="00:00:35.840" video="mainVideo" id=subtitle]]
+[[!template text="between the Emacs environment" start="00:00:37.680" video="mainVideo" id=subtitle]]
+[[!template text="and the Montessori classroom," start="00:00:39.440" video="mainVideo" id=subtitle]]
+[[!template text="which is called a prepared environment," start="00:00:41.040" video="mainVideo" id=subtitle]]
+[[!template text="meaning that everything in the environment" start="00:00:43.760" video="mainVideo" id=subtitle]]
+[[!template text="has been prepared for the child to come" start="00:00:45.760" video="mainVideo" id=subtitle]]
+[[!template text="and interact with in a meaningful way." start="00:00:48.559" video="mainVideo" id=subtitle]]
+[[!template text="The child will be driven" start="00:00:51.120" video="mainVideo" id=subtitle]]
+[[!template text="by natural human tendencies" start="00:00:52.399" video="mainVideo" id=subtitle]]
+[[!template text="to interact with their environment" start="00:00:54.399" video="mainVideo" id=subtitle]]
+[[!template text="and to construct and refine" start="00:00:56.399" video="mainVideo" id=subtitle]]
+[[!template text="their understanding of the world" start="00:00:58.079" video="mainVideo" id=subtitle]]
+[[!template text="and the things in it." start="00:00:59.920" video="mainVideo" id=subtitle]]
+[[!template text="What I hope you come away from this talk with" start="00:01:01.359" video="mainVideo" id=subtitle]]
+[[!template text="is just a new perspective" start="00:01:03.600" video="mainVideo" id=subtitle]]
+[[!template text="on Emacs and software," start="00:01:06.080" video="mainVideo" id=subtitle]]
+[[!template text="and how users interact" start="00:01:08.479" video="mainVideo" id=subtitle]]
+[[!template text="in a prepared environment like Emacs" start="00:01:10.240" video="mainVideo" id=subtitle]]
+[[!template text="following their human tendencies" start="00:01:13.520" video="mainVideo" id=subtitle]]
+[[!template text="to gain understanding" start="00:01:15.280" video="mainVideo" id=subtitle]]
+[[!template text="and reach toward perfection." start="00:01:17.200" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay. So the human tendencies" start="00:01:19.119" video="mainVideo" id=subtitle]]
+[[!template text="are innate drives present in everybody." start="00:01:21.040" video="mainVideo" id=subtitle]]
+[[!template text="They're what enable us to explore" start="00:01:24.000" video="mainVideo" id=subtitle]]
+[[!template text="and make sense of our world." start="00:01:25.600" video="mainVideo" id=subtitle]]
+[[!template text="We use these human tendencies" start="00:01:27.520" video="mainVideo" id=subtitle]]
+[[!template text="to construct and refine the world itself." start="00:01:29.360" video="mainVideo" id=subtitle]]
+[[!template text="You know, if you're an Emacs user," start="00:01:32.960" video="mainVideo" id=subtitle]]
+[[!template text="I hope that's ringing some bells for you" start="00:01:34.240" video="mainVideo" id=subtitle]]
+[[!template text="right away, because what we do" start="00:01:35.920" video="mainVideo" id=subtitle]]
+[[!template text="when we interact with Emacs as individuals" start="00:01:38.320" video="mainVideo" id=subtitle]]
+[[!template text="is construct and refine our world in Emacs." start="00:01:40.960" video="mainVideo" id=subtitle]]
+[[!template text="So I'm going to go through" start="00:01:45.360" video="mainVideo" id=subtitle]]
+[[!template text="the human tendencies one by one" start="00:01:46.320" video="mainVideo" id=subtitle]]
+[[!template text="and bring up things" start="00:01:47.920" video="mainVideo" id=subtitle]]
+[[!template text="that I have observed or noticed in Emacs." start="00:01:48.960" video="mainVideo" id=subtitle]]
+[[!template text="I'm sure there's plenty more." start="00:01:52.079" video="mainVideo" id=subtitle]]
+[[!template text="Feel free to share it in chat." start="00:01:53.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So number one is orientation." start="00:01:56.560" video="mainVideo" id=subtitle]]
+[[!template text="Human beings want to know their relationship" start="00:02:00.000" video="mainVideo" id=subtitle]]
+[[!template text="to the environment around them." start="00:02:02.000" video="mainVideo" id=subtitle]]
+[[!template text="With children, when they come into" start="00:02:04.320" video="mainVideo" id=subtitle]]
+[[!template text="a new environment, they want to look at it," start="00:02:05.840" video="mainVideo" id=subtitle]]
+[[!template text="touch everything around them." start="00:02:07.520" video="mainVideo" id=subtitle]]
+[[!template text="They want to know where they fit in," start="00:02:09.360" video="mainVideo" id=subtitle]]
+[[!template text="things like that." start="00:02:11.520" video="mainVideo" id=subtitle]]
+[[!template text="In Emacs, the easiest thing to think of" start="00:02:12.800" video="mainVideo" id=subtitle]]
+[[!template text="is the initial new Emacs buffer." start="00:02:15.599" video="mainVideo" id=subtitle]]
+[[!template text="Right away, that is giving you" start="00:02:18.560" video="mainVideo" id=subtitle]]
+[[!template text="some guideposts to orient yourself." start="00:02:21.040" video="mainVideo" id=subtitle]]
+[[!template text="If you've used any of the other" start="00:02:23.440" video="mainVideo" id=subtitle]]
+[[!template text="Emacs starter packages, different packages" start="00:02:25.920" video="mainVideo" id=subtitle]]
+[[!template text="take different approaches to this." start="00:02:28.720" video="mainVideo" id=subtitle]]
+[[!template text="I think if you're trying to get people" start="00:02:30.239" video="mainVideo" id=subtitle]]
+[[!template text="to use Emacs for some reason," start="00:02:33.519" video="mainVideo" id=subtitle]]
+[[!template text="thinking about how individuals" start="00:02:36.080" video="mainVideo" id=subtitle]]
+[[!template text="might orient themselves" start="00:02:39.440" video="mainVideo" id=subtitle]]
+[[!template text="to this new software world is important." start="00:02:40.720" video="mainVideo" id=subtitle]]
+[[!template text="I think that there are friendly ways" start="00:02:43.680" video="mainVideo" id=subtitle]]
+[[!template text="to welcome people into the environment" start="00:02:46.000" video="mainVideo" id=subtitle]]
+[[!template text="and to make it easier for people" start="00:02:48.080" video="mainVideo" id=subtitle]]
+[[!template text="to orient themselves within Emacs." start="00:02:50.879" video="mainVideo" id=subtitle]]
+[[!template text="Of course we've also got the Info manuals," start="00:02:53.120" video="mainVideo" id=subtitle]]
+[[!template text="and one of my favorite examples" start="00:02:56.080" video="mainVideo" id=subtitle]]
+[[!template text="is the which-key package, which," start="00:02:57.760" video="mainVideo" id=subtitle]]
+[[!template text="when you press a key," start="00:03:00.080" video="mainVideo" id=subtitle]]
+[[!template text="it'll pop up with all of the following" start="00:03:01.519" video="mainVideo" id=subtitle]]
+[[!template text="key bindings that are available." start="00:03:04.000" video="mainVideo" id=subtitle]]
+[[!template text="That's a really important way for me" start="00:03:05.760" video="mainVideo" id=subtitle]]
+[[!template text="to explore, which is another human tendency," start="00:03:09.280" video="mainVideo" id=subtitle]]
+[[!template text="or to orient myself;" start="00:03:13.599" video="mainVideo" id=subtitle]]
+[[!template text="to think about when I press this key," start="00:03:15.280" video="mainVideo" id=subtitle]]
+[[!template text="now I've got these possibilities." start="00:03:17.599" video="mainVideo" id=subtitle]]
+[[!template text="You see that all over in Emacs" start="00:03:19.920" video="mainVideo" id=subtitle]]
+[[!template text="with hydras or the Magit transient buffers." start="00:03:21.760" video="mainVideo" id=subtitle]]
+[[!template text="There's all sorts of ways" start="00:03:25.920" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is trying to help us" start="00:03:27.280" video="mainVideo" id=subtitle]]
+[[!template text="orient ourselves." start="00:03:29.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The second tendency is order, which" start="00:03:30.720" video="mainVideo" id=subtitle]]
+[[!template text="I probably should have talked about first," start="00:03:33.440" video="mainVideo" id=subtitle]]
+[[!template text="but here I am. I myself am not" start="00:03:35.120" video="mainVideo" id=subtitle]]
+[[!template text="particularly attuned to order," start="00:03:38.480" video="mainVideo" id=subtitle]]
+[[!template text="but when I was in the Montessori classroom," start="00:03:40.799" video="mainVideo" id=subtitle]]
+[[!template text="I found that it wasn't necessarily myself" start="00:03:43.120" video="mainVideo" id=subtitle]]
+[[!template text="imposing the order, it was..." start="00:03:45.920" video="mainVideo" id=subtitle]]
+[[!template text="The environment itself" start="00:03:47.360" video="mainVideo" id=subtitle]]
+[[!template text="has a certain order to it," start="00:03:48.480" video="mainVideo" id=subtitle]]
+[[!template text="and by creating an environment" start="00:03:50.239" video="mainVideo" id=subtitle]]
+[[!template text="where everything has its place," start="00:03:52.080" video="mainVideo" id=subtitle]]
+[[!template text="and everything has its time," start="00:03:54.239" video="mainVideo" id=subtitle]]
+[[!template text="and you have a way of doing things," start="00:03:56.480" video="mainVideo" id=subtitle]]
+[[!template text="it makes it easier for the child" start="00:03:59.840" video="mainVideo" id=subtitle]]
+[[!template text="to develop that internal sense of order" start="00:04:02.480" video="mainVideo" id=subtitle]]
+[[!template text="and succeed at imposing order" start="00:04:04.560" video="mainVideo" id=subtitle]]
+[[!template text="upon their work, which..." start="00:04:07.120" video="mainVideo" id=subtitle]]
+[[!template text="We do that as programmers." start="00:04:09.360" video="mainVideo" id=subtitle]]
+[[!template text="If we're contributing to Emacs," start="00:04:11.360" video="mainVideo" id=subtitle]]
+[[!template text="we try to do so in an orderly way," start="00:04:13.280" video="mainVideo" id=subtitle]]
+[[!template text="use prefixes for namespacing," start="00:04:16.079" video="mainVideo" id=subtitle]]
+[[!template text="since we don't have that ability" start="00:04:18.160" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs Lisp," start="00:04:19.919" video="mainVideo" id=subtitle]]
+[[!template text="and by sharing well-ordered" start="00:04:20.959" video="mainVideo" id=subtitle]]
+[[!template text="self-documenting programs with our community." start="00:04:22.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Number three is exploration. I think" start="00:04:26.000" video="mainVideo" id=subtitle]]
+[[!template text="exploration is what drew me into Emacs," start="00:04:28.560" video="mainVideo" id=subtitle]]
+[[!template text="personally. In the beginning," start="00:04:30.720" video="mainVideo" id=subtitle]]
+[[!template text="it was just this wondrous" start="00:04:32.400" video="mainVideo" id=subtitle]]
+[[!template text="software environment" start="00:04:35.759" video="mainVideo" id=subtitle]]
+[[!template text="that offered so many opportunities." start="00:04:36.800" video="mainVideo" id=subtitle]]
+[[!template text="I was curious. Like, you've got" start="00:04:39.360" video="mainVideo" id=subtitle]]
+[[!template text="your scratch buffer." start="00:04:41.680" video="mainVideo" id=subtitle]]
+[[!template text="You can explore in there with expressions." start="00:04:42.880" video="mainVideo" id=subtitle]]
+[[!template text="You can start up IELM." start="00:04:45.040" video="mainVideo" id=subtitle]]
+[[!template text="You can explore your file system with Dired." start="00:04:46.880" video="mainVideo" id=subtitle]]
+[[!template text="You can explore different packages" start="00:04:49.440" video="mainVideo" id=subtitle]]
+[[!template text="with list-packages. There's so many ways" start="00:04:51.199" video="mainVideo" id=subtitle]]
+[[!template text="you can explore in Emacs." start="00:04:54.560" video="mainVideo" id=subtitle]]
+[[!template text="For me, that was very delightful." start="00:04:56.880" video="mainVideo" id=subtitle]]
+[[!template text="It really resonated with my bias" start="00:04:59.040" video="mainVideo" id=subtitle]]
+[[!template text="of exploration and human tendencies." start="00:05:01.919" video="mainVideo" id=subtitle]]
+[[!template text="Places to explore in Emacs are wonderful," start="00:05:04.960" video="mainVideo" id=subtitle]]
+[[!template text="and eventually you get down" start="00:05:07.280" video="mainVideo" id=subtitle]]
+[[!template text="into the source code, and it's great." start="00:05:08.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And then we've got communication." start="00:05:12.080" video="mainVideo" id=subtitle]]
+[[!template text="I think communication kind of" start="00:05:14.400" video="mainVideo" id=subtitle]]
+[[!template text="speaks for itself as well." start="00:05:16.639" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is software." start="00:05:17.919" video="mainVideo" id=subtitle]]
+[[!template text="Software is a form of communication." start="00:05:19.520" video="mainVideo" id=subtitle]]
+[[!template text="We're all driven to communicate." start="00:05:22.080" video="mainVideo" id=subtitle]]
+[[!template text="That's why we're here at this conference." start="00:05:23.360" video="mainVideo" id=subtitle]]
+[[!template text="Within Emacs, you've got lots of ways" start="00:05:26.240" video="mainVideo" id=subtitle]]
+[[!template text="to communicate. You've got IRC clients," start="00:05:28.320" video="mainVideo" id=subtitle]]
+[[!template text="mail, you've got news readers." start="00:05:30.960" video="mainVideo" id=subtitle]]
+[[!template text="You could use Org." start="00:05:32.960" video="mainVideo" id=subtitle]]
+[[!template text="I even started working on a magazine in Org" start="00:05:34.080" video="mainVideo" id=subtitle]]
+[[!template text="that I was going to distribute" start="00:05:37.600" video="mainVideo" id=subtitle]]
+[[!template text="via live Debian CDs back in the day." start="00:05:38.800" video="mainVideo" id=subtitle]]
+[[!template text="So I think Emacs for communication" start="00:05:42.479" video="mainVideo" id=subtitle]]
+[[!template text="is pretty clear." start="00:05:45.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Activity. So Activities is just" start="00:05:46.160" video="mainVideo" id=subtitle]]
+[[!template text="a natural thing when you're..." start="00:05:48.639" video="mainVideo" id=subtitle]]
+[[!template text="You see it in children. Right?" start="00:05:51.120" video="mainVideo" id=subtitle]]
+[[!template text="Children always find something to do" start="00:05:52.479" video="mainVideo" id=subtitle]]
+[[!template text="to keep busy, whether they're pretending," start="00:05:54.720" video="mainVideo" id=subtitle]]
+[[!template text="or running around, or moving." start="00:05:57.120" video="mainVideo" id=subtitle]]
+[[!template text="You don't have to have a goal" start="00:05:59.039" video="mainVideo" id=subtitle]]
+[[!template text="or end-product in mind." start="00:06:00.240" video="mainVideo" id=subtitle]]
+[[!template text="People are just active." start="00:06:01.759" video="mainVideo" id=subtitle]]
+[[!template text="You do things. I find that in Emacs," start="00:06:02.800" video="mainVideo" id=subtitle]]
+[[!template text="all the time, when I don't know" start="00:06:06.160" video="mainVideo" id=subtitle]]
+[[!template text="what to work on, sometimes I just go" start="00:06:08.000" video="mainVideo" id=subtitle]]
+[[!template text="into Emacs and hack around and, like," start="00:06:09.919" video="mainVideo" id=subtitle]]
+[[!template text="change things in my config." start="00:06:12.479" video="mainVideo" id=subtitle]]
+[[!template text="I'm sure we've all been there." start="00:06:14.000" video="mainVideo" id=subtitle]]
+[[!template text="So Emacs encourages and enables" start="00:06:16.000" video="mainVideo" id=subtitle]]
+[[!template text="that kind of activity as well." start="00:06:19.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Manipulation is the next one." start="00:06:21.199" video="mainVideo" id=subtitle]]
+[[!template text="So Lisp. Anyone? The fact that Emacs is" start="00:06:23.120" video="mainVideo" id=subtitle]]
+[[!template text="this live Lisp process that's running," start="00:06:27.120" video="mainVideo" id=subtitle]]
+[[!template text="that you can manipulate at your fingertips..." start="00:06:29.919" video="mainVideo" id=subtitle]]
+[[!template text="You couldn't ask for something better." start="00:06:33.360" video="mainVideo" id=subtitle]]
+[[!template text="I think the malleability of Emacs" start="00:06:35.120" video="mainVideo" id=subtitle]]
+[[!template text="is why people love it." start="00:06:37.360" video="mainVideo" id=subtitle]]
+[[!template text="Clearly, the environment of Emacs" start="00:06:39.600" video="mainVideo" id=subtitle]]
+[[!template text="was prepared with manipulation in mind" start="00:06:41.840" video="mainVideo" id=subtitle]]
+[[!template text="from the very start." start="00:06:44.240" video="mainVideo" id=subtitle]]
+[[!template text="We'll go through these next ones" start="00:06:45.280" video="mainVideo" id=subtitle]]
+[[!template text="pretty quickly." start="00:06:46.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="We've got work or purposeful activity." start="00:06:48.319" video="mainVideo" id=subtitle]]
+[[!template text="Emacs would not exist" start="00:06:51.759" video="mainVideo" id=subtitle]]
+[[!template text="without this human tendency." start="00:06:53.039" video="mainVideo" id=subtitle]]
+[[!template text="it's been worked on" start="00:06:55.120" video="mainVideo" id=subtitle]]
+[[!template text="by free software volunteers" start="00:06:56.319" video="mainVideo" id=subtitle]]
+[[!template text="for 40 years, and this is the kind of" start="00:06:58.240" video="mainVideo" id=subtitle]]
+[[!template text="self-motivated work that inspired me" start="00:07:03.360" video="mainVideo" id=subtitle]]
+[[!template text="to be a hacker." start="00:07:06.000" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Repetition is another human tendency." start="00:07:09.199" video="mainVideo" id=subtitle]]
+[[!template text="I think that one kind of speaks for itself." start="00:07:11.919" video="mainVideo" id=subtitle]]
+[[!template text="It's this tendency that gave me" start="00:07:14.960" video="mainVideo" id=subtitle]]
+[[!template text="Emacs pinky after learning all of those" start="00:07:17.120" video="mainVideo" id=subtitle]]
+[[!template text="key bindings, and then that same tendency" start="00:07:19.919" video="mainVideo" id=subtitle]]
+[[!template text="drove me to learn another modal key mapping" start="00:07:23.360" video="mainVideo" id=subtitle]]
+[[!template text=" to deal with that. I've repeated myself," start="00:07:26.639" video="mainVideo" id=subtitle]]
+[[!template text="starting over new Emacs configs" start="00:07:29.759" video="mainVideo" id=subtitle]]
+[[!template text="several times. I could give another example," start="00:07:32.400" video="mainVideo" id=subtitle]]
+[[!template text="but I'll just be repeating myself" start="00:07:35.120" video="mainVideo" id=subtitle]]
+[[!template text="at this point." start="00:07:36.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And then exactness. So we have a tendency," start="00:07:38.960" video="mainVideo" id=subtitle]]
+[[!template text="a human tendency toward exactness." start="00:07:42.880" video="mainVideo" id=subtitle]]
+[[!template text="That's not one that's very strong for me." start="00:07:45.840" video="mainVideo" id=subtitle]]
+[[!template text="I'm not a super exacting person." start="00:07:48.160" video="mainVideo" id=subtitle]]
+[[!template text="But I think you can see that in Emacs," start="00:07:50.879" video="mainVideo" id=subtitle]]
+[[!template text="like certain parts of it" start="00:07:53.520" video="mainVideo" id=subtitle]]
+[[!template text="have been refined down to exactness." start="00:07:55.520" video="mainVideo" id=subtitle]]
+[[!template text="I know when I'm working," start="00:07:59.599" video="mainVideo" id=subtitle]]
+[[!template text="sometimes it's just the theme that I choose" start="00:08:01.759" video="mainVideo" id=subtitle]]
+[[!template text="or making sure the mode line" start="00:08:04.560" video="mainVideo" id=subtitle]]
+[[!template text="is exactly the way I want it..." start="00:08:06.319" video="mainVideo" id=subtitle]]
+[[!template text="You know, getting that environment" start="00:08:07.840" video="mainVideo" id=subtitle]]
+[[!template text="to feel conducive to thought and work" start="00:08:10.160" video="mainVideo" id=subtitle]]
+[[!template text="is important to me." start="00:08:14.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And then we have abstraction, which..." start="00:08:16.319" video="mainVideo" id=subtitle]]
+[[!template text="That one goes pretty deep," start="00:08:18.560" video="mainVideo" id=subtitle]]
+[[!template text="but I think you can see" start="00:08:19.680" video="mainVideo" id=subtitle]]
+[[!template text="how abstraction works in Emacs." start="00:08:21.840" video="mainVideo" id=subtitle]]
+[[!template text="A buffer is an abstraction." start="00:08:24.080" video="mainVideo" id=subtitle]]
+[[!template text="One of the great things about Emacs" start="00:08:26.080" video="mainVideo" id=subtitle]]
+[[!template text="and about Montessori philosophy" start="00:08:27.840" video="mainVideo" id=subtitle]]
+[[!template text="is that these abstractions" start="00:08:29.199" video="mainVideo" id=subtitle]]
+[[!template text="might not be something" start="00:08:32.080" video="mainVideo" id=subtitle]]
+[[!template text="you need to think about right away," start="00:08:33.200" video="mainVideo" id=subtitle]]
+[[!template text="but they're there, right," start="00:08:34.640" video="mainVideo" id=subtitle]]
+[[!template text="like the fact that a buffer abstracts" start="00:08:35.919" video="mainVideo" id=subtitle]]
+[[!template text="over working with text." start="00:08:39.200" video="mainVideo" id=subtitle]]
+[[!template text="Once that becomes clear to you," start="00:08:41.279" video="mainVideo" id=subtitle]]
+[[!template text="once you have a reason to manipulate it," start="00:08:43.519" video="mainVideo" id=subtitle]]
+[[!template text="having the abstraction of the buffer there" start="00:08:45.760" video="mainVideo" id=subtitle]]
+[[!template text="to work with makes a huge difference." start="00:08:48.320" video="mainVideo" id=subtitle]]
+[[!template text="And then of course," start="00:08:51.440" video="mainVideo" id=subtitle]]
+[[!template text="we can create our own abstractions:" start="00:08:52.160" video="mainVideo" id=subtitle]]
+[[!template text="transients, pop-up buffers, hydras..." start="00:08:54.560" video="mainVideo" id=subtitle]]
+[[!template text="I'm sure there's plenty of examples" start="00:08:57.519" video="mainVideo" id=subtitle]]
+[[!template text="in chat that I can't come up with." start="00:08:59.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And finally, perfection." start="00:09:02.000" video="mainVideo" id=subtitle]]
+[[!template text="All of the human tendencies" start="00:09:03.519" video="mainVideo" id=subtitle]]
+[[!template text="culminate in this one." start="00:09:04.959" video="mainVideo" id=subtitle]]
+[[!template text="Perfection doesn't mean" start="00:09:07.279" video="mainVideo" id=subtitle]]
+[[!template text="like you just have to make" start="00:09:08.320" video="mainVideo" id=subtitle]]
+[[!template text="this perfect shining idealistic thing." start="00:09:10.240" video="mainVideo" id=subtitle]]
+[[!template text="It's about perfecting what we do." start="00:09:13.040" video="mainVideo" id=subtitle]]
+[[!template text="I think everybody who's worked with Emacs" start="00:09:15.680" video="mainVideo" id=subtitle]]
+[[!template text="for a long time," start="00:09:18.800" video="mainVideo" id=subtitle]]
+[[!template text="you perfect your configuration." start="00:09:19.680" video="mainVideo" id=subtitle]]
+[[!template text="Sometimes you tear it down and start over." start="00:09:22.240" video="mainVideo" id=subtitle]]
+[[!template text="If you're working on a package," start="00:09:25.120" video="mainVideo" id=subtitle]]
+[[!template text="you perfect that," start="00:09:26.399" video="mainVideo" id=subtitle]]
+[[!template text="and it's an ongoing process." start="00:09:27.760" video="mainVideo" id=subtitle]]
+[[!template text="An example I can think of are" start="00:09:29.760" video="mainVideo" id=subtitle]]
+[[!template text="like raxod502's packages." start="00:09:31.600" video="mainVideo" id=subtitle]]
+[[!template text="straight.el is an attempt at perfecting" start="00:09:33.680" video="mainVideo" id=subtitle]]
+[[!template text="the package management system in Emacs," start="00:09:36.720" video="mainVideo" id=subtitle]]
+[[!template text="and he's taken a stab at" start="00:09:40.480" video="mainVideo" id=subtitle]]
+[[!template text="several other common things," start="00:09:41.920" video="mainVideo" id=subtitle]]
+[[!template text="like incremental selection and so on." start="00:09:43.440" video="mainVideo" id=subtitle]]
+[[!template text="These aren't necessarily finished problems." start="00:09:46.320" video="mainVideo" id=subtitle]]
+[[!template text="There's room for perfection," start="00:09:50.959" video="mainVideo" id=subtitle]]
+[[!template text="and we have a human tendency to pursue that." start="00:09:52.480" video="mainVideo" id=subtitle]]
+[[!template text="I hope this talk" start="00:09:58.160" video="mainVideo" id=subtitle]]
+[[!template text="has gotten you thinking about" start="00:09:59.040" video="mainVideo" id=subtitle]]
+[[!template text="how Emacs and the Montessori classroom" start="00:10:00.080" video="mainVideo" id=subtitle]]
+[[!template text="are similar--they're both" start="00:10:02.880" video="mainVideo" id=subtitle]]
+[[!template text="prepared environments" start="00:10:04.480" video="mainVideo" id=subtitle]]
+[[!template text="that call upon our human tendencies" start="00:10:06.160" video="mainVideo" id=subtitle]]
+[[!template text="to construct and refine our world--" start="00:10:08.800" video="mainVideo" id=subtitle]]
+[[!template text="and how Emacs respects us as users" start="00:10:12.240" video="mainVideo" id=subtitle]]
+[[!template text="in the hopes that we will grow up into" start="00:10:15.519" video="mainVideo" id=subtitle]]
+[[!template text="creative hackers." start="00:10:18.480" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for listening." start="00:10:21.200" video="mainVideo" id=subtitle]]
+[[!template text="I'm happy to answer any questions" start="00:10:22.240" video="mainVideo" id=subtitle]]
+[[!template text="(captions by sachac)" start="00:10:26.079" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/nangulator.md b/2021/captions/nangulator.md
new file mode 100644
index 00000000..2acc019f
--- /dev/null
+++ b/2021/captions/nangulator.md
@@ -0,0 +1,227 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello. This is Kevin Haddock" start="00:00:00.240" video="mainVideo" id=subtitle]]
+[[!template text="to announce the introduction of N-Angulator," start="00:00:02.800" video="mainVideo" id=subtitle]]
+[[!template text="hereafter called NA." start="00:00:05.839" video="mainVideo" id=subtitle]]
+[[!template text="NA allows you, the user, to supply" start="00:00:07.759" video="mainVideo" id=subtitle]]
+[[!template text="the meaning to your data" start="00:00:10.240" video="mainVideo" id=subtitle]]
+[[!template text="in a concise, efficient way." start="00:00:11.679" video="mainVideo" id=subtitle]]
+[[!template text="How does it work?" start="00:00:13.599" video="mainVideo" id=subtitle]]
+[[!template text="Your files are stored on your hard disk" start="00:00:14.880" video="mainVideo" id=subtitle]]
+[[!template text="in what technically is called" start="00:00:16.880" video="mainVideo" id=subtitle]]
+[[!template text="a hierarchical file system." start="00:00:18.160" video="mainVideo" id=subtitle]]
+[[!template text="What this means is that" start="00:00:20.640" video="mainVideo" id=subtitle]]
+[[!template text="the root of the directory tree can be" start="00:00:22.240" video="mainVideo" id=subtitle]]
+[[!template text="not only files, or what we call leaves," start="00:00:24.560" video="mainVideo" id=subtitle]]
+[[!template text="but also other folders/branches" start="00:00:27.760" video="mainVideo" id=subtitle]]
+[[!template text="that themselves contain other files, leaves," start="00:00:30.720" video="mainVideo" id=subtitle]]
+[[!template text="and/or branches." start="00:00:33.680" video="mainVideo" id=subtitle]]
+[[!template text="This structure is supposed to" start="00:00:36.000" video="mainVideo" id=subtitle]]
+[[!template text="make it easy to locate your data," start="00:00:37.680" video="mainVideo" id=subtitle]]
+[[!template text="but as anyone knows who has worked with this" start="00:00:40.079" video="mainVideo" id=subtitle]]
+[[!template text="single-dimensional file system" start="00:00:42.079" video="mainVideo" id=subtitle]]
+[[!template text="for any length of time," start="00:00:43.600" video="mainVideo" id=subtitle]]
+[[!template text="it can get quite frustrating" start="00:00:45.280" video="mainVideo" id=subtitle]]
+[[!template text="when your file would fit equally well" start="00:00:46.800" video="mainVideo" id=subtitle]]
+[[!template text="on more than one branch of the tree." start="00:00:48.960" video="mainVideo" id=subtitle]]
+[[!template text="What are you to do?" start="00:00:52.079" video="mainVideo" id=subtitle]]
+[[!template text="Create multiple copies everywhere" start="00:00:53.920" video="mainVideo" id=subtitle]]
+[[!template text="it might appropriately fit." start="00:00:55.920" video="mainVideo" id=subtitle]]
+[[!template text="What if the file was something" start="00:00:57.840" video="mainVideo" id=subtitle]]
+[[!template text="people would occasionally modify," start="00:00:59.039" video="mainVideo" id=subtitle]]
+[[!template text="like a spreadsheet or a computer source file?" start="00:01:01.120" video="mainVideo" id=subtitle]]
+[[!template text="You would have to hunt it down in every place" start="00:01:04.879" video="mainVideo" id=subtitle]]
+[[!template text="and apply those changes everywhere by hand." start="00:01:07.760" video="mainVideo" id=subtitle]]
+[[!template text="Also, let's say not only did you want" start="00:01:11.840" video="mainVideo" id=subtitle]]
+[[!template text="to put the file in multiple places," start="00:01:14.720" video="mainVideo" id=subtitle]]
+[[!template text="but it was also more appropriate" start="00:01:17.040" video="mainVideo" id=subtitle]]
+[[!template text="to give it different names?" start="00:01:18.799" video="mainVideo" id=subtitle]]
+[[!template text="Plus, let's say in different areas" start="00:01:21.280" video="mainVideo" id=subtitle]]
+[[!template text="of the tree, there were files" start="00:01:23.280" video="mainVideo" id=subtitle]]
+[[!template text="with the same name" start="00:01:25.119" video="mainVideo" id=subtitle]]
+[[!template text="that had totally different content?" start="00:01:26.560" video="mainVideo" id=subtitle]]
+[[!template text="Then updating all the different instances" start="00:01:29.280" video="mainVideo" id=subtitle]]
+[[!template text="of the file you need" start="00:01:31.280" video="mainVideo" id=subtitle]]
+[[!template text="would become more and more of a nightmare." start="00:01:32.640" video="mainVideo" id=subtitle]]
+[[!template text="In addition, wouldn't it be great" start="00:01:35.200" video="mainVideo" id=subtitle]]
+[[!template text="if we could all speed up" start="00:01:37.920" video="mainVideo" id=subtitle]]
+[[!template text="the actual searching for a particular file" start="00:01:39.520" video="mainVideo" id=subtitle]]
+[[!template text="by selecting multiple branches in the tree" start="00:01:42.479" video="mainVideo" id=subtitle]]
+[[!template text="and simply asking the computer" start="00:01:45.680" video="mainVideo" id=subtitle]]
+[[!template text="to tell us which branches under those" start="00:01:47.200" video="mainVideo" id=subtitle]]
+[[!template text="contain the same file and which do not?" start="00:01:49.680" video="mainVideo" id=subtitle]]
+[[!template text="This would be especially great" start="00:01:52.560" video="mainVideo" id=subtitle]]
+[[!template text="if it were instantaneous." start="00:01:54.000" video="mainVideo" id=subtitle]]
+[[!template text="Well, believe it or not, this is what NA" start="00:01:56.719" video="mainVideo" id=subtitle]]
+[[!template text="brings to the table." start="00:01:58.640" video="mainVideo" id=subtitle]]
+[[!template text="In fact, this is how NA got its name." start="00:02:00.079" video="mainVideo" id=subtitle]]
+[[!template text="Your data is located by a process" start="00:02:03.040" video="mainVideo" id=subtitle]]
+[[!template text="very similar to the triangulation" start="00:02:05.040" video="mainVideo" id=subtitle]]
+[[!template text="used to locate radio signals," start="00:02:06.960" video="mainVideo" id=subtitle]]
+[[!template text="only we are not limited" start="00:02:09.119" video="mainVideo" id=subtitle]]
+[[!template text="to just two or three angles," start="00:02:10.160" video="mainVideo" id=subtitle]]
+[[!template text="but instead, many dozens can be used," start="00:02:12.000" video="mainVideo" id=subtitle]]
+[[!template text="this makes NA appear to be" start="00:02:14.720" video="mainVideo" id=subtitle]]
+[[!template text="what is known in computer lingo" start="00:02:16.879" video="mainVideo" id=subtitle]]
+[[!template text="as an n-dimensional sparse array." start="00:02:18.640" video="mainVideo" id=subtitle]]
+[[!template text="If that sounds complex, don't worry." start="00:02:21.760" video="mainVideo" id=subtitle]]
+[[!template text="It will become clear when you see it" start="00:02:23.599" video="mainVideo" id=subtitle]]
+[[!template text="in operation in a couple of minutes." start="00:02:25.280" video="mainVideo" id=subtitle]]
+[[!template text="To start out, here we see the NA main screen." start="00:02:28.720" video="mainVideo" id=subtitle]]
+[[!template text="There are two vital aspects of mastering NA." start="00:02:32.560" video="mainVideo" id=subtitle]]
+[[!template text="First is the actual mechanics" start="00:02:36.080" video="mainVideo" id=subtitle]]
+[[!template text="of using the program," start="00:02:37.760" video="mainVideo" id=subtitle]]
+[[!template text="which should be second nature" start="00:02:39.120" video="mainVideo" id=subtitle]]
+[[!template text="for most anyone familiar with" start="00:02:40.480" video="mainVideo" id=subtitle]]
+[[!template text="either a Windows or Unix/apple file system." start="00:02:41.920" video="mainVideo" id=subtitle]]
+[[!template text="We have the same operations" start="00:02:46.160" video="mainVideo" id=subtitle]]
+[[!template text="as one might do with Windows Explorer" start="00:02:48.080" video="mainVideo" id=subtitle]]
+[[!template text="or any number of other file tools," start="00:02:50.400" video="mainVideo" id=subtitle]]
+[[!template text="but what we also do" start="00:02:52.560" video="mainVideo" id=subtitle]]
+[[!template text="that generally they do not" start="00:02:54.560" video="mainVideo" id=subtitle]]
+[[!template text="is place a leaf on a branch," start="00:02:56.080" video="mainVideo" id=subtitle]]
+[[!template text="then cruise around adding links to that leaf" start="00:02:58.000" video="mainVideo" id=subtitle]]
+[[!template text="on a multitude of other branches," start="00:03:00.560" video="mainVideo" id=subtitle]]
+[[!template text="which could include creating, renaming," start="00:03:02.720" video="mainVideo" id=subtitle]]
+[[!template text="or restructuring more branches on the fly" start="00:03:05.120" video="mainVideo" id=subtitle]]
+[[!template text="as needed. Plus, when we find ourselves" start="00:03:07.360" video="mainVideo" id=subtitle]]
+[[!template text="hunting for that file," start="00:03:10.480" video="mainVideo" id=subtitle]]
+[[!template text="we can incrementally select" start="00:03:12.319" video="mainVideo" id=subtitle]]
+[[!template text="a stack of branches" start="00:03:13.840" video="mainVideo" id=subtitle]]
+[[!template text="while seeking what the latter branches" start="00:03:15.120" video="mainVideo" id=subtitle]]
+[[!template text="have in common with the earlier ones," start="00:03:17.200" video="mainVideo" id=subtitle]]
+[[!template text="to make putting one's finger on exactly" start="00:03:19.920" video="mainVideo" id=subtitle]]
+[[!template text="the item they're looking for a snap." start="00:03:22.720" video="mainVideo" id=subtitle]]
+[[!template text="Secondly, you have the actual art" start="00:03:26.239" video="mainVideo" id=subtitle]]
+[[!template text="of organizing your data," start="00:03:28.319" video="mainVideo" id=subtitle]]
+[[!template text="and NA doesn't really put" start="00:03:29.680" video="mainVideo" id=subtitle]]
+[[!template text="any limitations on this," start="00:03:31.120" video="mainVideo" id=subtitle]]
+[[!template text="other than the underlying limitations" start="00:03:32.640" video="mainVideo" id=subtitle]]
+[[!template text="of the file system." start="00:03:34.799" video="mainVideo" id=subtitle]]
+[[!template text="Let's get started, shall we?" start="00:03:36.560" video="mainVideo" id=subtitle]]
+[[!template text="Right-clicking the mouse button here" start="00:03:39.760" video="mainVideo" id=subtitle]]
+[[!template text="will bring up what we call" start="00:03:41.920" video="mainVideo" id=subtitle]]
+[[!template text="a branch navigation menu," start="00:03:43.760" video="mainVideo" id=subtitle]]
+[[!template text="because it allows you" start="00:03:46.000" video="mainVideo" id=subtitle]]
+[[!template text="to move around the tree" start="00:03:46.959" video="mainVideo" id=subtitle]]
+[[!template text="or commence a new angle." start="00:03:48.239" video="mainVideo" id=subtitle]]
+[[!template text="We have chosen to organize our data" start="00:03:50.159" video="mainVideo" id=subtitle]]
+[[!template text="with a hopper to put new items in," start="00:03:52.480" video="mainVideo" id=subtitle]]
+[[!template text="and the initial branches representing" start="00:03:55.519" video="mainVideo" id=subtitle]]
+[[!template text="who, what, where, why, and how." start="00:03:57.360" video="mainVideo" id=subtitle]]
+[[!template text="We right-click on the root" start="00:03:59.519" video="mainVideo" id=subtitle]]
+[[!template text="and select 0hopper," start="00:04:01.280" video="mainVideo" id=subtitle]]
+[[!template text="and that branch is added to the display." start="00:04:03.439" video="mainVideo" id=subtitle]]
+[[!template text="If we middle-click on the branch," start="00:04:06.000" video="mainVideo" id=subtitle]]
+[[!template text="we get what is called" start="00:04:08.080" video="mainVideo" id=subtitle]]
+[[!template text="the branch command menu," start="00:04:09.360" video="mainVideo" id=subtitle]]
+[[!template text="which gives us many options," start="00:04:11.280" video="mainVideo" id=subtitle]]
+[[!template text="not the least of which" start="00:04:12.959" video="mainVideo" id=subtitle]]
+[[!template text="is to create a leaf here." start="00:04:13.920" video="mainVideo" id=subtitle]]
+[[!template text="Remember this item as we progress," start="00:04:15.920" video="mainVideo" id=subtitle]]
+[[!template text="because it will become important." start="00:04:18.000" video="mainVideo" id=subtitle]]
+[[!template text="Next we pick what we know is a leaf item," start="00:04:20.320" video="mainVideo" id=subtitle]]
+[[!template text="due to the fact that it does not have" start="00:04:22.960" video="mainVideo" id=subtitle]]
+[[!template text="a trailing slash." start="00:04:24.720" video="mainVideo" id=subtitle]]
+[[!template text="Now, when we right-click on it," start="00:04:30.960" video="mainVideo" id=subtitle]]
+[[!template text="notice the navigation menu is limited to" start="00:04:32.960" video="mainVideo" id=subtitle]]
+[[!template text="the two items: New Angle" start="00:04:35.040" video="mainVideo" id=subtitle]]
+[[!template text="and the leaf name itself." start="00:04:37.040" video="mainVideo" id=subtitle]]
+[[!template text="If we want to view or edit that leaf item," start="00:04:40.960" video="mainVideo" id=subtitle]]
+[[!template text="we can select that item." start="00:04:43.680" video="mainVideo" id=subtitle]]
+[[!template text="Now that we have selected a leaf," start="00:04:45.440" video="mainVideo" id=subtitle]]
+[[!template text="let's middle-click on it" start="00:04:47.280" video="mainVideo" id=subtitle]]
+[[!template text="to bring up what we call" start="00:04:48.560" video="mainVideo" id=subtitle]]
+[[!template text="the leaf command menu." start="00:04:49.520" video="mainVideo" id=subtitle]]
+[[!template text="This shows us a bunch of standard options" start="00:04:51.600" video="mainVideo" id=subtitle]]
+[[!template text="one might do in a typical file tool" start="00:04:54.080" video="mainVideo" id=subtitle]]
+[[!template text="like Microsoft Explorer." start="00:04:56.160" video="mainVideo" id=subtitle]]
+[[!template text="Since we want to do what they cannot do," start="00:04:58.320" video="mainVideo" id=subtitle]]
+[[!template text="let's right-click the leaf" start="00:05:00.479" video="mainVideo" id=subtitle]]
+[[!template text="and select New Angle." start="00:05:01.680" video="mainVideo" id=subtitle]]
+[[!template text="Notice that another slash has appeared" start="00:05:04.639" video="mainVideo" id=subtitle]]
+[[!template text="below the displayed path of the leaf." start="00:05:06.400" video="mainVideo" id=subtitle]]
+[[!template text="Right-click on it, and you will see" start="00:05:09.840" video="mainVideo" id=subtitle]]
+[[!template text="the root branch navigation menu appears again," start="00:05:11.520" video="mainVideo" id=subtitle]]
+[[!template text="but now 0hopper entry has a line" start="00:05:14.639" video="mainVideo" id=subtitle]]
+[[!template text="both above and below it." start="00:05:19.039" video="mainVideo" id=subtitle]]
+[[!template text="Items in between these two lines" start="00:05:20.960" video="mainVideo" id=subtitle]]
+[[!template text="are called members," start="00:05:23.199" video="mainVideo" id=subtitle]]
+[[!template text="and items below them are called others." start="00:05:24.560" video="mainVideo" id=subtitle]]
+[[!template text="What this is saying is that" start="00:05:27.520" video="mainVideo" id=subtitle]]
+[[!template text="the previously selected angle," start="00:05:29.680" video="mainVideo" id=subtitle]]
+[[!template text="which can be a single leaf" start="00:05:32.160" video="mainVideo" id=subtitle]]
+[[!template text="as in this instance," start="00:05:34.160" video="mainVideo" id=subtitle]]
+[[!template text="or can be all of the leaves" start="00:05:35.840" video="mainVideo" id=subtitle]]
+[[!template text="under a particular branch" start="00:05:37.360" video="mainVideo" id=subtitle]]
+[[!template text="chosen to navigate new angle from," start="00:05:38.960" video="mainVideo" id=subtitle]]
+[[!template text="shares content with the items" start="00:05:43.039" video="mainVideo" id=subtitle]]
+[[!template text="under the member area of the menu," start="00:05:44.880" video="mainVideo" id=subtitle]]
+[[!template text="but items in the others area do not." start="00:05:47.680" video="mainVideo" id=subtitle]]
+[[!template text="Since the first angle is 0hopper," start="00:05:50.880" video="mainVideo" id=subtitle]]
+[[!template text="of course it shares content with itself," start="00:05:53.600" video="mainVideo" id=subtitle]]
+[[!template text="and so it appears in members." start="00:05:56.800" video="mainVideo" id=subtitle]]
+[[!template text="Now let's click the middle button" start="00:05:59.199" video="mainVideo" id=subtitle]]
+[[!template text="on the root branch, and see what" start="00:06:01.199" video="mainVideo" id=subtitle]]
+[[!template text="the branch command menu has to say." start="00:06:02.960" video="mainVideo" id=subtitle]]
+[[!template text="Notice that the entry that used to say" start="00:06:07.360" video="mainVideo" id=subtitle]]
+[[!template text="Create a New Leaf now says Add a Link." start="00:06:09.280" video="mainVideo" id=subtitle]]
+[[!template text="This is because we have already selected" start="00:06:13.120" video="mainVideo" id=subtitle]]
+[[!template text="a leaf, and now we want to add links" start="00:06:15.039" video="mainVideo" id=subtitle]]
+[[!template text="to it rather than create a new one." start="00:06:17.360" video="mainVideo" id=subtitle]]
+[[!template text="If you go back to the root" start="00:06:20.479" video="mainVideo" id=subtitle]]
+[[!template text="and reselect 0hopper," start="00:06:21.840" video="mainVideo" id=subtitle]]
+[[!template text="that option will revert back again." start="00:06:24.319" video="mainVideo" id=subtitle]]
+[[!template text="So let's add a link under person." start="00:06:29.039" video="mainVideo" id=subtitle]]
+[[!template text="We right-click the root," start="00:06:40.880" video="mainVideo" id=subtitle]]
+[[!template text="select person, and let's add a link." start="00:06:42.720" video="mainVideo" id=subtitle]]
+[[!template text="Notice the bottom area (called the minibuffer)" start="00:06:46.720" video="mainVideo" id=subtitle]]
+[[!template text="gives us the proposed name of the link," start="00:06:50.560" video="mainVideo" id=subtitle]]
+[[!template text="and we choose to accept it by hitting enter," start="00:06:53.360" video="mainVideo" id=subtitle]]
+[[!template text="or edit it to taste first." start="00:06:55.680" video="mainVideo" id=subtitle]]
+[[!template text="Now let's go back up to" start="00:07:09.759" video="mainVideo" id=subtitle]]
+[[!template text="the end of the prior angle," start="00:07:10.960" video="mainVideo" id=subtitle]]
+[[!template text="select New Angle again," start="00:07:13.120" video="mainVideo" id=subtitle]]
+[[!template text="and then click the resultant /," start="00:07:15.360" video="mainVideo" id=subtitle]]
+[[!template text="and see what are members" start="00:07:18.319" video="mainVideo" id=subtitle]]
+[[!template text="and what are others." start="00:07:20.240" video="mainVideo" id=subtitle]]
+[[!template text="Notice that the 0hopper and person" start="00:07:21.840" video="mainVideo" id=subtitle]]
+[[!template text="are members." start="00:07:24.319" video="mainVideo" id=subtitle]]
+[[!template text="NA knows you added content to the person," start="00:07:25.759" video="mainVideo" id=subtitle]]
+[[!template text="so it moves to members." start="00:07:28.319" video="mainVideo" id=subtitle]]
+[[!template text="Now let's add some more links" start="00:07:32.160" video="mainVideo" id=subtitle]]
+[[!template text="and perhaps a few subdirectories" start="00:07:33.599" video="mainVideo" id=subtitle]]
+[[!template text="for this item." start="00:07:35.360" video="mainVideo" id=subtitle]]
+[[!template text="Notice how we can even eliminate" start="00:08:06.960" video="mainVideo" id=subtitle]]
+[[!template text="the file name extension." start="00:08:08.960" video="mainVideo" id=subtitle]]
+[[!template text="It will still know how to display the item" start="00:08:11.039" video="mainVideo" id=subtitle]]
+[[!template text="as it actually analyzes the file" start="00:08:13.680" video="mainVideo" id=subtitle]]
+[[!template text="to determine its type." start="00:08:15.440" video="mainVideo" id=subtitle]]
+[[!template text="This greatly cleans up your metadata" start="00:08:17.120" video="mainVideo" id=subtitle]]
+[[!template text="and makes it more human." start="00:08:19.120" video="mainVideo" id=subtitle]]
+[[!template text="Now let's pick a branch" start="00:08:40.719" video="mainVideo" id=subtitle]]
+[[!template text="from one of the menus." start="00:08:41.839" video="mainVideo" id=subtitle]]
+[[!template text="For instance, let's look and see" start="00:08:43.519" video="mainVideo" id=subtitle]]
+[[!template text="where any events broadcast were done from." start="00:08:44.880" video="mainVideo" id=subtitle]]
+[[!template text="We select event, broadcast, then New Angle," start="00:08:54.880" video="mainVideo" id=subtitle]]
+[[!template text="and we can see California is in members." start="00:09:06.640" video="mainVideo" id=subtitle]]
+[[!template text="Now we can also do New Angle" start="00:09:09.600" video="mainVideo" id=subtitle]]
+[[!template text="and select person," start="00:09:11.600" video="mainVideo" id=subtitle]]
+[[!template text="and we can see who did them." start="00:09:13.920" video="mainVideo" id=subtitle]]
+[[!template text="Another thing we can do is pick a leaf" start="00:09:16.160" video="mainVideo" id=subtitle]]
+[[!template text="and quickly display" start="00:09:18.720" video="mainVideo" id=subtitle]]
+[[!template text="all angles or links for it," start="00:09:19.920" video="mainVideo" id=subtitle]]
+[[!template text="or if we are willing to wait a little longer," start="00:09:21.920" video="mainVideo" id=subtitle]]
+[[!template text="have NA construct all the display items" start="00:09:24.160" video="mainVideo" id=subtitle]]
+[[!template text="with Edit All Angles," start="00:09:26.720" video="mainVideo" id=subtitle]]
+[[!template text="so we can manipulate them" start="00:09:28.320" video="mainVideo" id=subtitle]]
+[[!template text="just as if we had entered" start="00:09:30.160" video="mainVideo" id=subtitle]]
+[[!template text="or selected them by hand." start="00:09:31.440" video="mainVideo" id=subtitle]]
+[[!template text="There are many more tools in NA" start="00:09:44.320" video="mainVideo" id=subtitle]]
+[[!template text="to handle sets of leaves" start="00:09:46.080" video="mainVideo" id=subtitle]]
+[[!template text="such as scanned pages of a book," start="00:09:47.440" video="mainVideo" id=subtitle]]
+[[!template text="promoting /, demoting nodes," start="00:09:50.320" video="mainVideo" id=subtitle]]
+[[!template text="and so forth." start="00:09:53.040" video="mainVideo" id=subtitle]]
+[[!template text="Thanks for watching." start="00:09:54.560" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:09:55.560" 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/news.md b/2021/captions/news.md
new file mode 100644
index 00000000..1a301142
--- /dev/null
+++ b/2021/captions/news.md
@@ -0,0 +1,159 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="I'm Sacha Chua, and here are" start="00:00:00.003" video="mainVideo" id=subtitle]]
+[[!template text="ten Emacs News highlights for 2021." start="00:00:01.519" video="mainVideo" id=subtitle]]
+[[!template text="If you want to follow the links," start="00:00:03.754" video="mainVideo" id=subtitle]]
+[[!template text="check out the wiki page at" start="00:00:05.305" video="mainVideo" id=subtitle]]
+[[!template text="https://emacsconf.org/2021/talks/news/ ." start="00:00:06.846" video="mainVideo" id=subtitle]]
+[[!template new="1" text="1\. The Emacs developers are currently" start="00:00:11.024" video="mainVideo" id=subtitle]]
+[[!template text="working on Emacs 28.1," start="00:00:13.442" video="mainVideo" id=subtitle]]
+[[!template text="which will be the next major release." start="00:00:15.346" video="mainVideo" id=subtitle]]
+[[!template text="John Wiegley will share more Emacs 28 details" start="00:00:17.119" video="mainVideo" id=subtitle]]
+[[!template text="in his update, so check out his talk." start="00:00:19.703" video="mainVideo" id=subtitle]]
+[[!template text="Andrea Corallo's giving a talk" start="00:00:21.483" video="mainVideo" id=subtitle]]
+[[!template text="on native compilation too." start="00:00:23.353" video="mainVideo" id=subtitle]]
+[[!template new="1" text="2\." start="00:00:24.988" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode is now at version 9.5." start="00:00:25.776" video="mainVideo" id=subtitle]]
+[[!template text="New features include" start="00:00:28.302" video="mainVideo" id=subtitle]]
+[[!template text="a library for managing citations," start="00:00:29.656" video="mainVideo" id=subtitle]]
+[[!template text="asynchronous session support" start="00:00:31.505" video="mainVideo" id=subtitle]]
+[[!template text="for code blocks," start="00:00:32.984" video="mainVideo" id=subtitle]]
+[[!template text="and better control" start="00:00:33.945" video="mainVideo" id=subtitle]]
+[[!template text="of your agenda's appearance." start="00:00:34.912" video="mainVideo" id=subtitle]]
+[[!template text="If you've been getting your Org packages" start="00:00:36.165" video="mainVideo" id=subtitle]]
+[[!template text="from Org ELPA," start="00:00:37.942" video="mainVideo" id=subtitle]]
+[[!template text="you can update your configuration" start="00:00:39.076" video="mainVideo" id=subtitle]]
+[[!template text="to get Org from GNU ELPA" start="00:00:40.698" video="mainVideo" id=subtitle]]
+[[!template text="and org-contrib from NonGNU ELPA." start="00:00:42.466" video="mainVideo" id=subtitle]]
+[[!template text="The new release of the Org Roam package" start="00:00:44.725" video="mainVideo" id=subtitle]]
+[[!template text="should be a faster and more consistent way" start="00:00:46.848" video="mainVideo" id=subtitle]]
+[[!template text="to use Org to manage a knowledgebase," start="00:00:48.755" video="mainVideo" id=subtitle]]
+[[!template text="and org-roam-ui looks pretty snazzy." start="00:00:50.630" video="mainVideo" id=subtitle]]
+[[!template text="The best way to keep up with Org changes" start="00:00:52.993" video="mainVideo" id=subtitle]]
+[[!template text="is to check out the blog This Month in Org." start="00:00:55.101" video="mainVideo" id=subtitle]]
+[[!template new="1" text="3\." start="00:00:57.126" video="mainVideo" id=subtitle]]
+[[!template text="New Magit major release!" start="00:00:58.009" video="mainVideo" id=subtitle]]
+[[!template text="Jonas Bernoulli has split some functionality" start="00:01:00.039" video="mainVideo" id=subtitle]]
+[[!template text="into other packages so that" start="00:01:02.351" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Lisp developers can use them, such as" start="00:01:04.127" video="mainVideo" id=subtitle]]
+[[!template text="magit-section, transient, and forge." start="00:01:06.289" video="mainVideo" id=subtitle]]
+[[!template text="Here's an example of using magit-section" start="00:01:08.619" video="mainVideo" id=subtitle]]
+[[!template text="to manage groups of buffers." start="00:01:11.072" video="mainVideo" id=subtitle]]
+[[!template text="You can learn more about Transient" start="00:01:12.343" video="mainVideo" id=subtitle]]
+[[!template text="in the talk on self-describing" start="00:01:13.903" video="mainVideo" id=subtitle]]
+[[!template text="smart domain-specific languages or DSLs." start="00:01:15.412" video="mainVideo" id=subtitle]]
+[[!template new="1" text="4\." start="00:01:18.108" video="mainVideo" id=subtitle]]
+[[!template text="In terms of smaller packages, there's been" start="00:01:18.890" video="mainVideo" id=subtitle]]
+[[!template text="a lot of activity around completion." start="00:01:21.115" video="mainVideo" id=subtitle]]
+[[!template text="Karthik has a great diagram," start="00:01:23.195" video="mainVideo" id=subtitle]]
+[[!template text="and Prot explains how things work together." start="00:01:24.862" video="mainVideo" id=subtitle]]
+[[!template text="I think the idea is that instead of having" start="00:01:27.029" video="mainVideo" id=subtitle]]
+[[!template text="one large completion system" start="00:01:28.984" video="mainVideo" id=subtitle]]
+[[!template text="like Helm or Icicles, you can choose" start="00:01:30.636" video="mainVideo" id=subtitle]]
+[[!template text="a few different, smaller packages" start="00:01:32.914" video="mainVideo" id=subtitle]]
+[[!template text="and configure them to work together." start="00:01:34.680" video="mainVideo" id=subtitle]]
+[[!template text="If you're curious about this," start="00:01:36.439" video="mainVideo" id=subtitle]]
+[[!template text="you might start with either selectrum" start="00:01:37.699" video="mainVideo" id=subtitle]]
+[[!template text="or vertico, which are both completion interfaces," start="00:01:39.729" video="mainVideo" id=subtitle]]
+[[!template text="add marginalia for more information," start="00:01:42.441" video="mainVideo" id=subtitle]]
+[[!template text="and try consult for many useful" start="00:01:45.013" video="mainVideo" id=subtitle]]
+[[!template text="completing commands." start="00:01:46.792" video="mainVideo" id=subtitle]]
+[[!template text="There are so many options," start="00:01:47.803" video="mainVideo" id=subtitle]]
+[[!template text="so it might be useful to check out" start="00:01:48.849" video="mainVideo" id=subtitle]]
+[[!template text="some discussions." start="00:01:50.437" video="mainVideo" id=subtitle]]
+[[!template new="1" text="5\." start="00:01:51.284" video="mainVideo" id=subtitle]]
+[[!template text="Embark is usually mentioned as part of" start="00:01:52.047" video="mainVideo" id=subtitle]]
+[[!template text="that group of packages," start="00:01:54.101" video="mainVideo" id=subtitle]]
+[[!template text="but it's well worth looking into" start="00:01:55.177" video="mainVideo" id=subtitle]]
+[[!template text="even if you use a different system." start="00:01:56.766" video="mainVideo" id=subtitle]]
+[[!template text="Embark lets you have context-sensitive shortcuts" start="00:01:58.465" video="mainVideo" id=subtitle]]
+[[!template text="that work on things in buffers, minibuffers," start="00:02:00.987" video="mainVideo" id=subtitle]]
+[[!template text="and even collections of things." start="00:02:03.366" video="mainVideo" id=subtitle]]
+[[!template text="You can also use it" start="00:02:05.338" video="mainVideo" id=subtitle]]
+[[!template text="when you start doing one command" start="00:02:06.307" video="mainVideo" id=subtitle]]
+[[!template text="and then decide to do a different one instead." start="00:02:07.482" video="mainVideo" id=subtitle]]
+[[!template text="For more ideas, check out" start="00:02:09.582" video="mainVideo" id=subtitle]]
+[[!template text="Fifteen Ways to Use Embark." start="00:02:10.841" video="mainVideo" id=subtitle]]
+[[!template new="1" text="6\." start="00:02:12.065" video="mainVideo" id=subtitle]]
+[[!template text="Now that there are Emacs Lisp bindings" start="00:02:12.855" video="mainVideo" id=subtitle]]
+[[!template text="for tree-sitter, we can work more easily" start="00:02:14.733" video="mainVideo" id=subtitle]]
+[[!template text="with the structure of code instead of" start="00:02:16.709" video="mainVideo" id=subtitle]]
+[[!template text="just using regular expressions." start="00:02:18.369" video="mainVideo" id=subtitle]]
+[[!template text="Check out the talk" start="00:02:20.031" video="mainVideo" id=subtitle]]
+[[!template text="on Tree-edit and structural editing" start="00:02:20.779" video="mainVideo" id=subtitle]]
+[[!template text="to learn more." start="00:02:22.374" video="mainVideo" id=subtitle]]
+[[!template text="You can use tree-sitter for" start="00:02:23.163" video="mainVideo" id=subtitle]]
+[[!template text="intelligent snippets that get information" start="00:02:24.626" video="mainVideo" id=subtitle]]
+[[!template text="from the code around them," start="00:02:26.521" video="mainVideo" id=subtitle]]
+[[!template text="editing Lisp expressions," start="00:02:27.739" video="mainVideo" id=subtitle]]
+[[!template text="and navigating text objects in Evil mode." start="00:02:29.634" video="mainVideo" id=subtitle]]
+[[!template text="(That's when Emacs is pretending to be Vi.)" start="00:02:31.971" video="mainVideo" id=subtitle]]
+[[!template text="Dynamic modules help us add more to Emacs" start="00:02:34.240" video="mainVideo" id=subtitle]]
+[[!template text="than Emacs Lisp easily offers," start="00:02:37.133" video="mainVideo" id=subtitle]]
+[[!template text="such as structural editing in OCaml" start="00:02:38.958" video="mainVideo" id=subtitle]]
+[[!template text="and using Rust to figure out parentheses" start="00:02:41.374" video="mainVideo" id=subtitle]]
+[[!template text="and indentation for Lisp." start="00:02:43.299" video="mainVideo" id=subtitle]]
+[[!template new="1" text="7\." start="00:02:44.656" video="mainVideo" id=subtitle]]
+[[!template text="Collaborative editing is now much easier" start="00:02:45.559" video="mainVideo" id=subtitle]]
+[[!template text="since the CRDT package is in GNU ELPA." start="00:02:47.614" video="mainVideo" id=subtitle]]
+[[!template text="It allows multiple people to edit" start="00:02:50.210" video="mainVideo" id=subtitle]]
+[[!template text="the same file over the network," start="00:02:51.952" video="mainVideo" id=subtitle]]
+[[!template text="using their own Emacs." start="00:02:53.605" video="mainVideo" id=subtitle]]
+[[!template text="This means you can keep your own config" start="00:02:55.345" video="mainVideo" id=subtitle]]
+[[!template text="and keybindings, yay!" start="00:02:57.170" video="mainVideo" id=subtitle]]
+[[!template text="Watch the Emacs Research Group talk" start="00:02:58.994" video="mainVideo" id=subtitle]]
+[[!template text="for an example of how several people" start="00:03:00.720" video="mainVideo" id=subtitle]]
+[[!template text="used it to work together." start="00:03:02.505" video="mainVideo" id=subtitle]]
+[[!template new="1" text="8\." start="00:03:03.657" video="mainVideo" id=subtitle]]
+[[!template text="In case you're still under the impression" start="00:03:04.158" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is just a text editor," start="00:03:05.721" video="mainVideo" id=subtitle]]
+[[!template text="some folks have been working on" start="00:03:07.369" video="mainVideo" id=subtitle]]
+[[!template text="pretty neat graphical experiments." start="00:03:08.880" video="mainVideo" id=subtitle]]
+[[!template text="These OpenGL bindings for Emacs Lisp" start="00:03:10.574" video="mainVideo" id=subtitle]]
+[[!template text="use an embedded xwidget," start="00:03:12.752" video="mainVideo" id=subtitle]]
+[[!template text="while other prototypes use the SVG support" start="00:03:14.515" video="mainVideo" id=subtitle]]
+[[!template text="that's built into Emacs" start="00:03:16.927" video="mainVideo" id=subtitle]]
+[[!template text="for Gantt charts," start="00:03:18.020" video="mainVideo" id=subtitle]]
+[[!template text="scribbles," start="00:03:19.367" video="mainVideo" id=subtitle]]
+[[!template text="and even diagrams." start="00:03:20.139" video="mainVideo" id=subtitle]]
+[[!template text="The color-picker from that one" start="00:03:21.640" video="mainVideo" id=subtitle]]
+[[!template text="looks particularly useful for CSS." start="00:03:23.110" video="mainVideo" id=subtitle]]
+[[!template text="If you want to play around with adding SVGs" start="00:03:25.161" video="mainVideo" id=subtitle]]
+[[!template text="to your files and interfaces," start="00:03:27.363" video="mainVideo" id=subtitle]]
+[[!template text="svg-icon" start="00:03:29.042" video="mainVideo" id=subtitle]]
+[[!template text="and svg-lib" start="00:03:30.082" video="mainVideo" id=subtitle]]
+[[!template text="might be good places to start. (Reddit)" start="00:03:30.999" video="mainVideo" id=subtitle]]
+[[!template text="Of course, there's always a place" start="00:03:33.053" video="mainVideo" id=subtitle]]
+[[!template text="for ASCII art," start="00:03:34.527" video="mainVideo" id=subtitle]]
+[[!template text="especially with the new boxy package" start="00:03:35.529" video="mainVideo" id=subtitle]]
+[[!template text="that you can use for org files," start="00:03:37.253" video="mainVideo" id=subtitle]]
+[[!template text="imenu navigation," start="00:03:38.753" video="mainVideo" id=subtitle]]
+[[!template text="and even things in real life." start="00:03:40.073" video="mainVideo" id=subtitle]]
+[[!template new="1" text="9\." start="00:03:41.738" video="mainVideo" id=subtitle]]
+[[!template text="There have been a lot of great posts, videos," start="00:03:42.528" video="mainVideo" id=subtitle]]
+[[!template text="and livestreams about Emacs this year." start="00:03:44.731" video="mainVideo" id=subtitle]]
+[[!template text="In addition to the ones" start="00:03:46.632" video="mainVideo" id=subtitle]]
+[[!template text="from System Crafters," start="00:03:47.894" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Elements," start="00:03:49.293" video="mainVideo" id=subtitle]]
+[[!template text="and Protesilaos," start="00:03:50.473" video="mainVideo" id=subtitle]]
+[[!template text="John Kitchin" start="00:03:51.984" video="mainVideo" id=subtitle]]
+[[!template text="and Mike Zamansky" start="00:03:52.794" video="mainVideo" id=subtitle]]
+[[!template text="are back, hooray!" start="00:03:53.540" video="mainVideo" id=subtitle]]
+[[!template text="And Marcin Borkowski has just finished" start="00:03:54.575" video="mainVideo" id=subtitle]]
+[[!template text="writing an intermediate textbook" start="00:03:56.946" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Lisp, too!" start="00:03:58.836" video="mainVideo" id=subtitle]]
+[[!template new="1" text="10\." start="00:04:00.071" video="mainVideo" id=subtitle]]
+[[!template text="Lastly, if you want to chat" start="00:04:00.742" video="mainVideo" id=subtitle]]
+[[!template text="with other Emacs folks" start="00:04:02.249" video="mainVideo" id=subtitle]]
+[[!template text="and get help on Emacs, Org Mode," start="00:04:03.403" video="mainVideo" id=subtitle]]
+[[!template text="or other topics," start="00:04:05.604" video="mainVideo" id=subtitle]]
+[[!template text="the #emacs and #org-mode" start="00:04:06.531" video="mainVideo" id=subtitle]]
+[[!template text="Internet Relay Chat or IRC channels" start="00:04:07.756" video="mainVideo" id=subtitle]]
+[[!template text="are now on the libera.chat network" start="00:04:10.181" video="mainVideo" id=subtitle]]
+[[!template text="instead of Freenode." start="00:04:12.067" video="mainVideo" id=subtitle]]
+[[!template text="If you'd like to add something I've missed," start="00:04:13.333" video="mainVideo" id=subtitle]]
+[[!template text="please add them to the wiki page," start="00:04:15.208" video="mainVideo" id=subtitle]]
+[[!template text="or e-mail me at sacha@sachachua.com ." start="00:04:16.903" video="mainVideo" id=subtitle]]
+[[!template text="That's all for this quick review." start="00:04:19.354" video="mainVideo" id=subtitle]]
+[[!template text="Enjoy the rest of EmacsConf 2021!" start="00:04:20.874" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/nongnu.md b/2021/captions/nongnu.md
new file mode 100644
index 00000000..001c039a
--- /dev/null
+++ b/2021/captions/nongnu.md
@@ -0,0 +1,181 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello! My name is Philip," start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="and I'll be giving a brief update on" start="00:00:02.283" video="mainVideo" id=subtitle]]
+[[!template text="NonGNU ELPA." start="00:00:04.363" video="mainVideo" id=subtitle]]
+[[!template text="Before we begin," start="00:00:05.963" video="mainVideo" id=subtitle]]
+[[!template text="let's first make sure" start="00:00:07.403" video="mainVideo" id=subtitle]]
+[[!template text="everyone's on the same page." start="00:00:08.283" video="mainVideo" id=subtitle]]
+[[!template text="What is NonGNU ELPA?" start="00:00:09.563" video="mainVideo" id=subtitle]]
+[[!template text="Put simply, NonGNU ELPA" start="00:00:11.203" video="mainVideo" id=subtitle]]
+[[!template text="is a new Emacs Lisp package archive." start="00:00:14.323" video="mainVideo" id=subtitle]]
+[[!template text="similar to its sister archive, GNU ELPA." start="00:00:16.723" video="mainVideo" id=subtitle]]
+[[!template text="The main difference is that" start="00:00:19.323" video="mainVideo" id=subtitle]]
+[[!template text="GNU ELPA regards each package in the archive" start="00:00:21.883" video="mainVideo" id=subtitle]]
+[[!template text="to be part of Emacs itself." start="00:00:24.723" video="mainVideo" id=subtitle]]
+[[!template text="This means each significant contributor" start="00:00:26.643" video="mainVideo" id=subtitle]]
+[[!template text="has to have signed their copyrights" start="00:00:30.083" video="mainVideo" id=subtitle]]
+[[!template text="to the Free Software Foundation." start="00:00:32.483" video="mainVideo" id=subtitle]]
+[[!template text="NonGNU ELPA is made for packages" start="00:00:34.803" video="mainVideo" id=subtitle]]
+[[!template text="that cannot ensure this condition." start="00:00:37.203" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The immediate consequence of all of this" start="00:00:39.363" video="mainVideo" id=subtitle]]
+[[!template text="is that more packages can be installed" start="00:00:42.483" video="mainVideo" id=subtitle]]
+[[!template text="out of the box." start="00:00:44.243" video="mainVideo" id=subtitle]]
+[[!template text="All you need to install," start="00:00:44.723" video="mainVideo" id=subtitle]]
+[[!template text="for example, magit, evil-mode, slime," start="00:00:46.803" video="mainVideo" id=subtitle]]
+[[!template text="is a simple M-x package-install." start="00:00:49.443" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The more subtle consequence" start="00:00:52.723" video="mainVideo" id=subtitle]]
+[[!template text="is that ELPA distributes" start="00:00:56.083" video="mainVideo" id=subtitle]]
+[[!template text="stable packages by default." start="00:00:58.083" video="mainVideo" id=subtitle]]
+[[!template text="This differs from, for example," start="00:00:59.763" video="mainVideo" id=subtitle]]
+[[!template text="the community-maintained package archive MELPA," start="00:01:01.563" video="mainVideo" id=subtitle]]
+[[!template text="where each change in the respective package repository" start="00:01:04.163" video="mainVideo" id=subtitle]]
+[[!template text="triggers a new package to be rebuilt." start="00:01:08.483" video="mainVideo" id=subtitle]]
+[[!template text="Of course, &quot;stable&quot; here has to be taken" start="00:01:12.803" video="mainVideo" id=subtitle]]
+[[!template text="with a grain of salt because," start="00:01:15.123" video="mainVideo" id=subtitle]]
+[[!template text="on the one hand," start="00:01:16.843" video="mainVideo" id=subtitle]]
+[[!template text="a package maintainer can be very careful" start="00:01:17.963" video="mainVideo" id=subtitle]]
+[[!template text="to avoid buggy code in their default branch," start="00:01:19.923" video="mainVideo" id=subtitle]]
+[[!template text="and on the other hand," start="00:01:22.403" video="mainVideo" id=subtitle]]
+[[!template text="a package maintainer can be too eager" start="00:01:23.923" video="mainVideo" id=subtitle]]
+[[!template text="to tag a new release" start="00:01:26.523" video="mainVideo" id=subtitle]]
+[[!template text="without properly checking" start="00:01:28.083" video="mainVideo" id=subtitle]]
+[[!template text="that the code works as intended." start="00:01:29.483" video="mainVideo" id=subtitle]]
+[[!template text="My personal hope is that" start="00:01:31.403" video="mainVideo" id=subtitle]]
+[[!template text="more people using NonGNU ELPA" start="00:01:33.483" video="mainVideo" id=subtitle]]
+[[!template text="be incentive for increase" start="00:01:35.603" video="mainVideo" id=subtitle]]
+[[!template text="for package development to shift away" start="00:01:37.683" video="mainVideo" id=subtitle]]
+[[!template text="from the currently predominant" start="00:01:39.603" video="mainVideo" id=subtitle]]
+[[!template text="rolling release model," start="00:01:41.083" video="mainVideo" id=subtitle]]
+[[!template text="improving the overall stability" start="00:01:42.323" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs configurations." start="00:01:44.243" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Another side effect of the initiative" start="00:01:45.523" video="mainVideo" id=subtitle]]
+[[!template text="is a chance to clean up" start="00:01:48.843" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs package space." start="00:01:51.003" video="mainVideo" id=subtitle]]
+[[!template text="Over the last few years," start="00:01:52.803" video="mainVideo" id=subtitle]]
+[[!template text="a lot of packages have been abandoned," start="00:01:54.723" video="mainVideo" id=subtitle]]
+[[!template text="have been broken, duplicated," start="00:01:56.363" video="mainVideo" id=subtitle]]
+[[!template text="or even in some cases," start="00:01:59.043" video="mainVideo" id=subtitle]]
+[[!template text="replaced by functionality in Emacs itself." start="00:02:00.443" video="mainVideo" id=subtitle]]
+[[!template text="When reviewing packages for NonGNU ELPA," start="00:02:03.483" video="mainVideo" id=subtitle]]
+[[!template text="the opportunity to avoid these problems" start="00:02:07.403" video="mainVideo" id=subtitle]]
+[[!template text="will hopefully also improve the general quality" start="00:02:10.043" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs packages." start="00:02:12.523" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, what is this update about?" start="00:02:13.923" video="mainVideo" id=subtitle]]
+[[!template text="I'm taking Richard Stallman's announcement" start="00:02:16.883" video="mainVideo" id=subtitle]]
+[[!template text="at EmacsConf 2020" start="00:02:20.443" video="mainVideo" id=subtitle]]
+[[!template text="as my reference point." start="00:02:22.363" video="mainVideo" id=subtitle]]
+[[!template text="There, the idea, the history," start="00:02:23.563" video="mainVideo" id=subtitle]]
+[[!template text="and the motivation was explained," start="00:02:26.283" video="mainVideo" id=subtitle]]
+[[!template text="and the call for contributions was made." start="00:02:28.283" video="mainVideo" id=subtitle]]
+[[!template text="I won't be going into these aspects" start="00:02:30.443" video="mainVideo" id=subtitle]]
+[[!template text="again this year." start="00:02:32.643" video="mainVideo" id=subtitle]]
+[[!template text="As this implies, there was nothing concrete" start="00:02:33.483" video="mainVideo" id=subtitle]]
+[[!template text="at that point." start="00:02:37.163" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The first practical steps towards NonGNU ELPA" start="00:02:38.683" video="mainVideo" id=subtitle]]
+[[!template text="were taken up by Stefan Monnier." start="00:02:41.883" video="mainVideo" id=subtitle]]
+[[!template text="This included updating GNU ELPA's build system" start="00:02:43.683" video="mainVideo" id=subtitle]]
+[[!template text="to support the requirements" start="00:02:47.963" video="mainVideo" id=subtitle]]
+[[!template text="of NonGNU ELPA as well." start="00:02:49.523" video="mainVideo" id=subtitle]]
+[[!template text="And so eventually," start="00:02:51.003" video="mainVideo" id=subtitle]]
+[[!template text="the idea became a Git repository," start="00:02:53.283" video="mainVideo" id=subtitle]]
+[[!template text="nongnu.git on savannah," start="00:02:55.323" video="mainVideo" id=subtitle]]
+[[!template text="then a website," start="00:02:57.203" video="mainVideo" id=subtitle]]
+[[!template text="elpa.nongnu.org," start="00:02:59.203" video="mainVideo" id=subtitle]]
+[[!template text="and then around late December of last year," start="00:03:02.523" video="mainVideo" id=subtitle]]
+[[!template text="NonGNU ELPA was also added" start="00:03:04.643" video="mainVideo" id=subtitle]]
+[[!template text="to the package-archives list." start="00:03:06.923" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Sadly, progress stalled from this point on," start="00:03:08.643" video="mainVideo" id=subtitle]]
+[[!template text="with the new archive consisting of only" start="00:03:11.963" video="mainVideo" id=subtitle]]
+[[!template text="five or six packages." start="00:03:14.123" video="mainVideo" id=subtitle]]
+[[!template text="It took until August" start="00:03:16.203" video="mainVideo" id=subtitle]]
+[[!template text="for more packages to be added," start="00:03:18.083" video="mainVideo" id=subtitle]]
+[[!template text="some by their respective authors," start="00:03:20.123" video="mainVideo" id=subtitle]]
+[[!template text="such as Magit and Projectile," start="00:03:22.003" video="mainVideo" id=subtitle]]
+[[!template text="but most by contributors such as myself." start="00:03:23.963" video="mainVideo" id=subtitle]]
+[[!template text="As of recording," start="00:03:26.163" video="mainVideo" id=subtitle]]
+[[!template text="the archive has around 70 packages," start="00:03:27.923" video="mainVideo" id=subtitle]]
+[[!template text="with more pending to be out soon." start="00:03:30.363" video="mainVideo" id=subtitle]]
+[[!template text="These include popular applications" start="00:03:32.803" video="mainVideo" id=subtitle]]
+[[!template text="such as the previously-mentioned Magit," start="00:03:34.803" video="mainVideo" id=subtitle]]
+[[!template text="SLIME, or wgrep," start="00:03:36.483" video="mainVideo" id=subtitle]]
+[[!template text="major modes like php-mode, rust-mode," start="00:03:38.083" video="mainVideo" id=subtitle]]
+[[!template text="go-mode, clojure-mode, lua-mode," start="00:03:41.523" video="mainVideo" id=subtitle]]
+[[!template text="markdown-mode... You get my point." start="00:03:43.723" video="mainVideo" id=subtitle]]
+[[!template text="And a number of visual themes," start="00:03:45.923" video="mainVideo" id=subtitle]]
+[[!template text="among other things." start="00:03:47.883" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If you are interested in using NonGNU ELPA," start="00:03:49.443" video="mainVideo" id=subtitle]]
+[[!template text="but you are still bound" start="00:03:52.643" video="mainVideo" id=subtitle]]
+[[!template text="to an older version of Emacs," start="00:03:53.603" video="mainVideo" id=subtitle]]
+[[!template text="all you have to do is" start="00:03:55.203" video="mainVideo" id=subtitle]]
+[[!template text="to add the snippet" start="00:03:56.683" video="mainVideo" id=subtitle]]
+[[!template text="from the NonGNU ELPA home page" start="00:03:57.483" video="mainVideo" id=subtitle]]
+[[!template text="updating the package-archives variable." start="00:03:59.003" video="mainVideo" id=subtitle]]
+[[!template text="For Emacs 28 and newer," start="00:04:01.323" video="mainVideo" id=subtitle]]
+[[!template text="one might have to watch out" start="00:04:03.923" video="mainVideo" id=subtitle]]
+[[!template text="that you're not setting package-archives directly," start="00:04:05.123" video="mainVideo" id=subtitle]]
+[[!template text="and if you are doing so," start="00:04:07.563" video="mainVideo" id=subtitle]]
+[[!template text="to update the value." start="00:04:09.363" video="mainVideo" id=subtitle]]
+[[!template text="Emacs 28 only updates the default value" start="00:04:10.723" video="mainVideo" id=subtitle]]
+[[!template text="and will not manipulate the user's configuration." start="00:04:14.003" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Finally, a short note" start="00:04:17.043" video="mainVideo" id=subtitle]]
+[[!template text="for package developers." start="00:04:20.363" video="mainVideo" id=subtitle]]
+[[!template text="Most packages up until now" start="00:04:22.163" video="mainVideo" id=subtitle]]
+[[!template text="haven't been added by their maintainers." start="00:04:24.243" video="mainVideo" id=subtitle]]
+[[!template text="For the most part," start="00:04:26.243" video="mainVideo" id=subtitle]]
+[[!template text="I have been collecting and reviewing the packages" start="00:04:28.083" video="mainVideo" id=subtitle]]
+[[!template text="which have been added," start="00:04:31.083" video="mainVideo" id=subtitle]]
+[[!template text="which takes time" start="00:04:32.683" video="mainVideo" id=subtitle]]
+[[!template text="and is one of the main reasons" start="00:04:33.923" video="mainVideo" id=subtitle]]
+[[!template text="why we're still at only 70 packages." start="00:04:36.043" video="mainVideo" id=subtitle]]
+[[!template text="This is of course not a permanent solution." start="00:04:38.323" video="mainVideo" id=subtitle]]
+[[!template text="The intention here is" start="00:04:41.683" video="mainVideo" id=subtitle]]
+[[!template text="to bootstrap, so to say," start="00:04:42.243" video="mainVideo" id=subtitle]]
+[[!template text="the interest in NonGNU ELPA" start="00:04:44.803" video="mainVideo" id=subtitle]]
+[[!template text="by making it more interesting to you" start="00:04:46.243" video="mainVideo" id=subtitle]]
+[[!template text="and thus more interesting to contribute to." start="00:04:48.083" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If you are interested in adding a package" start="00:04:50.563" video="mainVideo" id=subtitle]]
+[[!template text="that already exists, or a new package" start="00:04:53.563" video="mainVideo" id=subtitle]]
+[[!template text="to NonGNU ELPA, all you need to do is" start="00:04:56.643" video="mainVideo" id=subtitle]]
+[[!template text="send an e-mail to the" start="00:04:59.443" video="mainVideo" id=subtitle]]
+[[!template text="Emacs development mailing list," start="00:05:00.843" video="mainVideo" id=subtitle]]
+[[!template text="emacs-devel@gnu.org." start="00:05:02.483" video="mainVideo" id=subtitle]]
+[[!template text="This is an open mailing list" start="00:05:05.523" video="mainVideo" id=subtitle]]
+[[!template text="and requires no special registration." start="00:05:08.123" video="mainVideo" id=subtitle]]
+[[!template text="Your message should" start="00:05:10.563" video="mainVideo" id=subtitle]]
+[[!template text="mention NonGNU ELPA in the subject" start="00:05:12.283" video="mainVideo" id=subtitle]]
+[[!template text="and contain a link to a public Git repository" start="00:05:14.643" video="mainVideo" id=subtitle]]
+[[!template text="in the body. Ideally, a brief explanation" start="00:05:17.483" video="mainVideo" id=subtitle]]
+[[!template text="on what your package does" start="00:05:20.643" video="mainVideo" id=subtitle]]
+[[!template text="would be much appreciated." start="00:05:21.803" video="mainVideo" id=subtitle]]
+[[!template text="The proposal will be reviewed" start="00:05:23.243" video="mainVideo" id=subtitle]]
+[[!template text="by the readers of the mailing list," start="00:05:25.603" video="mainVideo" id=subtitle]]
+[[!template text="and after a bit of back-and-forth" start="00:05:28.043" video="mainVideo" id=subtitle]]
+[[!template text="on possible issues and improvements," start="00:05:29.443" video="mainVideo" id=subtitle]]
+[[!template text="the package will hopefully be added" start="00:05:31.123" video="mainVideo" id=subtitle]]
+[[!template text="to NonGNU ELPA itself." start="00:05:32.723" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The simplest mistake a lot of packages make" start="00:05:34.443" video="mainVideo" id=subtitle]]
+[[!template text="is to either not have" start="00:05:38.523" video="mainVideo" id=subtitle]]
+[[!template text="or maintain a version attribute" start="00:05:40.043" video="mainVideo" id=subtitle]]
+[[!template text="in the package header." start="00:05:41.843" video="mainVideo" id=subtitle]]
+[[!template text="This is done despite actually being necessary" start="00:05:42.803" video="mainVideo" id=subtitle]]
+[[!template text="for a well-formed Emacs package" start="00:05:46.323" video="mainVideo" id=subtitle]]
+[[!template text="according to the Elisp manual." start="00:05:48.163" video="mainVideo" id=subtitle]]
+[[!template text="ELPA relies on this tag" start="00:05:50.083" video="mainVideo" id=subtitle]]
+[[!template text="to detect new package versions" start="00:05:52.443" video="mainVideo" id=subtitle]]
+[[!template text="that will be built and distributed." start="00:05:54.323" video="mainVideo" id=subtitle]]
+[[!template text="If the version isn't updated," start="00:05:55.843" video="mainVideo" id=subtitle]]
+[[!template text="no new package will be released," start="00:05:58.483" video="mainVideo" id=subtitle]]
+[[!template text="and any changes won't be made public." start="00:06:00.323" video="mainVideo" id=subtitle]]
+[[!template text="So, that's that on NonGNU ELPA." start="00:06:03.043" video="mainVideo" id=subtitle]]
+[[!template new="1" text="To summarize, NonGNU ELPA is an" start="00:06:07.683" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Lisp Package Archive for Emacs," start="00:06:09.883" video="mainVideo" id=subtitle]]
+[[!template text="without a need for copyright assignments." start="00:06:11.683" video="mainVideo" id=subtitle]]
+[[!template text="It works, it exists, and it's been used already." start="00:06:13.363" video="mainVideo" id=subtitle]]
+[[!template text="I'm looking forward to" start="00:06:17.203" video="mainVideo" id=subtitle]]
+[[!template text="more packages being added to the archive" start="00:06:18.403" video="mainVideo" id=subtitle]]
+[[!template text="and improving the overall experience" start="00:06:20.403" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs out of the box." start="00:06:22.803" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for your interest, and goodbye." start="00:06:24.283" video="mainVideo" id=subtitle]]
+[[!template text="[captioned by sachac]" start="00:06:27.163" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/nyxt.md b/2021/captions/nyxt.md
new file mode 100644
index 00000000..98b5bc5b
--- /dev/null
+++ b/2021/captions/nyxt.md
@@ -0,0 +1,180 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Welcome to my talk &quot;Emacs with Nyxt:" start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="extend your editor with" start="00:00:01.783" video="mainVideo" id=subtitle]]
+[[!template text="the power of a Lisp browser&quot;." start="00:00:02.823" video="mainVideo" id=subtitle]]
+[[!template text="Who am I? I'm Andrea. I work as" start="00:00:04.623" video="mainVideo" id=subtitle]]
+[[!template text="a Clojure software engineer somewhere" start="00:00:06.583" video="mainVideo" id=subtitle]]
+[[!template text="in the middle of the UK." start="00:00:08.303" video="mainVideo" id=subtitle]]
+[[!template text="And I inherited my passion for Emacs" start="00:00:09.743" video="mainVideo" id=subtitle]]
+[[!template text="from my Ph.D. supervisor, and from that" start="00:00:11.743" video="mainVideo" id=subtitle]]
+[[!template text="moment on Emacs became a core tool" start="00:00:13.703" video="mainVideo" id=subtitle]]
+[[!template text="of my daily routine." start="00:00:15.943" video="mainVideo" id=subtitle]]
+[[!template text="You can find more about me and my interests" start="00:00:17.863" video="mainVideo" id=subtitle]]
+[[!template text="at ag91.github.io, that is my blog." start="00:00:20.863" video="mainVideo" id=subtitle]]
+[[!template text="Let's get into the talk." start="00:00:23.983" video="mainVideo" id=subtitle]]
+[[!template text="So, why Nyxt? Nyxt is an extensible" start="00:00:25.183" video="mainVideo" id=subtitle]]
+[[!template text="Common Lisp browser." start="00:00:28.183" video="mainVideo" id=subtitle]]
+[[!template text="Fundamentally, it's Emacs for web browsing." start="00:00:29.543" video="mainVideo" id=subtitle]]
+[[!template text="And why do I say that? I say that" start="00:00:31.903" video="mainVideo" id=subtitle]]
+[[!template text="because is a…, this is Nyxt." start="00:00:34.063" video="mainVideo" id=subtitle]]
+[[!template text="You can see that is organized with buffers," start="00:00:36.063" video="mainVideo" id=subtitle]]
+[[!template text="and you can see that I can invoke command," start="00:00:40.223" video="mainVideo" id=subtitle]]
+[[!template text="like, I was in Emacs with this." start="00:00:44.063" video="mainVideo" id=subtitle]]
+[[!template text="So, I'm using even the same keybindings," start="00:00:47.183" video="mainVideo" id=subtitle]]
+[[!template text="so, for that I used M-x." start="00:00:48.983" video="mainVideo" id=subtitle]]
+[[!template text="And some of the features of Nyxt" start="00:00:52.783" video="mainVideo" id=subtitle]]
+[[!template text="are just amazing. For example, say that" start="00:00:55.983" video="mainVideo" id=subtitle]]
+[[!template text="you want to mark some text, this is the way," start="00:01:00.103" video="mainVideo" id=subtitle]]
+[[!template text="so, I just pressed Control space (C-SPC)," start="00:01:03.823" video="mainVideo" id=subtitle]]
+[[!template text="and now I will start the marker," start="00:01:08.703" video="mainVideo" id=subtitle]]
+[[!template text="and now I can copy the text, and when" start="00:01:10.423" video="mainVideo" id=subtitle]]
+[[!template text="I'm done, I can finish to use visual mode." start="00:01:13.223" video="mainVideo" id=subtitle]]
+[[!template text="Or, for example, what about…," start="00:01:15.663" video="mainVideo" id=subtitle]]
+[[!template text="I want to navigate without using my mouse." start="00:01:18.023" video="mainVideo" id=subtitle]]
+[[!template text="I can do something like follow-hint," start="00:01:21.183" video="mainVideo" id=subtitle]]
+[[!template text="and this opens the possibility to press" start="00:01:25.183" video="mainVideo" id=subtitle]]
+[[!template text="AC to jump on the Articles," start="00:01:28.023" video="mainVideo" id=subtitle]]
+[[!template text="and all of a sudden I'm on the page" start="00:01:29.903" video="mainVideo" id=subtitle]]
+[[!template text="with the blog posts of the Atlas team." start="00:01:33.063" video="mainVideo" id=subtitle]]
+[[!template text="Or, for example, I can extend my browser" start="00:01:36.023" video="mainVideo" id=subtitle]]
+[[!template text="from within the browser." start="00:01:39.383" video="mainVideo" id=subtitle]]
+[[!template text="So, you can see I can evaluate a command," start="00:01:40.783" video="mainVideo" id=subtitle]]
+[[!template text="a Common Lisp code," start="00:01:43.223" video="mainVideo" id=subtitle]]
+[[!template text="and it produces the result." start="00:01:48.663" video="mainVideo" id=subtitle]]
+[[!template text="And then, for example, I can also auto…." start="00:01:50.903" video="mainVideo" id=subtitle]]
+[[!template text="This browser comes by default with an" start="00:01:56.183" video="mainVideo" id=subtitle]]
+[[!template text="integration with your password manager," start="00:01:58.663" video="mainVideo" id=subtitle]]
+[[!template text="in my case it's pass, and I can copy" start="00:02:01.143" video="mainVideo" id=subtitle]]
+[[!template text="a password. This is just as easy as is," start="00:02:04.223" video="mainVideo" id=subtitle]]
+[[!template text="it comes by default." start="00:02:08.783" video="mainVideo" id=subtitle]]
+[[!template text="Another incredibly useful feature" start="00:02:10.543" video="mainVideo" id=subtitle]]
+[[!template text="that I didn't find in other browsers is" start="00:02:13.583" video="mainVideo" id=subtitle]]
+[[!template text="searching between multiple buffers." start="00:02:18.023" video="mainVideo" id=subtitle]]
+[[!template text="So, this function search-buffers," start="00:02:20.503" video="mainVideo" id=subtitle]]
+[[!template text="this command lets me select" start="00:02:23.503" video="mainVideo" id=subtitle]]
+[[!template text="some of my open buffers," start="00:02:25.823" video="mainVideo" id=subtitle]]
+[[!template text="and I can look for a string in there." start="00:02:29.503" video="mainVideo" id=subtitle]]
+[[!template text="And you would see that the hits are" start="00:02:32.503" video="mainVideo" id=subtitle]]
+[[!template text="from the buffers that I have open," start="00:02:34.623" video="mainVideo" id=subtitle]]
+[[!template text="for example, Clojure or" start="00:02:37.423" video="mainVideo" id=subtitle]]
+[[!template text="the YouTube video about Clojure." start="00:02:42.583" video="mainVideo" id=subtitle]]
+[[!template text="Let me get into something very interesting." start="00:02:46.103" video="mainVideo" id=subtitle]]
+[[!template text="How can I make Emacs speak to Nyxt." start="00:02:49.623" video="mainVideo" id=subtitle]]
+[[!template text="And for that, let me show you something" start="00:02:52.783" video="mainVideo" id=subtitle]]
+[[!template text="in the literate programming approach." start="00:02:55.103" video="mainVideo" id=subtitle]]
+[[!template text="So, this Org mode source block is" start="00:02:57.143" video="mainVideo" id=subtitle]]
+[[!template text="linked to this Nyxt REPL." start="00:03:00.183" video="mainVideo" id=subtitle]]
+[[!template text="I can define a new command," start="00:03:04.423" video="mainVideo" id=subtitle]]
+[[!template text="and when I go in Nyxt," start="00:03:06.983" video="mainVideo" id=subtitle]]
+[[!template text="I can find this new command," start="00:03:09.343" video="mainVideo" id=subtitle]]
+[[!template text="and I can invoke it, and you can see" start="00:03:10.863" video="mainVideo" id=subtitle]]
+[[!template text="there is something in the minibuffer." start="00:03:12.503" video="mainVideo" id=subtitle]]
+[[!template text="I can use it from Nyxt, but I can do it here." start="00:03:16.943" video="mainVideo" id=subtitle]]
+[[!template text="I can also use it directly from the REPL." start="00:03:21.543" video="mainVideo" id=subtitle]]
+[[!template text="You can see that the same thing is logged" start="00:03:24.703" video="mainVideo" id=subtitle]]
+[[!template text="in the REPL." start="00:03:27.743" video="mainVideo" id=subtitle]]
+[[!template text="And then with something that I would speak" start="00:03:30.423" video="mainVideo" id=subtitle]]
+[[!template text="about in another talk in the conference" start="00:03:32.663" video="mainVideo" id=subtitle]]
+[[!template text="— Moldable Emacs. I can also just" start="00:03:36.423" video="mainVideo" id=subtitle]]
+[[!template text="evaluate JavaScript outside. Let's create" start="00:03:39.143" video="mainVideo" id=subtitle]]
+[[!template text="a playground that allows me to write some" start="00:03:42.823" video="mainVideo" id=subtitle]]
+[[!template text="JavaScript code. And if I evaluate this code," start="00:03:46.703" video="mainVideo" id=subtitle]]
+[[!template text="I get the title of the webpage" start="00:03:49.903" video="mainVideo" id=subtitle]]
+[[!template text="that is currently open in Nyxt." start="00:03:52.023" video="mainVideo" id=subtitle]]
+[[!template text="The cool thing is that I can do it also" start="00:03:54.583" video="mainVideo" id=subtitle]]
+[[!template text="directly in Lisp, this is Parenscript" start="00:03:58.343" video="mainVideo" id=subtitle]]
+[[!template text="that evaluates to the same thing," start="00:04:02.263" video="mainVideo" id=subtitle]]
+[[!template text="(it) is just the same, just document.title," start="00:04:05.223" video="mainVideo" id=subtitle]]
+[[!template text="only that is in Common Lisp." start="00:04:07.823" video="mainVideo" id=subtitle]]
+[[!template text="You see that Emacs can speak to Nyxt," start="00:04:10.743" video="mainVideo" id=subtitle]]
+[[!template text="but also the reverse is true." start="00:04:14.343" video="mainVideo" id=subtitle]]
+[[!template text="Nyxt can speak to Emacs. So, for example," start="00:04:16.103" video="mainVideo" id=subtitle]]
+[[!template text="if I'm in Nyxt, and for example," start="00:04:19.023" video="mainVideo" id=subtitle]]
+[[!template text="let me go to my blog, if I press here," start="00:04:21.943" video="mainVideo" id=subtitle]]
+[[!template text="this is an email link, automatically in Emacs" start="00:04:26.623" video="mainVideo" id=subtitle]]
+[[!template text="it will let me compone a message" start="00:04:30.863" video="mainVideo" id=subtitle]]
+[[!template text="using my email manager." start="00:04:33.943" video="mainVideo" id=subtitle]]
+[[!template text="Or, say that always in my blog I want" start="00:04:35.943" video="mainVideo" id=subtitle]]
+[[!template text="to write something here in the searchbar," start="00:04:39.823" video="mainVideo" id=subtitle]]
+[[!template text="I think that I don't want to write it in" start="00:04:43.543" video="mainVideo" id=subtitle]]
+[[!template text="the browser but in my Emacs because" start="00:04:46.303" video="mainVideo" id=subtitle]]
+[[!template text="I have some template for search." start="00:04:50.623" video="mainVideo" id=subtitle]]
+[[!template text="If I do this, all of a sudden" start="00:04:52.903" video="mainVideo" id=subtitle]]
+[[!template text="the text is added." start="00:04:55.503" video="mainVideo" id=subtitle]]
+[[!template text="Or say I'm watching that Clojure video," start="00:04:59.103" video="mainVideo" id=subtitle]]
+[[!template text="and I get to this point, and then I say" start="00:05:03.423" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Yuu! This is a very interesting thing," start="00:05:06.343" video="mainVideo" id=subtitle]]
+[[!template text="let me take a note&quot;. So, I take some note" start="00:05:09.703" video="mainVideo" id=subtitle]]
+[[!template text="with some text, and if I go back in Emacs," start="00:05:12.783" video="mainVideo" id=subtitle]]
+[[!template text="tadam! I found the note," start="00:05:16.903" video="mainVideo" id=subtitle]]
+[[!template text="and I found it with the duration," start="00:05:19.023" video="mainVideo" id=subtitle]]
+[[!template text="so I can just jump to the same point." start="00:05:21.903" video="mainVideo" id=subtitle]]
+[[!template text="And what else?" start="00:05:25.063" video="mainVideo" id=subtitle]]
+[[!template text="There is something even bigger" start="00:05:28.743" video="mainVideo" id=subtitle]]
+[[!template text="that we can do," start="00:05:31.903" video="mainVideo" id=subtitle]]
+[[!template text="this is a bit more advanced," start="00:05:32.663" video="mainVideo" id=subtitle]]
+[[!template text="and this is something that I do" start="00:05:34.063" video="mainVideo" id=subtitle]]
+[[!template text="again with my Moldable Emacs." start="00:05:35.823" video="mainVideo" id=subtitle]]
+[[!template text="Say that you want to do some" start="00:05:39.023" video="mainVideo" id=subtitle]]
+[[!template text="data visualization." start="00:05:41.183" video="mainVideo" id=subtitle]]
+[[!template text="If we use Vega-Lite…, for example," start="00:05:43.223" video="mainVideo" id=subtitle]]
+[[!template text="we want to visualize a scatter plot." start="00:05:44.863" video="mainVideo" id=subtitle]]
+[[!template text="Let me take some example data" start="00:05:47.823" video="mainVideo" id=subtitle]]
+[[!template text="that could be interesting also to you." start="00:05:49.623" video="mainVideo" id=subtitle]]
+[[!template text="So, say that I have this playground" start="00:05:52.423" video="mainVideo" id=subtitle]]
+[[!template text="that lets me evaluate" start="00:05:55.063" video="mainVideo" id=subtitle]]
+[[!template text="some query on my Org-roam database." start="00:05:57.263" video="mainVideo" id=subtitle]]
+[[!template text="What I'm doing here is I'm gonna" start="00:06:01.703" video="mainVideo" id=subtitle]]
+[[!template text="go through my first 100 notes" start="00:06:03.663" video="mainVideo" id=subtitle]]
+[[!template text="and collect their backlinks," start="00:06:05.703" video="mainVideo" id=subtitle]]
+[[!template text="so some information that I find interesting." start="00:06:09.823" video="mainVideo" id=subtitle]]
+[[!template text="If I convert this to JSON," start="00:06:13.183" video="mainVideo" id=subtitle]]
+[[!template text="now, all of a sudden this is something" start="00:06:16.343" video="mainVideo" id=subtitle]]
+[[!template text="that I can put in that Vega-Lite template" start="00:06:18.903" video="mainVideo" id=subtitle]]
+[[!template text="that I showed you a moment ago." start="00:06:22.623" video="mainVideo" id=subtitle]]
+[[!template text="So, I'm gonna find out that file," start="00:06:26.183" video="mainVideo" id=subtitle]]
+[[!template text="you see that I left a question mark," start="00:06:28.343" video="mainVideo" id=subtitle]]
+[[!template text="(this is) something that I still" start="00:06:30.463" video="mainVideo" id=subtitle]]
+[[!template text="didn't automate completely." start="00:06:31.703" video="mainVideo" id=subtitle]]
+[[!template text="By saving this file and opening it with Nyxt," start="00:06:33.783" video="mainVideo" id=subtitle]]
+[[!template text="you can see that now I have a scatter plot." start="00:06:37.983" video="mainVideo" id=subtitle]]
+[[!template text="And these are my actual notes," start="00:06:41.183" video="mainVideo" id=subtitle]]
+[[!template text="so you can see that if I stay on it," start="00:06:43.943" video="mainVideo" id=subtitle]]
+[[!template text="these are actually my notes." start="00:06:48.343" video="mainVideo" id=subtitle]]
+[[!template text="When I'm in Emacs, what I can do is" start="00:06:53.063" video="mainVideo" id=subtitle]]
+[[!template text="I click here, and now in the background" start="00:06:55.343" video="mainVideo" id=subtitle]]
+[[!template text="it opened my note," start="00:06:58.303" video="mainVideo" id=subtitle]]
+[[!template text="and it opened with all my backlinks." start="00:07:00.903" video="mainVideo" id=subtitle]]
+[[!template text="You can see that I have embedded in my" start="00:07:04.303" video="mainVideo" id=subtitle]]
+[[!template text="browser some functionality of Emacs." start="00:07:07.703" video="mainVideo" id=subtitle]]
+[[!template text="You understand that this is the power of" start="00:07:11.303" video="mainVideo" id=subtitle]]
+[[!template text="unifying, integrating these two experiences," start="00:07:13.463" video="mainVideo" id=subtitle]]
+[[!template text="and it opens the doors for" start="00:07:16.983" video="mainVideo" id=subtitle]]
+[[!template text="a lot of interesting interactivity." start="00:07:18.943" video="mainVideo" id=subtitle]]
+[[!template text="Anyway, what is next?" start="00:07:22.223" video="mainVideo" id=subtitle]]
+[[!template text="This was my talk, what is next is" start="00:07:24.743" video="mainVideo" id=subtitle]]
+[[!template text="continue merging it with Moldable Emacs." start="00:07:29.023" video="mainVideo" id=subtitle]]
+[[!template text="(This) is something I will present in" start="00:07:32.143" video="mainVideo" id=subtitle]]
+[[!template text="another talk in this conference with web," start="00:07:34.023" video="mainVideo" id=subtitle]]
+[[!template text="so that we can extract meaning from" start="00:07:37.463" video="mainVideo" id=subtitle]]
+[[!template text="the web, and we can bring it in Emacs." start="00:07:39.263" video="mainVideo" id=subtitle]]
+[[!template text="And from Emacs bringing back stuff" start="00:07:41.103" video="mainVideo" id=subtitle]]
+[[!template text="like a picture into a web page," start="00:07:43.583" video="mainVideo" id=subtitle]]
+[[!template text="so that we can do fancy visualization." start="00:07:46.543" video="mainVideo" id=subtitle]]
+[[!template text="Another thing I want to do is to" start="00:07:48.903" video="mainVideo" id=subtitle]]
+[[!template text="automate the boring browser flows" start="00:07:51.063" video="mainVideo" id=subtitle]]
+[[!template text="that I do, like, for example," start="00:07:54.263" video="mainVideo" id=subtitle]]
+[[!template text="if I periodically buy something," start="00:07:55.543" video="mainVideo" id=subtitle]]
+[[!template text="I could do it from within Emacs" start="00:07:58.263" video="mainVideo" id=subtitle]]
+[[!template text="instead of always clicking around." start="00:08:00.863" video="mainVideo" id=subtitle]]
+[[!template text="And then I'm just gonna cross fingers," start="00:08:05.263" video="mainVideo" id=subtitle]]
+[[!template text="I hope that this browser will" start="00:08:08.383" video="mainVideo" id=subtitle]]
+[[!template text="become mainstream." start="00:08:10.023" video="mainVideo" id=subtitle]]
+[[!template text="So, this was my talk," start="00:08:11.783" video="mainVideo" id=subtitle]]
+[[!template text="thank you for listening," start="00:08:13.263" video="mainVideo" id=subtitle]]
+[[!template text="and you can find more about it at" start="00:08:14.663" video="mainVideo" id=subtitle]]
+[[!template text="ag91.github.io, my blog," start="00:08:17.343" video="mainVideo" id=subtitle]]
+[[!template text="and enjoy the rest of the conference, bye!" start="00:08:19.823" video="mainVideo" id=subtitle]]
+[[!template text="captions: bhavin192 (Bhavin Gandhi)" start="00:08:22.680" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/omegat.md b/2021/captions/omegat.md
new file mode 100644
index 00000000..e6f68e57
--- /dev/null
+++ b/2021/captions/omegat.md
@@ -0,0 +1,900 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, everybody." start="00:00:01.280" video="mainVideo" id=subtitle]]
+[[!template text="My name is Jean-Christophe Helary," start="00:00:02.560" video="mainVideo" id=subtitle]]
+[[!template text="and today I'm going to talk about" start="00:00:04.400" video="mainVideo" id=subtitle]]
+[[!template text="Emacs manuals translation and OmegaT." start="00:00:05.680" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for joining the session." start="00:00:08.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Translation in the free software world" start="00:00:10.960" video="mainVideo" id=subtitle]]
+[[!template text="is really a big thing. You already know" start="00:00:12.880" video="mainVideo" id=subtitle]]
+[[!template text="that most of the Linux distributions," start="00:00:15.040" video="mainVideo" id=subtitle]]
+[[!template text="most of the software packages," start="00:00:17.119" video="mainVideo" id=subtitle]]
+[[!template text="most of the websites" start="00:00:18.720" video="mainVideo" id=subtitle]]
+[[!template text="are translated by dozens of communities" start="00:00:19.920" video="mainVideo" id=subtitle]]
+[[!template text="using different processes" start="00:00:22.320" video="mainVideo" id=subtitle]]
+[[!template text="and file formats." start="00:00:23.439" video="mainVideo" id=subtitle]]
+[[!template text="Translation and localizations" start="00:00:24.880" video="mainVideo" id=subtitle]]
+[[!template text="are things we know very well." start="00:00:27.359" video="mainVideo" id=subtitle]]
+[[!template text="It's a tad different" start="00:00:29.599" video="mainVideo" id=subtitle]]
+[[!template text="for the Emacs community." start="00:00:30.400" video="mainVideo" id=subtitle]]
+[[!template text="We didn't have a localization process" start="00:00:32.160" video="mainVideo" id=subtitle]]
+[[!template text="because it's quite complex" start="00:00:34.079" video="mainVideo" id=subtitle]]
+[[!template text="and because we don't" start="00:00:35.200" video="mainVideo" id=subtitle]]
+[[!template text="have the resources yet." start="00:00:35.920" video="mainVideo" id=subtitle]]
+[[!template text="Still, we could translate the manuals," start="00:00:37.600" video="mainVideo" id=subtitle]]
+[[!template text="and translating the manuals" start="00:00:39.920" video="mainVideo" id=subtitle]]
+[[!template text="would probably bring a lot of good" start="00:00:41.200" video="mainVideo" id=subtitle]]
+[[!template text="to the Emacs community at large." start="00:00:42.399" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So what's the state of the manuals?" start="00:00:45.600" video="mainVideo" id=subtitle]]
+[[!template text="As of today, we have 182 files" start="00:00:47.920" video="mainVideo" id=subtitle]]
+[[!template text="coming in .texi and .org format." start="00:00:51.199" video="mainVideo" id=subtitle]]
+[[!template text="We've got more than 2 million words." start="00:00:54.160" video="mainVideo" id=subtitle]]
+[[!template text="We've got more than" start="00:00:56.559" video="mainVideo" id=subtitle]]
+[[!template text="50 million characters." start="00:00:57.360" video="mainVideo" id=subtitle]]
+[[!template text="So that's quite a lot of work," start="00:00:59.039" video="mainVideo" id=subtitle]]
+[[!template text="and obviously, it's not a one person job." start="00:01:00.559" video="mainVideo" id=subtitle]]
+[[!template new="1" text="When we open .texi files," start="00:01:04.559" video="mainVideo" id=subtitle]]
+[[!template text="what do we have?" start="00:01:06.159" video="mainVideo" id=subtitle]]
+[[!template text="Well, we actually have a lot of things" start="00:01:07.760" video="mainVideo" id=subtitle]]
+[[!template text="that the translators" start="00:01:09.439" video="mainVideo" id=subtitle]]
+[[!template text="shouldn't have to translate." start="00:01:10.560" video="mainVideo" id=subtitle]]
+[[!template text="Here we can see that only" start="00:01:12.400" video="mainVideo" id=subtitle]]
+[[!template text="the very last segment," start="00:01:13.680" video="mainVideo" id=subtitle]]
+[[!template text="the very last sentence" start="00:01:15.040" video="mainVideo" id=subtitle]]
+[[!template text="should be translated." start="00:01:16.400" video="mainVideo" id=subtitle]]
+[[!template text="All those meta things" start="00:01:18.080" video="mainVideo" id=subtitle]]
+[[!template text="should not be under" start="00:01:19.360" video="mainVideo" id=subtitle]]
+[[!template text="the translator's eyes." start="00:01:20.240" video="mainVideo" id=subtitle]]
+[[!template text="How do we deal with this situation?" start="00:01:24.479" video="mainVideo" id=subtitle]]
+[[!template text="For code files, we have" start="00:01:26.720" video="mainVideo" id=subtitle]]
+[[!template text="the gettext utility that converts" start="00:01:27.680" video="mainVideo" id=subtitle]]
+[[!template text="all the translatable strings" start="00:01:29.360" video="mainVideo" id=subtitle]]
+[[!template text="into a translable format," start="00:01:30.640" video="mainVideo" id=subtitle]]
+[[!template text="which is the .po format." start="00:01:32.079" video="mainVideo" id=subtitle]]
+[[!template text="And that .po format is ubiquitous," start="00:01:33.840" video="mainVideo" id=subtitle]]
+[[!template text="even in the non-free" start="00:01:35.520" video="mainVideo" id=subtitle]]
+[[!template text="software translation industry." start="00:01:36.400" video="mainVideo" id=subtitle]]
+[[!template text="For documentation," start="00:01:38.720" video="mainVideo" id=subtitle]]
+[[!template text="we have something different." start="00:01:39.520" video="mainVideo" id=subtitle]]
+[[!template text="It's called po4a," start="00:01:40.720" video="mainVideo" id=subtitle]]
+[[!template text="which is short for .po for all." start="00:01:42.000" video="mainVideo" id=subtitle]]
+[[!template text="When we use po4a" start="00:01:45.119" video="mainVideo" id=subtitle]]
+[[!template text="on those 182 .texi and .org files," start="00:01:46.399" video="mainVideo" id=subtitle]]
+[[!template text="what do we get?" start="00:01:49.200" video="mainVideo" id=subtitle]]
+[[!template text="We get something that's much better." start="00:01:50.479" video="mainVideo" id=subtitle]]
+[[!template text="Now we have three segments." start="00:01:52.640" video="mainVideo" id=subtitle]]
+[[!template text="It's not perfect because," start="00:01:54.799" video="mainVideo" id=subtitle]]
+[[!template text="as you can see," start="00:01:55.759" video="mainVideo" id=subtitle]]
+[[!template text="the two first segments" start="00:01:56.399" video="mainVideo" id=subtitle]]
+[[!template text="should not be translated." start="00:01:57.280" video="mainVideo" id=subtitle]]
+[[!template text="so there's still" start="00:01:58.880" video="mainVideo" id=subtitle]]
+[[!template text="room for improvement." start="00:01:59.520" video="mainVideo" id=subtitle]]
+[[!template text="Now, when we put that file set" start="00:02:02.479" video="mainVideo" id=subtitle]]
+[[!template text="into OmegaT, we considerably reduce" start="00:02:04.960" video="mainVideo" id=subtitle]]
+[[!template text="the words total." start="00:02:07.119" video="mainVideo" id=subtitle]]
+[[!template text="We have now 50% less words" start="00:02:08.800" video="mainVideo" id=subtitle]]
+[[!template text="and 23% less characters to type," start="00:02:11.360" video="mainVideo" id=subtitle]]
+[[!template text="but that's still a lot of work." start="00:02:14.239" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's talk about OmegaT now" start="00:02:15.680" video="mainVideo" id=subtitle]]
+[[!template text="and see where it can help." start="00:02:17.599" video="mainVideo" id=subtitle]]
+[[!template text="OmegaT is a GPL3+ Java8+" start="00:02:22.239" video="mainVideo" id=subtitle]]
+[[!template text="computer aided translation tool." start="00:02:25.440" video="mainVideo" id=subtitle]]
+[[!template text="We call them CATs." start="00:02:27.599" video="mainVideo" id=subtitle]]
+[[!template text="CATs are to translators" start="00:02:29.440" video="mainVideo" id=subtitle]]
+[[!template text="what ideas are to programmers." start="00:02:30.720" video="mainVideo" id=subtitle]]
+[[!template text="They leverage the power of computers" start="00:02:33.280" video="mainVideo" id=subtitle]]
+[[!template text="to automate our work," start="00:02:35.040" video="mainVideo" id=subtitle]]
+[[!template text="which is reference searches," start="00:02:36.480" video="mainVideo" id=subtitle]]
+[[!template text="fuzzy matching, automatic insertions," start="00:02:38.400" video="mainVideo" id=subtitle]]
+[[!template text="and things like that." start="00:02:40.800" video="mainVideo" id=subtitle]]
+[[!template new="1" text="OmegaT is not really recent." start="00:02:44.080" video="mainVideo" id=subtitle]]
+[[!template text="It will turn 20 next year," start="00:02:46.319" video="mainVideo" id=subtitle]]
+[[!template text="and at this point," start="00:02:48.319" video="mainVideo" id=subtitle]]
+[[!template text="we have about 1.5 million downloads" start="00:02:48.959" video="mainVideo" id=subtitle]]
+[[!template text="from the SourceForge site," start="00:02:51.440" video="mainVideo" id=subtitle]]
+[[!template text="which doesn't mean much" start="00:02:53.200" video="mainVideo" id=subtitle]]
+[[!template text="because that includes" start="00:02:54.080" video="mainVideo" id=subtitle]]
+[[!template text="files used for localization" start="00:02:55.040" video="mainVideo" id=subtitle]]
+[[!template text="and manuals, but still" start="00:02:56.480" video="mainVideo" id=subtitle]]
+[[!template text="it's a pretty big number." start="00:02:57.920" video="mainVideo" id=subtitle]]
+[[!template text="OmegaT is included in" start="00:02:59.599" video="mainVideo" id=subtitle]]
+[[!template text="a lot of Linux distributions," start="00:03:00.720" video="mainVideo" id=subtitle]]
+[[!template text="but as you can see here," start="00:03:02.400" video="mainVideo" id=subtitle]]
+[[!template text="it's mostly downloaded on Windows systems" start="00:03:03.680" video="mainVideo" id=subtitle]]
+[[!template text="because translators" start="00:03:05.920" video="mainVideo" id=subtitle]]
+[[!template text="mostly work on Windows." start="00:03:06.800" video="mainVideo" id=subtitle]]
+[[!template text="OmegaT comes with a cool logo" start="00:03:09.680" video="mainVideo" id=subtitle]]
+[[!template text="and a cool site too," start="00:03:11.120" video="mainVideo" id=subtitle]]
+[[!template text="and I really invite you to visit it." start="00:03:12.080" video="mainVideo" id=subtitle]]
+[[!template text="It's omegat.org , and you'll see" start="00:03:13.920" video="mainVideo" id=subtitle]]
+[[!template text="all the information you need," start="00:03:16.159" video="mainVideo" id=subtitle]]
+[[!template text="plus downloads to Linux versions," start="00:03:17.280" video="mainVideo" id=subtitle]]
+[[!template text="with or without Java included." start="00:03:19.040" video="mainVideo" id=subtitle]]
+[[!template text="So what does OmegaT bring to the game?" start="00:03:22.080" video="mainVideo" id=subtitle]]
+[[!template text="Professional translators have to deliver" start="00:03:24.799" video="mainVideo" id=subtitle]]
+[[!template text="fast, consistent," start="00:03:26.560" video="mainVideo" id=subtitle]]
+[[!template text="and quality translations," start="00:03:27.680" video="mainVideo" id=subtitle]]
+[[!template text="and we need to have proper tools" start="00:03:29.519" video="mainVideo" id=subtitle]]
+[[!template text="to achieve that." start="00:03:30.720" video="mainVideo" id=subtitle]]
+[[!template text="I wish po-mode was part of the toolbox," start="00:03:32.159" video="mainVideo" id=subtitle]]
+[[!template text="but that's not the case," start="00:03:34.239" video="mainVideo" id=subtitle]]
+[[!template text="and it's a pity." start="00:03:35.120" video="mainVideo" id=subtitle]]
+[[!template text="So we have to use those CAT tools." start="00:03:36.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let me show you what OmegaT looks like" start="00:03:39.760" video="mainVideo" id=subtitle]]
+[[!template text="when I open this project that I created" start="00:03:41.440" video="mainVideo" id=subtitle]]
+[[!template text="for this demonstration." start="00:03:43.120" video="mainVideo" id=subtitle]]
+[[!template text="The display is quite a mouthful," start="00:03:45.200" video="mainVideo" id=subtitle]]
+[[!template text="but you can actually modify" start="00:03:46.640" video="mainVideo" id=subtitle]]
+[[!template text="all windows as needed." start="00:03:47.760" video="mainVideo" id=subtitle]]
+[[!template text="I just want to show you" start="00:03:49.519" video="mainVideo" id=subtitle]]
+[[!template text="everything at once" start="00:03:50.400" video="mainVideo" id=subtitle]]
+[[!template text="to give you a quick idea of the thing." start="00:03:51.120" video="mainVideo" id=subtitle]]
+[[!template text="You have various colors, windows," start="00:03:53.680" video="mainVideo" id=subtitle]]
+[[!template text="and all those spaces" start="00:03:55.200" video="mainVideo" id=subtitle]]
+[[!template text="have different functions" start="00:03:55.920" video="mainVideo" id=subtitle]]
+[[!template text="that help the translator," start="00:03:57.120" video="mainVideo" id=subtitle]]
+[[!template text="and that you're probably" start="00:03:58.560" video="mainVideo" id=subtitle]]
+[[!template text="not familiar with." start="00:03:59.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I'm going to introduce you" start="00:04:02.879" video="mainVideo" id=subtitle]]
+[[!template text="to the interface now." start="00:04:04.080" video="mainVideo" id=subtitle]]
+[[!template text="So first, we have the editor." start="00:04:05.680" video="mainVideo" id=subtitle]]
+[[!template text="The editor comes in two parts:" start="00:04:07.519" video="mainVideo" id=subtitle]]
+[[!template text="the current segment," start="00:04:09.439" video="mainVideo" id=subtitle]]
+[[!template text="which is associated to a number," start="00:04:10.480" video="mainVideo" id=subtitle]]
+[[!template text="and all the other segments" start="00:04:12.319" video="mainVideo" id=subtitle]]
+[[!template text="above or below." start="00:04:13.519" video="mainVideo" id=subtitle]]
+[[!template text="At the top of the window," start="00:04:15.840" video="mainVideo" id=subtitle]]
+[[!template text="you can see the three first segments" start="00:04:16.720" video="mainVideo" id=subtitle]]
+[[!template text="that were in the .po file." start="00:04:18.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The last one here, the fourth one, comes" start="00:04:20.799" video="mainVideo" id=subtitle]]
+[[!template text="with an automatic fuzzy match insertion." start="00:04:22.880" video="mainVideo" id=subtitle]]
+[[!template text="Such legacy translations are what we" start="00:04:28.720" video="mainVideo" id=subtitle]]
+[[!template text="call &quot;translation memories&quot;." start="00:04:30.880" video="mainVideo" id=subtitle]]
+[[!template text="OmegaT has inserted this one automatically" start="00:04:32.720" video="mainVideo" id=subtitle]]
+[[!template text="because I told it to do so," start="00:04:35.280" video="mainVideo" id=subtitle]]
+[[!template text="and for my security, it comes with" start="00:04:37.120" video="mainVideo" id=subtitle]]
+[[!template text="the predefined fuzzy prefix" start="00:04:38.560" video="mainVideo" id=subtitle]]
+[[!template text="that i will have to remove" start="00:04:40.639" video="mainVideo" id=subtitle]]
+[[!template text="to validate the translation." start="00:04:41.919" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Our next feature is the glossary feature." start="00:04:44.880" video="mainVideo" id=subtitle]]
+[[!template text="In this project," start="00:04:47.919" video="mainVideo" id=subtitle]]
+[[!template text="we have a lot of glossary data." start="00:04:48.479" video="mainVideo" id=subtitle]]
+[[!template text="Some is relevant and some is not." start="00:04:50.160" video="mainVideo" id=subtitle]]
+[[!template text="In the segment that I'm translating" start="00:04:52.560" video="mainVideo" id=subtitle]]
+[[!template text="at the moment, you can see" start="00:04:53.919" video="mainVideo" id=subtitle]]
+[[!template text="underlying items." start="00:04:55.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This pop-up menu on the right" start="00:04:57.520" video="mainVideo" id=subtitle]]
+[[!template text="allows me to enter the terms as I type." start="00:04:59.040" video="mainVideo" id=subtitle]]
+[[!template text="It's kind of an auto insertion system" start="00:05:02.240" video="mainVideo" id=subtitle]]
+[[!template text="that also supports history predictions," start="00:05:04.639" video="mainVideo" id=subtitle]]
+[[!template text="predefined strings, and things like that." start="00:05:07.039" video="mainVideo" id=subtitle]]
+[[!template new="1" text="In the part on the right," start="00:05:14.479" video="mainVideo" id=subtitle]]
+[[!template text="we have reference information" start="00:05:15.440" video="mainVideo" id=subtitle]]
+[[!template text="that comes directly from" start="00:05:17.120" video="mainVideo" id=subtitle]]
+[[!template text="the .po and the .texi files." start="00:05:18.240" video="mainVideo" id=subtitle]]
+[[!template new="1" text="We also have notes that I can share" start="00:05:21.440" video="mainVideo" id=subtitle]]
+[[!template text="with fellow translators," start="00:05:23.440" video="mainVideo" id=subtitle]]
+[[!template text="and we have numbers that tell me" start="00:05:25.759" video="mainVideo" id=subtitle]]
+[[!template text="that I still have 143 segments more to go" start="00:05:28.080" video="mainVideo" id=subtitle]]
+[[!template text="before I complete this translation." start="00:05:31.199" video="mainVideo" id=subtitle]]
+[[!template text="As we see, there are plenty of strings" start="00:05:35.280" video="mainVideo" id=subtitle]]
+[[!template text="that we really don't want to have to type." start="00:05:37.120" video="mainVideo" id=subtitle]]
+[[!template text="For example, those strings" start="00:05:40.000" video="mainVideo" id=subtitle]]
+[[!template text="are typical .texi strings" start="00:05:42.160" video="mainVideo" id=subtitle]]
+[[!template text="that the translator" start="00:05:43.840" video="mainVideo" id=subtitle]]
+[[!template text="should really not have to type." start="00:05:45.039" video="mainVideo" id=subtitle]]
+[[!template text="So we're going to have to" start="00:05:46.479" video="mainVideo" id=subtitle]]
+[[!template text="do something about that." start="00:05:47.360" video="mainVideo" id=subtitle]]
+[[!template text="we're going to have to create" start="00:05:50.400" video="mainVideo" id=subtitle]]
+[[!template text="protected strings" start="00:05:51.600" video="mainVideo" id=subtitle]]
+[[!template text="with regular expressions," start="00:05:52.479" video="mainVideo" id=subtitle]]
+[[!template text="so that the strings can be visualized" start="00:05:54.400" video="mainVideo" id=subtitle]]
+[[!template text="right away in the source segment," start="00:05:56.800" video="mainVideo" id=subtitle]]
+[[!template text="entered semi-automatically" start="00:05:59.120" video="mainVideo" id=subtitle]]
+[[!template text="in the target segment," start="00:06:00.479" video="mainVideo" id=subtitle]]
+[[!template text="and checked for integrity." start="00:06:01.680" video="mainVideo" id=subtitle]]
+[[!template text="The regular expression I came up with" start="00:06:04.479" video="mainVideo" id=subtitle]]
+[[!template text="for defining most of the strings" start="00:06:06.479" video="mainVideo" id=subtitle]]
+[[!template text="is this one," start="00:06:08.160" video="mainVideo" id=subtitle]]
+[[!template text="and I'm not a regular expression pro" start="00:06:09.600" video="mainVideo" id=subtitle]]
+[[!template text="so I'm sure some of you will correct me." start="00:06:11.120" video="mainVideo" id=subtitle]]
+[[!template text="But this expression gives me" start="00:06:13.360" video="mainVideo" id=subtitle]]
+[[!template text="a good enough definition" start="00:06:14.560" video="mainVideo" id=subtitle]]
+[[!template text="even though it does not yet include" start="00:06:15.919" video="mainVideo" id=subtitle]]
+[[!template text="Org mode syntax." start="00:06:17.919" video="mainVideo" id=subtitle]]
+[[!template text="So now we have all those" start="00:06:20.960" video="mainVideo" id=subtitle]]
+[[!template text=".texi-specific things" start="00:06:22.344" video="mainVideo" id=subtitle]]
+[[!template text="that we don't want to touch" start="00:06:23.440" video="mainVideo" id=subtitle]]
+[[!template text="displayed in gray." start="00:06:24.960" video="mainVideo" id=subtitle]]
+[[!template text="Actually, you may have noticed" start="00:06:26.100" video="mainVideo" id=subtitle]]
+[[!template text="that I cheated a bit," start="00:06:27.680" video="mainVideo" id=subtitle]]
+[[!template text="because here I added the years" start="00:06:28.479" video="mainVideo" id=subtitle]]
+[[!template text="and the Free Software Foundation name" start="00:06:30.319" video="mainVideo" id=subtitle]]
+[[!template text="to the previous regular expression" start="00:06:32.000" video="mainVideo" id=subtitle]]
+[[!template text="to show you that you can protect" start="00:06:34.000" video="mainVideo" id=subtitle]]
+[[!template text="any kind of string, really." start="00:06:35.520" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So what we have now" start="00:06:38.560" video="mainVideo" id=subtitle]]
+[[!template text="is a way to visualize the strings" start="00:06:39.520" video="mainVideo" id=subtitle]]
+[[!template text="that we do not want to touch," start="00:06:41.360" video="mainVideo" id=subtitle]]
+[[!template text="but we still have to enter all of them" start="00:06:43.440" video="mainVideo" id=subtitle]]
+[[!template text="in the translation." start="00:06:45.440" video="mainVideo" id=subtitle]]
+[[!template text="For that, we have the pop-up menu" start="00:06:46.880" video="mainVideo" id=subtitle]]
+[[!template text="that I used earlier with the glossary," start="00:06:48.319" video="mainVideo" id=subtitle]]
+[[!template text="and we also have items" start="00:06:50.400" video="mainVideo" id=subtitle]]
+[[!template text="in the edit menu" start="00:06:51.520" video="mainVideo" id=subtitle]]
+[[!template text="that come with shortcuts" start="00:06:52.400" video="mainVideo" id=subtitle]]
+[[!template text="for easy insertion of missing tags." start="00:06:53.919" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Last, but certainly not least," start="00:06:57.199" video="mainVideo" id=subtitle]]
+[[!template text="we can now validate our input." start="00:06:58.800" video="mainVideo" id=subtitle]]
+[[!template text="Here, OmegaT properly tells me" start="00:07:00.800" video="mainVideo" id=subtitle]]
+[[!template text="that I made 7 protected strings," start="00:07:02.479" video="mainVideo" id=subtitle]]
+[[!template text="I entered only 1998," start="00:07:05.759" video="mainVideo" id=subtitle]]
+[[!template text="but there were five different years," start="00:07:07.599" video="mainVideo" id=subtitle]]
+[[!template text="the copyright string," start="00:07:09.280" video="mainVideo" id=subtitle]]
+[[!template text="and the FSF name string." start="00:07:10.479" video="mainVideo" id=subtitle]]
+[[!template text="With all this almost-native" start="00:07:14.240" video="mainVideo" id=subtitle]]
+[[!template text="Texinfo support," start="00:07:15.970" video="mainVideo" id=subtitle]]
+[[!template text="we have much less things to type," start="00:07:16.960" video="mainVideo" id=subtitle]]
+[[!template text="and there is a much lower" start="00:07:18.880" video="mainVideo" id=subtitle]]
+[[!template text="potential for errors." start="00:07:19.919" video="mainVideo" id=subtitle]]
+[[!template text="But we agree, it's still a lot of work." start="00:07:21.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="What we'd like now" start="00:07:25.199" video="mainVideo" id=subtitle]]
+[[!template text="is to work with fellow translators," start="00:07:26.319" video="mainVideo" id=subtitle]]
+[[!template text="and here we need to know" start="00:07:27.840" video="mainVideo" id=subtitle]]
+[[!template text="that OmegaT is actually" start="00:07:28.720" video="mainVideo" id=subtitle]]
+[[!template text="a hidden svn/git client," start="00:07:29.840" video="mainVideo" id=subtitle]]
+[[!template text="and team projects can be hosted" start="00:07:32.080" video="mainVideo" id=subtitle]]
+[[!template text="on svn/git platforms." start="00:07:34.240" video="mainVideo" id=subtitle]]
+[[!template text="Translators don't need to" start="00:07:36.319" video="mainVideo" id=subtitle]]
+[[!template text="know anything about VCS." start="00:07:37.199" video="mainVideo" id=subtitle]]
+[[!template text="They just need access credentials," start="00:07:38.880" video="mainVideo" id=subtitle]]
+[[!template text="and OmegaT commits for them." start="00:07:40.720" video="mainVideo" id=subtitle]]
+[[!template text="This way we do not have to use" start="00:07:42.400" video="mainVideo" id=subtitle]]
+[[!template text="ugly and clumsy web-based" start="00:07:44.080" video="mainVideo" id=subtitle]]
+[[!template text="translation interfaces," start="00:07:45.759" video="mainVideo" id=subtitle]]
+[[!template text="and we can use a powerful" start="00:07:47.199" video="mainVideo" id=subtitle]]
+[[!template text="offline professional tool." start="00:07:48.800" video="mainVideo" id=subtitle]]
+[[!template text="So this is how it looks" start="00:07:51.440" video="mainVideo" id=subtitle]]
+[[!template text="when you look at the platform" start="00:07:52.479" video="mainVideo" id=subtitle]]
+[[!template text="where I hosted this project." start="00:07:54.160" video="mainVideo" id=subtitle]]
+[[!template text="The last updates are from" start="00:07:55.919" video="mainVideo" id=subtitle]]
+[[!template text="20 days and 30 seconds ago" start="00:07:57.199" video="mainVideo" id=subtitle]]
+[[!template text="when I created this slide," start="00:07:58.639" video="mainVideo" id=subtitle]]
+[[!template text="and you can see that I had a partner" start="00:08:00.720" video="mainVideo" id=subtitle]]
+[[!template text="who worked with me on the same file set." start="00:08:02.479" video="mainVideo" id=subtitle]]
+[[!template text="Although it looks like" start="00:08:04.639" video="mainVideo" id=subtitle]]
+[[!template text="we actually committed the translation" start="00:08:05.520" video="mainVideo" id=subtitle]]
+[[!template text="to the platform," start="00:08:06.879" video="mainVideo" id=subtitle]]
+[[!template text="it was not us, but OmegaT." start="00:08:07.680" video="mainVideo" id=subtitle]]
+[[!template text="OmegaT does all the heavy-duty work." start="00:08:11.039" video="mainVideo" id=subtitle]]
+[[!template text="It regularly saves to" start="00:08:13.599" video="mainVideo" id=subtitle]]
+[[!template text="and syncs from the servers." start="00:08:15.039" video="mainVideo" id=subtitle]]
+[[!template text="Translators are regularly kept updated" start="00:08:16.879" video="mainVideo" id=subtitle]]
+[[!template text="with work from fellow translators" start="00:08:18.720" video="mainVideo" id=subtitle]]
+[[!template text="and when necessary," start="00:08:20.479" video="mainVideo" id=subtitle]]
+[[!template text="OmegaT offers a simple" start="00:08:21.680" video="mainVideo" id=subtitle]]
+[[!template text="conflict-resolution dialogue." start="00:08:23.360" video="mainVideo" id=subtitle]]
+[[!template text="Translators never have to do anything" start="00:08:25.440" video="mainVideo" id=subtitle]]
+[[!template text="with svn or git ever." start="00:08:27.039" video="mainVideo" id=subtitle]]
+[[!template text="And now we can envision a future" start="00:08:29.360" video="mainVideo" id=subtitle]]
+[[!template text="not so far away" start="00:08:30.800" video="mainVideo" id=subtitle]]
+[[!template text="where the manuals will be translated" start="00:08:31.599" video="mainVideo" id=subtitle]]
+[[!template text="and eventually included" start="00:08:33.120" video="mainVideo" id=subtitle]]
+[[!template text="in the distribution," start="00:08:34.159" video="mainVideo" id=subtitle]]
+[[!template text="but that's a topic" start="00:08:35.279" video="mainVideo" id=subtitle]]
+[[!template text="for a different presentation." start="00:08:36.080" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So we've reached the end of this session." start="00:08:39.760" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much again for joining it." start="00:08:42.080" video="mainVideo" id=subtitle]]
+[[!template text="There are plenty of topics" start="00:08:44.240" video="mainVideo" id=subtitle]]
+[[!template text="I promised I would not address," start="00:08:45.600" video="mainVideo" id=subtitle]]
+[[!template text="and I think I kept my promise." start="00:08:46.880" video="mainVideo" id=subtitle]]
+[[!template text="There will be a Q&A now," start="00:08:50.000" video="mainVideo" id=subtitle]]
+[[!template text="and I also started" start="00:08:51.600" video="mainVideo" id=subtitle]]
+[[!template text="a thread about this talk" start="00:08:52.517" video="mainVideo" id=subtitle]]
+[[!template text="on Reddit last saturday." start="00:08:53.600" video="mainVideo" id=subtitle]]
+[[!template text="You can find me on emacs-help" start="00:08:55.519" video="mainVideo" id=subtitle]]
+[[!template text="and emacs-devel list as well," start="00:08:57.279" video="mainVideo" id=subtitle]]
+[[!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/captions/org-outside.md b/2021/captions/org-outside.md
new file mode 100644
index 00000000..9a1cf57c
--- /dev/null
+++ b/2021/captions/org-outside.md
@@ -0,0 +1,259 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello. My name is Karl Voit," start="00:00:05.520" video="mainVideo" id=subtitle]]
+[[!template text="and I've spent the last decade" start="00:00:08.170" video="mainVideo" id=subtitle]]
+[[!template text="working with Emacs Org Mode" start="00:00:11.360" video="mainVideo" id=subtitle]]
+[[!template text="as my main organization system" start="00:00:13.040" video="mainVideo" id=subtitle]]
+[[!template text="for my use cases," start="00:00:15.280" video="mainVideo" id=subtitle]]
+[[!template text="and I would like to take this opportunity" start="00:00:16.880" video="mainVideo" id=subtitle]]
+[[!template text="and point out a subtle issue we've had" start="00:00:19.760" video="mainVideo" id=subtitle]]
+[[!template text="in many different discussions around Org Mode," start="00:00:22.480" video="mainVideo" id=subtitle]]
+[[!template text="which itself stands for" start="00:00:25.359" video="mainVideo" id=subtitle]]
+[[!template text="quite different kind of things." start="00:00:27.519" video="mainVideo" id=subtitle]]
+[[!template text="On the one hand side," start="00:00:29.679" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode is an implementation in Elisp" start="00:00:31.760" video="mainVideo" id=subtitle]]
+[[!template text="on the Emacs platform," start="00:00:34.640" video="mainVideo" id=subtitle]]
+[[!template text="and on the other hand side," start="00:00:36.559" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode is also a lightweight markup language" start="00:00:38.480" video="mainVideo" id=subtitle]]
+[[!template text="which we use to express things:" start="00:00:42.960" video="mainVideo" id=subtitle]]
+[[!template text="how headings are marked," start="00:00:45.760" video="mainVideo" id=subtitle]]
+[[!template text="how text is made boldface," start="00:00:47.440" video="mainVideo" id=subtitle]]
+[[!template text="how external links are written," start="00:00:49.840" video="mainVideo" id=subtitle]]
+[[!template text="and so forth, in text documents." start="00:00:51.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="From my own experience," start="00:01:01.920" video="mainVideo" id=subtitle]]
+[[!template text="from many different online discussions," start="00:01:03.920" video="mainVideo" id=subtitle]]
+[[!template text="I once wrote a blog article on my web page" start="00:01:05.920" video="mainVideo" id=subtitle]]
+[[!template text="that summarizes why I do think" start="00:01:09.600" video="mainVideo" id=subtitle]]
+[[!template text="that Org Mode is superior" start="00:01:11.760" video="mainVideo" id=subtitle]]
+[[!template text="to other well-known lightweight markup languages" start="00:01:13.200" video="mainVideo" id=subtitle]]
+[[!template text="such as Markdown, AsciiDoc, reStructuredText and more." start="00:01:16.000" video="mainVideo" id=subtitle]]
+[[!template text="My main points in this article were that" start="00:01:21.040" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode is an intuitive" start="00:01:23.360" video="mainVideo" id=subtitle]]
+[[!template text="and easy to learn and remember markup." start="00:01:25.040" video="mainVideo" id=subtitle]]
+[[!template text="It is standardized," start="00:01:28.000" video="mainVideo" id=subtitle]]
+[[!template text="as in the Emacs implementation" start="00:01:29.360" video="mainVideo" id=subtitle]]
+[[!template text="defines the current standard," start="00:01:31.439" video="mainVideo" id=subtitle]]
+[[!template text="and there is no different Org mode version" start="00:01:32.799" video="mainVideo" id=subtitle]]
+[[!template text="out there which conflicts with that." start="00:01:35.360" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode is consistent" start="00:01:38.159" video="mainVideo" id=subtitle]]
+[[!template text="within its markup language design." start="00:01:41.040" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode can be easily typed in any text-based tool," start="00:01:44.159" video="mainVideo" id=subtitle]]
+[[!template text="and Org Mode makes much sense outside of Emacs," start="00:01:48.640" video="mainVideo" id=subtitle]]
+[[!template text="so that you can use it, for example," start="00:01:53.280" video="mainVideo" id=subtitle]]
+[[!template text="in email clients or in other text documents" start="00:01:55.360" video="mainVideo" id=subtitle]]
+[[!template text="not interpreting the markup at all." start="00:01:58.719" video="mainVideo" id=subtitle]]
+[[!template text="And of course, if you want," start="00:02:01.040" video="mainVideo" id=subtitle]]
+[[!template text="you can have the perfect tool support within Emacs" start="00:02:03.280" video="mainVideo" id=subtitle]]
+[[!template text="and other software tools." start="00:02:06.640" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This naming issue," start="00:02:13.760" video="mainVideo" id=subtitle]]
+[[!template text="using one name for two different kind of things," start="00:02:15.440" video="mainVideo" id=subtitle]]
+[[!template text="arises in discussions about the markup's support" start="00:02:18.560" video="mainVideo" id=subtitle]]
+[[!template text="in non-Emacs tools and services," start="00:02:22.239" video="mainVideo" id=subtitle]]
+[[!template text="in questions on levels of compatibility" start="00:02:24.560" video="mainVideo" id=subtitle]]
+[[!template text="in comparison to the large and huge" start="00:02:27.440" video="mainVideo" id=subtitle]]
+[[!template text="amount of functionality within Emacs," start="00:02:30.080" video="mainVideo" id=subtitle]]
+[[!template text="and so forth." start="00:02:32.959" video="mainVideo" id=subtitle]]
+[[!template new="1" text="In order to find a solution" start="00:02:36.319" video="mainVideo" id=subtitle]]
+[[!template text="to some of those issues," start="00:02:38.000" video="mainVideo" id=subtitle]]
+[[!template text="I propose a different name. A new idea." start="00:02:40.160" video="mainVideo" id=subtitle]]
+[[!template text="A definition for the lightweight markup language," start="00:02:44.480" video="mainVideo" id=subtitle]]
+[[!template text="and the lightweight markup language alone." start="00:02:47.360" video="mainVideo" id=subtitle]]
+[[!template text="A new standard, which, by the way," start="00:02:51.200" video="mainVideo" id=subtitle]]
+[[!template text="reminds me on something here..." start="00:02:54.000" video="mainVideo" id=subtitle]]
+[[!template text="Anyway..." start="00:02:57.680" video="mainVideo" id=subtitle]]
+[[!template text="So we need a different name" start="00:03:05.200" video="mainVideo" id=subtitle]]
+[[!template text="for this new thing," start="00:03:06.640" video="mainVideo" id=subtitle]]
+[[!template text="and its feature set needs to be" start="00:03:08.159" video="mainVideo" id=subtitle]]
+[[!template text="something good enough" start="00:03:09.840" video="mainVideo" id=subtitle]]
+[[!template text="to help adapting Org Mode syntax" start="00:03:11.760" video="mainVideo" id=subtitle]]
+[[!template text="outside of the Emacs universe." start="00:03:14.000" video="mainVideo" id=subtitle]]
+[[!template text="It can't be the whole set of Org Mode features." start="00:03:16.560" video="mainVideo" id=subtitle]]
+[[!template text="This would kill the idea instantly," start="00:03:19.760" video="mainVideo" id=subtitle]]
+[[!template text="because everything that is going" start="00:03:21.680" video="mainVideo" id=subtitle]]
+[[!template text="into that direction" start="00:03:23.519" video="mainVideo" id=subtitle]]
+[[!template text="would be compared to our golden standards," start="00:03:24.720" video="mainVideo" id=subtitle]]
+[[!template text="the Emacs implementation of Org Mode," start="00:03:26.959" video="mainVideo" id=subtitle]]
+[[!template text="which cannot be compared" start="00:03:29.280" video="mainVideo" id=subtitle]]
+[[!template text="to anything else at this time." start="00:03:31.120" video="mainVideo" id=subtitle]]
+[[!template text="So it needs to be somehow less than Org Mode." start="00:03:33.599" video="mainVideo" id=subtitle]]
+[[!template text="It needs to be recognizable in non-Emacs circles," start="00:03:37.040" video="mainVideo" id=subtitle]]
+[[!template text="and it should remind people" start="00:03:41.040" video="mainVideo" id=subtitle]]
+[[!template text="on similar things" start="00:03:42.720" video="mainVideo" id=subtitle]]
+[[!template text="in order to be something" start="00:03:43.920" video="mainVideo" id=subtitle]]
+[[!template text="somewhat self-explanatory as a term." start="00:03:45.760" video="mainVideo" id=subtitle]]
+[[!template text="Hereby, I propose the name Orgdown" start="00:03:49.760" video="mainVideo" id=subtitle]]
+[[!template text="for this thing, and it's launched" start="00:03:54.000" video="mainVideo" id=subtitle]]
+[[!template text="with my Emacs Conference talk 2021." start="00:03:56.000" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So what should Orgdown be?" start="00:04:06.239" video="mainVideo" id=subtitle]]
+[[!template text="It should be a subset of Org Mode" start="00:04:09.360" video="mainVideo" id=subtitle]]
+[[!template text="lightweight markup language syntax." start="00:04:11.439" video="mainVideo" id=subtitle]]
+[[!template text="It should be a definition of" start="00:04:14.400" video="mainVideo" id=subtitle]]
+[[!template text="Org-Mode-based entities" start="00:04:17.120" video="mainVideo" id=subtitle]]
+[[!template text="that do make sense on their own" start="00:04:18.880" video="mainVideo" id=subtitle]]
+[[!template text="which is, in any case," start="00:04:20.880" video="mainVideo" id=subtitle]]
+[[!template text="always a compromise of some sort, of course." start="00:04:22.720" video="mainVideo" id=subtitle]]
+[[!template text="It needs to be extensible for different purposes" start="00:04:26.320" video="mainVideo" id=subtitle]]
+[[!template text="to ensure future-proofness," start="00:04:29.919" video="mainVideo" id=subtitle]]
+[[!template text="and it needs to have" start="00:04:32.560" video="mainVideo" id=subtitle]]
+[[!template text="a formal definition of Org Mode," start="00:04:33.600" video="mainVideo" id=subtitle]]
+[[!template text="which helps in becoming a new standard." start="00:04:35.919" video="mainVideo" id=subtitle]]
+[[!template text="it needs to be a self-sustaining community" start="00:04:39.680" video="mainVideo" id=subtitle]]
+[[!template text="that supports the process by documentation" start="00:04:42.160" video="mainVideo" id=subtitle]]
+[[!template text="and connecting people to other people," start="00:04:45.040" video="mainVideo" id=subtitle]]
+[[!template text="to the documentation, and to tools." start="00:04:48.320" video="mainVideo" id=subtitle]]
+[[!template text="What Orgdown should never be" start="00:04:52.080" video="mainVideo" id=subtitle]]
+[[!template text="is something that's incompatible" start="00:04:54.800" video="mainVideo" id=subtitle]]
+[[!template text="with Org Mode within Emacs," start="00:04:57.280" video="mainVideo" id=subtitle]]
+[[!template text="and some kind of Org Mode replacement, of course." start="00:04:59.759" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The advantages of Orgdown for everybody" start="00:05:08.560" video="mainVideo" id=subtitle]]
+[[!template text="includes better Org support in non-Emacs tools;" start="00:05:12.160" video="mainVideo" id=subtitle]]
+[[!template text="to promote the beautifully crafted Org Mode syntax" start="00:05:16.800" video="mainVideo" id=subtitle]]
+[[!template text="to a larger set of people," start="00:05:19.759" video="mainVideo" id=subtitle]]
+[[!template text="even outside of Emacs, of course;" start="00:05:21.520" video="mainVideo" id=subtitle]]
+[[!template text="to push better support for the collaboration" start="00:05:23.759" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs and non-Emacs users" start="00:05:26.560" video="mainVideo" id=subtitle]]
+[[!template text="for using text-based documents;" start="00:05:28.800" video="mainVideo" id=subtitle]]
+[[!template text="finally, fix the irritating mix-up of" start="00:05:31.759" video="mainVideo" id=subtitle]]
+[[!template text="markup language support" start="00:05:35.919" video="mainVideo" id=subtitle]]
+[[!template text="and its Elisp implementation." start="00:05:37.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I already mentioned briefly the need for" start="00:05:41.680" video="mainVideo" id=subtitle]]
+[[!template text="a definition and extensibility." start="00:05:44.000" video="mainVideo" id=subtitle]]
+[[!template text="Therefore I came up with the idea" start="00:05:47.039" video="mainVideo" id=subtitle]]
+[[!template text="of having different levels of Orgdown," start="00:05:48.960" video="mainVideo" id=subtitle]]
+[[!template text="and the first and most basic level of Orgdown" start="00:05:52.320" video="mainVideo" id=subtitle]]
+[[!template text="is called Orgdown1." start="00:05:56.400" video="mainVideo" id=subtitle]]
+[[!template text="Orgdown1, or in short, OD1, consists of" start="00:06:05.600" video="mainVideo" id=subtitle]]
+[[!template text="a small set of Org-Mode-based features" start="00:06:09.759" video="mainVideo" id=subtitle]]
+[[!template text="such as simple text formatting, headings, lists," start="00:06:11.759" video="mainVideo" id=subtitle]]
+[[!template text="and checkboxes, example, quote, and source blocks," start="00:06:15.759" video="mainVideo" id=subtitle]]
+[[!template text="comments, external web links," start="00:06:19.520" video="mainVideo" id=subtitle]]
+[[!template text="tables without calculations." start="00:06:22.479" video="mainVideo" id=subtitle]]
+[[!template text="I tried to find a compromise" start="00:06:25.280" video="mainVideo" id=subtitle]]
+[[!template text="that should work with most people" start="00:06:27.120" video="mainVideo" id=subtitle]]
+[[!template text="starting with any lightweight markup" start="00:06:29.199" video="mainVideo" id=subtitle]]
+[[!template text="that is based on Emacs Org Mode." start="00:06:31.600" video="mainVideo" id=subtitle]]
+[[!template text="In order to get a measure" start="00:06:39.759" video="mainVideo" id=subtitle]]
+[[!template text="on how well Orgdown1 is supported" start="00:06:41.199" video="mainVideo" id=subtitle]]
+[[!template text="by one specific tool," start="00:06:43.759" video="mainVideo" id=subtitle]]
+[[!template text="I came up with an OD1" start="00:06:45.919" video="mainVideo" id=subtitle]]
+[[!template text="compatibility percentage index." start="00:06:47.759" video="mainVideo" id=subtitle]]
+[[!template text="43 easy-to-check features such as:" start="00:06:51.199" video="mainVideo" id=subtitle]]
+[[!template text="does it support highlighting of bold text" start="00:06:54.080" video="mainVideo" id=subtitle]]
+[[!template text="using single asterisks?" start="00:06:56.800" video="mainVideo" id=subtitle]]
+[[!template text="Each feature can be supported" start="00:06:59.039" video="mainVideo" id=subtitle]]
+[[!template text="in a basic way (one point)" start="00:07:00.800" video="mainVideo" id=subtitle]]
+[[!template text="or in an advanced way (two points)." start="00:07:02.880" video="mainVideo" id=subtitle]]
+[[!template text="One point means it basically" start="00:07:06.319" video="mainVideo" id=subtitle]]
+[[!template text="doesn't interfere with the tool" start="00:07:08.319" video="mainVideo" id=subtitle]]
+[[!template text="in any negative way." start="00:07:10.080" video="mainVideo" id=subtitle]]
+[[!template text="Two points means that it provides" start="00:07:12.000" video="mainVideo" id=subtitle]]
+[[!template text="active syntax highlighting, for example," start="00:07:14.479" video="mainVideo" id=subtitle]]
+[[!template text="or even tool-supported features" start="00:07:16.720" video="mainVideo" id=subtitle]]
+[[!template text="like shortcuts to insert elements and such." start="00:07:18.479" video="mainVideo" id=subtitle]]
+[[!template text="Summing up those two levels" start="00:07:22.960" video="mainVideo" id=subtitle]]
+[[!template text="for all those 43 features" start="00:07:24.880" video="mainVideo" id=subtitle]]
+[[!template text="result in a number" start="00:07:27.280" video="mainVideo" id=subtitle]]
+[[!template text="that can be compared" start="00:07:28.479" video="mainVideo" id=subtitle]]
+[[!template text="to the maximum level there is," start="00:07:29.919" video="mainVideo" id=subtitle]]
+[[!template text="which results in a given percentage." start="00:07:32.319" video="mainVideo" id=subtitle]]
+[[!template new="1" text="By definition," start="00:07:36.319" video="mainVideo" id=subtitle]]
+[[!template text="Emacs provides full support" start="00:07:37.919" video="mainVideo" id=subtitle]]
+[[!template text="of all Orgdown levels," start="00:07:40.479" video="mainVideo" id=subtitle]]
+[[!template text="and most tools support" start="00:07:43.360" video="mainVideo" id=subtitle]]
+[[!template text="at least fifty percent of Orgdown1" start="00:07:45.360" video="mainVideo" id=subtitle]]
+[[!template text="as long as Orgdown1 syntax" start="00:07:48.240" video="mainVideo" id=subtitle]]
+[[!template text="doesn't result in some markup conflict" start="00:07:50.400" video="mainVideo" id=subtitle]]
+[[!template text="or tooling conflict or whatever." start="00:07:52.720" video="mainVideo" id=subtitle]]
+[[!template text="This emphasizes the idea" start="00:07:57.039" video="mainVideo" id=subtitle]]
+[[!template text="that Orgdown can and should be used" start="00:07:58.560" video="mainVideo" id=subtitle]]
+[[!template text="for personal notes anywhere and in general domains," start="00:08:01.360" video="mainVideo" id=subtitle]]
+[[!template text="just like writing emails, for example." start="00:08:04.879" video="mainVideo" id=subtitle]]
+[[!template text="I guess the majority of tools" start="00:08:07.919" video="mainVideo" id=subtitle]]
+[[!template text="with a certain support for Orgdown1" start="00:08:10.000" video="mainVideo" id=subtitle]]
+[[!template text="will be in the area of 80s and 90s, percentwise." start="00:08:12.720" video="mainVideo" id=subtitle]]
+[[!template text="If Orgdown1 is not enough," start="00:08:18.080" video="mainVideo" id=subtitle]]
+[[!template text="there will be future definitions" start="00:08:20.639" video="mainVideo" id=subtitle]]
+[[!template text="of Orgdown2, 3, or higher" start="00:08:22.400" video="mainVideo" id=subtitle]]
+[[!template text="which will take more and more syntax elements" start="00:08:24.960" video="mainVideo" id=subtitle]]
+[[!template text="from the Org Mode syntax" start="00:08:27.599" video="mainVideo" id=subtitle]]
+[[!template text="and integrate it into" start="00:08:29.039" video="mainVideo" id=subtitle]]
+[[!template text="the domain of Orgdown." start="00:08:30.479" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So far, Orgdown1 is described" start="00:08:39.519" video="mainVideo" id=subtitle]]
+[[!template text="on a public GitLab page" start="00:08:42.000" video="mainVideo" id=subtitle]]
+[[!template text="which has already documentation" start="00:08:43.599" video="mainVideo" id=subtitle]]
+[[!template text="on how to learn Orgdown," start="00:08:45.920" video="mainVideo" id=subtitle]]
+[[!template text="some syntax examples," start="00:08:48.399" video="mainVideo" id=subtitle]]
+[[!template text="frequently asked questions," start="00:08:50.560" video="mainVideo" id=subtitle]]
+[[!template text="and of course, with their answers," start="00:08:51.839" video="mainVideo" id=subtitle]]
+[[!template text="a collection of tools" start="00:08:54.240" video="mainVideo" id=subtitle]]
+[[!template text="that already do support Orgdown in some way," start="00:08:55.920" video="mainVideo" id=subtitle]]
+[[!template text="and a few of them did already" start="00:08:59.279" video="mainVideo" id=subtitle]]
+[[!template text="get evaluated by me" start="00:09:01.040" video="mainVideo" id=subtitle]]
+[[!template text="and got their OD1 compatibility percentage" start="00:09:02.640" video="mainVideo" id=subtitle]]
+[[!template text="in a table." start="00:09:05.920" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Some ideas on how people can contribute" start="00:09:07.279" video="mainVideo" id=subtitle]]
+[[!template text="to this new standard" start="00:09:09.839" video="mainVideo" id=subtitle]]
+[[!template text="is also part of this new site." start="00:09:11.040" video="mainVideo" id=subtitle]]
+[[!template text="And of course, now I need your help" start="00:09:13.839" video="mainVideo" id=subtitle]]
+[[!template text="in order to make this a success story" start="00:09:17.200" video="mainVideo" id=subtitle]]
+[[!template text="for Org Mode and of course Orgdown." start="00:09:19.519" video="mainVideo" id=subtitle]]
+[[!template text="So please do contribute" start="00:09:28.880" video="mainVideo" id=subtitle]]
+[[!template text="to the GitLab project pages" start="00:09:31.360" video="mainVideo" id=subtitle]]
+[[!template text="and add tools and their Orgdown1-compatible percentages." start="00:09:33.279" video="mainVideo" id=subtitle]]
+[[!template text="For example, a template file is provided," start="00:09:38.000" video="mainVideo" id=subtitle]]
+[[!template text="of course." start="00:09:40.800" video="mainVideo" id=subtitle]]
+[[!template text="Please do add more parsers." start="00:09:41.839" video="mainVideo" id=subtitle]]
+[[!template text="Please use the term Orgdown1" start="00:09:43.680" video="mainVideo" id=subtitle]]
+[[!template text="to label tool properties" start="00:09:46.320" video="mainVideo" id=subtitle]]
+[[!template text="for your own stuff" start="00:09:48.080" video="mainVideo" id=subtitle]]
+[[!template text="and so that people do realize" start="00:09:49.440" video="mainVideo" id=subtitle]]
+[[!template text="that your tools are already supporting" start="00:09:51.760" video="mainVideo" id=subtitle]]
+[[!template text="this general use case of Org Mode." start="00:09:53.839" video="mainVideo" id=subtitle]]
+[[!template text="And there is no need to support" start="00:09:56.800" video="mainVideo" id=subtitle]]
+[[!template text="all the Org Mode" start="00:09:58.640" video="mainVideo" id=subtitle]]
+[[!template text="in order to profit from Org Mode syntax" start="00:09:59.680" video="mainVideo" id=subtitle]]
+[[!template text="with Orgdown." start="00:10:02.160" video="mainVideo" id=subtitle]]
+[[!template text="You can spread the idea" start="00:10:04.320" video="mainVideo" id=subtitle]]
+[[!template text="by promoting Orgdown" start="00:10:05.839" video="mainVideo" id=subtitle]]
+[[!template text="as a separate term" start="00:10:07.279" video="mainVideo" id=subtitle]]
+[[!template text="compared to Org Mode" start="00:10:08.480" video="mainVideo" id=subtitle]]
+[[!template text="and its mixed up definition" start="00:10:09.680" video="mainVideo" id=subtitle]]
+[[!template text="with the Org Mode Elisp implementation." start="00:10:11.279" video="mainVideo" id=subtitle]]
+[[!template text="And in case that Orgdown" start="00:10:21.279" video="mainVideo" id=subtitle]]
+[[!template text="really resonates with you," start="00:10:23.120" video="mainVideo" id=subtitle]]
+[[!template text="you can add a formal specification" start="00:10:24.880" video="mainVideo" id=subtitle]]
+[[!template text="to the GitLab project of Orgdown." start="00:10:26.959" video="mainVideo" id=subtitle]]
+[[!template text="I guess that some of the" start="00:10:29.279" video="mainVideo" id=subtitle]]
+[[!template text="existing formal definitions of Org Mode" start="00:10:30.480" video="mainVideo" id=subtitle]]
+[[!template text="already do qualify for Orgdown1" start="00:10:33.040" video="mainVideo" id=subtitle]]
+[[!template text="by stripping down to the few things" start="00:10:35.760" video="mainVideo" id=subtitle]]
+[[!template text="Orgdown1 is concentrating on." start="00:10:37.920" video="mainVideo" id=subtitle]]
+[[!template new="1" text="You can create, for example," start="00:10:41.279" video="mainVideo" id=subtitle]]
+[[!template text="a language server protocol for Orgdown1" start="00:10:42.720" video="mainVideo" id=subtitle]]
+[[!template text="which would multiply the possibilities" start="00:10:45.760" video="mainVideo" id=subtitle]]
+[[!template text="for adapting Orgdown1" start="00:10:48.000" video="mainVideo" id=subtitle]]
+[[!template text="in all kinds of editors" start="00:10:50.000" video="mainVideo" id=subtitle]]
+[[!template text="by giving syntax highlighting, for example." start="00:10:51.760" video="mainVideo" id=subtitle]]
+[[!template text="And you may find the idea intriguing" start="00:11:00.880" video="mainVideo" id=subtitle]]
+[[!template text="that Orgdown1 is a perfect markup language candidate" start="00:11:03.200" video="mainVideo" id=subtitle]]
+[[!template text="for the Gemini project," start="00:11:07.440" video="mainVideo" id=subtitle]]
+[[!template text="which would be, in short," start="00:11:09.920" video="mainVideo" id=subtitle]]
+[[!template text="a linked web of plain Orgdown1 files" start="00:11:11.200" video="mainVideo" id=subtitle]]
+[[!template text="that form a parallel internet" start="00:11:14.240" video="mainVideo" id=subtitle]]
+[[!template text="without advertisements," start="00:11:16.160" video="mainVideo" id=subtitle]]
+[[!template text="malware-bloated web pages, and so forth." start="00:11:17.839" video="mainVideo" id=subtitle]]
+[[!template text="It's concentrating" start="00:11:20.880" video="mainVideo" id=subtitle]]
+[[!template text="on the essential value of information" start="00:11:22.160" video="mainVideo" id=subtitle]]
+[[!template text="in form of simple text files" start="00:11:23.920" video="mainVideo" id=subtitle]]
+[[!template text="and links to other simple text files." start="00:11:26.399" video="mainVideo" id=subtitle]]
+[[!template text="I would love to see this. happen someday" start="00:11:29.279" video="mainVideo" id=subtitle]]
+[[!template text="In the meantime, let's kick-start Orgdown" start="00:11:39.760" video="mainVideo" id=subtitle]]
+[[!template text="with Orgdown1 as the first level." start="00:11:42.560" video="mainVideo" id=subtitle]]
+[[!template text="Visit the GitLab page," start="00:11:45.120" video="mainVideo" id=subtitle]]
+[[!template text="hand in improvements for the linked tool sections," start="00:11:46.880" video="mainVideo" id=subtitle]]
+[[!template text="and spread the brilliant markup design" start="00:11:49.600" video="mainVideo" id=subtitle]]
+[[!template text="of Org Mode," start="00:11:52.240" video="mainVideo" id=subtitle]]
+[[!template text="using Orgdown as a well-defined" start="00:11:52.880" video="mainVideo" id=subtitle]]
+[[!template text="new standard." start="00:11:56.000" video="mainVideo" id=subtitle]]
+[[!template text="Thank you." start="00:11:57.839" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/pattern.md b/2021/captions/pattern.md
new file mode 100644
index 00000000..eb92e453
--- /dev/null
+++ b/2021/captions/pattern.md
@@ -0,0 +1,627 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Welcome to this EmacsConf 2021 talk" start="00:00:01.040" video="mainVideo" id=subtitle]]
+[[!template text="on Emacs as Design Pattern Learning." start="00:00:03.520" video="mainVideo" id=subtitle]]
+[[!template text="I'm Greta Goetz, and this talk" start="00:00:06.160" video="mainVideo" id=subtitle]]
+[[!template text="is for people who are interested" start="00:00:08.400" video="mainVideo" id=subtitle]]
+[[!template text="in thinking about Emacs" start="00:00:10.080" video="mainVideo" id=subtitle]]
+[[!template text="as a tool that's sophisticated enough" start="00:00:11.679" video="mainVideo" id=subtitle]]
+[[!template text="not only to cope with activities and tasks," start="00:00:13.840" video="mainVideo" id=subtitle]]
+[[!template text="but also sophisticated enough" start="00:00:17.680" video="mainVideo" id=subtitle]]
+[[!template text="to cater to a complex assemblage" start="00:00:19.760" video="mainVideo" id=subtitle]]
+[[!template text="of not just tasks and activities," start="00:00:22.560" video="mainVideo" id=subtitle]]
+[[!template text="but also people, outcomes," start="00:00:24.000" video="mainVideo" id=subtitle]]
+[[!template text="as well as tools." start="00:00:26.160" video="mainVideo" id=subtitle]]
+[[!template text="This is a definition of epistemic fluency" start="00:00:27.760" video="mainVideo" id=subtitle]]
+[[!template text="from a work by Markauskaite and Goodyear" start="00:00:31.039" video="mainVideo" id=subtitle]]
+[[!template text="that is relevant to us" start="00:00:33.440" video="mainVideo" id=subtitle]]
+[[!template text="if we're interested in" start="00:00:35.040" video="mainVideo" id=subtitle]]
+[[!template text="learning how to learn and" start="00:00:36.320" video="mainVideo" id=subtitle]]
+[[!template text="how to continuously iterate knowledge" start="00:00:37.600" video="mainVideo" id=subtitle]]
+[[!template text="to fit changing complex specific contexts." start="00:00:39.840" video="mainVideo" id=subtitle]]
+[[!template text="Some software oversimplifies." start="00:00:44.480" video="mainVideo" id=subtitle]]
+[[!template text="Emacs both helps users" start="00:00:46.719" video="mainVideo" id=subtitle]]
+[[!template text="implement design pattern learning" start="00:00:49.039" video="mainVideo" id=subtitle]]
+[[!template text="that can cope with complexity," start="00:00:50.559" video="mainVideo" id=subtitle]]
+[[!template text="and it models complex design pattern learning." start="00:00:53.360" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, what do we mean by design patterns?" start="00:00:57.360" video="mainVideo" id=subtitle]]
+[[!template text="The term comes from design theorist and" start="00:00:59.920" video="mainVideo" id=subtitle]]
+[[!template text="architect Christopher Alexander," start="00:01:03.120" video="mainVideo" id=subtitle]]
+[[!template text="whose work influenced" start="00:01:05.199" video="mainVideo" id=subtitle]]
+[[!template text="a broad variety of disciplines." start="00:01:06.400" video="mainVideo" id=subtitle]]
+[[!template text="I'll be drawing on a work in programming" start="00:01:08.479" video="mainVideo" id=subtitle]]
+[[!template text="by Richard Gabriel, and in pedagogy," start="00:01:11.680" video="mainVideo" id=subtitle]]
+[[!template text="by Peter Goodyear." start="00:01:14.240" video="mainVideo" id=subtitle]]
+[[!template text="What are design patterns?" start="00:01:16.240" video="mainVideo" id=subtitle]]
+[[!template text="They are patterns of micro solutions" start="00:01:17.920" video="mainVideo" id=subtitle]]
+[[!template text="combining method and artifact," start="00:01:20.159" video="mainVideo" id=subtitle]]
+[[!template text="and macro solutions" start="00:01:22.560" video="mainVideo" id=subtitle]]
+[[!template text="of these micro patterns" start="00:01:24.080" video="mainVideo" id=subtitle]]
+[[!template text="when viewed together." start="00:01:25.680" video="mainVideo" id=subtitle]]
+[[!template text="This approach allows for the" start="00:01:27.680" video="mainVideo" id=subtitle]]
+[[!template text="specialization, customization," start="00:01:29.280" video="mainVideo" id=subtitle]]
+[[!template text="extension, and reuse of patterns." start="00:01:31.840" video="mainVideo" id=subtitle]]
+[[!template text="This is useful if we're seeking to" start="00:01:35.600" video="mainVideo" id=subtitle]]
+[[!template text="deal with complexity. It helps extend" start="00:01:37.360" video="mainVideo" id=subtitle]]
+[[!template text="the assemblage of learning components" start="00:01:40.079" video="mainVideo" id=subtitle]]
+[[!template text="that we have, without having to build" start="00:01:42.560" video="mainVideo" id=subtitle]]
+[[!template text="from scratch." start="00:01:45.040" video="mainVideo" id=subtitle]]
+[[!template text="Another important feature" start="00:01:46.640" video="mainVideo" id=subtitle]]
+[[!template text="of design patterns" start="00:01:48.320" video="mainVideo" id=subtitle]]
+[[!template text="and their relevance to Emacs" start="00:01:49.520" video="mainVideo" id=subtitle]]
+[[!template text="is the human-centeredness." start="00:01:51.759" video="mainVideo" id=subtitle]]
+[[!template text="Christopher Alexander critiqued" start="00:01:54.799" video="mainVideo" id=subtitle]]
+[[!template text="the mechanical" start="00:01:57.360" video="mainVideo" id=subtitle]]
+[[!template text="and championed the human place." start="00:01:58.320" video="mainVideo" id=subtitle]]
+[[!template text="Emacs, too, champions the human place." start="00:02:00.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So why Emacs and design learning?" start="00:02:03.439" video="mainVideo" id=subtitle]]
+[[!template text="One reason is indeed this extensibility" start="00:02:06.079" video="mainVideo" id=subtitle]]
+[[!template text="through Emacs, which allows a person" start="00:02:09.679" video="mainVideo" id=subtitle]]
+[[!template text="to extend their learning and use of Emacs" start="00:02:13.360" video="mainVideo" id=subtitle]]
+[[!template text="as far as they wish to take it." start="00:02:16.720" video="mainVideo" id=subtitle]]
+[[!template text="This is thanks to its free software core," start="00:02:18.800" video="mainVideo" id=subtitle]]
+[[!template text="and this permits what we call" start="00:02:22.959" video="mainVideo" id=subtitle]]
+[[!template text="in networked learning" start="00:02:24.720" video="mainVideo" id=subtitle]]
+[[!template text="'e-quality' cf. Beaty et al.," start="00:02:25.843" video="mainVideo" id=subtitle]]
+[[!template text="which is to say," start="00:02:27.040" video="mainVideo" id=subtitle]]
+[[!template text="the opportunity to co-create knowledge." start="00:02:28.160" video="mainVideo" id=subtitle]]
+[[!template text="So if one wishes to extend" start="00:02:31.120" video="mainVideo" id=subtitle]]
+[[!template text="their learning trajectory with Emacs" start="00:02:32.959" video="mainVideo" id=subtitle]]
+[[!template text="such that they're able to" start="00:02:35.120" video="mainVideo" id=subtitle]]
+[[!template text="write packages for Emacs," start="00:02:37.120" video="mainVideo" id=subtitle]]
+[[!template text="if these packages become part of the core," start="00:02:38.560" video="mainVideo" id=subtitle]]
+[[!template text="they're really co-creating knowledge" start="00:02:41.040" video="mainVideo" id=subtitle]]
+[[!template text="within the community" start="00:02:43.440" video="mainVideo" id=subtitle]]
+[[!template text="and extending the capabilities of Emacs." start="00:02:44.879" video="mainVideo" id=subtitle]]
+[[!template text="Emacs can also be considered" start="00:02:48.800" video="mainVideo" id=subtitle]]
+[[!template text="in terms of design pattern learning," start="00:02:50.480" video="mainVideo" id=subtitle]]
+[[!template text="because it can be used" start="00:02:52.319" video="mainVideo" id=subtitle]]
+[[!template text="for different purposes." start="00:02:53.440" video="mainVideo" id=subtitle]]
+[[!template text="This is true even at the very basic level" start="00:02:54.800" video="mainVideo" id=subtitle]]
+[[!template text="of Emacs functionalities," start="00:02:57.280" video="mainVideo" id=subtitle]]
+[[!template text="which is a point" start="00:02:58.959" video="mainVideo" id=subtitle]]
+[[!template text="that should really be stressed." start="00:02:59.920" video="mainVideo" id=subtitle]]
+[[!template text="So even newcomers coming to Emacs" start="00:03:01.280" video="mainVideo" id=subtitle]]
+[[!template text="who don't know programming" start="00:03:03.680" video="mainVideo" id=subtitle]]
+[[!template text="can do a very broad variety" start="00:03:04.879" video="mainVideo" id=subtitle]]
+[[!template text="of different things with their Emacs," start="00:03:07.040" video="mainVideo" id=subtitle]]
+[[!template text="using these basic functionalities:" start="00:03:09.040" video="mainVideo" id=subtitle]]
+[[!template text="for example, simply by customizing" start="00:03:11.760" video="mainVideo" id=subtitle]]
+[[!template text="the language variable" start="00:03:14.800" video="mainVideo" id=subtitle]]
+[[!template text="in the initialization file." start="00:03:15.840" video="mainVideo" id=subtitle]]
+[[!template text="This, thanks to the powerful Emacs Lisp" start="00:03:17.923" video="mainVideo" id=subtitle]]
+[[!template text="interpreter, makes it possible for one" start="00:03:20.879" video="mainVideo" id=subtitle]]
+[[!template text="to do a wide variety of different things" start="00:03:22.640" video="mainVideo" id=subtitle]]
+[[!template text="within Emacs: from making graphs" start="00:03:24.640" video="mainVideo" id=subtitle]]
+[[!template text="to exporting in LaTeX." start="00:03:26.560" video="mainVideo" id=subtitle]]
+[[!template text="And also part of the Emacs basic" start="00:03:29.360" video="mainVideo" id=subtitle]]
+[[!template text="functionalities are" start="00:03:32.000" video="mainVideo" id=subtitle]]
+[[!template text="how we can cycle through" start="00:03:34.239" video="mainVideo" id=subtitle]]
+[[!template text="different tasks and texts very easily" start="00:03:36.159" video="mainVideo" id=subtitle]]
+[[!template text="through buffer cycling," start="00:03:38.400" video="mainVideo" id=subtitle]]
+[[!template text="or how within Org we can use tree outlines" start="00:03:40.000" video="mainVideo" id=subtitle]]
+[[!template text="that can hierarchize the material" start="00:03:44.640" video="mainVideo" id=subtitle]]
+[[!template text="that we're working with" start="00:03:48.159" video="mainVideo" id=subtitle]]
+[[!template text="and even change a headline" start="00:03:49.519" video="mainVideo" id=subtitle]]
+[[!template text="into a to-do. So we see this extensibility," start="00:03:52.080" video="mainVideo" id=subtitle]]
+[[!template text="this flexibility. Also, within Org," start="00:03:54.799" video="mainVideo" id=subtitle]]
+[[!template text="we can see how by writing" start="00:03:57.280" video="mainVideo" id=subtitle]]
+[[!template text="just a few lines of code" start="00:03:58.799" video="mainVideo" id=subtitle]]
+[[!template text="such as through header arguments" start="00:04:00.159" video="mainVideo" id=subtitle]]
+[[!template text="or code blocks, we can change the way" start="00:04:02.239" video="mainVideo" id=subtitle]]
+[[!template text="in which a file," start="00:04:04.879" video="mainVideo" id=subtitle]]
+[[!template text="or part of a file, is executed." start="00:04:06.159" video="mainVideo" id=subtitle]]
+[[!template text="An illustration of what this means" start="00:04:08.480" video="mainVideo" id=subtitle]]
+[[!template text="to the beginner would be how easy it is" start="00:04:10.239" video="mainVideo" id=subtitle]]
+[[!template text="to export a LaTeX file," start="00:04:12.720" video="mainVideo" id=subtitle]]
+[[!template text="so one doesn't even need to know" start="00:04:15.280" video="mainVideo" id=subtitle]]
+[[!template text="all of LaTeX to be able to implement" start="00:04:17.040" video="mainVideo" id=subtitle]]
+[[!template text="parts of LaTeX within Org. So this" start="00:04:19.199" video="mainVideo" id=subtitle]]
+[[!template text="variety of different purposes, then," start="00:04:23.360" video="mainVideo" id=subtitle]]
+[[!template text="can be experienced by the beginner." start="00:04:25.280" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs is also an example" start="00:04:27.600" video="mainVideo" id=subtitle]]
+[[!template text="of design pattern learning" start="00:04:30.400" video="mainVideo" id=subtitle]]
+[[!template text="because it is a design pattern" start="00:04:32.080" video="mainVideo" id=subtitle]]
+[[!template text="of learning itself." start="00:04:34.320" video="mainVideo" id=subtitle]]
+[[!template text="Here we're thinking about design patterns" start="00:04:35.919" video="mainVideo" id=subtitle]]
+[[!template text="as a visual representation." start="00:04:39.040" video="mainVideo" id=subtitle]]
+[[!template text="We can think of how systems of systems," start="00:04:41.919" video="mainVideo" id=subtitle]]
+[[!template text="which Emacs is an example of," start="00:04:44.320" video="mainVideo" id=subtitle]]
+[[!template text="stem from a successful center," start="00:04:47.680" video="mainVideo" id=subtitle]]
+[[!template text="and 'this center is surrounded" start="00:04:50.560" video="mainVideo" id=subtitle]]
+[[!template text="by a boundary which is itself" start="00:04:53.280" video="mainVideo" id=subtitle]]
+[[!template text="made up of centers' Gabriel." start="00:04:55.440" video="mainVideo" id=subtitle]]
+[[!template text="So, where we have Emacs at the center," start="00:04:57.040" video="mainVideo" id=subtitle]]
+[[!template text="we also have packages such as Magit." start="00:04:59.440" video="mainVideo" id=subtitle]]
+[[!template text="Magit can be viewed as a center" start="00:05:02.720" video="mainVideo" id=subtitle]]
+[[!template text="unto itself. However, this center" start="00:05:04.800" video="mainVideo" id=subtitle]]
+[[!template text="only exists thanks to the center" start="00:05:07.120" video="mainVideo" id=subtitle]]
+[[!template text="of the center, which is Emacs." start="00:05:09.520" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And thus we speak of Emacs" start="00:05:11.759" video="mainVideo" id=subtitle]]
+[[!template text="as being a successful design pattern" start="00:05:14.320" video="mainVideo" id=subtitle]]
+[[!template text="implementation cf. Gabriel. And why do we care about" start="00:05:17.039" video="mainVideo" id=subtitle]]
+[[!template text="design pattern approaches? Here, well," start="00:05:20.880" video="mainVideo" id=subtitle]]
+[[!template text="what I'm trying to say is that" start="00:05:25.520" video="mainVideo" id=subtitle]]
+[[!template text="this is useful to the person" start="00:05:28.560" video="mainVideo" id=subtitle]]
+[[!template text="who is interested in being able to" start="00:05:30.080" video="mainVideo" id=subtitle]]
+[[!template text="more efficiently cope with" start="00:05:32.240" video="mainVideo" id=subtitle]]
+[[!template text="complex and specific situations," start="00:05:34.000" video="mainVideo" id=subtitle]]
+[[!template text="and this design pattern allows for this" start="00:05:36.639" video="mainVideo" id=subtitle]]
+[[!template text="because of its extensibility," start="00:05:40.240" video="mainVideo" id=subtitle]]
+[[!template text="because we can find these specializations" start="00:05:43.039" video="mainVideo" id=subtitle]]
+[[!template text="or customizations that are able to reach" start="00:05:46.400" video="mainVideo" id=subtitle]]
+[[!template text="these changing contexts that we seek to interact with." start="00:05:50.000" video="mainVideo" id=subtitle]]
+[[!template text="This can be compared with" start="00:05:52.880" video="mainVideo" id=subtitle]]
+[[!template text="other software applications" start="00:05:55.039" video="mainVideo" id=subtitle]]
+[[!template text="that are prefabricated" start="00:05:56.479" video="mainVideo" id=subtitle]]
+[[!template text="so they already decide" start="00:05:58.000" video="mainVideo" id=subtitle]]
+[[!template text="what it is a person is going to do" start="00:05:59.680" video="mainVideo" id=subtitle]]
+[[!template text="when they use them." start="00:06:01.600" video="mainVideo" id=subtitle]]
+[[!template text="This also means that what they're doing" start="00:06:02.800" video="mainVideo" id=subtitle]]
+[[!template text="within these applications" start="00:06:04.319" video="mainVideo" id=subtitle]]
+[[!template text="can get stranded there," start="00:06:05.520" video="mainVideo" id=subtitle]]
+[[!template text="that it's harder to integrate" start="00:06:06.639" video="mainVideo" id=subtitle]]
+[[!template text="their knowledge or their texts" start="00:06:08.479" video="mainVideo" id=subtitle]]
+[[!template text="or their activities" start="00:06:10.319" video="mainVideo" id=subtitle]]
+[[!template text="with each other." start="00:06:12.240" video="mainVideo" id=subtitle]]
+[[!template text="A lot of software also makes assumptions" start="00:06:13.440" video="mainVideo" id=subtitle]]
+[[!template text="on who their users are. We know that" start="00:06:15.759" video="mainVideo" id=subtitle]]
+[[!template text="we speak in user experience design" start="00:06:18.240" video="mainVideo" id=subtitle]]
+[[!template text="of the 'customer journey' or of 'personas'," start="00:06:20.160" video="mainVideo" id=subtitle]]
+[[!template text="and very often, then," start="00:06:23.120" video="mainVideo" id=subtitle]]
+[[!template text="the customer journey is pre-designed." start="00:06:24.720" video="mainVideo" id=subtitle]]
+[[!template text="But within Emacs, we can be" start="00:06:27.840" video="mainVideo" id=subtitle]]
+[[!template text="our own persona." start="00:06:29.680" video="mainVideo" id=subtitle]]
+[[!template text="Practical use of Emacs" start="00:06:32.079" video="mainVideo" id=subtitle]]
+[[!template text="can also make non-programmers" start="00:06:33.440" video="mainVideo" id=subtitle]]
+[[!template text="into programmers." start="00:06:35.680" video="mainVideo" id=subtitle]]
+[[!template text="So this is to say that" start="00:06:36.720" video="mainVideo" id=subtitle]]
+[[!template text="as we are using Emacs," start="00:06:38.400" video="mainVideo" id=subtitle]]
+[[!template text="we can continue to develop" start="00:06:40.240" video="mainVideo" id=subtitle]]
+[[!template text="as far as we wish." start="00:06:41.840" video="mainVideo" id=subtitle]]
+[[!template text="Therefore we are not only users" start="00:06:44.479" video="mainVideo" id=subtitle]]
+[[!template text="within Emacs, but we are also" start="00:06:46.240" video="mainVideo" id=subtitle]]
+[[!template text="creative persons and producers." start="00:06:48.720" video="mainVideo" id=subtitle]]
+[[!template text="So here I am citing work by ivan Illich." start="00:06:51.280" video="mainVideo" id=subtitle]]
+[[!template text="We can further contribute" start="00:06:54.400" video="mainVideo" id=subtitle]]
+[[!template text="to the evolution of the rules of Emacs." start="00:06:56.079" video="mainVideo" id=subtitle]]
+[[!template text="To draw on Bernard Stiegler," start="00:06:58.880" video="mainVideo" id=subtitle]]
+[[!template text="if I may also make an analogy," start="00:07:01.680" video="mainVideo" id=subtitle]]
+[[!template text="within our inits, we contribute to" start="00:07:04.880" video="mainVideo" id=subtitle]]
+[[!template text="the evolution of the rules" start="00:07:07.520" video="mainVideo" id=subtitle]]
+[[!template text="according to which our Emacs works for us." start="00:07:08.800" video="mainVideo" id=subtitle]]
+[[!template text="But again, if we're extending" start="00:07:11.759" video="mainVideo" id=subtitle]]
+[[!template text="our learning trajectory," start="00:07:13.120" video="mainVideo" id=subtitle]]
+[[!template text="and if we write a package," start="00:07:14.560" video="mainVideo" id=subtitle]]
+[[!template text="and the package becomes part of the core," start="00:07:16.319" video="mainVideo" id=subtitle]]
+[[!template text="we do indeed contribute to the evolution" start="00:07:18.400" video="mainVideo" id=subtitle]]
+[[!template text="of the rules of Emacs." start="00:07:21.440" video="mainVideo" id=subtitle]]
+[[!template text="But because it stems" start="00:07:23.840" video="mainVideo" id=subtitle]]
+[[!template text="from our personal use" start="00:07:25.359" video="mainVideo" id=subtitle]]
+[[!template text="and our personal customizations," start="00:07:26.560" video="mainVideo" id=subtitle]]
+[[!template text="we can think of it as being" start="00:07:28.479" video="mainVideo" id=subtitle]]
+[[!template text="a personal toolkit cf. Stallman." start="00:07:30.000" video="mainVideo" id=subtitle]]
+[[!template text="So this design pattern iteration approach" start="00:07:31.600" video="mainVideo" id=subtitle]]
+[[!template text="to Emacs is the very reason" start="00:07:35.840" video="mainVideo" id=subtitle]]
+[[!template text="why it is that we can customize it" start="00:07:39.680" video="mainVideo" id=subtitle]]
+[[!template text="to our own liking," start="00:07:41.840" video="mainVideo" id=subtitle]]
+[[!template text="and using Emacs to extend our freedom" start="00:07:43.440" video="mainVideo" id=subtitle]]
+[[!template text="then helps us to develop heuristics." start="00:07:46.160" video="mainVideo" id=subtitle]]
+[[!template text="It helps us develop our decision-making," start="00:07:48.720" video="mainVideo" id=subtitle]]
+[[!template text="our problem-solving" start="00:07:51.919" video="mainVideo" id=subtitle]]
+[[!template text="and responsibility for what it is" start="00:07:54.719" video="mainVideo" id=subtitle]]
+[[!template text="that we're doing," start="00:07:57.839" video="mainVideo" id=subtitle]]
+[[!template text="and these skill sets" start="00:07:58.880" video="mainVideo" id=subtitle]]
+[[!template text="are extensible beyond Emacs." start="00:08:00.640" video="mainVideo" id=subtitle]]
+[[!template text="These can be considered as life skills" start="00:08:02.480" video="mainVideo" id=subtitle]]
+[[!template text="that have relevance beyond." start="00:08:04.240" video="mainVideo" id=subtitle]]
+[[!template text="This is a very good example" start="00:08:05.839" video="mainVideo" id=subtitle]]
+[[!template text="of why it is that being exposed" start="00:08:07.520" video="mainVideo" id=subtitle]]
+[[!template text="to complex assemblages" start="00:08:10.560" video="mainVideo" id=subtitle]]
+[[!template text="matter to us as human beings." start="00:08:12.480" video="mainVideo" id=subtitle]]
+[[!template text="It's good training ground for life." start="00:08:14.320" video="mainVideo" id=subtitle]]
+[[!template text="But it's also important" start="00:08:17.120" video="mainVideo" id=subtitle]]
+[[!template text="for a very basic pedagogical point." start="00:08:19.680" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So now I'm going to draw on work" start="00:08:22.719" video="mainVideo" id=subtitle]]
+[[!template text="by Hélène Trocmé-Fabre," start="00:08:24.160" video="mainVideo" id=subtitle]]
+[[!template text="who explains that" start="00:08:26.560" video="mainVideo" id=subtitle]]
+[[!template text="reduced and poor contextualizations" start="00:08:27.839" video="mainVideo" id=subtitle]]
+[[!template text="flatten communication." start="00:08:30.719" video="mainVideo" id=subtitle]]
+[[!template text="So, for example," start="00:08:32.800" video="mainVideo" id=subtitle]]
+[[!template text="within the field of software," start="00:08:33.760" video="mainVideo" id=subtitle]]
+[[!template text="if we are using an application" start="00:08:35.279" video="mainVideo" id=subtitle]]
+[[!template text="that only asks us to swipe left or right," start="00:08:37.680" video="mainVideo" id=subtitle]]
+[[!template text="this deprives us of our ability" start="00:08:40.640" video="mainVideo" id=subtitle]]
+[[!template text="to respond in a more sophisticated way." start="00:08:42.880" video="mainVideo" id=subtitle]]
+[[!template text="By contrast, by being exposed" start="00:08:45.600" video="mainVideo" id=subtitle]]
+[[!template text="to a rich contextualization within Emacs," start="00:08:48.640" video="mainVideo" id=subtitle]]
+[[!template text="we are learning to contextualize," start="00:08:51.600" video="mainVideo" id=subtitle]]
+[[!template text="which Trocmé-Fabre says is the first step" start="00:08:53.839" video="mainVideo" id=subtitle]]
+[[!template text="in learning how to learn." start="00:08:57.040" video="mainVideo" id=subtitle]]
+[[!template text="So we can understand" start="00:08:58.719" video="mainVideo" id=subtitle]]
+[[!template text="just how important it is" start="00:08:59.920" video="mainVideo" id=subtitle]]
+[[!template text="to be exposed to complexity." start="00:09:01.760" video="mainVideo" id=subtitle]]
+[[!template text="It's not just a mere" start="00:09:03.520" video="mainVideo" id=subtitle]]
+[[!template text="intellectual exercise," start="00:09:05.440" video="mainVideo" id=subtitle]]
+[[!template text="but it is indeed how it is" start="00:09:06.719" video="mainVideo" id=subtitle]]
+[[!template text="that we begin to learn." start="00:09:08.719" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If this sounds too abstract," start="00:09:12.240" video="mainVideo" id=subtitle]]
+[[!template text="maybe we can step back for a moment" start="00:09:13.760" video="mainVideo" id=subtitle]]
+[[!template text="and think about visualizing Emacs" start="00:09:15.520" video="mainVideo" id=subtitle]]
+[[!template text="as a mental map. So here, too," start="00:09:17.520" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to draw on Trocmé-Fabre," start="00:09:19.600" video="mainVideo" id=subtitle]]
+[[!template text="and she is building her ideas" start="00:09:21.839" video="mainVideo" id=subtitle]]
+[[!template text="on those of Tony Buzan," start="00:09:24.560" video="mainVideo" id=subtitle]]
+[[!template text="who was the popularizer of the mind map." start="00:09:26.240" video="mainVideo" id=subtitle]]
+[[!template text="So mind maps begin with a core," start="00:09:29.120" video="mainVideo" id=subtitle]]
+[[!template text="which with Emacs is the Emacs core," start="00:09:31.519" video="mainVideo" id=subtitle]]
+[[!template text="which now includes Org." start="00:09:33.760" video="mainVideo" id=subtitle]]
+[[!template text="They extend outwards from the core" start="00:09:36.320" video="mainVideo" id=subtitle]]
+[[!template text="through relational codes." start="00:09:38.719" video="mainVideo" id=subtitle]]
+[[!template text="And then through keywords and cycling," start="00:09:40.800" video="mainVideo" id=subtitle]]
+[[!template text="mind maps function to bring out" start="00:09:44.399" video="mainVideo" id=subtitle]]
+[[!template text="further ideas, and this may be" start="00:09:46.240" video="mainVideo" id=subtitle]]
+[[!template text="the experience you've already had" start="00:09:48.320" video="mainVideo" id=subtitle]]
+[[!template text="with your Emacs. Then finally," start="00:09:49.760" video="mainVideo" id=subtitle]]
+[[!template text="these mind maps extend outwards" start="00:09:52.640" video="mainVideo" id=subtitle]]
+[[!template text="at the periphery." start="00:09:54.800" video="mainVideo" id=subtitle]]
+[[!template text="In thinking about how this applies to Emacs," start="00:09:56.480" video="mainVideo" id=subtitle]]
+[[!template text="we can think about how yes, indeed," start="00:10:00.240" video="mainVideo" id=subtitle]]
+[[!template text="we all share the same core," start="00:10:02.320" video="mainVideo" id=subtitle]]
+[[!template text="but then we extend this core outwards" start="00:10:04.240" video="mainVideo" id=subtitle]]
+[[!template text="into our personal configurations." start="00:10:07.360" video="mainVideo" id=subtitle]]
+[[!template text="So this is the social moment," start="00:10:09.680" video="mainVideo" id=subtitle]]
+[[!template text="but this social moment" start="00:10:11.360" video="mainVideo" id=subtitle]]
+[[!template text="is integral to Emacs" start="00:10:12.480" video="mainVideo" id=subtitle]]
+[[!template text="because Emacs fully achieves its meaning" start="00:10:13.839" video="mainVideo" id=subtitle]]
+[[!template text="when it is being applied, extended," start="00:10:16.800" video="mainVideo" id=subtitle]]
+[[!template text="and customized in this way." start="00:10:18.959" video="mainVideo" id=subtitle]]
+[[!template text="Further, these social branches" start="00:10:20.880" video="mainVideo" id=subtitle]]
+[[!template text="are relevant to the continuation" start="00:10:23.279" video="mainVideo" id=subtitle]]
+[[!template text="of learning how to learn how to use Emacs." start="00:10:25.839" video="mainVideo" id=subtitle]]
+[[!template text="So for example, we may have" start="00:10:28.560" video="mainVideo" id=subtitle]]
+[[!template text="our first configuration file," start="00:10:30.800" video="mainVideo" id=subtitle]]
+[[!template text="and then we might want to compare it" start="00:10:33.279" video="mainVideo" id=subtitle]]
+[[!template text="with other people's configuration files," start="00:10:35.040" video="mainVideo" id=subtitle]]
+[[!template text="not only to see what code they're using," start="00:10:37.440" video="mainVideo" id=subtitle]]
+[[!template text="but also to see how it is that they are" start="00:10:40.240" video="mainVideo" id=subtitle]]
+[[!template text="implementing certain functionalities" start="00:10:42.480" video="mainVideo" id=subtitle]]
+[[!template text="within their workflow." start="00:10:44.240" video="mainVideo" id=subtitle]]
+[[!template text="So along these lines, then," start="00:10:46.000" video="mainVideo" id=subtitle]]
+[[!template text="descriptive configuration files" start="00:10:48.080" video="mainVideo" id=subtitle]]
+[[!template text="are extremely helpful." start="00:10:50.160" video="mainVideo" id=subtitle]]
+[[!template text="This map, then, of Emacs" start="00:10:53.360" video="mainVideo" id=subtitle]]
+[[!template text="can be considered as a" start="00:10:56.160" video="mainVideo" id=subtitle]]
+[[!template text="frontierless heuristic schema," start="00:10:57.519" video="mainVideo" id=subtitle]]
+[[!template text="borrowing from Trocmé-Fabre." start="00:11:00.399" video="mainVideo" id=subtitle]]
+[[!template text="Frontierless, because we can extend" start="00:11:02.000" video="mainVideo" id=subtitle]]
+[[!template text="our use of Emacs as far as we want." start="00:11:04.080" video="mainVideo" id=subtitle]]
+[[!template text="Heuristic, again, because we're using it" start="00:11:06.320" video="mainVideo" id=subtitle]]
+[[!template text="to solve problems, etc." start="00:11:08.399" video="mainVideo" id=subtitle]]
+[[!template text="This is a free system that extends" start="00:11:10.640" video="mainVideo" id=subtitle]]
+[[!template text="following our own 'paths of desire'," start="00:11:13.360" video="mainVideo" id=subtitle]]
+[[!template text="if I can use that phrase from design." start="00:11:15.920" video="mainVideo" id=subtitle]]
+[[!template text="So it's following our own 'paths of desire'," start="00:11:18.640" video="mainVideo" id=subtitle]]
+[[!template text="but yet it is a shared tool," start="00:11:20.640" video="mainVideo" id=subtitle]]
+[[!template text="so this is an idea of the convivial tool" start="00:11:22.480" video="mainVideo" id=subtitle]]
+[[!template text="to draw on Ivan Illich." start="00:11:26.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs is itself" start="00:11:30.000" video="mainVideo" id=subtitle]]
+[[!template text="a design pattern framework," start="00:11:31.760" video="mainVideo" id=subtitle]]
+[[!template text="so we can visualize this" start="00:11:33.440" video="mainVideo" id=subtitle]]
+[[!template text="through the mind map," start="00:11:35.279" video="mainVideo" id=subtitle]]
+[[!template text="but we can also go back to thinking about" start="00:11:36.640" video="mainVideo" id=subtitle]]
+[[!template text="how Christopher Alexander's work" start="00:11:40.160" video="mainVideo" id=subtitle]]
+[[!template text="inspired Richard Gabriel" start="00:11:42.399" video="mainVideo" id=subtitle]]
+[[!template text="to think about systems of systems" start="00:11:44.240" video="mainVideo" id=subtitle]]
+[[!template text="within software. And he," start="00:11:46.640" video="mainVideo" id=subtitle]]
+[[!template text="drawing on Alexander," start="00:11:49.040" video="mainVideo" id=subtitle]]
+[[!template text="says, well, there is such a thing" start="00:11:50.240" video="mainVideo" id=subtitle]]
+[[!template text="as a &quot;being&quot; of successful software," start="00:11:52.240" video="mainVideo" id=subtitle]]
+[[!template text="if it succeeds in being" start="00:11:55.600" video="mainVideo" id=subtitle]]
+[[!template text="a center of centers," start="00:11:59.519" video="mainVideo" id=subtitle]]
+[[!template text="as we saw before." start="00:12:00.640" video="mainVideo" id=subtitle]]
+[[!template text="So in Emacs, then, we have a system" start="00:12:02.240" video="mainVideo" id=subtitle]]
+[[!template text="that's made up of other systems" start="00:12:04.480" video="mainVideo" id=subtitle]]
+[[!template text="of 'communicating components" start="00:12:06.880" video="mainVideo" id=subtitle]]
+[[!template text="that work together" start="00:12:08.719" video="mainVideo" id=subtitle]]
+[[!template text="to provide a comprehensive set" start="00:12:09.839" video="mainVideo" id=subtitle]]
+[[!template text="of capabilities that can be customized," start="00:12:11.600" video="mainVideo" id=subtitle]]
+[[!template text="specialized, and extended" start="00:12:14.399" video="mainVideo" id=subtitle]]
+[[!template text="to provide more" start="00:12:16.000" video="mainVideo" id=subtitle]]
+[[!template text="or slightly different capabilities' Gabriel." start="00:12:16.959" video="mainVideo" id=subtitle]]
+[[!template text="So if we're not finding what we need" start="00:12:18.959" video="mainVideo" id=subtitle]]
+[[!template text="within the core, we can look for packages" start="00:12:21.200" video="mainVideo" id=subtitle]]
+[[!template text="that allow us to extend in a certain way," start="00:12:25.120" video="mainVideo" id=subtitle]]
+[[!template text="or we write our own," start="00:12:27.519" video="mainVideo" id=subtitle]]
+[[!template text="or we begin to write in Emacs Lisp." start="00:12:28.560" video="mainVideo" id=subtitle]]
+[[!template new="1" text="And speaking of personal customizations," start="00:12:31.680" video="mainVideo" id=subtitle]]
+[[!template text="Emacs can be considered as an extension" start="00:12:34.800" video="mainVideo" id=subtitle]]
+[[!template text="of the as yet unfulfilled promise of" start="00:12:37.839" video="mainVideo" id=subtitle]]
+[[!template text="general computing." start="00:12:40.079" video="mainVideo" id=subtitle]]
+[[!template text="In the 1980s, Michael Crichton wrote" start="00:12:41.600" video="mainVideo" id=subtitle]]
+[[!template text="that it's easy to use computers, which is" start="00:12:44.000" video="mainVideo" id=subtitle]]
+[[!template text="fortunate because everyone's going to" start="00:12:46.320" video="mainVideo" id=subtitle]]
+[[!template text="have to learn." start="00:12:48.000" video="mainVideo" id=subtitle]]
+[[!template text="It's not easy to use computers wisely," start="00:12:49.040" video="mainVideo" id=subtitle]]
+[[!template text="which is unfortunate because" start="00:12:51.440" video="mainVideo" id=subtitle]]
+[[!template text="everyone's going to have to learn." start="00:12:52.880" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is wise computing" start="00:12:54.719" video="mainVideo" id=subtitle]]
+[[!template text="because everyone's Emacs is their own." start="00:12:56.639" video="mainVideo" id=subtitle]]
+[[!template text="We see that it is an exercise" start="00:12:59.600" video="mainVideo" id=subtitle]]
+[[!template text="in heuristics, but while it is complex," start="00:13:01.680" video="mainVideo" id=subtitle]]
+[[!template text="at on some level, we want to remember" start="00:13:05.760" video="mainVideo" id=subtitle]]
+[[!template text="that it can be used easily by anybody," start="00:13:08.000" video="mainVideo" id=subtitle]]
+[[!template text="as often or as seldom as they want," start="00:13:10.240" video="mainVideo" id=subtitle]]
+[[!template text="for the purpose that they are choosing," start="00:13:12.560" video="mainVideo" id=subtitle]]
+[[!template text="and shaped according to their own taste." start="00:13:15.200" video="mainVideo" id=subtitle]]
+[[!template text="So again I'm drawing on Ivan Illich here." start="00:13:17.519" video="mainVideo" id=subtitle]]
+[[!template text="Emacs then champions the human place" start="00:13:20.480" video="mainVideo" id=subtitle]]
+[[!template text="and is a support in our learning" start="00:13:24.880" video="mainVideo" id=subtitle]]
+[[!template text="how to learn." start="00:13:28.800" video="mainVideo" id=subtitle]]
+[[!template text="So now I want to think about" start="00:13:30.639 video="mainVideo" id=subtitle]]
+[[!template text="being inspired by the Emacs design pattern" start="00:13:32.000" video="mainVideo" id=subtitle]]
+[[!template text="and comparing what I think" start="00:13:34.959" video="mainVideo" id=subtitle]]
+[[!template text="I've learned about how Emacs works" start="00:13:37.040" video="mainVideo" id=subtitle]]
+[[!template text="with some research that has been done" start="00:13:40.480" video="mainVideo" id=subtitle]]
+[[!template text="by Philip Guo and his colleagues" start="00:13:43.600" video="mainVideo" id=subtitle]]
+[[!template text="about how technology is being used" start="00:13:46.240" video="mainVideo" id=subtitle]]
+[[!template text="in certain online teaching contexts." start="00:13:47.920" video="mainVideo" id=subtitle]]
+[[!template text="Researchers continue to note" start="00:13:51.120" video="mainVideo" id=subtitle]]
+[[!template text="how the modes of delivery of content" start="00:13:52.800" video="mainVideo" id=subtitle]]
+[[!template text="continue to change in terms of" start="00:13:55.200" video="mainVideo" id=subtitle]]
+[[!template text="what is considered effective" start="00:13:56.880" video="mainVideo" id=subtitle]]
+[[!template text="and what is not." start="00:13:58.240" video="mainVideo" id=subtitle]]
+[[!template text="The talking head was considered effective," start="00:13:59.600" video="mainVideo" id=subtitle]]
+[[!template text="for example. Lectures needed to be" start="00:14:02.000" video="mainVideo" id=subtitle]]
+[[!template text="broken down into shorter segments." start="00:14:05.360" video="mainVideo" id=subtitle]]
+[[!template text="But I would say that by using Emacs" start="00:14:07.760" video="mainVideo" id=subtitle]]
+[[!template text="and by working within the Emacs ecosystem," start="00:14:11.360" video="mainVideo" id=subtitle]]
+[[!template text="one is already used to" start="00:14:14.320" video="mainVideo" id=subtitle]]
+[[!template text="'re-presenting' one's knowledge" start="00:14:16.519" video="mainVideo" id=subtitle]]
+[[!template text="in a variety of different ways." start="00:14:18.959" video="mainVideo" id=subtitle]]
+[[!template text="So if we are called tomorrow" start="00:14:20.800" video="mainVideo" id=subtitle]]
+[[!template text="to deliver in a different way," start="00:14:22.320" video="mainVideo" id=subtitle]]
+[[!template text="we're already used to" start="00:14:24.240" video="mainVideo" id=subtitle]]
+[[!template text="thinking about this within Emacs." start="00:14:26.240" video="mainVideo" id=subtitle]]
+[[!template text="So, for example," start="00:14:28.399" video="mainVideo" id=subtitle]]
+[[!template text="merely by changing a header argument," start="00:14:30.639" video="mainVideo" id=subtitle]]
+[[!template text="one can change the way in which" start="00:14:32.399" video="mainVideo" id=subtitle]]
+[[!template text="text in a file is executed," start="00:14:34.880" video="mainVideo" id=subtitle]]
+[[!template text="so we see then this easy iteration" start="00:14:36.480" video="mainVideo" id=subtitle]]
+[[!template text="within Emacs. We can also think about" start="00:14:39.600" video="mainVideo" id=subtitle]]
+[[!template text="how Emacs can be considered in terms of" start="00:14:42.160" video="mainVideo" id=subtitle]]
+[[!template text="a help for developing rhetorical 'topoi'," start="00:14:45.760" video="mainVideo" id=subtitle]]
+[[!template text="'topoi' being places where we find things," start="00:14:49.839" video="mainVideo" id=subtitle]]
+[[!template text="places where we find ideas," start="00:14:52.240" video="mainVideo" id=subtitle]]
+[[!template text="because we can circulate" start="00:14:54.480" video="mainVideo" id=subtitle]]
+[[!template text="among the different tasks and texts" start="00:14:56.320" video="mainVideo" id=subtitle]]
+[[!template text="that we are working on" start="00:14:58.959" video="mainVideo" id=subtitle]]
+[[!template text="within Emacs seamlessly." start="00:14:59.920" video="mainVideo" id=subtitle]]
+[[!template text="This increases the likelihood" start="00:15:01.920" video="mainVideo" id=subtitle]]
+[[!template text="that we can gain inspiration" start="00:15:04.000" video="mainVideo" id=subtitle]]
+[[!template text="from the collage of different ideas" start="00:15:07.519" video="mainVideo" id=subtitle]]
+[[!template text="that bring out new ideas." start="00:15:11.440" video="mainVideo" id=subtitle]]
+[[!template text="At least this is how" start="00:15:14.079" video="mainVideo" id=subtitle]]
+[[!template text="I've experienced Emacs," start="00:15:14.959" video="mainVideo" id=subtitle]]
+[[!template text="if I may add that anecdotal observation." start="00:15:16.160" video="mainVideo" id=subtitle]]
+[[!template text="And speaking of bringing out ideas," start="00:15:19.279" video="mainVideo" id=subtitle]]
+[[!template text="we see how changing Emacs functionalities" start="00:15:22.480" video="mainVideo" id=subtitle]]
+[[!template text="can help us bring out ideas" start="00:15:26.079" video="mainVideo" id=subtitle]]
+[[!template text="for example, through how we can" start="00:15:27.680" video="mainVideo" id=subtitle]]
+[[!template text="use PlantUML easier today" start="00:15:30.079" video="mainVideo" id=subtitle]]
+[[!template text="than ever before, so we can now include" start="00:15:32.000" video="mainVideo" id=subtitle]]
+[[!template text="mental maps within our Emacs files" start="00:15:35.519" video="mainVideo" id=subtitle]]
+[[!template text="if we want to, but also" start="00:15:38.880" video="mainVideo" id=subtitle]]
+[[!template text="if we're thinking about Emacs helping us" start="00:15:40.800" video="mainVideo" id=subtitle]]
+[[!template text="both remember the material" start="00:15:45.120" video="mainVideo" id=subtitle]]
+[[!template text="that we're working with" start="00:15:47.600" video="mainVideo" id=subtitle]]
+[[!template text="and 're-present' it," start="00:15:48.719" video="mainVideo" id=subtitle]]
+[[!template text="we can think of it" start="00:15:50.000" video="mainVideo" id=subtitle]]
+[[!template text="in terms of its archival functions," start="00:15:51.040" video="mainVideo" id=subtitle]]
+[[!template text="So we can see an example of this" start="00:15:53.120" video="mainVideo" id=subtitle]]
+[[!template text="in Sacha Chua's init," start="00:15:54.880" video="mainVideo" id=subtitle]]
+[[!template text="where she is using Emacs" start="00:15:57.040" video="mainVideo" id=subtitle]]
+[[!template text="to manage her recent sketches." start="00:15:59.120" video="mainVideo" id=subtitle]]
+[[!template text="This would be really useful" start="00:16:02.399" video="mainVideo" id=subtitle]]
+[[!template text="for implementation" start="00:16:03.839" video="mainVideo" id=subtitle]]
+[[!template text="in terms of what the researchers" start="00:16:06.000" video="mainVideo" id=subtitle]]
+[[!template text="(Philip Guo and his colleagues) discovered" start="00:16:08.160" video="mainVideo" id=subtitle]]
+[[!template text="with regards to how today" start="00:16:10.480" video="mainVideo" id=subtitle]]
+[[!template text="Khan-style slides are considered" start="00:16:12.656" video="mainVideo" id=subtitle]]
+[[!template text="more effective than traditional slides," start="00:16:14.880" video="mainVideo" id=subtitle]]
+[[!template text="because if one is able to integrate" start="00:16:17.920" video="mainVideo" id=subtitle]]
+[[!template text="the other kinds of sketches" start="00:16:20.160" video="mainVideo" id=subtitle]]
+[[!template text="that one has been doing within Emacs -" start="00:16:21.519" video="mainVideo" id=subtitle]]
+[[!template text="and therefore have them at hand" start="00:16:23.680" video="mainVideo" id=subtitle]]
+[[!template text="more easily, it would be easier to" start="00:16:25.999" video="mainVideo" id=subtitle]]
+[[!template text="'re-present' this material as needed" start="00:16:27.999" video="mainVideo" id=subtitle]]
+[[!template text="in the ever-changing context of the classroom." start="00:16:30.800" video="mainVideo" id=subtitle]]
+[[!template text="We can see from this example" start="00:16:33.600" video="mainVideo" id=subtitle]]
+[[!template text="of Sacha Chua's init that we learn" start="00:16:35.519" video="mainVideo" id=subtitle]]
+[[!template text="by following the traces" start="00:16:38.320" video="mainVideo" id=subtitle]]
+[[!template text="left by others in the community." start="00:16:39.999" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So we were saying then that" start="00:16:41.999" video="mainVideo" id=subtitle]]
+[[!template text="Emacs extends outwards" start="00:16:43.279" video="mainVideo" id=subtitle]]
+[[!template text="through these social branches," start="00:16:45.040" video="mainVideo" id=subtitle]]
+[[!template text="and indeed we can speak" start="00:16:46.479" video="mainVideo" id=subtitle]]
+[[!template text="of the grammar of interaction," start="00:16:48.560" video="mainVideo" id=subtitle]]
+[[!template text="that we benefit from by being" start="00:16:50.640" video="mainVideo" id=subtitle]]
+[[!template text="a member of the Emacs community." start="00:16:52.320" video="mainVideo" id=subtitle]]
+[[!template text="And this wonderful phrase comes to us" start="00:16:54.720" video="mainVideo" id=subtitle]]
+[[!template text="from a book that was co-edited" start="00:16:56.960" video="mainVideo" id=subtitle]]
+[[!template text="by our very own former Org father," start="00:16:58.880" video="mainVideo" id=subtitle]]
+[[!template text="Bastien Guerry, in an interview" start="00:17:01.736" video="mainVideo" id=subtitle]]
+[[!template text="that he led with Nicolas Gaume Andler & Guerry." start="00:17:03.680" video="mainVideo" id=subtitle]]
+[[!template text="Nicolas Gaume was explaining" start="00:17:05.359" video="mainVideo" id=subtitle]]
+[[!template text="how in video games, we see our character" start="00:17:07.040" video="mainVideo" id=subtitle]]
+[[!template text="and compare our character" start="00:17:10.640" video="mainVideo" id=subtitle]]
+[[!template text="to other characters," start="00:17:12.160" video="mainVideo" id=subtitle]]
+[[!template text="and we watch how other characters" start="00:17:14.160" video="mainVideo" id=subtitle]]
+[[!template text="make decisions," start="00:17:16.080" video="mainVideo" id=subtitle]]
+[[!template text="and the outcomes of these decisions," start="00:17:17.040" video="mainVideo" id=subtitle]]
+[[!template text="and their trajectories in the game," start="00:17:19.040" video="mainVideo" id=subtitle]]
+[[!template text="and then we compare where we are" start="00:17:21.440" video="mainVideo" id=subtitle]]
+[[!template text="with respect to this," start="00:17:23.119" video="mainVideo" id=subtitle]]
+[[!template text="and by having this comparison," start="00:17:24.720" video="mainVideo" id=subtitle]]
+[[!template text="it helps us chart out our own path." start="00:17:27.119" video="mainVideo" id=subtitle]]
+[[!template text="So we can experience" start="00:17:29.840" video="mainVideo" id=subtitle]]
+[[!template text="this grammar of interaction" start="00:17:31.280" video="mainVideo" id=subtitle]]
+[[!template text="within Emacs every time we compare" start="00:17:32.800" video="mainVideo" id=subtitle]]
+[[!template text="our config with that of others." start="00:17:35.200" video="mainVideo" id=subtitle]]
+[[!template text="Emacs further champions the social element" start="00:17:38.720" video="mainVideo" id=subtitle]]
+[[!template text="through co-individuation, which is" start="00:17:41.760" video="mainVideo" id=subtitle]]
+[[!template text="a term coined by Bernard Stiegler." start="00:17:43.920" video="mainVideo" id=subtitle]]
+[[!template text="This means the meaning that is known" start="00:17:46.880" video="mainVideo" id=subtitle]]
+[[!template text="and shared by other individuals." start="00:17:48.720" video="mainVideo" id=subtitle]]
+[[!template text="What is it that we know and share" start="00:17:50.960" video="mainVideo" id=subtitle]]
+[[!template text="within Emacs? It is how to" start="00:17:52.560" video="mainVideo" id=subtitle]]
+[[!template text="improve our lives" start="00:17:54.560" video="mainVideo" id=subtitle]]
+[[!template text="through customizing Emacs" start="00:17:55.600" video="mainVideo" id=subtitle]]
+[[!template text="in specific ways. So if one person" start="00:17:57.280" video="mainVideo" id=subtitle]]
+[[!template text="reaches the apotheosis" start="00:18:00.479" video="mainVideo" id=subtitle]]
+[[!template text="of individuation," start="00:18:03.040" video="mainVideo" id=subtitle]]
+[[!template text="and they're living the life" start="00:18:04.239" video="mainVideo" id=subtitle]]
+[[!template text="they dreamed of" start="00:18:05.920" video="mainVideo" id=subtitle]]
+[[!template text="through their Emacs use," start="00:18:07.760" video="mainVideo" id=subtitle]]
+[[!template text="they can share this information" start="00:18:08.960" video="mainVideo" id=subtitle]]
+[[!template text="with somebody else" start="00:18:10.720" video="mainVideo" id=subtitle]]
+[[!template text="who too can come to realize themselves" start="00:18:11.680" video="mainVideo" id=subtitle]]
+[[!template text="in this way." start="00:18:14.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Without the social milieu," start="00:18:15.920" video="mainVideo" id=subtitle]]
+[[!template text="without this attention" start="00:18:17.280" video="mainVideo" id=subtitle]]
+[[!template text="to the human element," start="00:18:18.880" video="mainVideo" id=subtitle]]
+[[!template text="the technical milieu inevitably becomes" start="00:18:21.040" video="mainVideo" id=subtitle]]
+[[!template text="a negative externality" start="00:18:23.600" video="mainVideo" id=subtitle]]
+[[!template text="which is a philosophical problem." start="00:18:24.414" video="mainVideo" id=subtitle]]
+[[!template text="Here I'm drawing on Bernard Stiegler." start="00:18:25.760" video="mainVideo" id=subtitle]]
+[[!template text="What does this mean? This means" start="00:18:27.840" video="mainVideo" id=subtitle]]
+[[!template text="where knowledge becomes automaticized," start="00:18:29.680" video="mainVideo" id=subtitle]]
+[[!template text="it becomes a closed" start="00:18:32.400" video="mainVideo" id=subtitle]]
+[[!template text="and self-referential system." start="00:18:33.760" video="mainVideo" id=subtitle]]
+[[!template text="Because it's self-referential and closed," start="00:18:36.560" video="mainVideo" id=subtitle]]
+[[!template text="there is no need for any human input," start="00:18:39.520" video="mainVideo" id=subtitle]]
+[[!template text="so the human within this system" start="00:18:41.999" video="mainVideo" id=subtitle]]
+[[!template text="turns into a servant." start="00:18:43.600" video="mainVideo" id=subtitle]]
+[[!template text="By contrast, by using human-centered Emacs," start="00:18:46.080" video="mainVideo" id=subtitle]]
+[[!template text="we are able to take care of our neighbors." start="00:18:50.800" video="mainVideo" id=subtitle]]
+[[!template text="We can write extensions for them." start="00:18:53.520" video="mainVideo" id=subtitle]]
+[[!template text="We can help each other on the forums." start="00:18:55.840" video="mainVideo" id=subtitle]]
+[[!template text="We can even teach just one more person" start="00:18:58.560" video="mainVideo" id=subtitle]]
+[[!template text="how to use Emacs." start="00:19:00.800" video="mainVideo" id=subtitle]]
+[[!template text="And this idea comes from Ivan Illich" start="00:19:02.640" video="mainVideo" id=subtitle]]
+[[!template text="who extends it to say" start="00:19:04.880" video="mainVideo" id=subtitle]]
+[[!template text="that by taking care of our neighbors" start="00:19:06.800" video="mainVideo" id=subtitle]]
+[[!template text="in this way," start="00:19:08.880" video="mainVideo" id=subtitle]]
+[[!template text="this enables us to excel" start="00:19:09.680" video="mainVideo" id=subtitle]]
+[[!template text="at using the best available tools." start="00:19:11.840" video="mainVideo" id=subtitle]]
+[[!template text="The tool here being Emacs." start="00:19:13.999" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The community aspect of Emacs" start="00:19:16.239" video="mainVideo" id=subtitle]]
+[[!template text="can also be seen" start="00:19:19.200" video="mainVideo" id=subtitle]]
+[[!template text="in how the core of Emacs itself" start="00:19:20.320" video="mainVideo" id=subtitle]]
+[[!template text="is evolving. So just like we are" start="00:19:22.720" video="mainVideo" id=subtitle]]
+[[!template text="configuring and programming Emacs" start="00:19:25.040" video="mainVideo" id=subtitle]]
+[[!template text="while we are using it," start="00:19:27.119" video="mainVideo" id=subtitle]]
+[[!template text="Emacs, too, continues to develop" start="00:19:28.720" video="mainVideo" id=subtitle]]
+[[!template text="as the core expands." start="00:19:32.239" video="mainVideo" id=subtitle]]
+[[!template text="So in this, too, we see how Emacs" start="00:19:34.560" video="mainVideo" id=subtitle]]
+[[!template text="is a model of design pattern learning" start="00:19:36.880" video="mainVideo" id=subtitle]]
+[[!template text="that we can be inspired from," start="00:19:39.680" video="mainVideo" id=subtitle]]
+[[!template text="and the fact that people" start="00:19:42.320" video="mainVideo" id=subtitle]]
+[[!template text="from the Emacs community" start="00:19:44.960" video="mainVideo" id=subtitle]]
+[[!template text="are able to contribute to the core" start="00:19:46.320" video="mainVideo" id=subtitle]]
+[[!template text="brings emphasis to the community role" start="00:19:49.280" video="mainVideo" id=subtitle]]
+[[!template text="in this design pattern." start="00:19:52.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So at the beginning, we were saying" start="00:19:53.999" video="mainVideo" id=subtitle]]
+[[!template text="we're interested" start="00:19:55.440" video="mainVideo" id=subtitle]]
+[[!template text="in the complex assemblage," start="00:19:56.239" video="mainVideo" id=subtitle]]
+[[!template text="not just of activities and tools," start="00:19:57.680" video="mainVideo" id=subtitle]]
+[[!template text="but also of people." start="00:19:59.520" video="mainVideo" id=subtitle]]
+[[!template text="So here we are talking about" start="00:20:00.960" video="mainVideo" id=subtitle]]
+[[!template text="an 'Emacs community'." start="00:20:03.119" video="mainVideo" id=subtitle]]
+[[!template text="This is also thanks to" start="00:20:04.720" video="mainVideo" id=subtitle]]
+[[!template text="the selfless work of people" start="00:20:06.880" video="mainVideo" id=subtitle]]
+[[!template text="like Sacha Chua, or blog rings" start="00:20:08.560" video="mainVideo" id=subtitle]]
+[[!template text="such as Planet Emacs Life" start="00:20:11.999" video="mainVideo" id=subtitle]]
+[[!template text="that bring us together" start="00:20:13.760" video="mainVideo" id=subtitle]]
+[[!template text="so that we truly can say" start="00:20:14.960" video="mainVideo" id=subtitle]]
+[[!template text="that there is a community." start="00:20:16.880" video="mainVideo" id=subtitle]]
+[[!template text="This conference is an example of this:" start="00:20:18.479" video="mainVideo" id=subtitle]]
+[[!template text="and thank you to the conference organizers." start="00:20:20.080" video="mainVideo" id=subtitle]]
+[[!template text="But this community," start="00:20:23.440" video="mainVideo" id=subtitle]]
+[[!template text="because of the free core," start="00:20:24.880" video="mainVideo" id=subtitle]]
+[[!template text="allows for there to be" start="00:20:28.640" video="mainVideo" id=subtitle]]
+[[!template text="different viewpoints" start="00:20:30.160" video="mainVideo" id=subtitle]]
+[[!template text="within the community." start="00:20:31.119" video="mainVideo" id=subtitle]]
+[[!template text="One thing that I've noticed" start="00:20:32.320" video="mainVideo" id=subtitle]]
+[[!template text="about the Emacs community" start="00:20:33.440" video="mainVideo" id=subtitle]]
+[[!template text="is that there are sometimes even" start="00:20:34.880" video="mainVideo" id=subtitle]]
+[[!template text="competing views within the community." start="00:20:36.320" video="mainVideo" id=subtitle]]
+[[!template text="This can be considered" start="00:20:38.880" video="mainVideo" id=subtitle]]
+[[!template text="proof of concept of systems thinker" start="00:20:40.160" video="mainVideo" id=subtitle]]
+[[!template text="and philosopher Edgar Morin's idea" start="00:20:42.239" video="mainVideo" id=subtitle]]
+[[!template text="of a 'cognitive democracy'," start="00:20:44.479" video="mainVideo" id=subtitle]]
+[[!template text="which is to say," start="00:20:46.720" video="mainVideo" id=subtitle]]
+[[!template text="a community that is nourished" start="00:20:48.160" video="mainVideo" id=subtitle]]
+[[!template text="by antagonisms" start="00:20:50.880" video="mainVideo" id=subtitle]]
+[[!template text="while also regulating them." start="00:20:52.320" video="mainVideo" id=subtitle]]
+[[!template text="The &quot;being&quot; of this" start="00:20:55.840" video="mainVideo" id=subtitle]]
+[[!template text="very special community," start="00:20:57.280" video="mainVideo" id=subtitle]]
+[[!template text="then, very importantly," start="00:20:58.560" video="mainVideo" id=subtitle]]
+[[!template text="stems from how at the center," start="00:21:01.119" video="mainVideo" id=subtitle]]
+[[!template text="we have free software" start="00:21:03.920" video="mainVideo" id=subtitle]]
+[[!template text="that allows for this range of difference" start="00:21:05.999" video="mainVideo" id=subtitle]]
+[[!template text="and range of extensibility to exist" start="00:21:08.720" video="mainVideo" id=subtitle]]
+[[!template text="even within the community." start="00:21:11.440" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, by way of a conclusion," start="00:21:13.599" video="mainVideo" id=subtitle]]
+[[!template text="we can think of Emacs" start="00:21:16.880" video="mainVideo" id=subtitle]]
+[[!template text="as the center of centers that expands," start="00:21:18.080" video="mainVideo" id=subtitle]]
+[[!template text="that is relational and free." start="00:21:21.359" video="mainVideo" id=subtitle]]
+[[!template text="Only in some systems, we should add," start="00:21:24.160" video="mainVideo" id=subtitle]]
+[[!template text="does this &quot;being&quot; emerge." start="00:21:27.280" video="mainVideo" id=subtitle]]
+[[!template text="So going back to Richard Gabriel," start="00:21:28.720" video="mainVideo" id=subtitle]]
+[[!template text="just to champion Emacs one more time" start="00:21:31.040" video="mainVideo" id=subtitle]]
+[[!template text="before we say goodbye:" start="00:21:32.960" video="mainVideo" id=subtitle]]
+[[!template text="only in some systems," start="00:21:34.400" video="mainVideo" id=subtitle]]
+[[!template text="some software systems," start="00:21:35.599" video="mainVideo" id=subtitle]]
+[[!template text="does a system succeed" start="00:21:36.640" video="mainVideo" id=subtitle]]
+[[!template text="in becoming the center" start="00:21:38.960" video="mainVideo" id=subtitle]]
+[[!template text="of all of the other centers" start="00:21:40.080" video="mainVideo" id=subtitle]]
+[[!template text="and become a framework" start="00:21:41.680" video="mainVideo" id=subtitle]]
+[[!template text="that can be used and reused," start="00:21:43.920" video="mainVideo" id=subtitle]]
+[[!template text="which gives systems and objects" start="00:21:45.520" video="mainVideo" id=subtitle]]
+[[!template text="their spirit." start="00:21:47.840" video="mainVideo" id=subtitle]]
+[[!template text="So Emacs is being used and reused" start="00:21:48.720" video="mainVideo" id=subtitle]]
+[[!template text="through these packages," start="00:21:51.520" video="mainVideo" id=subtitle]]
+[[!template text="and it gives to them their spirit." start="00:21:53.599" video="mainVideo" id=subtitle]]
+[[!template text="The spirit, I would argue," start="00:21:55.119" video="mainVideo" id=subtitle]]
+[[!template text="is in part this extensibility," start="00:21:56.320" video="mainVideo" id=subtitle]]
+[[!template text="and sometimes even difference." start="00:21:59.040" video="mainVideo" id=subtitle]]
+[[!template text="Emacs values the value cf. Stiegler" start="00:22:01.520" video="mainVideo" id=subtitle]]
+[[!template text="of the freedom to create," start="00:22:03.120" video="mainVideo" id=subtitle]]
+[[!template text="use, and share cf. Illich," start="00:22:04.240" video="mainVideo" id=subtitle]]
+[[!template text="so we can be inspired" start="00:22:05.680" video="mainVideo" id=subtitle]]
+[[!template text="by this design pattern." start="00:22:06.960" video="mainVideo" id=subtitle]]
+[[!template text="It is... It rallies" start="00:22:09.119" video="mainVideo" id=subtitle]]
+[[!template text="an autonomous designer mindset" start="00:22:11.359" video="mainVideo" id=subtitle]]
+[[!template text="and encourages and supports us" start="00:22:14.320" video="mainVideo" id=subtitle]]
+[[!template text="on our path towards" start="00:22:16.800" video="mainVideo" id=subtitle]]
+[[!template text="design pattern iteration." start="00:22:18.400" video="mainVideo" id=subtitle]]
+[[!template text="It is not a 'flattened' contextualization." start="00:22:20.960" video="mainVideo" id=subtitle]]
+[[!template text="It permits ongoing learning," start="00:22:23.359" video="mainVideo" id=subtitle]]
+[[!template text="reassembling contexts," start="00:22:25.359" video="mainVideo" id=subtitle]]
+[[!template text="and an adaptable design pattern" start="00:22:27.040" video="mainVideo" id=subtitle]]
+[[!template text="extensibility." start="00:22:29.520" video="mainVideo" id=subtitle]]
+[[!template text="Ultimately, it helps us create" start="00:22:31.520" video="mainVideo" id=subtitle]]
+[[!template text="circumstances where learning is coherent" start="00:22:33.200" video="mainVideo" id=subtitle]]
+[[!template text="with what is valued in the rest of life:" start="00:22:35.520" video="mainVideo" id=subtitle]]
+[[!template text="pleasure, growth, and transformation." start="00:22:37.920" video="mainVideo" id=subtitle]]
+[[!template text="So thank you, on that note," start="00:22:41.520" video="mainVideo" id=subtitle]]
+[[!template text="to all of the developers, maintainers," start="00:22:43.200" video="mainVideo" id=subtitle]]
+[[!template text="contributors, and community" start="00:22:45.280" video="mainVideo" id=subtitle]]
+[[!template text="for championing our freedom" start="00:22:47.119" video="mainVideo" id=subtitle]]
+[[!template text="to co-individuate complex design patterns" start="00:22:48.560" video="mainVideo" id=subtitle]]
+[[!template text="the way we want to, so we, too," start="00:22:51.760" video="mainVideo" id=subtitle]]
+[[!template text="can leave original traces, if we want to." start="00:22:54.320" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much." start="00:22:57.359" video="mainVideo" id=subtitle]]
+[[!template text="[captions by sachac]" start="00:23:00.003" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/professional.md b/2021/captions/professional.md
new file mode 100644
index 00000000..de4948ee
--- /dev/null
+++ b/2021/captions/professional.md
@@ -0,0 +1,293 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello everyone! My name is Philip Beadling." start="00:00:02.879" video="mainVideo" id=subtitle]]
+[[!template text="Just to give you a bit of background," start="00:00:05.424" video="mainVideo" id=subtitle]]
+[[!template text="I'm the enterprise architect" start="00:00:06.944" video="mainVideo" id=subtitle]]
+[[!template text="in a company called Quantile Technologies." start="00:00:08.400" video="mainVideo" id=subtitle]]
+[[!template text="I've been using Emacs" start="00:00:10.384" video="mainVideo" id=subtitle]]
+[[!template text="certainly for the last four or five years" start="00:00:12.799" video="mainVideo" id=subtitle]]
+[[!template text="as part of my day-to-day workflow," start="00:00:14.560" video="mainVideo" id=subtitle]]
+[[!template text="but I've used it on and off" start="00:00:16.800" video="mainVideo" id=subtitle]]
+[[!template text="for the last 20 years" start="00:00:18.080" video="mainVideo" id=subtitle]]
+[[!template text="depending on the jobs" start="00:00:19.000" video="mainVideo" id=subtitle]]
+[[!template text="or the task at hand." start="00:00:21.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now, today I'm here in a personal capacity" start="00:00:22.423" video="mainVideo" id=subtitle]]
+[[!template text="to talk about a use I had" start="00:00:24.800" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs last year" start="00:00:27.360" video="mainVideo" id=subtitle]]
+[[!template text="where I had to record" start="00:00:28.440" video="mainVideo" id=subtitle]]
+[[!template text="my continuous professional development," start="00:00:31.000" video="mainVideo" id=subtitle]]
+[[!template text="and I was required to be audited" start="00:00:32.800" video="mainVideo" id=subtitle]]
+[[!template text="by my professional body on it." start="00:00:35.320" video="mainVideo" id=subtitle]]
+[[!template text="My CPD record is a bit of a mess," start="00:00:37.280" video="mainVideo" id=subtitle]]
+[[!template text="or certainly was. It was over" start="00:00:40.240" video="mainVideo" id=subtitle]]
+[[!template text="various different services and systems" start="00:00:42.640" video="mainVideo" id=subtitle]]
+[[!template text="that have been provided to me" start="00:00:44.640" video="mainVideo" id=subtitle]]
+[[!template text="by previous employers." start="00:00:46.160" video="mainVideo" id=subtitle]]
+[[!template text="And, I had bits of it in Excel spreadsheets," start="00:00:47.920" video="mainVideo" id=subtitle]]
+[[!template text="and I was looking for like" start="00:00:51.824" video="mainVideo" id=subtitle]]
+[[!template text="a one single golden source" start="00:00:52.640" video="mainVideo" id=subtitle]]
+[[!template text="where I could store it all" start="00:00:54.200" video="mainVideo" id=subtitle]]
+[[!template text="and use in the future." start="00:00:55.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, I had a look online." start="00:00:56.719" video="mainVideo" id=subtitle]]
+[[!template text="I didn't find anything I'd like," start="00:00:59.024" video="mainVideo" id=subtitle]]
+[[!template text="so I decided I would use Emacs," start="00:00:59.824" video="mainVideo" id=subtitle]]
+[[!template text="and I quickly came to the conclusion" start="00:01:01.885" video="mainVideo" id=subtitle]]
+[[!template text="that using Org mode" start="00:01:03.840" video="mainVideo" id=subtitle]]
+[[!template text="was a nice fit for this," start="00:01:05.480" video="mainVideo" id=subtitle]]
+[[!template text="you know, both the TODO lists" start="00:01:07.040" video="mainVideo" id=subtitle]]
+[[!template text="and the properties" start="00:01:08.160" video="mainVideo" id=subtitle]]
+[[!template text="seem to fit nicely" start="00:01:09.080" video="mainVideo" id=subtitle]]
+[[!template text="with building a very basic database," start="00:01:10.920" video="mainVideo" id=subtitle]]
+[[!template text="which is what in effect this is," start="00:01:12.890" video="mainVideo" id=subtitle]]
+[[!template text="what this is." start="00:01:14.159" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Without further ado," start="00:01:16.159" video="mainVideo" id=subtitle]]
+[[!template text="I will start by just downloading." start="00:01:18.000" video="mainVideo" id=subtitle]]
+[[!template text="This is available on my public Git," start="00:01:22.640" video="mainVideo" id=subtitle]]
+[[!template text="handle is falloutfill," start="00:01:24.640" video="mainVideo" id=subtitle]]
+[[!template text="and it's under a project called Misc." start="00:01:26.160" video="mainVideo" id=subtitle]]
+[[!template text="It's just a single file called cpd.org," start="00:01:28.146" video="mainVideo" id=subtitle]]
+[[!template text="I can stick that in the chat" start="00:01:33.200" video="mainVideo" id=subtitle]]
+[[!template text="when we actually do this live," start="00:01:35.080" video="mainVideo" id=subtitle]]
+[[!template text="so that people will have a link to it." start="00:01:36.280" video="mainVideo" id=subtitle]]
+[[!template text="So, I'll start this up." start="00:01:38.532" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay. To start with, I am just going to" start="00:01:41.119" video="mainVideo" id=subtitle]]
+[[!template text="close down various Lisp stuff," start="00:01:44.560" video="mainVideo" id=subtitle]]
+[[!template text="and just give you a demo of" start="00:01:46.826" video="mainVideo" id=subtitle]]
+[[!template text="how it actually works." start="00:01:48.566" video="mainVideo" id=subtitle]]
+[[!template text="Let's go up here." start="00:01:50.560" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so, basically to make this work," start="00:01:55.040" video="mainVideo" id=subtitle]]
+[[!template text="the way I subdivide it" start="00:01:57.205" video="mainVideo" id=subtitle]]
+[[!template text="is that I would have" start="00:01:58.640" video="mainVideo" id=subtitle]]
+[[!template text="professional goals," start="00:01:59.200" video="mainVideo" id=subtitle]]
+[[!template text="and professional goals" start="00:02:00.200" video="mainVideo" id=subtitle]]
+[[!template text="would be made up of activities," start="00:02:01.040" video="mainVideo" id=subtitle]]
+[[!template text="and each of those activities" start="00:02:02.703" video="mainVideo" id=subtitle]]
+[[!template text="would contribute to the goal." start="00:02:03.741" video="mainVideo" id=subtitle]]
+[[!template text="So, in order to represent this," start="00:02:05.917" video="mainVideo" id=subtitle]]
+[[!template text="this is just a nested TODO list" start="00:02:07.713" video="mainVideo" id=subtitle]]
+[[!template text="in Emacs Org mode." start="00:02:10.000" video="mainVideo" id=subtitle]]
+[[!template text="I sort of change things like the naming," start="00:02:12.800" video="mainVideo" id=subtitle]]
+[[!template text="Pending, In-Progress and Complete" start="00:02:16.068" video="mainVideo" id=subtitle]]
+[[!template text="rather than TODO, DONE because" start="00:02:18.247" video="mainVideo" id=subtitle]]
+[[!template text="that's more like what my professional" start="00:02:19.440" video="mainVideo" id=subtitle]]
+[[!template text="body likes to categorize things," start="00:02:21.360" video="mainVideo" id=subtitle]]
+[[!template text="but essentially it's the same thing." start="00:02:23.244" video="mainVideo" id=subtitle]]
+[[!template text="So, I've got an Org capture template" start="00:02:25.315" video="mainVideo" id=subtitle]]
+[[!template text="or two Org capture templates" start="00:02:28.212" video="mainVideo" id=subtitle]]
+[[!template text="in order to grab this information," start="00:02:29.499" video="mainVideo" id=subtitle]]
+[[!template text="and then stick it in the TODO list," start="00:02:31.843" video="mainVideo" id=subtitle]]
+[[!template text="and also tabulate it using column view." start="00:02:33.645" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I'll start off just by showing you" start="00:02:36.540" video="mainVideo" id=subtitle]]
+[[!template text="an example here." start="00:02:39.304" video="mainVideo" id=subtitle]]
+[[!template text="So, what I'm going to do is" start="00:02:40.090" video="mainVideo" id=subtitle]]
+[[!template text="create a new goal," start="00:02:40.879" video="mainVideo" id=subtitle]]
+[[!template text="and then under it," start="00:02:41.965" video="mainVideo" id=subtitle]]
+[[!template text="I will create a couple of activities" start="00:02:42.849" video="mainVideo" id=subtitle]]
+[[!template text="relevant to that goal." start="00:02:44.959" video="mainVideo" id=subtitle]]
+[[!template text="For the goal I'm going to have, let's say," start="00:02:46.511" video="mainVideo" id=subtitle]]
+[[!template text="something relevant," start="00:02:49.360" video="mainVideo" id=subtitle]]
+[[!template text="so, 'Improve Public Speaking'," start="00:02:50.342" video="mainVideo" id=subtitle]]
+[[!template text="and then I'm going to say, the type" start="00:02:54.000" video="mainVideo" id=subtitle]]
+[[!template text="of that goal is, well, it's a 'Presentation'" start="00:02:55.680" video="mainVideo" id=subtitle]]
+[[!template text="I suppose. The outcome of that goal is," start="00:02:58.000" video="mainVideo" id=subtitle]]
+[[!template text="well, I don't want to go into too much" start="00:03:01.200" video="mainVideo" id=subtitle]]
+[[!template text="detail here, but it would be, you know," start="00:03:02.560" video="mainVideo" id=subtitle]]
+[[!template text="'Get feedback from colleagues', and so forth." start="00:03:06.069" video="mainVideo" id=subtitle]]
+[[!template text="I won't fully and completely inaudible" start="00:03:09.140" video="mainVideo" id=subtitle]]
+[[!template text="about what the goal was." start="00:03:11.200" video="mainVideo" id=subtitle]]
+[[!template text="Now, the retrospective value," start="00:03:12.538" video="mainVideo" id=subtitle]]
+[[!template text="my understanding is that" start="00:03:14.067" video="mainVideo" id=subtitle]]
+[[!template text="you fill that in afterwards," start="00:03:15.318" video="mainVideo" id=subtitle]]
+[[!template text="so you want to talk after completing the" start="00:03:17.028" video="mainVideo" id=subtitle]]
+[[!template text="action, so this is not relevant for the day." start="00:03:18.800" video="mainVideo" id=subtitle]]
+[[!template text="I'm just going to leave it blank," start="00:03:21.213" video="mainVideo" id=subtitle]]
+[[!template text="although I'm sure you can imagine" start="00:03:23.120" video="mainVideo" id=subtitle]]
+[[!template text="I could say: having completed this action" start="00:03:24.541" video="mainVideo" id=subtitle]]
+[[!template text="I felt that, blah blah blah, and so forth." start="00:03:26.428" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so I will add that, and then you" start="00:03:28.959" video="mainVideo" id=subtitle]]
+[[!template text="will see that I now have a new goal," start="00:03:31.360" video="mainVideo" id=subtitle]]
+[[!template text="both in my column view and in my TODO list," start="00:03:33.760" video="mainVideo" id=subtitle]]
+[[!template text="and just to make it a little bit" start="00:03:36.048" video="mainVideo" id=subtitle]]
+[[!template text="realistic, I'm going to then add two" start="00:03:38.159" video="mainVideo" id=subtitle]]
+[[!template text="activities to that." start="00:03:39.920" video="mainVideo" id=subtitle]]
+[[!template text="When I come in to add an activity," start="00:03:41.332" video="mainVideo" id=subtitle]]
+[[!template text="I have to select a goal." start="00:03:43.433" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to select 'Improve Public Speaking'." start="00:03:44.560" video="mainVideo" id=subtitle]]
+[[!template text="Yeah, so, the activity I'm going to say is," start="00:03:49.120" video="mainVideo" id=subtitle]]
+[[!template text="well, let's say, 'Speak at EmacsConf 2021'," start="00:03:52.963" video="mainVideo" id=subtitle]]
+[[!template text="that we can use a type of 'Presentation'," start="00:03:57.427" video="mainVideo" id=subtitle]]
+[[!template text="outcome of that is, stating the obvious," start="00:04:01.200" video="mainVideo" id=subtitle]]
+[[!template text="'Present on an Emacs idea'." start="00:04:04.352" video="mainVideo" id=subtitle]]
+[[!template text="Right, something along the lines of that." start="00:04:08.080" video="mainVideo" id=subtitle]]
+[[!template text="And, then retrospective, again I'm not" start="00:04:09.680" video="mainVideo" id=subtitle]]
+[[!template text="going to fill that in at the moment." start="00:04:11.519" video="mainVideo" id=subtitle]]
+[[!template text="Then, last but not least," start="00:04:14.135" video="mainVideo" id=subtitle]]
+[[!template text="I will come up with a slightly different" start="00:04:19.060" video="mainVideo" id=subtitle]]
+[[!template text="activity. So, again selecting" start="00:04:20.799" video="mainVideo" id=subtitle]]
+[[!template text="'Improve Public Speaking'," start="00:04:23.215" video="mainVideo" id=subtitle]]
+[[!template text="the activity would be" start="00:04:24.889" video="mainVideo" id=subtitle]]
+[[!template text="'Watch lecture series on public speaking'," start="00:04:27.440" video="mainVideo" id=subtitle]]
+[[!template text="you know, blah blah blah, so forth." start="00:04:31.257" video="mainVideo" id=subtitle]]
+[[!template text="Type value would be" start="00:04:33.426" video="mainVideo" id=subtitle]]
+[[!template text="Lecture, for this outcome would maybe be" start="00:04:34.720" video="mainVideo" id=subtitle]]
+[[!template text="'Use new knowledge in EmacsConf presentation'." start="00:04:37.600" video="mainVideo" id=subtitle]]
+[[!template text="Right, might be a good one there." start="00:04:43.252" video="mainVideo" id=subtitle]]
+[[!template text="Again, retrospective value," start="00:04:45.350" video="mainVideo" id=subtitle]]
+[[!template text="I'm just going to leave that blank," start="00:04:46.720" video="mainVideo" id=subtitle]]
+[[!template text="and I'm going to save that." start="00:04:48.518" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now, we're in a position where we've got" start="00:04:51.440" video="mainVideo" id=subtitle]]
+[[!template text="a goal and two activities, which are" start="00:04:52.960" video="mainVideo" id=subtitle]]
+[[!template text="represented here, you can see here that I" start="00:04:54.960" video="mainVideo" id=subtitle]]
+[[!template text="can move an activity, cycle it forward to" start="00:04:57.520" video="mainVideo" id=subtitle]]
+[[!template text="In-Progress. When I do that," start="00:05:00.160" video="mainVideo" id=subtitle]]
+[[!template text="I get a STARTED timestamp here." start="00:05:02.322" video="mainVideo" id=subtitle]]
+[[!template text="If I then cycle it again," start="00:05:05.104" video="mainVideo" id=subtitle]]
+[[!template text="I get the more familiar CLOSED timestamp here." start="00:05:06.737" video="mainVideo" id=subtitle]]
+[[!template text="The STARTED timestamp is a bit of" start="00:05:09.869" video="mainVideo" id=subtitle]]
+[[!template text="custom code, I'll show you that in a moment." start="00:05:11.635" video="mainVideo" id=subtitle]]
+[[!template text="And then likewise, let's say that…," start="00:05:13.918" video="mainVideo" id=subtitle]]
+[[!template text="we'll move this one from PENDING to STARTED." start="00:05:17.120" video="mainVideo" id=subtitle]]
+[[!template text="Okay. Now, if I save the document," start="00:05:20.166" video="mainVideo" id=subtitle]]
+[[!template text="that will trigger the updating" start="00:05:22.960" video="mainVideo" id=subtitle]]
+[[!template text="of the column view, you can see now" start="00:05:24.560" video="mainVideo" id=subtitle]]
+[[!template text="that we have the various started and" start="00:05:27.520" video="mainVideo" id=subtitle]]
+[[!template text="completed statuses, this is up to date." start="00:05:29.360" video="mainVideo" id=subtitle]]
+[[!template text="So, that's pretty much." start="00:05:31.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="You can imagine that we could add" start="00:05:32.937" video="mainVideo" id=subtitle]]
+[[!template text="lots of goals and lots of activities," start="00:05:34.211" video="mainVideo" id=subtitle]]
+[[!template text="and this would grow into, you know," start="00:05:35.469" video="mainVideo" id=subtitle]]
+[[!template text="several sheets worth of a work," start="00:05:37.474" video="mainVideo" id=subtitle]]
+[[!template text="and then last but not least," start="00:05:41.704" video="mainVideo" id=subtitle]]
+[[!template text="is obviously the most important thing." start="00:05:43.748" video="mainVideo" id=subtitle]]
+[[!template text="How do you submit it?" start="00:05:45.440" video="mainVideo" id=subtitle]]
+[[!template text="We could just use the standard" start="00:05:46.720" video="mainVideo" id=subtitle]]
+[[!template text="export facility in Org mode for doing that." start="00:05:48.479" video="mainVideo" id=subtitle]]
+[[!template text="That's just Control c Control e l o (C-c C-e l o)." start="00:05:50.856" video="mainVideo" id=subtitle]]
+[[!template text="And there you can see," start="00:05:55.039" video="mainVideo" id=subtitle]]
+[[!template text="there you've got the goals and activities." start="00:06:03.440" video="mainVideo" id=subtitle]]
+[[!template text="I spent a bit of time, I won't go too much" start="00:06:06.586" video="mainVideo" id=subtitle]]
+[[!template text="in the LaTeX formatting, but coming up" start="00:06:08.319" video="mainVideo" id=subtitle]]
+[[!template text="with something that I felt and got as" start="00:06:10.000" video="mainVideo" id=subtitle]]
+[[!template text="much information compactly on a page" start="00:06:12.319" video="mainVideo" id=subtitle]]
+[[!template text="without making it difficult to read," start="00:06:14.720" video="mainVideo" id=subtitle]]
+[[!template text="should we say, and it's always" start="00:06:17.840" video="mainVideo" id=subtitle]]
+[[!template text="a find-the-balance thing." start="00:06:19.039" video="mainVideo" id=subtitle]]
+[[!template text="I'm not saying I'm an expert on it," start="00:06:20.080" video="mainVideo" id=subtitle]]
+[[!template text="but I thought what I came up with here" start="00:06:22.560" video="mainVideo" id=subtitle]]
+[[!template text="was reasonably clear" start="00:06:24.400" video="mainVideo" id=subtitle]]
+[[!template text="but allowed you to write enough information." start="00:06:25.905" video="mainVideo" id=subtitle]]
+[[!template text="The goals and activities were reasonably" start="00:06:28.960" video="mainVideo" id=subtitle]]
+[[!template text="well explained." start="00:06:31.039" video="mainVideo" id=subtitle]]
+[[!template text="Okay, we can just kill that." start="00:06:32.419" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, how does all of that work?" start="00:06:35.039" video="mainVideo" id=subtitle]]
+[[!template text="Well, underneath is config tab here," start="00:06:37.402" video="mainVideo" id=subtitle]]
+[[!template text="we have a bunch of Lisp" start="00:06:40.180" video="mainVideo" id=subtitle]]
+[[!template text="that I'm going to sort of fly through here." start="00:06:41.210" video="mainVideo" id=subtitle]]
+[[!template text="You can ask me any questions afterwards." start="00:06:43.276" video="mainVideo" id=subtitle]]
+[[!template text="First thing is," start="00:06:45.898" video="mainVideo" id=subtitle]]
+[[!template text="we have the org-capture templates," start="00:06:46.639" video="mainVideo" id=subtitle]]
+[[!template text="which are here." start="00:06:48.371" video="mainVideo" id=subtitle]]
+[[!template text="The goal one is not doing anything special." start="00:06:50.101" video="mainVideo" id=subtitle]]
+[[!template text="It's just writing it back to this file," start="00:06:53.178" video="mainVideo" id=subtitle]]
+[[!template text="so there is a limitation there" start="00:06:55.605" video="mainVideo" id=subtitle]]
+[[!template text="that you must have this file open" start="00:06:57.125" video="mainVideo" id=subtitle]]
+[[!template text="when you add them, which is" start="00:06:58.718" video="mainVideo" id=subtitle]]
+[[!template text="something I'd like to improve in future." start="00:06:59.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="For the activities, it specifies the file," start="00:07:02.000" video="mainVideo" id=subtitle]]
+[[!template text="but it also specifies this function" start="00:07:04.952" video="mainVideo" id=subtitle]]
+[[!template text="set-activity-pos-from-goal, which (is) above here." start="00:07:06.560" video="mainVideo" id=subtitle]]
+[[!template text="What this does is, it iterates through the" start="00:07:09.926" video="mainVideo" id=subtitle]]
+[[!template text="various Org entries looking for goals," start="00:07:12.720" video="mainVideo" id=subtitle]]
+[[!template text="and once it has a list of goals," start="00:07:17.360" video="mainVideo" id=subtitle]]
+[[!template text="it presents them to you" start="00:07:20.720" video="mainVideo" id=subtitle]]
+[[!template text="using ido-completing-read," start="00:07:21.919" video="mainVideo" id=subtitle]]
+[[!template text="so that you can select the goal" start="00:07:23.599" video="mainVideo" id=subtitle]]
+[[!template text="that you want the activity to live underneath," start="00:07:25.120" video="mainVideo" id=subtitle]]
+[[!template text="and it then searches forward, and it finds" start="00:07:27.610" video="mainVideo" id=subtitle]]
+[[!template text="the appropriate spot in that goal" start="00:07:29.520" video="mainVideo" id=subtitle]]
+[[!template text="that the Emacs can then dump" start="00:07:31.599" video="mainVideo" id=subtitle]]
+[[!template text="the captured activity." start="00:07:33.919" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Okay, the next one is pretty straightforward." start="00:07:36.000" video="mainVideo" id=subtitle]]
+[[!template text="Because I changed the names" start="00:07:39.210" video="mainVideo" id=subtitle]]
+[[!template text="of the TODO, DONE," start="00:07:40.479" video="mainVideo" id=subtitle]]
+[[!template text="I now need a new way of aggregating" start="00:07:42.240" video="mainVideo" id=subtitle]]
+[[!template text="the summary completion statuses." start="00:07:44.720" video="mainVideo" id=subtitle]]
+[[!template text="So, for this I'm just looking" start="00:07:46.691" video="mainVideo" id=subtitle]]
+[[!template text="at the number of completed activities" start="00:07:48.400" video="mainVideo" id=subtitle]]
+[[!template text="over the total number of activities," start="00:07:51.440" video="mainVideo" id=subtitle]]
+[[!template text="and I make that available on the C+ here," start="00:07:53.627" video="mainVideo" id=subtitle]]
+[[!template text="which we will see when I go and show you" start="00:07:57.665" video="mainVideo" id=subtitle]]
+[[!template text="the top configuration in the Org document" start="00:08:00.859" video="mainVideo" id=subtitle]]
+[[!template text="in two minutes." start="00:08:03.960" video="mainVideo" id=subtitle]]
+[[!template new="1" text="I mentioned that we needed to have our" start="00:08:05.199" video="mainVideo" id=subtitle]]
+[[!template text="own start date. The way this works is" start="00:08:08.080" video="mainVideo" id=subtitle]]
+[[!template text="we add a hook to" start="00:08:10.400" video="mainVideo" id=subtitle]]
+[[!template text="org-after-todo-state-change-hook," start="00:08:11.870" video="mainVideo" id=subtitle]]
+[[!template text="which means that we test" start="00:08:14.996" video="mainVideo" id=subtitle]]
+[[!template text="the state change results in" start="00:08:17.199" video="mainVideo" id=subtitle]]
+[[!template text="one of the items being In-Progress," start="00:08:19.680" video="mainVideo" id=subtitle]]
+[[!template text="and if that's true" start="00:08:21.599" video="mainVideo" id=subtitle]]
+[[!template text="and it already doesn't have a time stamp," start="00:08:23.199" video="mainVideo" id=subtitle]]
+[[!template text="then it creates a timestamp" start="00:08:25.360" video="mainVideo" id=subtitle]]
+[[!template text="with the current time and date." start="00:08:26.639" video="mainVideo" id=subtitle]]
+[[!template text="The second hook here is just ensuring that" start="00:08:29.049" video="mainVideo" id=subtitle]]
+[[!template text="when we save the document," start="00:08:31.199" video="mainVideo" id=subtitle]]
+[[!template text="that the column view is dynamically updated," start="00:08:32.663" video="mainVideo" id=subtitle]]
+[[!template text="so that everything is up to date." start="00:08:34.898" video="mainVideo" id=subtitle]]
+[[!template text="And then last but not least here," start="00:08:36.578" video="mainVideo" id=subtitle]]
+[[!template text="the tmp-f-timestamp, what this does is," start="00:08:39.444" video="mainVideo" id=subtitle]]
+[[!template text="on the export, it modifies the timestamps," start="00:08:43.590" video="mainVideo" id=subtitle]]
+[[!template text="so that it removes the angle brackets," start="00:08:46.690" video="mainVideo" id=subtitle]]
+[[!template text="and it removes the hours and minutes." start="00:08:48.336" video="mainVideo" id=subtitle]]
+[[!template text="That is a space-saving thing" start="00:08:50.367" video="mainVideo" id=subtitle]]
+[[!template text="and a tidiness thing in the PDF." start="00:08:51.839" video="mainVideo" id=subtitle]]
+[[!template text="I'll show you in a second how that's used." start="00:08:54.080" video="mainVideo" id=subtitle]]
+[[!template text="We then allow bind-keywords." start="00:08:56.187" video="mainVideo" id=subtitle]]
+[[!template text="We use them above." start="00:08:58.121" video="mainVideo" id=subtitle]]
+[[!template text="Then we just have a simple key" start="00:08:59.839" video="mainVideo" id=subtitle]]
+[[!template text="that allows us to hotkey for org-capture." start="00:09:01.200" video="mainVideo" id=subtitle]]
+[[!template text="And then at the start," start="00:09:05.258" video="mainVideo" id=subtitle]]
+[[!template text="when we evaluate the startup block" start="00:09:06.800" video="mainVideo" id=subtitle]]
+[[!template text="that I have of Lisp," start="00:09:07.327" video="mainVideo" id=subtitle]]
+[[!template text="just so it's already there," start="00:09:10.160" video="mainVideo" id=subtitle]]
+[[!template text="and set the number of sublevels to one" start="00:09:11.360" video="mainVideo" id=subtitle]]
+[[!template text="so only the top levels exist." start="00:09:13.519" video="mainVideo" id=subtitle]]
+[[!template text="Coming back over the top" start="00:09:16.080" video="mainVideo" id=subtitle]]
+[[!template text="to put that all back together again." start="00:09:19.360" video="mainVideo" id=subtitle]]
+[[!template text="The startup just tells you" start="00:09:21.576" video="mainVideo" id=subtitle]]
+[[!template text="that you want log times." start="00:09:22.720" video="mainVideo" id=subtitle]]
+[[!template text="The title, author, description, and…," start="00:09:24.926" video="mainVideo" id=subtitle]]
+[[!template text="they should be obvious, right," start="00:09:27.023" video="mainVideo" id=subtitle]]
+[[!template text="that's just text for the PDF." start="00:09:28.536" video="mainVideo" id=subtitle]]
+[[!template text="Options, we disable the table of contents," start="00:09:29.920" video="mainVideo" id=subtitle]]
+[[!template text="we do not want that." start="00:09:33.049" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now, the output config here," start="00:09:34.320" video="mainVideo" id=subtitle]]
+[[!template text="the first two are resulting" start="00:09:35.680" video="mainVideo" id=subtitle]]
+[[!template text="in the timestamp formats, so, that was" start="00:09:37.519" video="mainVideo" id=subtitle]]
+[[!template text="the tmp-f-timestamp function" start="00:09:40.160" video="mainVideo" id=subtitle]]
+[[!template text="I showed you below." start="00:09:41.920" video="mainVideo" id=subtitle]]
+[[!template text="And, we got a better LaTeX stuff here," start="00:09:43.468" video="mainVideo" id=subtitle]]
+[[!template text="just saying that we want a landscape," start="00:09:45.310" video="mainVideo" id=subtitle]]
+[[!template text="and we want to use A4 paper size," start="00:09:47.134" video="mainVideo" id=subtitle]]
+[[!template text="and then the columns here." start="00:09:49.150" video="mainVideo" id=subtitle]]
+[[!template text="What we want is just to" start="00:09:50.560" video="mainVideo" id=subtitle]]
+[[!template text="rename the properties" start="00:09:51.839" video="mainVideo" id=subtitle]]
+[[!template text="to something which just looks" start="00:09:52.880" video="mainVideo" id=subtitle]]
+[[!template text="a little bit nicer in the table." start="00:09:54.160" video="mainVideo" id=subtitle]]
+[[!template text="So you can see that: goals, activities," start="00:09:55.572" video="mainVideo" id=subtitle]]
+[[!template text="status, completed, and so forth." start="00:09:58.320" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Then last but not least," start="00:10:00.979" video="mainVideo" id=subtitle]]
+[[!template text="on the actual thing," start="00:10:03.760" video="mainVideo" id=subtitle]]
+[[!template text="we use a longtable in LaTeX." start="00:10:04.640" video="mainVideo" id=subtitle]]
+[[!template text="We align, so we specify very exactly" start="00:10:06.487" video="mainVideo" id=subtitle]]
+[[!template text="that we want five centimeters" start="00:10:09.360" video="mainVideo" id=subtitle]]
+[[!template text="for the first and last two columns," start="00:10:11.040" video="mainVideo" id=subtitle]]
+[[!template text="and that we want all the other columns" start="00:10:13.364" video="mainVideo" id=subtitle]]
+[[!template text="to use the remaining space." start="00:10:15.680" video="mainVideo" id=subtitle]]
+[[!template text="And that's it." start="00:10:17.196" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Appreciate, I've absolutely whirlwinded" start="00:10:19.040" video="mainVideo" id=subtitle]]
+[[!template text="through that, but please do feel free" start="00:10:21.440" video="mainVideo" id=subtitle]]
+[[!template text="to ask me any questions," start="00:10:24.160" video="mainVideo" id=subtitle]]
+[[!template text="or speak to me offline." start="00:10:26.144" video="mainVideo" id=subtitle]]
+[[!template text="Thank you very much." start="00:10:28.786" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/project.md b/2021/captions/project.md
new file mode 100644
index 00000000..026e73ea
--- /dev/null
+++ b/2021/captions/project.md
@@ -0,0 +1,241 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="hi i am adolfo villafraid i am the" start="00:00:01.040" video="mainVideo" id=subtitle]]
+[[!template text="co-founder of chef tech an innovative" start="00:00:03.439" video="mainVideo" id=subtitle]]
+[[!template text="staff a socially vocated innovative" start="00:00:05.600" video="mainVideo" id=subtitle]]
+[[!template text="setup" start="00:00:08.240" video="mainVideo" id=subtitle]]
+[[!template text="in italy and today i'm gonna talk about" start="00:00:09.440" video="mainVideo" id=subtitle]]
+[[!template text="the way in which we use earth mode to" start="00:00:12.639" video="mainVideo" id=subtitle]]
+[[!template text="budget our" start="00:00:14.920" video="mainVideo" id=subtitle]]
+[[!template text="projects first i need to introduce the" start="00:00:16.960" video="mainVideo" id=subtitle]]
+[[!template text="way in which we build our project budget" start="00:00:18.880" video="mainVideo" id=subtitle]]
+[[!template text="we start from the goals and the work to" start="00:00:21.279" video="mainVideo" id=subtitle]]
+[[!template text="be performed" start="00:00:23.119" video="mainVideo" id=subtitle]]
+[[!template text="and" start="00:00:24.720" video="mainVideo" id=subtitle]]
+[[!template text="we" start="00:00:25.840" video="mainVideo" id=subtitle]]
+[[!template text="split it into different tasks" start="00:00:26.800" video="mainVideo" id=subtitle]]
+[[!template text="which may be grouped in different ways" start="00:00:29.840" video="mainVideo" id=subtitle]]
+[[!template text="according to our needs it could be user" start="00:00:31.920" video="mainVideo" id=subtitle]]
+[[!template text="stories or" start="00:00:34.320" video="mainVideo" id=subtitle]]
+[[!template text="functional groups or" start="00:00:35.840" video="mainVideo" id=subtitle]]
+[[!template text="or packages and then for each task we" start="00:00:38.320" video="mainVideo" id=subtitle]]
+[[!template text="compute the effort" start="00:00:40.879" video="mainVideo" id=subtitle]]
+[[!template text="then from the effort we derive the" start="00:00:44.000" video="mainVideo" id=subtitle]]
+[[!template text="project cost and" start="00:00:46.640" video="mainVideo" id=subtitle]]
+[[!template text="price" start="00:00:48.320" video="mainVideo" id=subtitle]]
+[[!template text="according to two different approaches" start="00:00:49.840" video="mainVideo" id=subtitle]]
+[[!template text="the first approach we allocate the" start="00:00:52.239" video="mainVideo" id=subtitle]]
+[[!template text="effort to each resource" start="00:00:54.160" video="mainVideo" id=subtitle]]
+[[!template text="and we multiply the effort" start="00:00:56.320" video="mainVideo" id=subtitle]]
+[[!template text="of the resource by the price of the" start="00:00:58.800" video="mainVideo" id=subtitle]]
+[[!template text="results we sum" start="00:01:00.719" video="mainVideo" id=subtitle]]
+[[!template text="all the efforts together and then we sum" start="00:01:02.800" video="mainVideo" id=subtitle]]
+[[!template text="all the tasks together the prices of all" start="00:01:05.040" video="mainVideo" id=subtitle]]
+[[!template text="the tasks together in the second" start="00:01:08.159" video="mainVideo" id=subtitle]]
+[[!template text="approach we use" start="00:01:10.240" video="mainVideo" id=subtitle]]
+[[!template text="a generic effort" start="00:01:12.640" video="mainVideo" id=subtitle]]
+[[!template text="estimation for each" start="00:01:15.439" video="mainVideo" id=subtitle]]
+[[!template text="task" start="00:01:18.000" video="mainVideo" id=subtitle]]
+[[!template text="without allocating the effort to any" start="00:01:19.200" video="mainVideo" id=subtitle]]
+[[!template text="specific person and we multiply this" start="00:01:21.200" video="mainVideo" id=subtitle]]
+[[!template text="effort by the average" start="00:01:24.560" video="mainVideo" id=subtitle]]
+[[!template text="price of the resource" start="00:01:26.960" video="mainVideo" id=subtitle]]
+[[!template text="in" start="00:01:29.040" video="mainVideo" id=subtitle]]
+[[!template text="both cases" start="00:01:30.159" video="mainVideo" id=subtitle]]
+[[!template text="the price is computed" start="00:01:32.000" video="mainVideo" id=subtitle]]
+[[!template text="by" start="00:01:34.720" video="mainVideo" id=subtitle]]
+[[!template text="summing cost to" start="00:01:35.600" video="mainVideo" id=subtitle]]
+[[!template text="overheads and and profit we're a small" start="00:01:38.079" video="mainVideo" id=subtitle]]
+[[!template text="company we can choose our two chain so" start="00:01:40.640" video="mainVideo" id=subtitle]]
+[[!template text="we decided to use our mode for writing" start="00:01:42.960" video="mainVideo" id=subtitle]]
+[[!template text="our proposals" start="00:01:45.840" video="mainVideo" id=subtitle]]
+[[!template text="so we built a template the template has" start="00:01:47.360" video="mainVideo" id=subtitle]]
+[[!template text="got uh some a fixed structure" start="00:01:50.000" video="mainVideo" id=subtitle]]
+[[!template text="which allows us to do a lot of reuse" start="00:01:54.159" video="mainVideo" id=subtitle]]
+[[!template text="and" start="00:01:56.880" video="mainVideo" id=subtitle]]
+[[!template text="some emacs list code and or promote the" start="00:01:57.759" video="mainVideo" id=subtitle]]
+[[!template text="features to build the" start="00:02:00.399" video="mainVideo" id=subtitle]]
+[[!template text="project tables let me show you" start="00:02:02.960" video="mainVideo" id=subtitle]]
+[[!template text="without further ado the template" start="00:02:06.079" video="mainVideo" id=subtitle]]
+[[!template text="which is shown here" start="00:02:09.759" video="mainVideo" id=subtitle]]
+[[!template text="and basically it is a fairly standard" start="00:02:11.760" video="mainVideo" id=subtitle]]
+[[!template text="old mod document" start="00:02:15.520" video="mainVideo" id=subtitle]]
+[[!template text="Music" start="00:02:17.750" video="mainVideo" id=subtitle]]
+[[!template text="there are some sections here to" start="00:02:20.800" video="mainVideo" id=subtitle]]
+[[!template text="let me show you" start="00:02:23.760" video="mainVideo" id=subtitle]]
+[[!template text="the structure here" start="00:02:26.239" video="mainVideo" id=subtitle]]
+[[!template text="there are some sections some of which" start="00:02:28.879" video="mainVideo" id=subtitle]]
+[[!template text="are not" start="00:02:31.519" video="mainVideo" id=subtitle]]
+[[!template text="exported shown to the client" start="00:02:34.000" video="mainVideo" id=subtitle]]
+[[!template text="because they are of no interest to them" start="00:02:36.640" video="mainVideo" id=subtitle]]
+[[!template text="such as for instance the" start="00:02:39.519" video="mainVideo" id=subtitle]]
+[[!template text="plaintext each ledger accounting entries" start="00:02:42.160" video="mainVideo" id=subtitle]]
+[[!template text="we generate for the project" start="00:02:45.440" video="mainVideo" id=subtitle]]
+[[!template text="and" start="00:02:47.440" video="mainVideo" id=subtitle]]
+[[!template text="or some info about the detailed uh" start="00:02:48.720" video="mainVideo" id=subtitle]]
+[[!template text="budget uh data uh while other are shared" start="00:02:51.599" video="mainVideo" id=subtitle]]
+[[!template text="with uh with the clients to form a" start="00:02:54.959" video="mainVideo" id=subtitle]]
+[[!template text="project proposal now the structure is" start="00:02:57.120" video="mainVideo" id=subtitle]]
+[[!template text="not really important in the sense that" start="00:02:59.360" video="mainVideo" id=subtitle]]
+[[!template text="the only constraint and requirement" start="00:03:01.120" video="mainVideo" id=subtitle]]
+[[!template text="we set is that there has to be a section" start="00:03:04.720" video="mainVideo" id=subtitle]]
+[[!template text="with an id" start="00:03:07.599" video="mainVideo" id=subtitle]]
+[[!template text="named plan" start="00:03:08.800" video="mainVideo" id=subtitle]]
+[[!template text="which will contain and contains the" start="00:03:10.800" video="mainVideo" id=subtitle]]
+[[!template text="plan the project plan" start="00:03:13.519" video="mainVideo" id=subtitle]]
+[[!template text="here for instance we have" start="00:03:15.840" video="mainVideo" id=subtitle]]
+[[!template text="we have a project plan made of a user" start="00:03:19.440" video="mainVideo" id=subtitle]]
+[[!template text="story" start="00:03:22.400" video="mainVideo" id=subtitle]]
+[[!template text="whose development is split into three" start="00:03:23.599" video="mainVideo" id=subtitle]]
+[[!template text="different tasks" start="00:03:25.599" video="mainVideo" id=subtitle]]
+[[!template text="for each task" start="00:03:27.360" video="mainVideo" id=subtitle]]
+[[!template text="let me show you just" start="00:03:29.200" video="mainVideo" id=subtitle]]
+[[!template text="the structure before" start="00:03:31.440" video="mainVideo" id=subtitle]]
+[[!template text="the application of the template" start="00:03:34.799" video="mainVideo" id=subtitle]]
+[[!template text="for each task" start="00:03:37.280" video="mainVideo" id=subtitle]]
+[[!template text="you need to define you need to define" start="00:03:39.680" video="mainVideo" id=subtitle]]
+[[!template text="the effort here for instance we have an" start="00:03:44.319" video="mainVideo" id=subtitle]]
+[[!template text="effort a generic effort not allocated to" start="00:03:46.879" video="mainVideo" id=subtitle]]
+[[!template text="any person" start="00:03:49.280" video="mainVideo" id=subtitle]]
+[[!template text="uh we use our mood duration 60 stands" start="00:03:50.480" video="mainVideo" id=subtitle]]
+[[!template text="for 60 minutes" start="00:03:53.280" video="mainVideo" id=subtitle]]
+[[!template text="and here we have an effort" start="00:03:54.799" video="mainVideo" id=subtitle]]
+[[!template text="profiled so" start="00:03:56.879" video="mainVideo" id=subtitle]]
+[[!template text="in task 1.2 and also we work 10 days and" start="00:03:58.480" video="mainVideo" id=subtitle]]
+[[!template text="we kill 20 days" start="00:04:02.080" video="mainVideo" id=subtitle]]
+[[!template text="these are working days so one working" start="00:04:04.159" video="mainVideo" id=subtitle]]
+[[!template text="day corresponds to eight hours" start="00:04:06.879" video="mainVideo" id=subtitle]]
+[[!template text="this is like you know stand that we" start="00:04:09.760" video="mainVideo" id=subtitle]]
+[[!template text="might revise these" start="00:04:11.760" video="mainVideo" id=subtitle]]
+[[!template text="to become more compliant with" start="00:04:13.519" video="mainVideo" id=subtitle]]
+[[!template text="the definition of the" start="00:04:16.400" video="mainVideo" id=subtitle]]
+[[!template text="given by word mode notice that" start="00:04:18.400" video="mainVideo" id=subtitle]]
+[[!template text="you can or cannot you may or may not use" start="00:04:21.120" video="mainVideo" id=subtitle]]
+[[!template text="to do keywords here if you want we don't" start="00:04:25.360" video="mainVideo" id=subtitle]]
+[[!template text="usually don't use them because the final" start="00:04:28.160" video="mainVideo" id=subtitle]]
+[[!template text="document looks nice to the customer" start="00:04:30.800" video="mainVideo" id=subtitle]]
+[[!template text="without to do we then add them when we" start="00:04:33.680" video="mainVideo" id=subtitle]]
+[[!template text="move to a later" start="00:04:38.000" video="mainVideo" id=subtitle]]
+[[!template text="stage" start="00:04:39.680" video="mainVideo" id=subtitle]]
+[[!template text="so" start="00:04:40.720" video="mainVideo" id=subtitle]]
+[[!template text="once you define the plan with the effort" start="00:04:41.520" video="mainVideo" id=subtitle]]
+[[!template text="allocation" start="00:04:44.320" video="mainVideo" id=subtitle]]
+[[!template text="you can" start="00:04:45.600" video="mainVideo" id=subtitle]]
+[[!template text="go back to the" start="00:04:47.440" video="mainVideo" id=subtitle]]
+[[!template text="emacs list part" start="00:04:49.440" video="mainVideo" id=subtitle]]
+[[!template text="where" start="00:04:51.440" video="mainVideo" id=subtitle]]
+[[!template text="you can set three different variables" start="00:04:53.040" video="mainVideo" id=subtitle]]
+[[!template text="to define the hourly rates of your team" start="00:04:55.680" video="mainVideo" id=subtitle]]
+[[!template text="so for instance here" start="00:04:59.680" video="mainVideo" id=subtitle]]
+[[!template text="i am taking 10 euros per hour" start="00:05:01.440" video="mainVideo" id=subtitle]]
+[[!template text="one" start="00:05:05.360" video="mainVideo" id=subtitle]]
+[[!template text="not real rate actually let me kill it 20" start="00:05:06.160" video="mainVideo" id=subtitle]]
+[[!template text="and then you can set the profit as a" start="00:05:09.680" video="mainVideo" id=subtitle]]
+[[!template text="percentage on top of the hourly rate and" start="00:05:11.600" video="mainVideo" id=subtitle]]
+[[!template text="profit as a percentage on top of uh" start="00:05:14.720" video="mainVideo" id=subtitle]]
+[[!template text="hourly rates" start="00:05:17.759" video="mainVideo" id=subtitle]]
+[[!template text="and" start="00:05:19.360" video="mainVideo" id=subtitle]]
+[[!template text="the" start="00:05:20.240" video="mainVideo" id=subtitle]]
+[[!template text="ballpark effort allocation here is used" start="00:05:21.360" video="mainVideo" id=subtitle]]
+[[!template text="to compute the average" start="00:05:24.880" video="mainVideo" id=subtitle]]
+[[!template text="type" start="00:05:27.919" video="mainVideo" id=subtitle]]
+[[!template text="uh our average hourly" start="00:05:28.880" video="mainVideo" id=subtitle]]
+[[!template text="rate" start="00:05:31.199" video="mainVideo" id=subtitle]]
+[[!template text="as a weighted average so here i'm saying" start="00:05:32.160" video="mainVideo" id=subtitle]]
+[[!template text="that" start="00:05:34.720" video="mainVideo" id=subtitle]]
+[[!template text="on average i will work 30 percent" start="00:05:35.680" video="mainVideo" id=subtitle]]
+[[!template text="of the effort of each task while mike" start="00:05:38.880" video="mainVideo" id=subtitle]]
+[[!template text="will take care of the" start="00:05:41.600" video="mainVideo" id=subtitle]]
+[[!template text="remaining 70" start="00:05:43.199" video="mainVideo" id=subtitle]]
+[[!template text="and the" start="00:05:45.280" video="mainVideo" id=subtitle]]
+[[!template text="hourly rate is computed by multiplying" start="00:05:46.479" video="mainVideo" id=subtitle]]
+[[!template text="30" start="00:05:48.720" video="mainVideo" id=subtitle]]
+[[!template text="percent by 10 plus 70" start="00:05:49.919" video="mainVideo" id=subtitle]]
+[[!template text="by 20. um" start="00:05:53.600" video="mainVideo" id=subtitle]]
+[[!template text="okay if i do a ctrl c ctrl c here i" start="00:05:57.120" video="mainVideo" id=subtitle]]
+[[!template text="execute the imax list code in the" start="00:06:00.479" video="mainVideo" id=subtitle]]
+[[!template text="uh in the source code block as you can" start="00:06:04.800" video="mainVideo" id=subtitle]]
+[[!template text="see" start="00:06:07.919" video="mainVideo" id=subtitle]]
+[[!template text="emacs put" start="00:06:08.880" video="mainVideo" id=subtitle]]
+[[!template text="back" start="00:06:10.639" video="mainVideo" id=subtitle]]
+[[!template text="the properties" start="00:06:11.520" video="mainVideo" id=subtitle]]
+[[!template text="Music" start="00:06:13.830" video="mainVideo" id=subtitle]]
+[[!template text="that transform the effort into a total" start="00:06:15.759" video="mainVideo" id=subtitle]]
+[[!template text="amount namely the the effort is first" start="00:06:18.720" video="mainVideo" id=subtitle]]
+[[!template text="transformed into working hours" start="00:06:22.080" video="mainVideo" id=subtitle]]
+[[!template text="the rates and costs are computed" start="00:06:24.479" video="mainVideo" id=subtitle]]
+[[!template text="overhead computed and everything" start="00:06:27.280" video="mainVideo" id=subtitle]]
+[[!template text="contributes to the total amount" start="00:06:31.440" video="mainVideo" id=subtitle]]
+[[!template text="same thing here" start="00:06:34.639" video="mainVideo" id=subtitle]]
+[[!template text="the count the the" start="00:06:36.560" video="mainVideo" id=subtitle]]
+[[!template text="cost is slightly more complex because we" start="00:06:39.280" video="mainVideo" id=subtitle]]
+[[!template text="use profile effort" start="00:06:42.160" video="mainVideo" id=subtitle]]
+[[!template text="and so on and so forth that this" start="00:06:45.360" video="mainVideo" id=subtitle]]
+[[!template text="information here" start="00:06:47.440" video="mainVideo" id=subtitle]]
+[[!template text="can be then" start="00:06:49.680" video="mainVideo" id=subtitle]]
+[[!template text="grouped up" start="00:06:52.160" video="mainVideo" id=subtitle]]
+[[!template text="in the" start="00:06:56.960" video="mainVideo" id=subtitle]]
+[[!template text="to form the the project plan and project" start="00:06:58.000" video="mainVideo" id=subtitle]]
+[[!template text="budget as you can see" start="00:07:00.639" video="mainVideo" id=subtitle]]
+[[!template text="this is something we do not" start="00:07:03.039" video="mainVideo" id=subtitle]]
+[[!template text="export" start="00:07:05.599" video="mainVideo" id=subtitle]]
+[[!template text="in the project proposal to the client" start="00:07:06.880" video="mainVideo" id=subtitle]]
+[[!template text="because we prefer to do some rounding by" start="00:07:09.440" video="mainVideo" id=subtitle]]
+[[!template text="hand" start="00:07:11.919" video="mainVideo" id=subtitle]]
+[[!template text="in order to build a budget which is" start="00:07:13.199" video="mainVideo" id=subtitle]]
+[[!template text="let's say" start="00:07:15.599" video="mainVideo" id=subtitle]]
+[[!template text="more" start="00:07:16.960" video="mainVideo" id=subtitle]]
+[[!template text="reasonable and" start="00:07:17.840" video="mainVideo" id=subtitle]]
+[[!template text="this table here" start="00:07:20.880" video="mainVideo" id=subtitle]]
+[[!template text="computes what" start="00:07:22.720" video="mainVideo" id=subtitle]]
+[[!template text="in total amounts by control c control c" start="00:07:24.639" video="mainVideo" id=subtitle]]
+[[!template text="once again and then this table here the" start="00:07:26.880" video="mainVideo" id=subtitle]]
+[[!template text="payment structure is used to um" start="00:07:30.000" video="mainVideo" id=subtitle]]
+[[!template text="compute" start="00:07:33.440" video="mainVideo" id=subtitle]]
+[[!template text="the amount to be paid according to" start="00:07:34.639" video="mainVideo" id=subtitle]]
+[[!template text="the different payments we want to set in" start="00:07:38.000" video="mainVideo" id=subtitle]]
+[[!template text="the project here for instance we are" start="00:07:40.240" video="mainVideo" id=subtitle]]
+[[!template text="setting three payments with the" start="00:07:41.840" video="mainVideo" id=subtitle]]
+[[!template text="following percentages and the table you" start="00:07:43.680" video="mainVideo" id=subtitle]]
+[[!template text="set the dates and amounts and the table" start="00:07:47.280" video="mainVideo" id=subtitle]]
+[[!template text="keeps" start="00:07:49.840" video="mainVideo" id=subtitle]]
+[[!template text="track of the rest by looking at the" start="00:07:52.240" video="mainVideo" id=subtitle]]
+[[!template text="total amount" start="00:07:55.039" video="mainVideo" id=subtitle]]
+[[!template text="it finds here" start="00:07:56.479" video="mainVideo" id=subtitle]]
+[[!template text="in the budget table so the payment" start="00:07:59.360" video="mainVideo" id=subtitle]]
+[[!template text="structure and budget are then used by" start="00:08:02.080" video="mainVideo" id=subtitle]]
+[[!template text="this piece of code here" start="00:08:05.199" video="mainVideo" id=subtitle]]
+[[!template text="to" start="00:08:07.280" video="mainVideo" id=subtitle]]
+[[!template text="build the entries" start="00:08:08.639" video="mainVideo" id=subtitle]]
+[[!template text="used" start="00:08:12.000" video="mainVideo" id=subtitle]]
+[[!template text="for our internal internal accounting" start="00:08:13.360" video="mainVideo" id=subtitle]]
+[[!template text="which is based on age ledge ledger" start="00:08:16.720" video="mainVideo" id=subtitle]]
+[[!template text="we did everything here by hand" start="00:08:21.039" video="mainVideo" id=subtitle]]
+[[!template text="but" start="00:08:23.759" video="mainVideo" id=subtitle]]
+[[!template text="it is not necessary of course" start="00:08:24.639" video="mainVideo" id=subtitle]]
+[[!template text="in the sense uh because if you" start="00:08:26.400" video="mainVideo" id=subtitle]]
+[[!template text="uh export the document using ctrl c ctrl" start="00:08:29.360" video="mainVideo" id=subtitle]]
+[[!template text="e and then for instance l for latex and" start="00:08:32.800" video="mainVideo" id=subtitle]]
+[[!template text="pip for pdf" start="00:08:36.240" video="mainVideo" id=subtitle]]
+[[!template text="or the mode takes care of doing" start="00:08:39.760" video="mainVideo" id=subtitle]]
+[[!template text="evaluating each piece of code" start="00:08:42.399" video="mainVideo" id=subtitle]]
+[[!template text="in the document and generate the" start="00:08:45.120" video="mainVideo" id=subtitle]]
+[[!template text="updated documents uh here for instance" start="00:08:49.040" video="mainVideo" id=subtitle]]
+[[!template text="you can see that the pdf generated from" start="00:08:51.600" video="mainVideo" id=subtitle]]
+[[!template text="the template which contains all the" start="00:08:54.800" video="mainVideo" id=subtitle]]
+[[!template text="tables budget and payment schema" start="00:08:56.560" video="mainVideo" id=subtitle]]
+[[!template text="everything which is you which we use to" start="00:08:58.560" video="mainVideo" id=subtitle]]
+[[!template text="make an offer to our clients um" start="00:09:01.440" video="mainVideo" id=subtitle]]
+[[!template text="there are various advantages uh the" start="00:09:08.000" video="mainVideo" id=subtitle]]
+[[!template text="first the main one being" start="00:09:10.160" video="mainVideo" id=subtitle]]
+[[!template text="that we keep all the information in one" start="00:09:12.399" video="mainVideo" id=subtitle]]
+[[!template text="place" start="00:09:14.480" video="mainVideo" id=subtitle]]
+[[!template text="um and that we can version the" start="00:09:15.600" video="mainVideo" id=subtitle]]
+[[!template text="different versions you can use source" start="00:09:19.040" video="mainVideo" id=subtitle]]
+[[!template text="control to version" start="00:09:21.279" video="mainVideo" id=subtitle]]
+[[!template text="uh different iterations on the document" start="00:09:22.800" video="mainVideo" id=subtitle]]
+[[!template text="if you want you can find the document" start="00:09:26.080" video="mainVideo" id=subtitle]]
+[[!template text="here and thank you for" start="00:09:27.519" video="mainVideo" id=subtitle]]
+[[!template text="your" start="00:09:30.959" video="mainVideo" id=subtitle]]
+[[!template text="attention and i'm open to questions" start="00:09:32.399" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/research.md b/2021/captions/research.md
new file mode 100644
index 00000000..0ee9aef1
--- /dev/null
+++ b/2021/captions/research.md
@@ -0,0 +1,176 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hello, everyone. My name is Ahmed" start="00:00:00.480" video="mainVideo" id=subtitle]]
+[[!template text="and I am very happy to be here." start="00:00:02.639" video="mainVideo" id=subtitle]]
+[[!template text="Today I'll talk about" start="00:00:05.279" video="mainVideo" id=subtitle]]
+[[!template text="my academic workflow inside Emacs." start="00:00:07.359" video="mainVideo" id=subtitle]]
+[[!template text="So the main needs that I have" start="00:00:12.160" video="mainVideo" id=subtitle]]
+[[!template text="is to keep up with the current research" start="00:00:14.880" video="mainVideo" id=subtitle]]
+[[!template text="in my field, and to be able" start="00:00:16.880" video="mainVideo" id=subtitle]]
+[[!template text="to take notes, and write," start="00:00:19.760" video="mainVideo" id=subtitle]]
+[[!template text="and use these notes later" start="00:00:23.920" video="mainVideo" id=subtitle]]
+[[!template text="in writing my papers inside Emacs." start="00:00:25.359" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is a great program for this" start="00:00:29.439" video="mainVideo" id=subtitle]]
+[[!template text="because it is very extendable" start="00:00:31.119" video="mainVideo" id=subtitle]]
+[[!template text="and we can basically write" start="00:00:32.880" video="mainVideo" id=subtitle]]
+[[!template text="whatever we are missing." start="00:00:36.960" video="mainVideo" id=subtitle]]
+[[!template text="It replaced my earlier" start="00:00:39.440" video="mainVideo" id=subtitle]]
+[[!template text="proprietary workflow" start="00:00:41.360" video="mainVideo" id=subtitle]]
+[[!template text="that involved using Mendeley" start="00:00:42.559" video="mainVideo" id=subtitle]]
+[[!template text="and Visual Studio Code" start="00:00:44.320" video="mainVideo" id=subtitle]]
+[[!template text="and many other tools" start="00:00:46.320" video="mainVideo" id=subtitle]]
+[[!template text="in order to do the things" start="00:00:47.760" video="mainVideo" id=subtitle]]
+[[!template text="that I'll show today." start="00:00:49.760" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So the first concern that I have" start="00:00:51.760" video="mainVideo" id=subtitle]]
+[[!template text="is to keep up with new papers." start="00:00:54.480" video="mainVideo" id=subtitle]]
+[[!template text="To do that, I use this package called elfeed." start="00:00:57.280" video="mainVideo" id=subtitle]]
+[[!template text="Elfeed is basically just an RSS reader," start="00:01:02.399" video="mainVideo" id=subtitle]]
+[[!template text="and here I fetch all the papers that I need" start="00:01:05.760" video="mainVideo" id=subtitle]]
+[[!template text="from arXiv, which is the main source" start="00:01:09.600" video="mainVideo" id=subtitle]]
+[[!template text="of papers in my field" start="00:01:12.159" video="mainVideo" id=subtitle]]
+[[!template text="and many other scientific fields." start="00:01:14.080" video="mainVideo" id=subtitle]]
+[[!template text="It allows me to view these papers" start="00:01:16.720" video="mainVideo" id=subtitle]]
+[[!template text="with the abstracts and so on." start="00:01:22.640" video="mainVideo" id=subtitle]]
+[[!template text="In order to simplify viewing" start="00:01:27.680" video="mainVideo" id=subtitle]]
+[[!template text="and searching for relevant papers," start="00:01:32.159" video="mainVideo" id=subtitle]]
+[[!template text="I used this other package called" start="00:01:34.799" video="mainVideo" id=subtitle]]
+[[!template text="elfeed-score, and elfeed-score enables me" start="00:01:36.400" video="mainVideo" id=subtitle]]
+[[!template text="to assign a numerical score like this" start="00:01:41.600" video="mainVideo" id=subtitle]]
+[[!template text="to each of the archive entries." start="00:01:44.560" video="mainVideo" id=subtitle]]
+[[!template text="This numerical score is very simple." start="00:01:47.600" video="mainVideo" id=subtitle]]
+[[!template text="It's just based on matching things." start="00:01:49.200" video="mainVideo" id=subtitle]]
+[[!template text="So, for example, we can ask elfeed" start="00:01:52.560" video="mainVideo" id=subtitle]]
+[[!template text="to explain this. So if we say = x," start="00:01:59.200" video="mainVideo" id=subtitle]]
+[[!template text="then this just says that" start="00:02:05.040" video="mainVideo" id=subtitle]]
+[[!template text="this matches three rules" start="00:02:08.720" video="mainVideo" id=subtitle]]
+[[!template text="for a score of 76. This paper." start="00:02:10.000" video="mainVideo" id=subtitle]]
+[[!template text="This is simply because I am searching" start="00:02:12.720" video="mainVideo" id=subtitle]]
+[[!template text="for these keywords" start="00:02:14.959" video="mainVideo" id=subtitle]]
+[[!template text="that are very interesting to me," start="00:02:16.800" video="mainVideo" id=subtitle]]
+[[!template text="such as neural networks" start="00:02:19.040" video="mainVideo" id=subtitle]]
+[[!template text="or federated learning." start="00:02:20.879" video="mainVideo" id=subtitle]]
+[[!template text="And now, if I see a paper here" start="00:02:22.879" video="mainVideo" id=subtitle]]
+[[!template text="that I am interested in..." start="00:02:28.959" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's say I'm interested in this paper" start="00:02:30.239" video="mainVideo" id=subtitle]]
+[[!template text="about Gaussian Process Inference," start="00:02:32.720" video="mainVideo" id=subtitle]]
+[[!template text="then I want to store it" start="00:02:35.040" video="mainVideo" id=subtitle]]
+[[!template text="in my local library. So I want the PDF" start="00:02:36.640" video="mainVideo" id=subtitle]]
+[[!template text="and I want to be able to cite it" start="00:02:40.160" video="mainVideo" id=subtitle]]
+[[!template text="in the future. To do that," start="00:02:41.920" video="mainVideo" id=subtitle]]
+[[!template text="I use a package called org-ref" start="00:02:44.000" video="mainVideo" id=subtitle]]
+[[!template text="that allows me to fetch papers from arXiv." start="00:02:46.080" video="mainVideo" id=subtitle]]
+[[!template text="So here I wrote a helper function," start="00:02:54.640" video="mainVideo" id=subtitle]]
+[[!template text="this elfeed-entry-to-arxiv" start="00:02:56.720" video="mainVideo" id=subtitle]]
+[[!template text="that automatically gets this paper." start="00:02:59.200" video="mainVideo" id=subtitle]]
+[[!template text="It asks me where to put it," start="00:03:02.480" video="mainVideo" id=subtitle]]
+[[!template text="it completes with my default libraries," start="00:03:03.840" video="mainVideo" id=subtitle]]
+[[!template text="and then it fetches the paper from arXiv" start="00:03:07.840" video="mainVideo" id=subtitle]]
+[[!template text="and places it in this folder," start="00:03:13.360" video="mainVideo" id=subtitle]]
+[[!template text="and also places it in my bibliography file" start="00:03:16.159" video="mainVideo" id=subtitle]]
+[[!template text="which is written in BibLaTex." start="00:03:20.000" video="mainVideo" id=subtitle]]
+[[!template text="So here, if we search for this paper now," start="00:03:23.280" video="mainVideo" id=subtitle]]
+[[!template text="we find that it is in our library." start="00:03:30.239" video="mainVideo" id=subtitle]]
+[[!template text="This library interface" start="00:03:35.200" video="mainVideo" id=subtitle]]
+[[!template text="is from a package called citar," start="00:03:38.000" video="mainVideo" id=subtitle]]
+[[!template text="and I have customized it quite a bit" start="00:03:41.280" video="mainVideo" id=subtitle]]
+[[!template text="to display all of the papers in my library" start="00:03:44.000" video="mainVideo" id=subtitle]]
+[[!template text="in this format." start="00:03:48.879" video="mainVideo" id=subtitle]]
+[[!template new="1" text="This just reads from a BibLaTeX file." start="00:03:50.560" video="mainVideo" id=subtitle]]
+[[!template text="So if we open it like this," start="00:03:55.439" video="mainVideo" id=subtitle]]
+[[!template text="you'll see that this is the" start="00:03:59.519" video="mainVideo" id=subtitle]]
+[[!template text="the entry that it placed." start="00:04:02.879" video="mainVideo" id=subtitle]]
+[[!template text="One of the interesting things here is that" start="00:04:06.640" video="mainVideo" id=subtitle]]
+[[!template text="org-ref actually doesn't really fetch" start="00:04:10.959" video="mainVideo" id=subtitle]]
+[[!template text="all of the entries in this format." start="00:04:13.519" video="mainVideo" id=subtitle]]
+[[!template text="Moreover, I want all the entries in my file" start="00:04:16.079" video="mainVideo" id=subtitle]]
+[[!template text="to look quite similar," start="00:04:18.639" video="mainVideo" id=subtitle]]
+[[!template text="and to have this very similar look," start="00:04:20.160" video="mainVideo" id=subtitle]]
+[[!template text="and the way I accomplish that is by" start="00:04:23.520" video="mainVideo" id=subtitle]]
+[[!template text="using several tools and chaining them." start="00:04:25.440" video="mainVideo" id=subtitle]]
+[[!template text="So in order to see this..." start="00:04:28.960" video="mainVideo" id=subtitle]]
+[[!template text="So here, this is the function" start="00:04:37.280" video="mainVideo" id=subtitle]]
+[[!template text="that I used to..." start="00:04:39.600" video="mainVideo" id=subtitle]]
+[[!template text="This is basically run as a hook after each time" start="00:04:41.680" video="mainVideo" id=subtitle]]
+[[!template text="Emacs modifies the bibliography file," start="00:04:46.720" video="mainVideo" id=subtitle]]
+[[!template text="and it runs rebiber" start="00:04:49.680" video="mainVideo" id=subtitle]]
+[[!template text="which gets the conference versions" start="00:04:52.320" video="mainVideo" id=subtitle]]
+[[!template text="of papers that I fetch from arXiv," start="00:04:56.479" video="mainVideo" id=subtitle]]
+[[!template text="because arXiv is a pre-print directory," start="00:04:58.320" video="mainVideo" id=subtitle]]
+[[!template text="and then biber normalizes the arXiv file" start="00:05:00.800" video="mainVideo" id=subtitle]]
+[[!template text="to have a consistent look," start="00:05:05.360" video="mainVideo" id=subtitle]]
+[[!template text="and then I apply just some substitutions" start="00:05:07.919" video="mainVideo" id=subtitle]]
+[[!template text="which I like more." start="00:05:10.320" video="mainVideo" id=subtitle]]
+[[!template text="Finally, I have the whole thing" start="00:05:12.960" video="mainVideo" id=subtitle]]
+[[!template text="under version control." start="00:05:14.560" video="mainVideo" id=subtitle]]
+[[!template text="This function, reformat-bib-library," start="00:05:16.639" video="mainVideo" id=subtitle]]
+[[!template text="I make it into a hook" start="00:05:20.000" video="mainVideo" id=subtitle]]
+[[!template text="and I run it every time after I save." start="00:05:21.840" video="mainVideo" id=subtitle]]
+[[!template text="It just checks if the current buffer" start="00:05:24.720" video="mainVideo" id=subtitle]]
+[[!template text="is the main bib library." start="00:05:27.039" video="mainVideo" id=subtitle]]
+[[!template text="We will just reformat the library." start="00:05:29.039" video="mainVideo" id=subtitle]]
+[[!template text="This allows me to keep the library" start="00:05:31.840" video="mainVideo" id=subtitle]]
+[[!template text="looking all consistent like this." start="00:05:33.680" video="mainVideo" id=subtitle]]
+[[!template text="By the way, all of the code is available." start="00:05:37.199" video="mainVideo" id=subtitle]]
+[[!template text="You don't have to get it from the video." start="00:05:39.120" video="mainVideo" id=subtitle]]
+[[!template text="I will attach it as a GitHub gist." start="00:05:40.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="One of the things" start="00:05:48.720" video="mainVideo" id=subtitle]]
+[[!template text="that are really important" start="00:05:49.919" video="mainVideo" id=subtitle]]
+[[!template text="is that I want to be able to keep notes" start="00:05:51.520" video="mainVideo" id=subtitle]]
+[[!template text="on papers that I read." start="00:05:54.080" video="mainVideo" id=subtitle]]
+[[!template text="For example, here are some of" start="00:05:56.160" video="mainVideo" id=subtitle]]
+[[!template text="my existing notes." start="00:05:58.479" video="mainVideo" id=subtitle]]
+[[!template text="Now, let's add a note to the paper" start="00:06:00.319" video="mainVideo" id=subtitle]]
+[[!template text="that we just got." start="00:06:04.720" video="mainVideo" id=subtitle]]
+[[!template text="So the the pipeline here is that" start="00:06:06.080" video="mainVideo" id=subtitle]]
+[[!template text="I use citar with embark," start="00:06:08.800" video="mainVideo" id=subtitle]]
+[[!template text="which is another library," start="00:06:12.080" video="mainVideo" id=subtitle]]
+[[!template text="but you can use any other library" start="00:06:13.199" video="mainVideo" id=subtitle]]
+[[!template text="just for completion" start="00:06:15.600" video="mainVideo" id=subtitle]]
+[[!template text="and acting upon completion, like ivy," start="00:06:17.039" video="mainVideo" id=subtitle]]
+[[!template text="and I ask it to open notes" start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="and then it asks me how to capture it." start="00:06:21.360" video="mainVideo" id=subtitle]]
+[[!template text="So these capture templates" start="00:06:23.680" video="mainVideo" id=subtitle]]
+[[!template text="are handled by the org-roam package," start="00:06:25.120" video="mainVideo" id=subtitle]]
+[[!template text="which is a very, very interesting package" start="00:06:27.440" video="mainVideo" id=subtitle]]
+[[!template text="for note-taking." start="00:06:30.400" video="mainVideo" id=subtitle]]
+[[!template text="org-roam, among other things, allows us" start="00:06:32.560" video="mainVideo" id=subtitle]]
+[[!template text="to write linkable notes in Org mode," start="00:06:36.160" video="mainVideo" id=subtitle]]
+[[!template text="and moreover, it is very extensible." start="00:06:38.800" video="mainVideo" id=subtitle]]
+[[!template text="There is another package called org-roam-bibtex" start="00:06:42.400" video="mainVideo" id=subtitle]]
+[[!template text="that allows us to attach these nodes" start="00:06:45.600" video="mainVideo" id=subtitle]]
+[[!template text="to bibliography files," start="00:06:47.840" video="mainVideo" id=subtitle]]
+[[!template text="which is what I'm doing right now." start="00:06:50.000" video="mainVideo" id=subtitle]]
+[[!template text="For example, I set up the capture template" start="00:06:51.919" video="mainVideo" id=subtitle]]
+[[!template text="such that when I press s" start="00:06:54.800" video="mainVideo" id=subtitle]]
+[[!template text="for short bibliography reference," start="00:06:57.680" video="mainVideo" id=subtitle]]
+[[!template text="it will make a new headline" start="00:07:01.440" video="mainVideo" id=subtitle]]
+[[!template text="in my &quot;Reference Notes&quot; note," start="00:07:04.800" video="mainVideo" id=subtitle]]
+[[!template text="and I can write things here" start="00:07:08.479" video="mainVideo" id=subtitle]]
+[[!template text="(so, for example, &quot;seems interesting&quot;)" start="00:07:10.479" video="mainVideo" id=subtitle]]
+[[!template text="and then note here that it added this paper" start="00:07:14.960" video="mainVideo" id=subtitle]]
+[[!template text="to ROAM_REFS, so this means that" start="00:07:18.000" video="mainVideo" id=subtitle]]
+[[!template text="when I look at these papers using citar," start="00:07:24.319" video="mainVideo" id=subtitle]]
+[[!template text="it will be able to find this note." start="00:07:26.720" video="mainVideo" id=subtitle]]
+[[!template text="Similarly, we can also add long-form notes." start="00:07:30.319" video="mainVideo" id=subtitle]]
+[[!template text="For example, if I do this and I add r," start="00:07:34.000" video="mainVideo" id=subtitle]]
+[[!template text="it will create an entirely new file" start="00:07:37.199" video="mainVideo" id=subtitle]]
+[[!template text="that I can take detailed notes in." start="00:07:39.840" video="mainVideo" id=subtitle]]
+[[!template text="The strengths of org-roam is that" start="00:07:48.000" video="mainVideo" id=subtitle]]
+[[!template text="I can do things like linking papers." start="00:07:50.639" video="mainVideo" id=subtitle]]
+[[!template text="For example, here are several books" start="00:07:53.520" video="mainVideo" id=subtitle]]
+[[!template text="that I am reading. This file just collects" start="00:07:55.360" video="mainVideo" id=subtitle]]
+[[!template text="these books so that I can find them" start="00:08:00.000" video="mainVideo" id=subtitle]]
+[[!template text="for easy reference." start="00:08:02.319" video="mainVideo" id=subtitle]]
+[[!template text="Of course, I can link these files from inside." start="00:08:03.919" video="mainVideo" id=subtitle]]
+[[!template text="You can see here that I also use org-cite" start="00:08:07.599" video="mainVideo" id=subtitle]]
+[[!template text="to cite other files, and I can act upon this" start="00:08:13.759" video="mainVideo" id=subtitle]]
+[[!template text="and open the notes corresponding to" start="00:08:18.720" video="mainVideo" id=subtitle]]
+[[!template text="this other book." start="00:08:21.199" video="mainVideo" id=subtitle]]
+[[!template text="So I'm a little short on time." start="00:08:28.240" video="mainVideo" id=subtitle]]
+[[!template text="I cannot go into detail on everything," start="00:08:30.319" video="mainVideo" id=subtitle]]
+[[!template text="but I will share my configuration," start="00:08:32.719" video="mainVideo" id=subtitle]]
+[[!template text="and I hope that this will inspire other people" start="00:08:34.560" video="mainVideo" id=subtitle]]
+[[!template text="to also use Emacs for their academic workflows." start="00:08:37.919" video="mainVideo" id=subtitle]]
+[[!template text="Thank you so much." start="00:08:43.919" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:08:44.919" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/structural.md b/2021/captions/structural.md
new file mode 100644
index 00000000..5ec3bf26
--- /dev/null
+++ b/2021/captions/structural.md
@@ -0,0 +1,275 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi. My name is Ethan," start="00:00:00.080" video="mainVideo" id=subtitle]]
+[[!template text="and today I'm going to be speaking" start="00:00:01.360" video="mainVideo" id=subtitle]]
+[[!template text="about tree-edit, which is a package" start="00:00:02.320" video="mainVideo" id=subtitle]]
+[[!template text="which aims to bring structural editing" start="00:00:04.240" video="mainVideo" id=subtitle]]
+[[!template text="to everyday languages." start="00:00:06.160" video="mainVideo" id=subtitle]]
+[[!template text="So what is structural editing?" start="00:00:08.320" video="mainVideo" id=subtitle]]
+[[!template text="The way that we typically" start="00:00:10.559" video="mainVideo" id=subtitle]]
+[[!template text="write code today" start="00:00:11.657" video="mainVideo" id=subtitle]]
+[[!template text="is working with characters, words," start="00:00:12.578" video="mainVideo" id=subtitle]]
+[[!template text="lines, paragraphs, and so on," start="00:00:14.480" video="mainVideo" id=subtitle]]
+[[!template text="and these objects have no real relation" start="00:00:16.206" video="mainVideo" id=subtitle]]
+[[!template text="to the structure of programming languages." start="00:00:18.600" video="mainVideo" id=subtitle]]
+[[!template text="In contrast, tree-edit's editing operations" start="00:00:21.520" video="mainVideo" id=subtitle]]
+[[!template text="map exactly to the structure" start="00:00:24.667" video="mainVideo" id=subtitle]]
+[[!template text="of the programming language," start="00:00:26.897" video="mainVideo" id=subtitle]]
+[[!template text="which is typically in a tree form" start="00:00:28.411" video="mainVideo" id=subtitle]]
+[[!template text="with different types of nodes" start="00:00:30.303" video="mainVideo" id=subtitle]]
+[[!template text="such as identifiers, expressions," start="00:00:32.053" video="mainVideo" id=subtitle]]
+[[!template text="and statements. Using this structure" start="00:00:33.920" video="mainVideo" id=subtitle]]
+[[!template text="can enable much more powerful" start="00:00:35.957" video="mainVideo" id=subtitle]]
+[[!template text="editing operations," start="00:00:37.548" video="mainVideo" id=subtitle]]
+[[!template text="and crucially editing operations" start="00:00:39.200" video="mainVideo" id=subtitle]]
+[[!template text="that map much more closely" start="00:00:40.769" video="mainVideo" id=subtitle]]
+[[!template text="to the way that we think about code." start="00:00:42.081" video="mainVideo" id=subtitle]]
+[[!template text="tree-edit was inspired by" start="00:00:44.960" video="mainVideo" id=subtitle]]
+[[!template text="paredit and lispy," start="00:00:46.140" video="mainVideo" id=subtitle]]
+[[!template text="which are two great" start="00:00:47.386" video="mainVideo" id=subtitle]]
+[[!template text="Lisp structural editors." start="00:00:48.320" video="mainVideo" id=subtitle]]
+[[!template text="However, what makes tree-edit unique" start="00:00:50.271" video="mainVideo" id=subtitle]]
+[[!template text="is that it can work with many languages," start="00:00:52.383" video="mainVideo" id=subtitle]]
+[[!template text="such as some of the" start="00:00:54.480" video="mainVideo" id=subtitle]]
+[[!template text="more mainstream languages like C, Java," start="00:00:55.759" video="mainVideo" id=subtitle]]
+[[!template text="Python, and so on." start="00:00:59.826" video="mainVideo" id=subtitle]]
+[[!template text="So now I'm going to show off tree-edit" start="00:01:01.600" video="mainVideo" id=subtitle]]
+[[!template text="in action, working with a Java program." start="00:01:03.273" video="mainVideo" id=subtitle]]
+[[!template text="So we can see on the left," start="00:01:05.705" video="mainVideo" id=subtitle]]
+[[!template text="we have a syntax tree," start="00:01:07.237" video="mainVideo" id=subtitle]]
+[[!template text="and the node in bold is what I call" start="00:01:09.119" video="mainVideo" id=subtitle]]
+[[!template text="the current node. So instead of" start="00:01:11.560" video="mainVideo" id=subtitle]]
+[[!template text="the concept of a cursor," start="00:01:13.780" video="mainVideo" id=subtitle]]
+[[!template text="where we have a point in 2D space," start="00:01:15.100" video="mainVideo" id=subtitle]]
+[[!template text="we instead work with a current node" start="00:01:17.600" video="mainVideo" id=subtitle]]
+[[!template text="which all our editing operations" start="00:01:20.285" video="mainVideo" id=subtitle]]
+[[!template text="take place upon." start="00:01:22.729" video="mainVideo" id=subtitle]]
+[[!template text="So we can move up and down," start="00:01:23.840" video="mainVideo" id=subtitle]]
+[[!template text="or rather side to side," start="00:01:26.479" video="mainVideo" id=subtitle]]
+[[!template text="move inwards down to the children" start="00:01:28.720" video="mainVideo" id=subtitle]]
+[[!template text="of the tree, back up to the parents." start="00:01:31.160" video="mainVideo" id=subtitle]]
+[[!template text="We can also jump to a node by its type." start="00:01:33.920" video="mainVideo" id=subtitle]]
+[[!template text="So we're going to jump to" start="00:01:36.799" video="mainVideo" id=subtitle]]
+[[!template text="a variable declaration." start="00:01:38.768" video="mainVideo" id=subtitle]]
+[[!template text="We can jump to an if statement." start="00:01:40.880" video="mainVideo" id=subtitle]]
+[[!template text="And as you might have noticed," start="00:01:44.399" video="mainVideo" id=subtitle]]
+[[!template text="tree-edit by default" start="00:01:46.880" video="mainVideo" id=subtitle]]
+[[!template text="uses a vim-style mode of editing," start="00:01:48.360" video="mainVideo" id=subtitle]]
+[[!template text="so it's a verb, which would be jump," start="00:01:51.337" video="mainVideo" id=subtitle]]
+[[!template text="and then a type," start="00:01:55.119" video="mainVideo" id=subtitle]]
+[[!template text="which would be if statement." start="00:01:56.874" video="mainVideo" id=subtitle]]
+[[!template text="So now I'll show off" start="00:02:00.799" video="mainVideo" id=subtitle]]
+[[!template text="the syntax tree modification in action." start="00:02:03.346" video="mainVideo" id=subtitle]]
+[[!template text="So if I delete this deleteme node," start="00:02:06.144" video="mainVideo" id=subtitle]]
+[[!template text="we can see the node is deleted," start="00:02:08.000" video="mainVideo" id=subtitle]]
+[[!template text="and also the comma is removed" start="00:02:10.112" video="mainVideo" id=subtitle]]
+[[!template text="since it's no longer needed." start="00:02:12.049" video="mainVideo" id=subtitle]]
+[[!template text="We can add some nodes back in." start="00:02:13.920" video="mainVideo" id=subtitle]]
+[[!template text="Here we just have a placeholder node" start="00:02:16.720" video="mainVideo" id=subtitle]]
+[[!template text="called tree, which we can swap out" start="00:02:18.160" video="mainVideo" id=subtitle]]
+[[!template text="with whatever we like." start="00:02:20.391" video="mainVideo" id=subtitle]]
+[[!template text="So if we want to put in, for example," start="00:02:21.875" video="mainVideo" id=subtitle]]
+[[!template text="a plus or minus operator," start="00:02:24.560" video="mainVideo" id=subtitle]]
+[[!template text="it'll put these two TREE things here" start="00:02:29.280" video="mainVideo" id=subtitle]]
+[[!template text="since there needs to be something there," start="00:02:30.879" video="mainVideo" id=subtitle]]
+[[!template text="but we can go fill them out as we like." start="00:02:32.634" video="mainVideo" id=subtitle]]
+[[!template text="So that's what that is." start="00:02:37.360" video="mainVideo" id=subtitle]]
+[[!template text="Then I'll delete these again." start="00:02:38.595" video="mainVideo" id=subtitle]]
+[[!template text="Next we can see raising." start="00:02:41.920" video="mainVideo" id=subtitle]]
+[[!template text="So if I raise reader," start="00:02:43.709" video="mainVideo" id=subtitle]]
+[[!template text="then it will replace" start="00:02:45.280" video="mainVideo" id=subtitle]]
+[[!template text="the outer function call" start="00:02:46.160" video="mainVideo" id=subtitle]]
+[[!template text="with the node itself." start="00:02:47.342" video="mainVideo" id=subtitle]]
+[[!template text="I could raise it again." start="00:02:48.583" video="mainVideo" id=subtitle]]
+[[!template text="The opposite operation to that" start="00:02:50.948" video="mainVideo" id=subtitle]]
+[[!template text="is wrapping. So I can wrap reader" start="00:02:53.363" video="mainVideo" id=subtitle]]
+[[!template text="back into function call," start="00:02:57.200" video="mainVideo" id=subtitle]]
+[[!template text="and I could wrap this again" start="00:02:59.519" video="mainVideo" id=subtitle]]
+[[!template text="if I wanted to. So that is wrapping." start="00:03:03.009" video="mainVideo" id=subtitle]]
+[[!template text="We can also do it on a statement level," start="00:03:08.480" video="mainVideo" id=subtitle]]
+[[!template text="so if I want to wrap this" start="00:03:12.640" video="mainVideo" id=subtitle]]
+[[!template text="in an if statement," start="00:03:13.760" video="mainVideo" id=subtitle]]
+[[!template text="I can wrap the statement," start="00:03:14.480" video="mainVideo" id=subtitle]]
+[[!template text="and there we go." start="00:03:17.034" video="mainVideo" id=subtitle]]
+[[!template text="And let's just raise it back up," start="00:03:18.400" video="mainVideo" id=subtitle]]
+[[!template text="raise it again." start="00:03:21.280" video="mainVideo" id=subtitle]]
+[[!template text="There we go. Finally, I'll show off" start="00:03:23.200" video="mainVideo" id=subtitle]]
+[[!template text="slurping and barfing," start="00:03:26.959" video="mainVideo" id=subtitle]]
+[[!template text="which... a little bit gross words," start="00:03:28.720" video="mainVideo" id=subtitle]]
+[[!template text="but I think it accurately describes" start="00:03:32.256" video="mainVideo" id=subtitle]]
+[[!template text="the action, so let me just add" start="00:03:34.879" video="mainVideo" id=subtitle]]
+[[!template text="a couple breaks here." start="00:03:37.519" video="mainVideo" id=subtitle]]
+[[!template text="So let's say we want" start="00:03:41.120" video="mainVideo" id=subtitle]]
+[[!template text="this if statement and a couple of breaks" start="00:03:44.748" video="mainVideo" id=subtitle]]
+[[!template text="to be inside of the while," start="00:03:46.779" video="mainVideo" id=subtitle]]
+[[!template text="so we can just slurp this up," start="00:03:48.319" video="mainVideo" id=subtitle]]
+[[!template text="and if we don't actually want them," start="00:03:50.959" video="mainVideo" id=subtitle]]
+[[!template text="we can barf them back out." start="00:03:52.433" video="mainVideo" id=subtitle]]
+[[!template text="So that's where those words" start="00:03:54.528" video="mainVideo" id=subtitle]]
+[[!template text="have come from." start="00:03:56.736" video="mainVideo" id=subtitle]]
+[[!template text="And we can just... delete as we please." start="00:03:57.840" video="mainVideo" id=subtitle]]
+[[!template text="So yeah, that's a quick overview" start="00:04:01.120" video="mainVideo" id=subtitle]]
+[[!template text="of the tree editing plugin in action." start="00:04:03.826" video="mainVideo" id=subtitle]]
+[[!template text="So now I want to talk a little bit" start="00:04:07.360" video="mainVideo" id=subtitle]]
+[[!template text="about the implementation of tree-edit." start="00:04:08.900" video="mainVideo" id=subtitle]]
+[[!template text="Tree-edit uses the tree-sitter parser" start="00:04:12.080" video="mainVideo" id=subtitle]]
+[[!template text="to convert text into a syntax tree." start="00:04:14.400" video="mainVideo" id=subtitle]]
+[[!template text="Tree-sitter is used by GitHub" start="00:04:17.919" video="mainVideo" id=subtitle]]
+[[!template text="for its syntax highlighting," start="00:04:21.501" video="mainVideo" id=subtitle]]
+[[!template text="and it's available in a bunch of editors," start="00:04:22.752" video="mainVideo" id=subtitle]]
+[[!template text="including Emacs, so it's" start="00:04:25.280" video="mainVideo" id=subtitle]]
+[[!template text="a fairly standard tool." start="00:04:27.120" video="mainVideo" id=subtitle]]
+[[!template text="However, the unique part about tree-edit" start="00:04:28.960" video="mainVideo" id=subtitle]]
+[[!template text="is how it performs" start="00:04:30.960" video="mainVideo" id=subtitle]]
+[[!template text="correct editing operations" start="00:04:32.479" video="mainVideo" id=subtitle]]
+[[!template text="on the syntax tree" start="00:04:34.479" video="mainVideo" id=subtitle]]
+[[!template text="and then converts that back into text." start="00:04:35.919" video="mainVideo" id=subtitle]]
+[[!template text="So to do that, we use miniKanren," start="00:04:38.320" video="mainVideo" id=subtitle]]
+[[!template text="and miniKanren is an embedded" start="00:04:41.759" video="mainVideo" id=subtitle]]
+[[!template text="domain-specific language" start="00:04:43.759" video="mainVideo" id=subtitle]]
+[[!template text="for logic programming." start="00:04:45.120" video="mainVideo" id=subtitle]]
+[[!template text="So what exactly does that mean?" start="00:04:47.440" video="mainVideo" id=subtitle]]
+[[!template text="In our case, it's just" start="00:04:50.080" video="mainVideo" id=subtitle]]
+[[!template text="an Emacs Lisp library called reazon," start="00:04:51.280" video="mainVideo" id=subtitle]]
+[[!template text="which exposes a set of macros" start="00:04:54.240" video="mainVideo" id=subtitle]]
+[[!template text="which enables us to program" start="00:04:56.720" video="mainVideo" id=subtitle]]
+[[!template text="in this logic programming style." start="00:04:58.320" video="mainVideo" id=subtitle]]
+[[!template text="I'm not going to get into the details" start="00:05:01.360" video="mainVideo" id=subtitle]]
+[[!template text="of how logic programming works." start="00:05:03.280" video="mainVideo" id=subtitle]]
+[[!template text="However, one of the most unique aspects" start="00:05:05.520" video="mainVideo" id=subtitle]]
+[[!template text="about it is that we can define" start="00:05:07.520" video="mainVideo" id=subtitle]]
+[[!template text="a predicate and then figure out" start="00:05:09.919" video="mainVideo" id=subtitle]]
+[[!template text="all the inputs to the predicate" start="00:05:13.600" video="mainVideo" id=subtitle]]
+[[!template text="that would hold to be true." start="00:05:15.280" video="mainVideo" id=subtitle]]
+[[!template text="So in this case," start="00:05:17.759" video="mainVideo" id=subtitle]]
+[[!template text="we have our query variable q," start="00:05:19.360" video="mainVideo" id=subtitle]]
+[[!template text="which will be what the output is," start="00:05:21.520" video="mainVideo" id=subtitle]]
+[[!template text="and we are asking for all the values of q" start="00:05:24.479" video="mainVideo" id=subtitle]]
+[[!template text="that pass this predicate of" start="00:05:29.120" video="mainVideo" id=subtitle]]
+[[!template text="being set-equal to 1 2 3 4." start="00:05:32.080" video="mainVideo" id=subtitle]]
+[[!template text="So if we execute this," start="00:05:34.479" video="mainVideo" id=subtitle]]
+[[!template text="it will take a little time..." start="00:05:36.880" video="mainVideo" id=subtitle]]
+[[!template text="It shouldn't be taking this long." start="00:05:40.080" video="mainVideo" id=subtitle]]
+[[!template text="Oh, there it goes." start="00:05:41.520" video="mainVideo" id=subtitle]]
+[[!template text="We can see that it's generated" start="00:05:43.280" video="mainVideo" id=subtitle]]
+[[!template text="a bunch of different answers" start="00:05:45.919" video="mainVideo" id=subtitle]]
+[[!template text="that are all set-equal to 1 2 3 4." start="00:05:47.520" video="mainVideo" id=subtitle]]
+[[!template text="So it's just a bunch of" start="00:05:51.199" video="mainVideo" id=subtitle]]
+[[!template text="different permutations of that." start="00:05:52.880" video="mainVideo" id=subtitle]]
+[[!template text="We can extend this notion" start="00:05:57.280" video="mainVideo" id=subtitle]]
+[[!template text="to a parser. In tree-edit, we've defined" start="00:05:59.120" video="mainVideo" id=subtitle]]
+[[!template text="a parser in reazon," start="00:06:03.600" video="mainVideo" id=subtitle]]
+[[!template text="and we can use that parser to figure out" start="00:06:05.360" video="mainVideo" id=subtitle]]
+[[!template text="any tokens that match the type of node" start="00:06:10.800" video="mainVideo" id=subtitle]]
+[[!template text="that we're trying to generate." start="00:06:15.919" video="mainVideo" id=subtitle]]
+[[!template text="If I execute this, we can see" start="00:06:16.880" video="mainVideo" id=subtitle]]
+[[!template text="that reazon has generated" start="00:06:19.600" video="mainVideo" id=subtitle]]
+[[!template text="these five answers that match" start="00:06:21.199" video="mainVideo" id=subtitle]]
+[[!template text="what a try statement is in Java." start="00:06:23.440" video="mainVideo" id=subtitle]]
+[[!template text="Here we can see we can have" start="00:06:26.960" video="mainVideo" id=subtitle]]
+[[!template text="an infinite amount of catches" start="00:06:29.680" video="mainVideo" id=subtitle]]
+[[!template text="optionally ending with a finally," start="00:06:31.919" video="mainVideo" id=subtitle]]
+[[!template text="and we always have to start" start="00:06:34.720" video="mainVideo" id=subtitle]]
+[[!template text="with a try and a block." start="00:06:36.160" video="mainVideo" id=subtitle]]
+[[!template text="We can see this again" start="00:06:39.039" video="mainVideo" id=subtitle]]
+[[!template text="with an argument list." start="00:06:40.000" video="mainVideo" id=subtitle]]
+[[!template text="We have the opening and closing" start="00:06:42.400" video="mainVideo" id=subtitle]]
+[[!template text="parentheses, and expressions" start="00:06:43.520" video="mainVideo" id=subtitle]]
+[[!template text="which are comma delimited." start="00:06:45.759" video="mainVideo" id=subtitle]]
+[[!template text="Now, for a more complex example, and" start="00:06:49.120" video="mainVideo" id=subtitle]]
+[[!template text="something that is along the lines" start="00:06:51.759" video="mainVideo" id=subtitle]]
+[[!template text="of what's in tree-edit," start="00:06:53.680" video="mainVideo" id=subtitle]]
+[[!template text="is if we have this x here" start="00:06:55.199" video="mainVideo" id=subtitle]]
+[[!template text="and we want to insert another expression," start="00:06:57.919" video="mainVideo" id=subtitle]]
+[[!template text="so x, y. We can assert" start="00:07:01.599" video="mainVideo" id=subtitle]]
+[[!template text="that there's some new tokens," start="00:07:05.759" video="mainVideo" id=subtitle]]
+[[!template text="and we want an expression" start="00:07:07.680" video="mainVideo" id=subtitle]]
+[[!template text="to be in those new tokens," start="00:07:10.160" video="mainVideo" id=subtitle]]
+[[!template text="and we can essentially state" start="00:07:11.840" video="mainVideo" id=subtitle]]
+[[!template text="where we want these new tokens to go" start="00:07:13.280" video="mainVideo" id=subtitle]]
+[[!template text="within the old list of tokens," start="00:07:15.039" video="mainVideo" id=subtitle]]
+[[!template text="so replacing it" start="00:07:19.759" video="mainVideo" id=subtitle]]
+[[!template text="after the previous expression," start="00:07:21.599" video="mainVideo" id=subtitle]]
+[[!template text="before the closed parentheses," start="00:07:23.360" video="mainVideo" id=subtitle]]
+[[!template text="and then we can state" start="00:07:26.000" video="mainVideo" id=subtitle]]
+[[!template text="that the whole thing parses." start="00:07:26.880" video="mainVideo" id=subtitle]]
+[[!template text="If we run that, we can see that" start="00:07:28.560" video="mainVideo" id=subtitle]]
+[[!template text="as we wanted earlier," start="00:07:30.080" video="mainVideo" id=subtitle]]
+[[!template text="which was a comma and then expression," start="00:07:32.479" video="mainVideo" id=subtitle]]
+[[!template text="we have that here as well." start="00:07:37.120" video="mainVideo" id=subtitle]]
+[[!template text="We can see this again." start="00:07:39.120" video="mainVideo" id=subtitle]]
+[[!template text="Here, the only change is that" start="00:07:41.759" video="mainVideo" id=subtitle]]
+[[!template text="we've moved the tokens to be" start="00:07:42.720" video="mainVideo" id=subtitle]]
+[[!template text="before the expression." start="00:07:45.280" video="mainVideo" id=subtitle]]
+[[!template text="So we want to put an expression" start="00:07:46.240" video="mainVideo" id=subtitle]]
+[[!template text="before this x, so we want something" start="00:07:48.800" video="mainVideo" id=subtitle]]
+[[!template text="like y, x," start="00:07:50.560" video="mainVideo" id=subtitle]]
+[[!template text="and if we execute that," start="00:07:52.560" video="mainVideo" id=subtitle]]
+[[!template text="we can see that it is correctly asserted" start="00:07:54.240" video="mainVideo" id=subtitle]]
+[[!template text="that it would be an expression" start="00:07:57.919" video="mainVideo" id=subtitle]]
+[[!template text="and then a comma afterwards." start="00:07:59.039" video="mainVideo" id=subtitle]]
+[[!template text="One last example is" start="00:08:01.520" video="mainVideo" id=subtitle]]
+[[!template text="if we have an if statement" start="00:08:02.960" video="mainVideo" id=subtitle]]
+[[!template text="and we want to add an extra block," start="00:08:04.400" video="mainVideo" id=subtitle]]
+[[!template text="we can see that it correctly figures out" start="00:08:07.759" video="mainVideo" id=subtitle]]
+[[!template text="that we need an else" start="00:08:11.599" video="mainVideo" id=subtitle]]
+[[!template text="in order to have another statement" start="00:08:12.400" video="mainVideo" id=subtitle]]
+[[!template text="in an if statement." start="00:08:13.840" video="mainVideo" id=subtitle]]
+[[!template text="So, next steps for tree-edit." start="00:08:16.720" video="mainVideo" id=subtitle]]
+[[!template text="The core of tree-edit is in place" start="00:08:19.759" video="mainVideo" id=subtitle]]
+[[!template text="but there's a lot of usability features" start="00:08:21.039" video="mainVideo" id=subtitle]]
+[[!template text="to add, and a lot of testing" start="00:08:23.120" video="mainVideo" id=subtitle]]
+[[!template text="that needs to be done" start="00:08:25.360" video="mainVideo" id=subtitle]]
+[[!template text="in order to iron out any bugs that exist." start="00:08:26.400" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to add support" start="00:08:29.599" video="mainVideo" id=subtitle]]
+[[!template text="for as many languages as is possible." start="00:08:30.960" video="mainVideo" id=subtitle]]
+[[!template text="I think my next step" start="00:08:35.200" video="mainVideo" id=subtitle]]
+[[!template text="will probably be Python." start="00:08:36.240" video="mainVideo" id=subtitle]]
+[[!template text="There's some performance improvements" start="00:08:38.490" video="mainVideo" id=subtitle]]
+[[!template text="that need to be made, since using this" start="00:08:41.279" video="mainVideo" id=subtitle]]
+[[!template text="logic programming language" start="00:08:44.080" video="mainVideo" id=subtitle]]
+[[!template text="is fairly intensive." start="00:08:45.519" video="mainVideo" id=subtitle]]
+[[!template text="There's some optimizations" start="00:08:47.600" video="mainVideo" id=subtitle]]
+[[!template text="both on the library side" start="00:08:48.800" video="mainVideo" id=subtitle]]
+[[!template text="and on tree-edit side" start="00:08:50.560" video="mainVideo" id=subtitle]]
+[[!template text="that can be made." start="00:08:51.519" video="mainVideo" id=subtitle]]
+[[!template text="Contributors are of course welcome," start="00:08:53.360" video="mainVideo" id=subtitle]]
+[[!template text="as tree-edit is an open source project." start="00:08:55.519" video="mainVideo" id=subtitle]]
+[[!template text="For future work, I think the prospect" start="00:09:00.000" video="mainVideo" id=subtitle]]
+[[!template text="of voice controlled development" start="00:09:03.360" video="mainVideo" id=subtitle]]
+[[!template text="with tree-edit is actually something" start="00:09:04.480" video="mainVideo" id=subtitle]]
+[[!template text="that's really exciting," start="00:09:06.240" video="mainVideo" id=subtitle]]
+[[!template text="since syntax can be very cumbersome" start="00:09:07.920" video="mainVideo" id=subtitle]]
+[[!template text="when you're working with" start="00:09:11.120" video="mainVideo" id=subtitle]]
+[[!template text="voice control software." start="00:09:12.320" video="mainVideo" id=subtitle]]
+[[!template text="I can envision something like" start="00:09:14.240" video="mainVideo" id=subtitle]]
+[[!template text="saying, &quot;Jump to identifier," start="00:09:16.320" video="mainVideo" id=subtitle]]
+[[!template text="add plus operator, jump to if statement," start="00:09:19.440" video="mainVideo" id=subtitle]]
+[[!template text="wrap if statement in while.&quot;" start="00:09:26.640" video="mainVideo" id=subtitle]]
+[[!template text="So that's something" start="00:09:30.480" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to investigate." start="00:09:31.519" video="mainVideo" id=subtitle]]
+[[!template text="I also would just like to" start="00:09:33.519" video="mainVideo" id=subtitle]]
+[[!template text="provide the core functionality" start="00:09:35.040" video="mainVideo" id=subtitle]]
+[[!template text="of tree-edit as something" start="00:09:37.279" video="mainVideo" id=subtitle]]
+[[!template text="that can be used as a library" start="00:09:39.120" video="mainVideo" id=subtitle]]
+[[!template text="for other projects," start="00:09:40.399" video="mainVideo" id=subtitle]]
+[[!template text="such as refactoring packages," start="00:09:41.920" video="mainVideo" id=subtitle]]
+[[!template text="or other non-Vim-style approaches," start="00:09:43.839" video="mainVideo" id=subtitle]]
+[[!template text="and just making the syntax generation" start="00:09:46.240" video="mainVideo" id=subtitle]]
+[[!template text="available for reuse." start="00:09:49.200" video="mainVideo" id=subtitle]]
+[[!template text="Finally, I'd like to thank" start="00:09:52.080" video="mainVideo" id=subtitle]]
+[[!template text="the authors of reazon" start="00:09:53.760" video="mainVideo" id=subtitle]]
+[[!template text="and elisp-tree-sitter," start="00:09:56.399" video="mainVideo" id=subtitle]]
+[[!template text="which in turn packages" start="00:09:58.399" video="mainVideo" id=subtitle]]
+[[!template text="tree-sitter itself," start="00:10:00.185" video="mainVideo" id=subtitle]]
+[[!template text="since tree-edit relies very heavily" start="00:10:02.079" video="mainVideo" id=subtitle]]
+[[!template text="on these two packages." start="00:10:05.440" video="mainVideo" id=subtitle]]
+[[!template text="I'd also like to thank" start="00:10:07.680" video="mainVideo" id=subtitle]]
+[[!template text="the author of lispy," start="00:10:08.959" video="mainVideo" id=subtitle]]
+[[!template text="since a lot of the design decisions" start="00:10:10.480" video="mainVideo" id=subtitle]]
+[[!template text="when it comes to the editing operations" start="00:10:12.720" video="mainVideo" id=subtitle]]
+[[!template text="are based very heavily on lispy." start="00:10:14.800" video="mainVideo" id=subtitle]]
+[[!template text="So that's the end of my talk." start="00:10:18.560" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for watching." start="00:10:20.320" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:10:22.959" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/teach.md b/2021/captions/teach.md
new file mode 100644
index 00000000..dc9ec925
--- /dev/null
+++ b/2021/captions/teach.md
@@ -0,0 +1,557 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, everybody. My name is Daniel German." start="00:00:01.040" video="mainVideo" id=subtitle]]
+[[!template text="I'm a professor of computer science" start="00:00:03.520" video="mainVideo" id=subtitle]]
+[[!template text="at the University of Victoria," start="00:00:04.799" video="mainVideo" id=subtitle]]
+[[!template text="and I have been teaching programming" start="00:00:06.080" video="mainVideo" id=subtitle]]
+[[!template text="for more than 10 years." start="00:00:07.680" video="mainVideo" id=subtitle]]
+[[!template text="I want to tell you today" start="00:00:12.080" video="mainVideo" id=subtitle]]
+[[!template text="about how I have been" start="00:00:14.639" video="mainVideo" id=subtitle]]
+[[!template text="using Emacs effectively" start="00:00:15.759" video="mainVideo" id=subtitle]]
+[[!template text="during the last 10 years," start="00:00:17.680" video="mainVideo" id=subtitle]]
+[[!template text="and to try to improve how I not only" start="00:00:20.000" video="mainVideo" id=subtitle]]
+[[!template text="create content for my students," start="00:00:22.880" video="mainVideo" id=subtitle]]
+[[!template text="but also how I deliver it," start="00:00:24.720" video="mainVideo" id=subtitle]]
+[[!template text="and particularly how," start="00:00:26.480" video="mainVideo" id=subtitle]]
+[[!template text="within the last five years," start="00:00:27.680" video="mainVideo" id=subtitle]]
+[[!template text="I have been using Org mode" start="00:00:29.119" video="mainVideo" id=subtitle]]
+[[!template text="in a very effective way" start="00:00:31.599" video="mainVideo" id=subtitle]]
+[[!template text="that benefits both" start="00:00:33.200" video="mainVideo" id=subtitle]]
+[[!template text="my students and myself" start="00:00:35.600" video="mainVideo" id=subtitle]]
+[[!template text="in the creation and the delivery" start="00:00:38.239" video="mainVideo" id=subtitle]]
+[[!template text="of content." start="00:00:40.480" video="mainVideo" id=subtitle]]
+[[!template text="Let me switch to my computer." start="00:00:42.399" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to remove myself" start="00:00:45.200" video="mainVideo" id=subtitle]]
+[[!template text="because I can use" start="00:00:46.480" video="mainVideo" id=subtitle]]
+[[!template text="all the real-estate screen." start="00:00:47.840" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The goal of my presentation today" start="00:00:51.840" video="mainVideo" id=subtitle]]
+[[!template text="is really to give you" start="00:00:54.079" video="mainVideo" id=subtitle]]
+[[!template text="a little bit of an overview" start="00:00:55.600" video="mainVideo" id=subtitle]]
+[[!template text="of how I have been able to" start="00:00:59.280" video="mainVideo" id=subtitle]]
+[[!template text="combine the use of Org mode" start="00:01:03.440" video="mainVideo" id=subtitle]]
+[[!template text="and with some other tools." start="00:01:06.240" video="mainVideo" id=subtitle]]
+[[!template text="I'll talk about specifically about them" start="00:01:08.560" video="mainVideo" id=subtitle]]
+[[!template text="and then also offer some suggestions" start="00:01:10.880" video="mainVideo" id=subtitle]]
+[[!template text="and recommendations" start="00:01:13.680" video="mainVideo" id=subtitle]]
+[[!template text="in how to get it started." start="00:01:14.640" video="mainVideo" id=subtitle]]
+[[!template text="I have created a configuration," start="00:01:16.240" video="mainVideo" id=subtitle]]
+[[!template text="a set of configuration files" start="00:01:18.799" video="mainVideo" id=subtitle]]
+[[!template text="that you can use." start="00:01:20.080" video="mainVideo" id=subtitle]]
+[[!template text="I will describe them towards the end." start="00:01:20.799" video="mainVideo" id=subtitle]]
+[[!template text="Hopefully, it will make it easy" start="00:01:22.880" video="mainVideo" id=subtitle]]
+[[!template text="for all of you to get started on using it." start="00:01:28.240" video="mainVideo" id=subtitle]]
+[[!template text="So we start talking a little bit" start="00:01:31.439" video="mainVideo" id=subtitle]]
+[[!template text="about the challenges" start="00:01:33.200" video="mainVideo" id=subtitle]]
+[[!template text="of teaching programming." start="00:01:34.079" video="mainVideo" id=subtitle]]
+[[!template text="I think that the fundamental one" start="00:01:35.119" video="mainVideo" id=subtitle]]
+[[!template text="is that keeping the content" start="00:01:37.200" video="mainVideo" id=subtitle]]
+[[!template text="and the slides up to date is hard," start="00:01:41.680" video="mainVideo" id=subtitle]]
+[[!template text="because the content is programs." start="00:01:45.280" video="mainVideo" id=subtitle]]
+[[!template text="There are programs" start="00:01:46.960" video="mainVideo" id=subtitle]]
+[[!template text="that sometimes have errors," start="00:01:47.840" video="mainVideo" id=subtitle]]
+[[!template text="and sometimes the slides are" start="00:01:50.399" video="mainVideo" id=subtitle]]
+[[!template text="incomplete snippets of code, and that" start="00:01:53.759" video="mainVideo" id=subtitle]]
+[[!template text="once they go into the slides software," start="00:01:58.079" video="mainVideo" id=subtitle]]
+[[!template text="like Google Slides or PowerPoint," start="00:02:00.240" video="mainVideo" id=subtitle]]
+[[!template text="they're essentially static objects." start="00:02:01.840" video="mainVideo" id=subtitle]]
+[[!template text="If we need to update them," start="00:02:05.520" video="mainVideo" id=subtitle]]
+[[!template text="we basically don't know" start="00:02:07.439" video="mainVideo" id=subtitle]]
+[[!template text="whether the update code actually works," start="00:02:09.920" video="mainVideo" id=subtitle]]
+[[!template text="or does it work?" start="00:02:12.160" video="mainVideo" id=subtitle]]
+[[!template text="Also, we cannot insert automatically" start="00:02:13.440" video="mainVideo" id=subtitle]]
+[[!template text="the output." start="00:02:16.000" video="mainVideo" id=subtitle]]
+[[!template text="We'll have to run the snippet outside," start="00:02:16.400" video="mainVideo" id=subtitle]]
+[[!template text="and run it, and then insert that code." start="00:02:18.480" video="mainVideo" id=subtitle]]
+[[!template text="So that's very cumbersome." start="00:02:20.560" video="mainVideo" id=subtitle]]
+[[!template text="It's really, really one of the" start="00:02:22.080" video="mainVideo" id=subtitle]]
+[[!template text="major challenges of using a slide software" start="00:02:23.200" video="mainVideo" id=subtitle]]
+[[!template text="to teach programming." start="00:02:26.080" video="mainVideo" id=subtitle]]
+[[!template text="The other thing is that" start="00:02:29.360" video="mainVideo" id=subtitle]]
+[[!template text="during the presentation," start="00:02:30.879" video="mainVideo" id=subtitle]]
+[[!template text="there's nothing you can do with the code." start="00:02:32.000" video="mainVideo" id=subtitle]]
+[[!template text="You might be able to edit it," start="00:02:33.440" video="mainVideo" id=subtitle]]
+[[!template text="but you cannot run it." start="00:02:34.480" video="mainVideo" id=subtitle]]
+[[!template text="You have to move outside of the" start="00:02:35.440" video="mainVideo" id=subtitle]]
+[[!template text="presentation software" start="00:02:37.360" video="mainVideo" id=subtitle]]
+[[!template text="to be able to execute the code." start="00:02:38.640" video="mainVideo" id=subtitle]]
+[[!template text="The last one is kind of related to" start="00:02:42.800" video="mainVideo" id=subtitle]]
+[[!template text="the previous two." start="00:02:44.640" video="mainVideo" id=subtitle]]
+[[!template text="You don't have a single file" start="00:02:46.959" video="mainVideo" id=subtitle]]
+[[!template text="and your information is spread across" start="00:02:48.800" video="mainVideo" id=subtitle]]
+[[!template text="many, many different files," start="00:02:51.121" video="mainVideo" id=subtitle]]
+[[!template text="especially if you have lots of" start="00:02:52.879" video="mainVideo" id=subtitle]]
+[[!template text="different snippets in your slides." start="00:02:54.080" video="mainVideo" id=subtitle]]
+[[!template text="You probably have a lot of" start="00:02:55.760" video="mainVideo" id=subtitle]]
+[[!template text="different small files, each of them" start="00:02:56.959" video="mainVideo" id=subtitle]]
+[[!template text="contributing something to your slides," start="00:02:59.440" video="mainVideo" id=subtitle]]
+[[!template text="and so it becomes a pain to manage." start="00:03:01.599" video="mainVideo" id=subtitle]]
+[[!template text="All of this is where Org mode" start="00:03:07.280" video="mainVideo" id=subtitle]]
+[[!template text="really excels. Org mode is capable of" start="00:03:10.080" video="mainVideo" id=subtitle]]
+[[!template text="doing everything, and it needs" start="00:03:12.640" video="mainVideo" id=subtitle]]
+[[!template text="a little bit of help from some friends." start="00:03:15.840" video="mainVideo" id=subtitle]]
+[[!template text="I will describe what I mean by that." start="00:03:18.400" video="mainVideo" id=subtitle]]
+[[!template text="But the other thing" start="00:03:22.159" video="mainVideo" id=subtitle]]
+[[!template text="that is also very valuable" start="00:03:23.040" video="mainVideo" id=subtitle]]
+[[!template text="is that it's within the magic of Emacs." start="00:03:24.480" video="mainVideo" id=subtitle]]
+[[!template text="I absolutely love to be able to" start="00:03:27.440" video="mainVideo" id=subtitle]]
+[[!template text="work with text within Emacs." start="00:03:30.480" video="mainVideo" id=subtitle]]
+[[!template text="I enjoy actually creating my notes" start="00:03:32.879" video="mainVideo" id=subtitle]]
+[[!template text="in Org mode way more than if I was" start="00:03:34.799" video="mainVideo" id=subtitle]]
+[[!template text="making them in Google Slides." start="00:03:36.640" video="mainVideo" id=subtitle]]
+[[!template text="Let me start by giving you a short demo." start="00:03:39.360" video="mainVideo" id=subtitle]]
+[[!template text="I have been teaching programming in C++" start="00:03:42.400" video="mainVideo" id=subtitle]]
+[[!template text="for around five years," start="00:03:46.400" video="mainVideo" id=subtitle]]
+[[!template text="and this was really the trigger towards" start="00:03:47.519" video="mainVideo" id=subtitle]]
+[[!template text="trying to do everything within Org mode." start="00:03:50.159" video="mainVideo" id=subtitle]]
+[[!template text="So I have a repository in GitHub," start="00:03:53.280" video="mainVideo" id=subtitle]]
+[[!template text="and I think that GitHub" start="00:03:58.159" video="mainVideo" id=subtitle]]
+[[!template text="is an excellent tool" start="00:03:59.439" video="mainVideo" id=subtitle]]
+[[!template text="that works collaboration with Org mode." start="00:04:00.560" video="mainVideo" id=subtitle]]
+[[!template text="I'll describe actually" start="00:04:04.480" video="mainVideo" id=subtitle]]
+[[!template text="what I mean by that." start="00:04:05.439" video="mainVideo" id=subtitle]]
+[[!template text="My lectures are essentially Org files." start="00:04:07.680" video="mainVideo" id=subtitle]]
+[[!template text="So, for example, let's go into" start="00:04:09.680" video="mainVideo" id=subtitle]]
+[[!template text="one of these files." start="00:04:12.480" video="mainVideo" id=subtitle]]
+[[!template text="This is a an Org file." start="00:04:15.040" video="mainVideo" id=subtitle]]
+[[!template text="You can actually see it in the extension." start="00:04:16.799" video="mainVideo" id=subtitle]]
+[[!template text="I get a table of contents." start="00:04:21.199" video="mainVideo" id=subtitle]]
+[[!template text="GitHub creates or give us actually" start="00:04:26.160" video="mainVideo" id=subtitle]]
+[[!template text="the ability to quickly jump, and it creates" start="00:04:28.000" video="mainVideo" id=subtitle]]
+[[!template text="a dynamic table of contents," start="00:04:31.280" video="mainVideo" id=subtitle]]
+[[!template text="but I also can actually" start="00:04:32.880" video="mainVideo" id=subtitle]]
+[[!template text="create it automatically," start="00:04:33.759" video="mainVideo" id=subtitle]]
+[[!template text="and then here it goes." start="00:04:35.280" video="mainVideo" id=subtitle]]
+[[!template text="This is the code that i have." start="00:04:36.800" video="mainVideo" id=subtitle]]
+[[!template text="This is a snippet" start="00:04:38.479" video="mainVideo" id=subtitle]]
+[[!template text="that I present in the class." start="00:04:41.440" video="mainVideo" id=subtitle]]
+[[!template text="Let me actually show you" start="00:04:44.240" video="mainVideo" id=subtitle]]
+[[!template text="how I do it within Emacs." start="00:04:45.680" video="mainVideo" id=subtitle]]
+[[!template text="So what I will do is the following." start="00:04:48.400" video="mainVideo" id=subtitle]]
+[[!template text="Let me try to open that file." start="00:04:52.160" video="mainVideo" id=subtitle]]
+[[!template text="Here's the file," start="00:04:57.919" video="mainVideo" id=subtitle]]
+[[!template text="and it's exactly the same" start="00:04:59.440" video="mainVideo" id=subtitle]]
+[[!template text="that we were browsing in GitHub." start="00:05:00.880" video="mainVideo" id=subtitle]]
+[[!template text="What I do is I simply just scroll through" start="00:05:03.759" video="mainVideo" id=subtitle]]
+[[!template text="the document. It's almost like" start="00:05:08.720" video="mainVideo" id=subtitle]]
+[[!template text="movie credits at the end of the movie." start="00:05:10.160" video="mainVideo" id=subtitle]]
+[[!template text="I don't break them into chunks" start="00:05:13.440" video="mainVideo" id=subtitle]]
+[[!template text="that I show in the screen." start="00:05:15.360" video="mainVideo" id=subtitle]]
+[[!template text="I see no point in doing that." start="00:05:16.639" video="mainVideo" id=subtitle]]
+[[!template text="What I do is I simply scroll through" start="00:05:18.320" video="mainVideo" id=subtitle]]
+[[!template text="the text. The students are able to see" start="00:05:20.880" video="mainVideo" id=subtitle]]
+[[!template text="the same information in GitHub" start="00:05:24.160" video="mainVideo" id=subtitle]]
+[[!template text="on their computer," start="00:05:26.560" video="mainVideo" id=subtitle]]
+[[!template text="or they can print it if they want," start="00:05:27.759" video="mainVideo" id=subtitle]]
+[[!template text="and they are able to actually" start="00:05:29.680" video="mainVideo" id=subtitle]]
+[[!template text="follow with me, and then having" start="00:05:31.039" video="mainVideo" id=subtitle]]
+[[!template text="a much bigger picture" start="00:05:32.560" video="mainVideo" id=subtitle]]
+[[!template text="than if i just show a very small snippet." start="00:05:33.759" video="mainVideo" id=subtitle]]
+[[!template text="In the case that the snippet is too big," start="00:05:36.320" video="mainVideo" id=subtitle]]
+[[!template text="for example, let's say this one" start="00:05:38.800" video="mainVideo" id=subtitle]]
+[[!template text="actually doesn't cover the..." start="00:05:40.800" video="mainVideo" id=subtitle]]
+[[!template text="covers more than full screen," start="00:05:42.240" video="mainVideo" id=subtitle]]
+[[!template text="I actually reduce the size" start="00:05:43.759" video="mainVideo" id=subtitle]]
+[[!template text="and then give a little bit of" start="00:05:45.360" video="mainVideo" id=subtitle]]
+[[!template text="an explanation of the whole thing," start="00:05:48.000" video="mainVideo" id=subtitle]]
+[[!template text="and then focus and say this is the line" start="00:05:49.759" video="mainVideo" id=subtitle]]
+[[!template text="where we have to pay attention." start="00:05:51.600" video="mainVideo" id=subtitle]]
+[[!template text="Notice actually how I use color for that." start="00:05:53.600" video="mainVideo" id=subtitle]]
+[[!template text="I think that the ability to use color" start="00:05:55.600" video="mainVideo" id=subtitle]]
+[[!template text="and typesetting is fundamental" start="00:05:57.759" video="mainVideo" id=subtitle]]
+[[!template text="to be able to do this effectively," start="00:05:59.759" video="mainVideo" id=subtitle]]
+[[!template text="and the nice thing is that" start="00:06:01.520" video="mainVideo" id=subtitle]]
+[[!template text="we can configure Org mode" start="00:06:02.720" video="mainVideo" id=subtitle]]
+[[!template text="to be able to do most of this" start="00:06:04.160" video="mainVideo" id=subtitle]]
+[[!template text="automatically." start="00:06:05.840" video="mainVideo" id=subtitle]]
+[[!template text="As I said before," start="00:06:08.160" video="mainVideo" id=subtitle]]
+[[!template text="one of the great advantages is that" start="00:06:09.360" video="mainVideo" id=subtitle]]
+[[!template text="I can actually run the code dynamically." start="00:06:10.960" video="mainVideo" id=subtitle]]
+[[!template text="So let's say that the student says," start="00:06:13.600" video="mainVideo" id=subtitle]]
+[[!template text="&quot;But what if I change that value to 10?&quot;" start="00:06:15.360" video="mainVideo" id=subtitle]]
+[[!template text="Well, let's try it." start="00:06:17.360" video="mainVideo" id=subtitle]]
+[[!template text="Let's change it, run it," start="00:06:18.560" video="mainVideo" id=subtitle]]
+[[!template text="and then you can see here" start="00:06:20.560" video="mainVideo" id=subtitle]]
+[[!template text="that it has a 10." start="00:06:21.840" video="mainVideo" id=subtitle]]
+[[!template text="That's really powerful because" start="00:06:24.720" video="mainVideo" id=subtitle]]
+[[!template text="you're not tied to" start="00:06:26.960" video="mainVideo" id=subtitle]]
+[[!template text="what is the content you have" start="00:06:29.280" video="mainVideo" id=subtitle]]
+[[!template text="on the slides. If you find an error" start="00:06:30.560" video="mainVideo" id=subtitle]]
+[[!template text="or an omission, or you want to talk about" start="00:06:33.120" video="mainVideo" id=subtitle]]
+[[!template text="something else, you can very quickly" start="00:06:34.880" video="mainVideo" id=subtitle]]
+[[!template text="do it. You can add comments" start="00:06:36.880" video="mainVideo" id=subtitle]]
+[[!template text="and then make some suggestions" start="00:06:40.720" video="mainVideo" id=subtitle]]
+[[!template text="specifically to that," start="00:06:42.080" video="mainVideo" id=subtitle]]
+[[!template text="or worst-case scenario," start="00:06:43.840" video="mainVideo" id=subtitle]]
+[[!template text="if you really, really, need it," start="00:06:45.680" video="mainVideo" id=subtitle]]
+[[!template text="you can say, &quot;Let's load it into...&quot;" start="00:06:48.880" video="mainVideo" id=subtitle]]
+[[!template text="Let's actually do some hand annotation." start="00:06:55.440" video="mainVideo" id=subtitle]]
+[[!template text="Let's actually say, &quot;look at this thing," start="00:06:58.400" video="mainVideo" id=subtitle]]
+[[!template text="this is the value that I want you to" start="00:07:00.319" video="mainVideo" id=subtitle]]
+[[!template text="concentrate on.&quot;" start="00:07:01.840" video="mainVideo" id=subtitle]]
+[[!template text="It's not perfect." start="00:07:02.800" video="mainVideo" id=subtitle]]
+[[!template text="I'm not doing it with an Emacs." start="00:07:03.599" video="mainVideo" id=subtitle]]
+[[!template text="I wish there was a way to do it," start="00:07:04.960" video="mainVideo" id=subtitle]]
+[[!template text="but it is absolutely effective" start="00:07:06.960" video="mainVideo" id=subtitle]]
+[[!template text="because I'm actually able to" start="00:07:09.120" video="mainVideo" id=subtitle]]
+[[!template text="use the power. Notice that all that is" start="00:07:10.720" video="mainVideo" id=subtitle]]
+[[!template text="exported is just the block, and also" start="00:07:12.800" video="mainVideo" id=subtitle]]
+[[!template text="the color and typesetting," start="00:07:15.520" video="mainVideo" id=subtitle]]
+[[!template text="the typesetting of the content." start="00:07:22.400" video="mainVideo" id=subtitle]]
+[[!template text="So this is actually great." start="00:07:24.560" video="mainVideo" id=subtitle]]
+[[!template text="I have the colors red, purple, etc. etc." start="00:07:25.759" video="mainVideo" id=subtitle]]
+[[!template text="I love being able to do that." start="00:07:30.639" video="mainVideo" id=subtitle]]
+[[!template text="This is just a temporary file." start="00:07:34.160" video="mainVideo" id=subtitle]]
+[[!template text="I can actually discard it," start="00:07:35.919" video="mainVideo" id=subtitle]]
+[[!template text="and it doesn't really matter." start="00:07:36.880" video="mainVideo" id=subtitle]]
+[[!template text="Let me go back to the presentation." start="00:07:39.680" video="mainVideo" id=subtitle]]
+[[!template text="So that's the delivery." start="00:07:41.919" video="mainVideo" id=subtitle]]
+[[!template text="So the delivery is great," start="00:07:43.360" video="mainVideo" id=subtitle]]
+[[!template text="and I can tell the students" start="00:07:44.639" video="mainVideo" id=subtitle]]
+[[!template text="now you're actually in GitHub," start="00:07:46.400" video="mainVideo" id=subtitle]]
+[[!template text="if you want to test the code," start="00:07:48.080" video="mainVideo" id=subtitle]]
+[[!template text="just cut and paste." start="00:07:50.160" video="mainVideo" id=subtitle]]
+[[!template text="Notice that I clicked on the little icon." start="00:07:51.360" video="mainVideo" id=subtitle]]
+[[!template text="Now it's copied. It's now part of" start="00:07:54.240" video="mainVideo" id=subtitle]]
+[[!template text="the kill buffer (kill-ring)," start="00:07:56.639" video="mainVideo" id=subtitle]]
+[[!template text="so if I want to actually create a file" start="00:07:57.440" video="mainVideo" id=subtitle]]
+[[!template text="that has that content," start="00:07:59.520" video="mainVideo" id=subtitle]]
+[[!template text="I can very quickly do it." start="00:08:00.560" video="mainVideo" id=subtitle]]
+[[!template text="Try that with PowerPoint." start="00:08:02.560" video="mainVideo" id=subtitle]]
+[[!template text="You will have to have the text" start="00:08:05.840" video="mainVideo" id=subtitle]]
+[[!template text="without any nice typesetting," start="00:08:08.160" video="mainVideo" id=subtitle]]
+[[!template text="or you will have to have a picture" start="00:08:10.000" video="mainVideo" id=subtitle]]
+[[!template text="that is impossible to cut and paste." start="00:08:11.280" video="mainVideo" id=subtitle]]
+[[!template text="So that's something that the students" start="00:08:13.120" video="mainVideo" id=subtitle]]
+[[!template text="really, really appreciate of this." start="00:08:14.400" video="mainVideo" id=subtitle]]
+[[!template text="They can try it on the computer." start="00:08:17.440" video="mainVideo" id=subtitle]]
+[[!template text="They can load it into" start="00:08:18.879" video="mainVideo" id=subtitle]]
+[[!template text="their favorite editor." start="00:08:19.919" video="mainVideo" id=subtitle]]
+[[!template text="I don't force them to use Emacs," start="00:08:22.319" video="mainVideo" id=subtitle]]
+[[!template text="but I have to say that some of them" start="00:08:24.720" video="mainVideo" id=subtitle]]
+[[!template text="really get intrigued by this power" start="00:08:26.879" video="mainVideo" id=subtitle]]
+[[!template text="that they want to try Emacs" start="00:08:28.479" video="mainVideo" id=subtitle]]
+[[!template text="because they see that they can do things," start="00:08:30.000" video="mainVideo" id=subtitle]]
+[[!template text="that I can do things that they cannot do" start="00:08:31.440" video="mainVideo" id=subtitle]]
+[[!template text="with other tools." start="00:08:33.760" video="mainVideo" id=subtitle]]
+[[!template text="Okay, so let's go back to presentation." start="00:08:35.919" video="mainVideo" id=subtitle]]
+[[!template text="The other half of it is" start="00:08:39.039" video="mainVideo" id=subtitle]]
+[[!template text="preparing the notes." start="00:08:40.080" video="mainVideo" id=subtitle]]
+[[!template text="I think the preparatory notes" start="00:08:41.039" video="mainVideo" id=subtitle]]
+[[!template text="is something that I want to do" start="00:08:44.640" video="mainVideo" id=subtitle]]
+[[!template text="as easy as possible." start="00:08:46.320" video="mainVideo" id=subtitle]]
+[[!template text="I want to be able to reduce the time" start="00:08:48.240" video="mainVideo" id=subtitle]]
+[[!template text="that I waste on things," start="00:08:52.560" video="mainVideo" id=subtitle]]
+[[!template text="that they are done." start="00:08:53.760" video="mainVideo" id=subtitle]]
+[[!template text="They're not part of the actual thinking" start="00:08:55.120" video="mainVideo" id=subtitle]]
+[[!template text="or the delivery of the presentation." start="00:08:57.519" video="mainVideo" id=subtitle]]
+[[!template text="So let me create a file." start="00:09:01.760" video="mainVideo" id=subtitle]]
+[[!template text="Let's call it rip2.org." start="00:09:03.440" video="mainVideo" id=subtitle]]
+[[!template text="Well, I have this one," start="00:09:05.720" video="mainVideo" id=subtitle]]
+[[!template text="so let's call it rip.org." start="00:09:07.839" video="mainVideo" id=subtitle]]
+[[!template text="Oh, I have this one too," start="00:09:09.519" video="mainVideo" id=subtitle]]
+[[!template text="so let's call it rip4.org." start="00:09:10.480" video="mainVideo" id=subtitle]]
+[[!template text="So it's empty." start="00:09:12.800" video="mainVideo" id=subtitle]]
+[[!template text="I use yasnippets. I think yasnippets" start="00:09:15.040" video="mainVideo" id=subtitle]]
+[[!template text="are very important," start="00:09:17.200" video="mainVideo" id=subtitle]]
+[[!template text="and I'll go through this" start="00:09:17.920" video="mainVideo" id=subtitle]]
+[[!template text="in a little bit later." start="00:09:19.040" video="mainVideo" id=subtitle]]
+[[!template text="It's important to set up" start="00:09:19.760" video="mainVideo" id=subtitle]]
+[[!template text="the properties for each language" start="00:09:21.200" video="mainVideo" id=subtitle]]
+[[!template text="that I use properly." start="00:09:23.440" video="mainVideo" id=subtitle]]
+[[!template text="I'll describe this a little bit later." start="00:09:24.399" video="mainVideo" id=subtitle]]
+[[!template text="Unfortunately, the properties" start="00:09:26.320" video="mainVideo" id=subtitle]]
+[[!template text="have to be evaluated one at a time," start="00:09:28.000" video="mainVideo" id=subtitle]]
+[[!template text="and so I'm just going to" start="00:09:30.080" video="mainVideo" id=subtitle]]
+[[!template text="kill the buffer and open it again." start="00:09:33.839" video="mainVideo" id=subtitle]]
+[[!template text="So now all of these properties" start="00:09:35.040" video="mainVideo" id=subtitle]]
+[[!template text="are properly set." start="00:09:36.480" video="mainVideo" id=subtitle]]
+[[!template text="As I said before, I have some yasnippets," start="00:09:40.560" video="mainVideo" id=subtitle]]
+[[!template text="so I can actually do very quickly..." start="00:09:43.760" video="mainVideo" id=subtitle]]
+[[!template text="This is C++, cout &lt;&lt; &quot;hello world&quot;," start="00:09:46.560" video="mainVideo" id=subtitle]]
+[[!template text="std::endl." start="00:09:55.200" video="mainVideo" id=subtitle]]
+[[!template text="And then I run it," start="00:09:58.080" video="mainVideo" id=subtitle]]
+[[!template text="and then it's inserted down here," start="00:10:00.080" video="mainVideo" id=subtitle]]
+[[!template text="so nothing special." start="00:10:02.720" video="mainVideo" id=subtitle]]
+[[!template text="Let's assume that I make a mistake" start="00:10:04.000" video="mainVideo" id=subtitle]]
+[[!template text="and I type a double l here." start="00:10:06.160" video="mainVideo" id=subtitle]]
+[[!template text="I will get an error." start="00:10:08.480" video="mainVideo" id=subtitle]]
+[[!template text="These line numbers unfortunately" start="00:10:10.720" video="mainVideo" id=subtitle]]
+[[!template text="don't perfectly match" start="00:10:12.399" video="mainVideo" id=subtitle]]
+[[!template text="with the line numbers" start="00:10:13.600" video="mainVideo" id=subtitle]]
+[[!template text="in the little snippet" start="00:10:15.040" video="mainVideo" id=subtitle]]
+[[!template text="because there's some code" start="00:10:17.839" video="mainVideo" id=subtitle]]
+[[!template text="that org-babel inserts," start="00:10:18.959" video="mainVideo" id=subtitle]]
+[[!template text="so that shifts them." start="00:10:22.160" video="mainVideo" id=subtitle]]
+[[!template text="So that's something to be aware of." start="00:10:23.040" video="mainVideo" id=subtitle]]
+[[!template text="I can correct it, run it," start="00:10:25.440" video="mainVideo" id=subtitle]]
+[[!template text="and then it inserts the result." start="00:10:27.680" video="mainVideo" id=subtitle]]
+[[!template text="Let's do one in C." start="00:10:30.160" video="mainVideo" id=subtitle]]
+[[!template text="I'll explain the exports both" start="00:10:36.079" video="mainVideo" id=subtitle]]
+[[!template text="a little bit." start="00:10:37.680" video="mainVideo" id=subtitle]]
+[[!template text="So let's assume that I don't want to" start="00:10:38.640" video="mainVideo" id=subtitle]]
+[[!template text="have a full main program." start="00:10:40.079" video="mainVideo" id=subtitle]]
+[[!template text="Let's assume that i just want to" start="00:10:41.519" video="mainVideo" id=subtitle]]
+[[!template text="demonstrate how to use a printf" start="00:10:42.560" video="mainVideo" id=subtitle]]
+[[!template text="&quot;hello world %s\n&quot;, &quot;my friend&quot;." start="00:10:45.200" video="mainVideo" id=subtitle]]
+[[!template text="Let's run it." start="00:10:54.959" video="mainVideo" id=subtitle]]
+[[!template text="I get a bunch of errors. Why?" start="00:10:56.800" video="mainVideo" id=subtitle]]
+[[!template text="Because I don't have a main program," start="00:10:58.800" video="mainVideo" id=subtitle]]
+[[!template text="so I have to actually tell org-babel" start="00:11:00.480" video="mainVideo" id=subtitle]]
+[[!template text="that I want a main product," start="00:11:03.279" video="mainVideo" id=subtitle]]
+[[!template text="so yes put a main around it." start="00:11:05.200" video="mainVideo" id=subtitle]]
+[[!template text="So now I run it and it says, oh," start="00:11:07.360" video="mainVideo" id=subtitle]]
+[[!template text="in the function main," start="00:11:09.040" video="mainVideo" id=subtitle]]
+[[!template text="we have an implicit declaration" start="00:11:09.760" video="mainVideo" id=subtitle]]
+[[!template text="for function printf." start="00:11:10.959" video="mainVideo" id=subtitle]]
+[[!template text="I'm very, very stringent" start="00:11:12.640" video="mainVideo" id=subtitle]]
+[[!template text="on my compilation options," start="00:11:14.000" video="mainVideo" id=subtitle]]
+[[!template text="so I want to have every single" start="00:11:16.959" video="mainVideo" id=subtitle]]
+[[!template text="potential error displayed ," start="00:11:18.959" video="mainVideo" id=subtitle]]
+[[!template text="so that's actually why." start="00:11:21.279" video="mainVideo" id=subtitle]]
+[[!template text="In this case, I actually need include," start="00:11:22.959" video="mainVideo" id=subtitle]]
+[[!template text="so I can say :includes &lt;stdio.h&gt;," start="00:11:24.640" video="mainVideo" id=subtitle]]
+[[!template text="and I'll run it and it runs perfectly." start="00:11:29.040" video="mainVideo" id=subtitle]]
+[[!template text="So why is this important?" start="00:11:31.040" video="mainVideo" id=subtitle]]
+[[!template text="Well, it allows me to just have" start="00:11:32.480" video="mainVideo" id=subtitle]]
+[[!template text="the snippet that I'm concerned about." start="00:11:35.440" video="mainVideo" id=subtitle]]
+[[!template text="I don't have to have all the overhead" start="00:11:37.600" video="mainVideo" id=subtitle]]
+[[!template text="of having to have the include, main, etc.," start="00:11:39.920" video="mainVideo" id=subtitle]]
+[[!template text="if I want to show" start="00:11:43.279" video="mainVideo" id=subtitle]]
+[[!template text="just one specific concept" start="00:11:44.000" video="mainVideo" id=subtitle]]
+[[!template text="and I can do it" start="00:11:45.440" video="mainVideo" id=subtitle]]
+[[!template text="in very few lines of code." start="00:11:46.560" video="mainVideo" id=subtitle]]
+[[!template text="I can do that immediately, of course." start="00:11:48.079" video="mainVideo" id=subtitle]]
+[[!template text="The students will not be able to" start="00:11:50.240" video="mainVideo" id=subtitle]]
+[[!template text="cut and paste it without the main file," start="00:11:51.279" video="mainVideo" id=subtitle]]
+[[!template text="but that's something" start="00:11:53.600" video="mainVideo" id=subtitle]]
+[[!template text="that we can explain to them." start="00:11:54.320" video="mainVideo" id=subtitle]]
+[[!template text="We can do all the languages." start="00:11:57.600" video="mainVideo" id=subtitle]]
+[[!template text="So I can say print," start="00:11:59.440" video="mainVideo" id=subtitle]]
+[[!template text="let's print just a list," start="00:12:02.079" video="mainVideo" id=subtitle]]
+[[!template text="or let's actually keep updating it," start="00:12:07.680" video="mainVideo" id=subtitle]]
+[[!template text="and let's do a map of a lambda x," start="00:12:10.000" video="mainVideo" id=subtitle]]
+[[!template text="x multiplied by x," start="00:12:16.000" video="mainVideo" id=subtitle]]
+[[!template text="and then we run it. Okay." start="00:12:19.279" video="mainVideo" id=subtitle]]
+[[!template text="The thing that is important" start="00:12:22.079" video="mainVideo" id=subtitle]]
+[[!template text="is that if we also have" start="00:12:23.200" video="mainVideo" id=subtitle]]
+[[!template text="the full power of the environment," start="00:12:25.120" video="mainVideo" id=subtitle]]
+[[!template text="right, so we can actually edit it" start="00:12:26.720" video="mainVideo" id=subtitle]]
+[[!template text="in the native mode of the language," start="00:12:28.320" video="mainVideo" id=subtitle]]
+[[!template text="and wherever we actually want to use" start="00:12:31.519" video="mainVideo" id=subtitle]]
+[[!template text="specific features, that they are available" start="00:12:34.560" video="mainVideo" id=subtitle]]
+[[!template text="in the particular mode." start="00:12:36.720" video="mainVideo" id=subtitle]]
+[[!template text="But for most of the cases," start="00:12:38.800" video="mainVideo" id=subtitle]]
+[[!template text="I don't need that," start="00:12:40.720" video="mainVideo" id=subtitle]]
+[[!template text="because my examples are relatively simple." start="00:12:41.519" video="mainVideo" id=subtitle]]
+[[!template text="Let's do one more." start="00:12:44.160" video="mainVideo" id=subtitle]]
+[[!template text="This is a little bit different: SQLite." start="00:12:46.720" video="mainVideo" id=subtitle]]
+[[!template text="In the previous examples," start="00:12:48.399" video="mainVideo" id=subtitle]]
+[[!template text="the output that is inserted" start="00:12:49.760" video="mainVideo" id=subtitle]]
+[[!template text="is a standard output." start="00:12:51.200" video="mainVideo" id=subtitle]]
+[[!template text="In SQLite, I want to actually see" start="00:12:52.720" video="mainVideo" id=subtitle]]
+[[!template text="the tables. I want to see" start="00:12:54.320" video="mainVideo" id=subtitle]]
+[[!template text="how the tables are," start="00:12:55.279" video="mainVideo" id=subtitle]]
+[[!template text="what the results are." start="00:12:56.720" video="mainVideo" id=subtitle]]
+[[!template text="So let's create table s." start="00:12:58.880" video="mainVideo" id=subtitle]]
+[[!template text="Let's call it r, a int, b int," start="00:13:04.000" video="mainVideo" id=subtitle]]
+[[!template text="and let's run it." start="00:13:08.399" video="mainVideo" id=subtitle]]
+[[!template text="This is-- oh, the table already exists." start="00:13:09.200" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So drop table if exists r," start="00:13:10.639" video="mainVideo" id=subtitle]]
+[[!template text="and then we run it. Okay." start="00:13:16.240" video="mainVideo" id=subtitle]]
+[[!template text="So now it's created. sqlite..." start="00:13:17.440" video="mainVideo" id=subtitle]]
+[[!template text="So we can say create a table," start="00:13:21.120" video="mainVideo" id=subtitle]]
+[[!template text="and let's actually add SQL," start="00:13:25.920" video="mainVideo" id=subtitle]]
+[[!template text="and here we're actually going to add..." start="00:13:27.760" video="mainVideo" id=subtitle]]
+[[!template text="This is an example in C," start="00:13:32.079" video="mainVideo" id=subtitle]]
+[[!template text="and here we're going to have C++." start="00:13:34.240" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So, SQL," start="00:13:38.240" video="mainVideo" id=subtitle]]
+[[!template text="and then we create a table," start="00:13:42.160" video="mainVideo" id=subtitle]]
+[[!template text="and then we populate" start="00:13:43.920" video="mainVideo" id=subtitle]]
+[[!template text="and then insert into R" start="00:13:47.839" video="mainVideo" id=subtitle]]
+[[!template text="values 1,2 2,3 3,4." start="00:13:51.360" video="mainVideo" id=subtitle]]
+[[!template text="Okay. So now I have a table," start="00:13:57.839" video="mainVideo" id=subtitle]]
+[[!template text="I have values," start="00:13:59.519" video="mainVideo" id=subtitle]]
+[[!template text="and I can do &quot;select * from here,&quot;" start="00:14:01.600" video="mainVideo" id=subtitle]]
+[[!template text="and then I get the result. Okay." start="00:14:04.560" video="mainVideo" id=subtitle]]
+[[!template text="It's almost magic" start="00:14:07.040" video="mainVideo" id=subtitle]]
+[[!template text="because I can actually get, formatted," start="00:14:07.920" video="mainVideo" id=subtitle]]
+[[!template text="the output in the way that I expected." start="00:14:10.399" video="mainVideo" id=subtitle]]
+[[!template text="Obviously, if my result is too big," start="00:14:13.040" video="mainVideo" id=subtitle]]
+[[!template text="then it will basically just create" start="00:14:15.279" video="mainVideo" id=subtitle]]
+[[!template text="a huge, huge buffer, or Org will say" start="00:14:18.399" video="mainVideo" id=subtitle]]
+[[!template text="the output is too big." start="00:14:20.880" video="mainVideo" id=subtitle]]
+[[!template text="So often with databases," start="00:14:21.920" video="mainVideo" id=subtitle]]
+[[!template text="I actually narrow my output, right," start="00:14:24.079" video="mainVideo" id=subtitle]]
+[[!template text="or I might do it with a clause," start="00:14:26.480" video="mainVideo" id=subtitle]]
+[[!template text="&quot;where a > 1&quot;." start="00:14:28.639" video="mainVideo" id=subtitle]]
+[[!template text="If the language is supported by Org Babel," start="00:14:34.959" video="mainVideo" id=subtitle]]
+[[!template text="then you can do all of this." start="00:14:36.959" video="mainVideo" id=subtitle]]
+[[!template text="Let me go back to the presentation." start="00:14:39.920" video="mainVideo" id=subtitle]]
+[[!template text="I'm running out of time." start="00:14:42.079" video="mainVideo" id=subtitle]]
+[[!template text="Let me give you a short tour" start="00:14:43.760" video="mainVideo" id=subtitle]]
+[[!template text="of how this is done." start="00:14:45.680" video="mainVideo" id=subtitle]]
+[[!template text="I have created a repository that has" start="00:14:47.279" video="mainVideo" id=subtitle]]
+[[!template text="all the configuration that I have." start="00:14:53.279" video="mainVideo" id=subtitle]]
+[[!template text="Everything is self-contained." start="00:14:54.800" video="mainVideo" id=subtitle]]
+[[!template text="You can just download it and run it." start="00:14:56.639" video="mainVideo" id=subtitle]]
+[[!template text="You will have to replace" start="00:14:59.600" video="mainVideo" id=subtitle]]
+[[!template text="your ~/.emacs.d directory," start="00:15:01.360" video="mainVideo" id=subtitle]]
+[[!template text="and then you can explore it, test it," start="00:15:03.760" video="mainVideo" id=subtitle]]
+[[!template text="and then pick things out of it," start="00:15:07.440" video="mainVideo" id=subtitle]]
+[[!template text="choose, etc." start="00:15:11.039" video="mainVideo" id=subtitle]]
+[[!template text="Let me go through the README." start="00:15:14.639" video="mainVideo" id=subtitle]]
+[[!template text="I think that the README" start="00:15:16.800" video="mainVideo" id=subtitle]]
+[[!template text="is actually useful." start="00:15:17.920" video="mainVideo" id=subtitle]]
+[[!template text="I have a function called actually start." start="00:15:19.600" video="mainVideo" id=subtitle]]
+[[!template text="That is the one" start="00:15:21.760" video="mainVideo" id=subtitle]]
+[[!template text="that creates indentation" start="00:15:22.480" video="mainVideo" id=subtitle]]
+[[!template text="and sets up the mode, etc." start="00:15:24.000" video="mainVideo" id=subtitle]]
+[[!template text="Let me talk about GitHub." start="00:15:28.399" video="mainVideo" id=subtitle]]
+[[!template text="So GitHub is a great resource. Why?" start="00:15:29.440" video="mainVideo" id=subtitle]]
+[[!template text="Well its publishing," start="00:15:31.839" video="mainVideo" id=subtitle]]
+[[!template text="as i mentioned before," start="00:15:32.880" video="mainVideo" id=subtitle]]
+[[!template text="is very simple." start="00:15:34.240" video="mainVideo" id=subtitle]]
+[[!template text="To publish, you basically just" start="00:15:35.519" video="mainVideo" id=subtitle]]
+[[!template text="push your changes" start="00:15:37.120" video="mainVideo" id=subtitle]]
+[[!template text="and it automatically renders the code." start="00:15:37.920" video="mainVideo" id=subtitle]]
+[[!template text="It's something that is quite useful." start="00:15:43.199" video="mainVideo" id=subtitle]]
+[[!template text="But it is not perfect," start="00:15:46.800" video="mainVideo" id=subtitle]]
+[[!template text="and it's not able to understand" start="00:15:48.720" video="mainVideo" id=subtitle]]
+[[!template text="the full Org. But for most of the things" start="00:15:50.399" video="mainVideo" id=subtitle]]
+[[!template text="that I use for teaching," start="00:15:52.880" video="mainVideo" id=subtitle]]
+[[!template text="it's sufficiently good." start="00:15:53.680" video="mainVideo" id=subtitle]]
+[[!template text="It would be better if it was full" start="00:15:55.600" video="mainVideo" id=subtitle]]
+[[!template text="at compliance, but it's not bad as it is." start="00:15:57.360" video="mainVideo" id=subtitle]]
+[[!template text="Version control. I think" start="00:16:00.720" video="mainVideo" id=subtitle]]
+[[!template text="it's extremely valuable" start="00:16:02.463" video="mainVideo" id=subtitle]]
+[[!template text="to have version control." start="00:16:03.839" video="mainVideo" id=subtitle]]
+[[!template text="It allows to actually use" start="00:16:05.199" video="mainVideo" id=subtitle]]
+[[!template text="different computers" start="00:16:08.079" video="mainVideo" id=subtitle]]
+[[!template text="or keep track of my changes," start="00:16:08.959" video="mainVideo" id=subtitle]]
+[[!template text="collaborate with authors," start="00:16:10.560" video="mainVideo" id=subtitle]]
+[[!template text="even have pull requests" start="00:16:11.920" video="mainVideo" id=subtitle]]
+[[!template text="from the students." start="00:16:13.040" video="mainVideo" id=subtitle]]
+[[!template text="Actually it's very empowering" start="00:16:13.759" video="mainVideo" id=subtitle]]
+[[!template text="for the students." start="00:16:16.320" video="mainVideo" id=subtitle]]
+[[!template text="Navigation, links, cut and paste" start="00:16:18.800" video="mainVideo" id=subtitle]]
+[[!template text="between code blocks," start="00:16:20.480" video="mainVideo" id=subtitle]]
+[[!template text="you can even edit in place" start="00:16:21.920" video="mainVideo" id=subtitle]]
+[[!template text="if you want to." start="00:16:23.199" video="mainVideo" id=subtitle]]
+[[!template text="In a pinch, you can actually use GitHub" start="00:16:26.160" video="mainVideo" id=subtitle]]
+[[!template text="to do the editing of your file." start="00:16:27.920" video="mainVideo" id=subtitle]]
+[[!template text="Of course, it will not update your buffers." start="00:16:30.000" video="mainVideo" id=subtitle]]
+[[!template text=":exports both. This is very important." start="00:16:33.199" video="mainVideo" id=subtitle]]
+[[!template text="If we have a block, by default," start="00:16:35.199" video="mainVideo" id=subtitle]]
+[[!template text="GitHub will not typeset" start="00:16:40.160" video="mainVideo" id=subtitle]]
+[[!template text="the output of that block." start="00:16:43.199" video="mainVideo" id=subtitle]]
+[[!template text="It will only put the source code," start="00:16:44.399" video="mainVideo" id=subtitle]]
+[[!template text="but not its output." start="00:16:45.839" video="mainVideo" id=subtitle]]
+[[!template text="In this case, if I actually showed this" start="00:16:47.199" video="mainVideo" id=subtitle]]
+[[!template text="in GitHub, &quot;hello world&quot; will not appear." start="00:16:50.079" video="mainVideo" id=subtitle]]
+[[!template text="So what we need to do is for every block," start="00:16:52.720" video="mainVideo" id=subtitle]]
+[[!template text="we have to do :exports both." start="00:16:55.120" video="mainVideo" id=subtitle]]
+[[!template text="okay that's unfortunate," start="00:16:57.040" video="mainVideo" id=subtitle]]
+[[!template text="but we can deal with that." start="00:16:58.720" video="mainVideo" id=subtitle]]
+[[!template text="Once it's done, then the output" start="00:17:01.120" video="mainVideo" id=subtitle]]
+[[!template text="is actually typeset." start="00:17:03.920" video="mainVideo" id=subtitle]]
+[[!template text="I mentioned that header args" start="00:17:06.079" video="mainVideo" id=subtitle]]
+[[!template text="are very important," start="00:17:07.520" video="mainVideo" id=subtitle]]
+[[!template text="because those are the ones" start="00:17:09.039" video="mainVideo" id=subtitle]]
+[[!template text="that set the parameters" start="00:17:10.079" video="mainVideo" id=subtitle]]
+[[!template text="for each one of the blocks that you have." start="00:17:12.799" video="mainVideo" id=subtitle]]
+[[!template text="You don't want to have to type every" start="00:17:14.640" video="mainVideo" id=subtitle]]
+[[!template text="single one of them at once." start="00:17:16.000" video="mainVideo" id=subtitle]]
+[[!template text="For example, let me go back to" start="00:17:19.120" video="mainVideo" id=subtitle]]
+[[!template text="my presentation." start="00:17:20.880" video="mainVideo" id=subtitle]]
+[[!template text="Here's actually the parameters for C." start="00:17:23.839" video="mainVideo" id=subtitle]]
+[[!template text="C, I say, I don't want you to" start="00:17:26.160" video="mainVideo" id=subtitle]]
+[[!template text="automatically add a main." start="00:17:28.880" video="mainVideo" id=subtitle]]
+[[!template text="I want to provide my main," start="00:17:30.000" video="mainVideo" id=subtitle]]
+[[!template text="and these are the flags to the compiler." start="00:17:31.120" video="mainVideo" id=subtitle]]
+[[!template text="With C++, similar. With SQLite," start="00:17:34.160" video="mainVideo" id=subtitle]]
+[[!template text="I said this is my database," start="00:17:37.280" video="mainVideo" id=subtitle]]
+[[!template text="this is the data," start="00:17:38.720" video="mainVideo" id=subtitle]]
+[[!template text="the file where the database lives," start="00:17:39.600" video="mainVideo" id=subtitle]]
+[[!template text="and for the results, I want you to insert" start="00:17:41.360" video="mainVideo" id=subtitle]]
+[[!template text="the column names. I want to see" start="00:17:44.559" video="mainVideo" id=subtitle]]
+[[!template text="the names of the columns in the result." start="00:17:46.160" video="mainVideo" id=subtitle]]
+[[!template text="So those are actually why" start="00:17:48.400" video="mainVideo" id=subtitle]]
+[[!template text="the headers are important." start="00:17:50.960" video="mainVideo" id=subtitle]]
+[[!template text="There's one in general." start="00:17:53.840" video="mainVideo" id=subtitle]]
+[[!template text="That's :results output." start="00:17:55.520" video="mainVideo" id=subtitle]]
+[[!template text="If you're interested on showing" start="00:17:56.880" video="mainVideo" id=subtitle]]
+[[!template text="the standard output of your snippet," start="00:17:59.039" video="mainVideo" id=subtitle]]
+[[!template text="then you have to use :results output." start="00:18:01.760" video="mainVideo" id=subtitle]]
+[[!template text="Otherwise, it will insert" start="00:18:03.600" video="mainVideo" id=subtitle]]
+[[!template text="the result of the last expression." start="00:18:04.799" video="mainVideo" id=subtitle]]
+[[!template text="It just depends on what you want to show," start="00:18:06.720" video="mainVideo" id=subtitle]]
+[[!template text="but it's important" start="00:18:08.000" video="mainVideo" id=subtitle]]
+[[!template text="that you are aware of that." start="00:18:08.720" video="mainVideo" id=subtitle]]
+[[!template text="I'm almost running out of time." start="00:18:11.200" video="mainVideo" id=subtitle]]
+[[!template text="There are some things that are C-specific" start="00:18:13.440" video="mainVideo" id=subtitle]]
+[[!template text="and that I sort of covered" start="00:18:15.919" video="mainVideo" id=subtitle]]
+[[!template text="during the demo." start="00:18:18.400" video="mainVideo" id=subtitle]]
+[[!template text="You can use advanced Org features," start="00:18:23.919" video="mainVideo" id=subtitle]]
+[[!template text="and you can actually use noweb." start="00:18:26.000" video="mainVideo" id=subtitle]]
+[[!template text="Now that's confusing for students," start="00:18:29.039" video="mainVideo" id=subtitle]]
+[[!template text="so i will suggest that you actually do it" start="00:18:30.640" video="mainVideo" id=subtitle]]
+[[!template text="but then inform the students" start="00:18:33.600" video="mainVideo" id=subtitle]]
+[[!template text="very clearly of that." start="00:18:34.880" video="mainVideo" id=subtitle]]
+[[!template text="Some potential issues:" start="00:18:37.760" video="mainVideo" id=subtitle]]
+[[!template text="_ (underscore). _ is used everywhere." start="00:18:39.280" video="mainVideo" id=subtitle]]
+[[!template text="By default, it will try to export it--" start="00:18:42.400" video="mainVideo" id=subtitle]]
+[[!template text="Org will try to export it as circumflex," start="00:18:44.640" video="mainVideo" id=subtitle]]
+[[!template text="the same as with GitHub." start="00:18:46.960" video="mainVideo" id=subtitle]]
+[[!template text="So we want to inform Org and GitHub" start="00:18:48.400" video="mainVideo" id=subtitle]]
+[[!template text="not to do anything with them," start="00:18:52.480" video="mainVideo" id=subtitle]]
+[[!template text="and this is via the circumflex." start="00:18:53.840" video="mainVideo" id=subtitle]]
+[[!template text="So we said in #+OPTIONS: ^:nil ," start="00:18:55.520" video="mainVideo" id=subtitle]]
+[[!template text="and that actually takes care" start="00:18:57.440" video="mainVideo" id=subtitle]]
+[[!template text="of the circumflex and also the underscore." start="00:18:58.720" video="mainVideo" id=subtitle]]
+[[!template text="It's kind of confusing" start="00:19:01.679" video="mainVideo" id=subtitle]]
+[[!template text="because it's both," start="00:19:02.720" video="mainVideo" id=subtitle]]
+[[!template text="but it's actually named" start="00:19:04.080" video="mainVideo" id=subtitle]]
+[[!template text="after the circumflex." start="00:19:05.120" video="mainVideo" id=subtitle]]
+[[!template text="The pipe character" start="00:19:06.720" video="mainVideo" id=subtitle]]
+[[!template text="is one of those characters" start="00:19:07.840" video="mainVideo" id=subtitle]]
+[[!template text="that is actually very, very common" start="00:19:08.880" video="mainVideo" id=subtitle]]
+[[!template text="in programming, but if you put in a table," start="00:19:10.640" video="mainVideo" id=subtitle]]
+[[!template text="there's no way to do it. Like, okay," start="00:19:12.799" video="mainVideo" id=subtitle]]
+[[!template text="I wish I had this table nicely" start="00:19:14.480" video="mainVideo" id=subtitle]]
+[[!template text="where I can say || here," start="00:19:16.559" video="mainVideo" id=subtitle]]
+[[!template text="but if I put this ||," start="00:19:19.520" video="mainVideo" id=subtitle]]
+[[!template text="it will actually interpret it" start="00:19:21.280" video="mainVideo" id=subtitle]]
+[[!template text="as the separator." start="00:19:22.799" video="mainVideo" id=subtitle]]
+[[!template text="So that's one of the few things" start="00:19:23.919" video="mainVideo" id=subtitle]]
+[[!template text="that's kind of annoying." start="00:19:25.760" video="mainVideo" id=subtitle]]
+[[!template text="Final words. See my configuration file," start="00:19:27.679" video="mainVideo" id=subtitle]]
+[[!template text="and try to typeset the code," start="00:19:31.679" video="mainVideo" id=subtitle]]
+[[!template text="the buffer as close as possible" start="00:19:35.520" video="mainVideo" id=subtitle]]
+[[!template text="to what you want to present." start="00:19:37.520" video="mainVideo" id=subtitle]]
+[[!template text="As you can see here," start="00:19:38.720" video="mainVideo" id=subtitle]]
+[[!template text="I'm actually using colors to highlight" start="00:19:40.000" video="mainVideo" id=subtitle]]
+[[!template text="by using the current line." start="00:19:42.240" video="mainVideo" id=subtitle]]
+[[!template text="Use yasnippets." start="00:19:44.320" video="mainVideo" id=subtitle]]
+[[!template text="They're amazing, and they will actually" start="00:19:46.960" video="mainVideo" id=subtitle]]
+[[!template text="make your life much more useful." start="00:19:48.480" video="mainVideo" id=subtitle]]
+[[!template text="Experiment." start="00:19:51.440" video="mainVideo" id=subtitle]]
+[[!template text="Just a conclusion." start="00:19:53.280" video="mainVideo" id=subtitle]]
+[[!template text="Org mode and Emacs really make" start="00:19:56.720" video="mainVideo" id=subtitle]]
+[[!template text="a wonderful, amazing environment" start="00:19:58.400" video="mainVideo" id=subtitle]]
+[[!template text="for teaching programming." start="00:20:01.039" video="mainVideo" id=subtitle]]
+[[!template text="I just want to end by saying that" start="00:20:03.360" video="mainVideo" id=subtitle]]
+[[!template text="I'm very grateful to all the Emacs community" start="00:20:06.640" video="mainVideo" id=subtitle]]
+[[!template text="because I have benefited tremendously" start="00:20:10.320" video="mainVideo" id=subtitle]]
+[[!template text="over the years. I have been using Emacs" start="00:20:14.159" video="mainVideo" id=subtitle]]
+[[!template text="since 1991, so this is essentially" start="00:20:16.080" video="mainVideo" id=subtitle]]
+[[!template text="my 30th year that have been using Emacs." start="00:20:18.960" video="mainVideo" id=subtitle]]
+[[!template text="I think that is the most important," start="00:20:22.240" video="mainVideo" id=subtitle]]
+[[!template text="most fundamental tool that I use" start="00:20:24.640" video="mainVideo" id=subtitle]]
+[[!template text="day-to-day, from reading email," start="00:20:26.980" video="mainVideo" id=subtitle]]
+[[!template text="to doing my teaching, doing my papers," start="00:20:29.760" video="mainVideo" id=subtitle]]
+[[!template text="my research... it's everything." start="00:20:32.480" video="mainVideo" id=subtitle]]
+[[!template text="So thank you all" start="00:20:34.960" video="mainVideo" id=subtitle]]
+[[!template text="and I hope that you find this useful." start="00:20:37.039" video="mainVideo" id=subtitle]]
+[[!template text="Bye." start="00:20:40.799" video="mainVideo" id=subtitle]]
+[[!template text="captions by sachac" start="00:20:42.799" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/tech.md b/2021/captions/tech.md
new file mode 100644
index 00000000..5131d5b7
--- /dev/null
+++ b/2021/captions/tech.md
@@ -0,0 +1,279 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi! My name is Jan, and I'll be talking" start="00:00:02.560" video="mainVideo" id=subtitle]]
+[[!template text="about using Emacs for technical writing." start="00:00:05.040" video="mainVideo" id=subtitle]]
+[[!template text="Let's first define what we mean by" start="00:00:07.680" video="mainVideo" id=subtitle]]
+[[!template text="technical writing." start="00:00:09.519" video="mainVideo" id=subtitle]]
+[[!template text="At least, I mean with that, any kind of" start="00:00:12.080" video="mainVideo" id=subtitle]]
+[[!template text="writing that involves computer systems." start="00:00:13.679" video="mainVideo" id=subtitle]]
+[[!template text="So, maybe a developer guide for a system," start="00:00:15.759" video="mainVideo" id=subtitle]]
+[[!template text="or a library you've been creating," start="00:00:19.700" video="mainVideo" id=subtitle]]
+[[!template text="maybe reference documentation" start="00:00:21.680" video="mainVideo" id=subtitle]]
+[[!template text="or a user guide for a REST API" start="00:00:23.433" video="mainVideo" id=subtitle]]
+[[!template text="that you offer as a cloud service," start="00:00:25.833" video="mainVideo" id=subtitle]]
+[[!template text="or doing a technical presentation" start="00:00:27.934" video="mainVideo" id=subtitle]]
+[[!template text="exactly like this one" start="00:00:29.767" video="mainVideo" id=subtitle]]
+[[!template text="that may actually include some live" start="00:00:30.700" video="mainVideo" id=subtitle]]
+[[!template text="coding as well that you may want to do" start="00:00:32.239" video="mainVideo" id=subtitle]]
+[[!template text="while you're showing the presentation" start="00:00:34.000" video="mainVideo" id=subtitle]]
+[[!template text="without too much context switching." start="00:00:36.000" video="mainVideo" id=subtitle]]
+[[!template text="I've been doing a variety of these" start="00:00:39.040" video="mainVideo" id=subtitle]]
+[[!template text="things in my professional life for a while now," start="00:00:40.399" video="mainVideo" id=subtitle]]
+[[!template text="and I found Emacs to be a" start="00:00:43.034" video="mainVideo" id=subtitle]]
+[[!template text="really nice tool to help out with that," start="00:00:43.840" video="mainVideo" id=subtitle]]
+[[!template text="since it actually pulls in different languages." start="00:00:46.879" video="mainVideo" id=subtitle]]
+[[!template text="The ones I work with is Scala, Java, C++," start="00:00:50.719" video="mainVideo" id=subtitle]]
+[[!template text="and things like that, and everything" start="00:00:52.800" video="mainVideo" id=subtitle]]
+[[!template text="works in the same way within Emacs," start="00:00:54.480" video="mainVideo" id=subtitle]]
+[[!template text="so you don't have to learn different tools" start="00:00:56.160" video="mainVideo" id=subtitle]]
+[[!template text="to do the same thing." start="00:00:58.400" video="mainVideo" id=subtitle]]
+[[!template text="Doing all of this against Java looks the" start="00:00:59.840" video="mainVideo" id=subtitle]]
+[[!template text="same as it would but with C++ except" start="00:01:02.079" video="mainVideo" id=subtitle]]
+[[!template text="the language is different." start="00:01:04.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="A little refresher for people that might" start="00:01:07.119" video="mainVideo" id=subtitle]]
+[[!template text="be viewing this out of context." start="00:01:08.640" video="mainVideo" id=subtitle]]
+[[!template text="Emacs is a very customizable text editor" start="00:01:10.666" video="mainVideo" id=subtitle]]
+[[!template text="environment, and Org mode is a" start="00:01:13.280" video="mainVideo" id=subtitle]]
+[[!template text="part of Emacs that allows you to deal" start="00:01:15.600" video="mainVideo" id=subtitle]]
+[[!template text="with structured text." start="00:01:17.360" video="mainVideo" id=subtitle]]
+[[!template text="So, a plain text file containing headings," start="00:01:18.734" video="mainVideo" id=subtitle]]
+[[!template text="lists, tables, and even code blocks" start="00:01:21.920" video="mainVideo" id=subtitle]]
+[[!template text="formatted in a particular way, so Org" start="00:01:25.439" video="mainVideo" id=subtitle]]
+[[!template text="mode can help out with that." start="00:01:27.360" video="mainVideo" id=subtitle]]
+[[!template text="And Org babel is the particular part of Org mode" start="00:01:29.866" video="mainVideo" id=subtitle]]
+[[!template text="that deals with executing those code" start="00:01:32.560" video="mainVideo" id=subtitle]]
+[[!template text="blocks and actually interacting with," start="00:01:34.400" video="mainVideo" id=subtitle]]
+[[!template text="say, a Java or a Python environment" start="00:01:37.000" video="mainVideo" id=subtitle]]
+[[!template text="underneath, and showing the results of" start="00:01:38.720" video="mainVideo" id=subtitle]]
+[[!template text="that right inside the same Org file." start="00:01:40.720" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's look at" start="00:01:43.840" video="mainVideo" id=subtitle]]
+[[!template text="what are a couple of scenarios" start="00:01:44.966" video="mainVideo" id=subtitle]]
+[[!template text="using this might actually look like." start="00:01:47.167" video="mainVideo" id=subtitle]]
+[[!template text="Let's start with imagining that" start="00:01:49.400" video="mainVideo" id=subtitle]]
+[[!template text="we are writing a developer guide" start="00:01:52.533" video="mainVideo" id=subtitle]]
+[[!template text="for a service or a library," start="00:01:55.000" video="mainVideo" id=subtitle]]
+[[!template text="or a computer program that we might be writing." start="00:01:59.439" video="mainVideo" id=subtitle]]
+[[!template text="And, imagine that we have some" start="00:02:02.560" video="mainVideo" id=subtitle]]
+[[!template text="dependencies that the program requires" start="00:02:04.560" video="mainVideo" id=subtitle]]
+[[!template text="that are configured using docker-compose," start="00:02:07.119" video="mainVideo" id=subtitle]]
+[[!template text="for those who don't know Docker, docker-compose," start="00:02:09.520" video="mainVideo" id=subtitle]]
+[[!template text="it's a way to quickly describe some Linux" start="00:02:11.767" video="mainVideo" id=subtitle]]
+[[!template text="programs that can be immediately run" start="00:02:15.599" video="mainVideo" id=subtitle]]
+[[!template text="without installing too much dependencies." start="00:02:17.920" video="mainVideo" id=subtitle]]
+[[!template text="You define these using a YAML file" start="00:02:21.280" video="mainVideo" id=subtitle]]
+[[!template text="called the docker-compose file." start="00:02:23.040" video="mainVideo" id=subtitle]]
+[[!template text="Now, here inside Emacs we have a block" start="00:02:25.040" video="mainVideo" id=subtitle]]
+[[!template text="that defines a YAML file, and we're" start="00:02:26.959" video="mainVideo" id=subtitle]]
+[[!template text="actually saying this is called" start="00:02:29.280" video="mainVideo" id=subtitle]]
+[[!template text="docker-compose.yaml" start="00:02:30.900" video="mainVideo" id=subtitle]]
+[[!template text="with some content here, and you can see" start="00:02:33.840" video="mainVideo" id=subtitle]]
+[[!template text="that even though we are in Org mode," start="00:02:36.400" video="mainVideo" id=subtitle]]
+[[!template text="Org mode knows that it can highlight this" start="00:02:38.200" video="mainVideo" id=subtitle]]
+[[!template text="according to YAML and Org mode doesn't" start="00:02:40.959" video="mainVideo" id=subtitle]]
+[[!template text="directly know about YAML, we just said hey" start="00:02:43.360" video="mainVideo" id=subtitle]]
+[[!template text="this block has to do with YAML." start="00:02:45.200" video="mainVideo" id=subtitle]]
+[[!template text="Because there's a yaml-mode in Emacs," start="00:02:47.360" video="mainVideo" id=subtitle]]
+[[!template text="it will borrow from that mode to actually" start="00:02:51.467" video="mainVideo" id=subtitle]]
+[[!template text="highlight this block." start="00:02:53.280" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now, the fun thing is that there's a" start="00:02:55.920" video="mainVideo" id=subtitle]]
+[[!template text="feature in Org called tangling that" start="00:02:57.680" video="mainVideo" id=subtitle]]
+[[!template text="allows you to take these kinds of blocks" start="00:03:00.080" video="mainVideo" id=subtitle]]
+[[!template text="and actually export them to separate files." start="00:03:02.159" video="mainVideo" id=subtitle]]
+[[!template text="So, if we look at the" start="00:03:04.800" video="mainVideo" id=subtitle]]
+[[!template text="directory that we're in right now, we see" start="00:03:06.959" video="mainVideo" id=subtitle]]
+[[!template text="that we just got the presentation," start="00:03:08.720" video="mainVideo" id=subtitle]]
+[[!template text="there is no docker-compose file yet." start="00:03:10.434" video="mainVideo" id=subtitle]]
+[[!template text="If I say Control c Control v t (C-c C-v t)" start="00:03:12.239" video="mainVideo" id=subtitle]]
+[[!template text="and I go back and refresh this directory," start="00:03:16.000" video="mainVideo" id=subtitle]]
+[[!template text="now we have a docker-compose file as well," start="00:03:18.080" video="mainVideo" id=subtitle]]
+[[!template text="which has the content in it that we" start="00:03:20.200" video="mainVideo" id=subtitle]]
+[[!template text="just created here." start="00:03:22.000" video="mainVideo" id=subtitle]]
+[[!template text="That's very nice because" start="00:03:23.334" video="mainVideo" id=subtitle]]
+[[!template text="conceptually we don't actually need to" start="00:03:25.200" video="mainVideo" id=subtitle]]
+[[!template text="leave Org mode, we can say something" start="00:03:26.560" video="mainVideo" id=subtitle]]
+[[!template text="about this file and have the contents of" start="00:03:28.080" video="mainVideo" id=subtitle]]
+[[!template text="the file in the same descriptive document" start="00:03:29.760" video="mainVideo" id=subtitle]]
+[[!template text="while also having some actual side effect" start="00:03:32.480" video="mainVideo" id=subtitle]]
+[[!template text="of the file existing on disk and" start="00:03:34.966" video="mainVideo" id=subtitle]]
+[[!template text="us being able to interact with it." start="00:03:36.159" video="mainVideo" id=subtitle]]
+[[!template text="For example, we could…, now that the file is" start="00:03:38.000" video="mainVideo" id=subtitle]]
+[[!template text="there, invoke docker-compose and actually" start="00:03:40.000" video="mainVideo" id=subtitle]]
+[[!template text="create the nginx web server that we're" start="00:03:42.319" video="mainVideo" id=subtitle]]
+[[!template text="defining here. Let's do that." start="00:03:44.400" video="mainVideo" id=subtitle]]
+[[!template text="We have a little block" start="00:03:46.700" video="mainVideo" id=subtitle]]
+[[!template text="here that runs the shell script if I" start="00:03:47.120" video="mainVideo" id=subtitle]]
+[[!template text="invoke that from Org mode, we get the" start="00:03:49.599" video="mainVideo" id=subtitle]]
+[[!template text="results here, we see that now we have a" start="00:03:51.920" video="mainVideo" id=subtitle]]
+[[!template text="web server running on port 8080." start="00:03:53.439" video="mainVideo" id=subtitle]]
+[[!template text="That's, by the way," start="00:03:55.867" video="mainVideo" id=subtitle]]
+[[!template text="serving up the contents of" start="00:03:56.767" video="mainVideo" id=subtitle]]
+[[!template text="the directory that we're in here" start="00:03:58.319" video="mainVideo" id=subtitle]]
+[[!template text="on port 8080." start="00:04:00.799" video="mainVideo" id=subtitle]]
+[[!template text="So, that's already quite nice." start="00:04:02.799" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's look at another scenario where we" start="00:04:06.000" video="mainVideo" id=subtitle]]
+[[!template text="may be documenting a REST API." start="00:04:08.959" video="mainVideo" id=subtitle]]
+[[!template text="REST APIs use a lot of HTTP interactions" start="00:04:11.760" video="mainVideo" id=subtitle]]
+[[!template text="typically describing an XML or JSON" start="00:04:14.720" video="mainVideo" id=subtitle]]
+[[!template text="structure and which HTTP verb GET or PUT" start="00:04:17.199" video="mainVideo" id=subtitle]]
+[[!template text="to use with that and the URL." start="00:04:20.000" video="mainVideo" id=subtitle]]
+[[!template text="There's actually a nice extension to" start="00:04:22.320" video="mainVideo" id=subtitle]]
+[[!template text="Org babel called rest client that you" start="00:04:25.919" video="mainVideo" id=subtitle]]
+[[!template text="can install, that allows you to describe" start="00:04:28.240" video="mainVideo" id=subtitle]]
+[[!template text="these kind of requests right inside Emacs." start="00:04:30.000" video="mainVideo" id=subtitle]]
+[[!template text="First, let's make sure that our HTTP" start="00:04:33.360" video="mainVideo" id=subtitle]]
+[[!template text="server has something to respond with," start="00:04:35.360" video="mainVideo" id=subtitle]]
+[[!template text="that's a little interesting, for example," start="00:04:36.720" video="mainVideo" id=subtitle]]
+[[!template text="an XML file. We already know how to do that." start="00:04:38.080" video="mainVideo" id=subtitle]]
+[[!template text="So, let's create a code block type xml" start="00:04:40.433" video="mainVideo" id=subtitle]]
+[[!template text="that we can tangle to file called" start="00:04:42.533" video="mainVideo" id=subtitle]]
+[[!template text="test.xml, Control c Control v t (C-c C-v t)." start="00:04:43.600" video="mainVideo" id=subtitle]]
+[[!template text="Now, if we look at the directory again," start="00:04:46.960" video="mainVideo" id=subtitle]]
+[[!template text="we have a test.xml file." start="00:04:52.067" video="mainVideo" id=subtitle]]
+[[!template text="And, now we can have a new type of block" start="00:04:55.120" video="mainVideo" id=subtitle]]
+[[!template text="called the restclient, which will invoke" start="00:04:57.520" video="mainVideo" id=subtitle]]
+[[!template text="REST client, and anything you type into" start="00:04:59.600" video="mainVideo" id=subtitle]]
+[[!template text="here will be sent as an HTTP request to" start="00:05:01.199" video="mainVideo" id=subtitle]]
+[[!template text="the server that you specify." start="00:05:04.160" video="mainVideo" id=subtitle]]
+[[!template text="Right now it goes to localhost on 8080 and" start="00:05:05.600" video="mainVideo" id=subtitle]]
+[[!template text="let's see if we can get our test.xml" start="00:05:08.880" video="mainVideo" id=subtitle]]
+[[!template text="file back." start="00:05:10.720" video="mainVideo" id=subtitle]]
+[[!template text="I've just invoked this, and you can see" start="00:05:11.433" video="mainVideo" id=subtitle]]
+[[!template text="we got the spec and the content type of" start="00:05:13.600" video="mainVideo" id=subtitle]]
+[[!template text="the server, if we scroll down a little" start="00:05:16.479" video="mainVideo" id=subtitle]]
+[[!template text="bit I think we see the headers here, yeah," start="00:05:17.680" video="mainVideo" id=subtitle]]
+[[!template text="so the server said it's text/xml and" start="00:05:19.199" video="mainVideo" id=subtitle]]
+[[!template text="restclient is smart enough to actually" start="00:05:22.080" video="mainVideo" id=subtitle]]
+[[!template text="invoke Emacs's sgml-mode to highlight it." start="00:05:23.759" video="mainVideo" id=subtitle]]
+[[!template text="I'm not exactly sure" start="00:05:27.966" video="mainVideo" id=subtitle]]
+[[!template text="what's the difference is between sxml" start="00:05:28.639" video="mainVideo" id=subtitle]]
+[[!template text="and xml-mode and there's a nxml-mode," start="00:05:31.039" video="mainVideo" id=subtitle]]
+[[!template text="they all pretty much know how to deal" start="00:05:33.680" video="mainVideo" id=subtitle]]
+[[!template text="with XML. In this case sgml was" start="00:05:35.600" video="mainVideo" id=subtitle]]
+[[!template text="chosen, which is fine." start="00:05:38.800" video="mainVideo" id=subtitle]]
+[[!template text="But you can see we just served up that" start="00:05:41.600" video="mainVideo" id=subtitle]]
+[[!template text="test.xml file, and" start="00:05:42.960" video="mainVideo" id=subtitle]]
+[[!template text="we can have some actual text here" start="00:05:45.680" video="mainVideo" id=subtitle]]
+[[!template text="describing &quot;Hey, if you do this request" start="00:05:46.880" video="mainVideo" id=subtitle]]
+[[!template text="you might get a response like that,&quot;" start="00:05:48.639" video="mainVideo" id=subtitle]]
+[[!template text="and the server will actually serve that up" start="00:05:50.734" video="mainVideo" id=subtitle]]
+[[!template text="and insert it right into the Org mode document." start="00:05:53.199" video="mainVideo" id=subtitle]]
+[[!template new="1" text="By the way, we're looking at" start="00:05:56.233" video="mainVideo" id=subtitle]]
+[[!template text="this now inside Emacs rendered somewhat" start="00:05:57.759" video="mainVideo" id=subtitle]]
+[[!template text="interestingly, but obviously you can" start="00:06:00.720" video="mainVideo" id=subtitle]]
+[[!template text="export this to a PDF, or HTML, or in all" start="00:06:02.479" video="mainVideo" id=subtitle]]
+[[!template text="sorts of nice and different ways as well" start="00:06:05.280" video="mainVideo" id=subtitle]]
+[[!template text="depending on what your particular needs are." start="00:06:06.880" video="mainVideo" id=subtitle]]
+[[!template text="Of course, we can't just send GET" start="00:06:09.759" video="mainVideo" id=subtitle]]
+[[!template text="requests, we can send PUT requests as" start="00:06:11.520" video="mainVideo" id=subtitle]]
+[[!template text="well, and just like in plain HTTP you" start="00:06:14.080" video="mainVideo" id=subtitle]]
+[[!template text="have the PUT method on the first line then" start="00:06:16.400" video="mainVideo" id=subtitle]]
+[[!template text="your headers, and a blank line," start="00:06:19.120" video="mainVideo" id=subtitle]]
+[[!template text="and then the body." start="00:06:20.600" video="mainVideo" id=subtitle]]
+[[!template new="1" text="If we try and invoke this then" start="00:06:22.000" video="mainVideo" id=subtitle]]
+[[!template text="nginx will say &quot;405 Not Allowed&quot;" start="00:06:24.720" video="mainVideo" id=subtitle]]
+[[!template text="because, obviously, just running a plain" start="00:06:27.440" video="mainVideo" id=subtitle]]
+[[!template text="web server will not allow you to" start="00:06:29.199" video="mainVideo" id=subtitle]]
+[[!template text="actually upload any files," start="00:06:30.319" video="mainVideo" id=subtitle]]
+[[!template text="but this of course could have been any" start="00:06:32.080" video="mainVideo" id=subtitle]]
+[[!template text="other response as well." start="00:06:33.440" video="mainVideo" id=subtitle]]
+[[!template text="Now, let's look at doing" start="00:06:36.800" video="mainVideo" id=subtitle]]
+[[!template text="presentations themselves, like the one" start="00:06:39.759" video="mainVideo" id=subtitle]]
+[[!template text="you're looking at." start="00:06:41.600" video="mainVideo" id=subtitle]]
+[[!template text="There's a package that I like to use a lot," start="00:06:42.867" video="mainVideo" id=subtitle]]
+[[!template text="which is called org-tree-slide." start="00:06:45.766" video="mainVideo" id=subtitle]]
+[[!template text="That's the one that's active right now," start="00:06:47.520" video="mainVideo" id=subtitle]]
+[[!template text="which takes an Org document and allows" start="00:06:49.759" video="mainVideo" id=subtitle]]
+[[!template text="you to show one heading at a time." start="00:06:52.080" video="mainVideo" id=subtitle]]
+[[!template text="It doesn't matter whether it's the first" start="00:06:54.600" video="mainVideo" id=subtitle]]
+[[!template text="level, second level, third level heading," start="00:06:55.599" video="mainVideo" id=subtitle]]
+[[!template text="they sort of fold into nice" start="00:06:57.280" video="mainVideo" id=subtitle]]
+[[!template text="things at the top," start="00:07:00.319" video="mainVideo" id=subtitle]]
+[[!template text="where you can" start="00:07:02.720" video="mainVideo" id=subtitle]]
+[[!template text="sort of go through a document" start="00:07:03.919" video="mainVideo" id=subtitle]]
+[[!template text="one piece at a time." start="00:07:05.366" video="mainVideo" id=subtitle]]
+[[!template text="I actually do like to use" start="00:07:07.680" video="mainVideo" id=subtitle]]
+[[!template text="Org babel at the same time to" start="00:07:10.367" video="mainVideo" id=subtitle]]
+[[!template text="do some live coding in it as well." start="00:07:12.319" video="mainVideo" id=subtitle]]
+[[!template text="Actually there are two ways to go to a PDF," start="00:07:14.479" video="mainVideo" id=subtitle]]
+[[!template text="you can just use the normal Org export" start="00:07:16.800" video="mainVideo" id=subtitle]]
+[[!template text="option to go to a PDF, which is" start="00:07:20.720" video="mainVideo" id=subtitle]]
+[[!template text="Control c Control e, and then l p (C-c C-e l p)," start="00:07:22.733" video="mainVideo" id=subtitle]]
+[[!template text="but if you use restclient, the" start="00:07:25.120" video="mainVideo" id=subtitle]]
+[[!template text="LaTeX file underneath sometimes gets" start="00:07:27.520" video="mainVideo" id=subtitle]]
+[[!template text="a little wonky because those things" start="00:07:30.960" video="mainVideo" id=subtitle]]
+[[!template text="don't directly work together." start="00:07:33.280" video="mainVideo" id=subtitle]]
+[[!template text="I wrote a little bit of Lisp" start="00:07:34.866" video="mainVideo" id=subtitle]]
+[[!template text="to help out with that," start="00:07:36.166" video="mainVideo" id=subtitle]]
+[[!template text="which you can look at if you check" start="00:07:37.039" video="mainVideo" id=subtitle]]
+[[!template text="out my presentation later." start="00:07:38.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="There's another package for Org babel called" start="00:07:40.960" video="mainVideo" id=subtitle]]
+[[!template text="beamer, or ox-beamer it's called," start="00:07:45.919" video="mainVideo" id=subtitle]]
+[[!template text="which uses a LaTeX style called beamer" start="00:07:48.800" video="mainVideo" id=subtitle]]
+[[!template text="to create a PDF," start="00:07:51.680" video="mainVideo" id=subtitle]]
+[[!template text="and that one looks sort of…," start="00:07:53.360" video="mainVideo" id=subtitle]]
+[[!template text="that one tries to actually" start="00:07:57.400" video="mainVideo" id=subtitle]]
+[[!template text="create one page per slide which you" start="00:07:58.000" video="mainVideo" id=subtitle]]
+[[!template text="would actually have a PDF with the" start="00:07:59.840" video="mainVideo" id=subtitle]]
+[[!template text="slides, but that one is a lot more picky" start="00:08:01.039" video="mainVideo" id=subtitle]]
+[[!template text="on what your Org file is" start="00:08:03.280" video="mainVideo" id=subtitle]]
+[[!template text="structured like, so you need to have all" start="00:08:06.160" video="mainVideo" id=subtitle]]
+[[!template text="your leaf headings at the same level," start="00:08:07.440" video="mainVideo" id=subtitle]]
+[[!template text="which I typically don't do." start="00:08:08.879" video="mainVideo" id=subtitle]]
+[[!template text="So, I can show you what this one" start="00:08:11.360" video="mainVideo" id=subtitle]]
+[[!template text="looks like." start="00:08:12.800" video="mainVideo" id=subtitle]]
+[[!template text="For this presentation you get a nice" start="00:08:16.639" video="mainVideo" id=subtitle]]
+[[!template text="title slide, and then you get…," start="00:08:18.240" video="mainVideo" id=subtitle]]
+[[!template text="it tries to make an outline," start="00:08:20.067" video="mainVideo" id=subtitle]]
+[[!template text="which is the one level above." start="00:08:21.167" video="mainVideo" id=subtitle]]
+[[!template text="The slides sort of look okay, but as" start="00:08:23.360" video="mainVideo" id=subtitle]]
+[[!template text="you go further they sort of start" start="00:08:26.319" video="mainVideo" id=subtitle]]
+[[!template text="to run into, you know," start="00:08:28.479" video="mainVideo" id=subtitle]]
+[[!template text="things not flowing as they should." start="00:08:31.680" video="mainVideo" id=subtitle]]
+[[!template text="I'm sure with a lot more LaTeX" start="00:08:34.633" video="mainVideo" id=subtitle]]
+[[!template text="knowledge you could make this" start="00:08:36.800" video="mainVideo" id=subtitle]]
+[[!template text="look a lot nicer, but personally I tend" start="00:08:37.919" video="mainVideo" id=subtitle]]
+[[!template text="to just create a normal PDF document" start="00:08:40.640" video="mainVideo" id=subtitle]]
+[[!template text="that's just, you know, text" start="00:08:44.080" video="mainVideo" id=subtitle]]
+[[!template text="with all the actual content of the" start="00:08:46.399" video="mainVideo" id=subtitle]]
+[[!template text="document. Inside the text you can see the" start="00:08:48.560" video="mainVideo" id=subtitle]]
+[[!template text="highlighting of especially restclient" start="00:08:50.560" video="mainVideo" id=subtitle]]
+[[!template text="stuff that works just fine, and" start="00:08:52.880" video="mainVideo" id=subtitle]]
+[[!template text="it's enough for my needs," start="00:08:55.920" video="mainVideo" id=subtitle]]
+[[!template text="so I just tend to make plain PDFs." start="00:08:57.400" video="mainVideo" id=subtitle]]
+[[!template text="Since we only have 10 minutes, I will" start="00:09:00.959" video="mainVideo" id=subtitle]]
+[[!template text="not go into the detailed configuration," start="00:09:02.959" video="mainVideo" id=subtitle]]
+[[!template text="you can check out the presentation" start="00:09:05.200" video="mainVideo" id=subtitle]]
+[[!template text="online to see how all these packages are" start="00:09:06.800" video="mainVideo" id=subtitle]]
+[[!template text="configured and how I use them," start="00:09:09.440" video="mainVideo" id=subtitle]]
+[[!template text="but for now that's all I have." start="00:09:13.440" video="mainVideo" id=subtitle]]
+[[!template text="I do recommend you try this out yourself." start="00:09:18.000" video="mainVideo" id=subtitle]]
+[[!template text="If you have any kind of documentation" start="00:09:20.000" video="mainVideo" id=subtitle]]
+[[!template text="or textual things to do," start="00:09:22.240" video="mainVideo" id=subtitle]]
+[[!template text="just pick one of these packages at a" start="00:09:24.399" video="mainVideo" id=subtitle]]
+[[!template text="time, integrate them into your" start="00:09:26.320" video="mainVideo" id=subtitle]]
+[[!template text="configuration if you haven't already." start="00:09:27.519" video="mainVideo" id=subtitle]]
+[[!template text="That's really the best way to go" start="00:09:29.200" video="mainVideo" id=subtitle]]
+[[!template text="about this, and you know, Google is your" start="00:09:31.040" video="mainVideo" id=subtitle]]
+[[!template text="friend, if you think &quot;Hey how I would do" start="00:09:32.959" video="mainVideo" id=subtitle]]
+[[!template text="this with these packages,&quot;" start="00:09:34.240" video="mainVideo" id=subtitle]]
+[[!template text="definitely do that." start="00:09:35.567" video="mainVideo" id=subtitle]]
+[[!template new="1" text="More things I will be looking at is" start="00:09:37.839" video="mainVideo" id=subtitle]]
+[[!template text="using this concept to write unit or" start="00:09:41.760" video="mainVideo" id=subtitle]]
+[[!template text="integration tests, you can imagine if you" start="00:09:44.000" video="mainVideo" id=subtitle]]
+[[!template text="have a documentation in Org mode that" start="00:09:45.360" video="mainVideo" id=subtitle]]
+[[!template text="describes your service as a" start="00:09:47.600" video="mainVideo" id=subtitle]]
+[[!template text="function of its REST API, you may want to" start="00:09:50.800" video="mainVideo" id=subtitle]]
+[[!template text="actually run all those commands as part" start="00:09:53.360" video="mainVideo" id=subtitle]]
+[[!template text="of your build and check if all the" start="00:09:55.040" video="mainVideo" id=subtitle]]
+[[!template text="documentation is still in order." start="00:09:56.480" video="mainVideo" id=subtitle]]
+[[!template text="I'm not doing that yet, but I'm" start="00:09:58.399" video="mainVideo" id=subtitle]]
+[[!template text="definitely looking into that." start="00:09:59.680" video="mainVideo" id=subtitle]]
+[[!template text="I'm also writing some extensions" start="00:10:01.133" video="mainVideo" id=subtitle]]
+[[!template text="to use Java and Scala" start="00:10:03.767" video="mainVideo" id=subtitle]]
+[[!template text="in a somewhat higher level with Org mode." start="00:10:06.000" video="mainVideo" id=subtitle]]
+[[!template text="But that's not entirely working yet," start="00:10:08.720" video="mainVideo" id=subtitle]]
+[[!template text="and we don't have time to go into that" start="00:10:11.680" video="mainVideo" id=subtitle]]
+[[!template text="today." start="00:10:12.959" video="mainVideo" id=subtitle]]
+[[!template text="That's it. Thanks a lot for your attention," start="00:10:14.240" video="mainVideo" id=subtitle]]
+[[!template text="and I'll be there for questions later." start="00:10:16.766" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/telega.md b/2021/captions/telega.md
new file mode 100644
index 00000000..54ea7a31
--- /dev/null
+++ b/2021/captions/telega.md
@@ -0,0 +1,259 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hello, my name is Gabriele," start="00:00:00.000" video="mainVideo" id=subtitle]]
+[[!template text="and today I'm going to tell you about Telega" start="00:00:01.599" video="mainVideo" id=subtitle]]
+[[!template text="and the Emacs community on Telegram." start="00:00:03.439" video="mainVideo" id=subtitle]]
+[[!template text="I'm not affiliated with Telegram or Telega," start="00:00:05.600" video="mainVideo" id=subtitle]]
+[[!template text="and opinions are my own in general." start="00:00:08.400" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to give you my personal spin about these topics." start="00:00:10.719" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The plan for the talk is the following." start="00:00:14.160" video="mainVideo" id=subtitle]]
+[[!template text="First, I'm going to talk about what is Telegram." start="00:00:16.160" video="mainVideo" id=subtitle]]
+[[!template text="Next, I'm going to tell you" start="00:00:18.800" video="mainVideo" id=subtitle]]
+[[!template text="about the Emacs community on Telegram." start="00:00:19.840" video="mainVideo" id=subtitle]]
+[[!template text="And finally, I'm going to discuss telega.el," start="00:00:21.840" video="mainVideo" id=subtitle]]
+[[!template text="an Emacs package for Telegram." start="00:00:24.720" video="mainVideo" id=subtitle]]
+[[!template text="In all of these, I'm now going to dive into details." start="00:00:26.560" video="mainVideo" id=subtitle]]
+[[!template text="My goal here is to give you" start="00:00:29.359" video="mainVideo" id=subtitle]]
+[[!template text="some exposure about these topics." start="00:00:30.880" video="mainVideo" id=subtitle]]
+[[!template text="You can find out more online, if you want." start="00:00:33.120" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Let's get started with what is Telegram." start="00:00:35.840" video="mainVideo" id=subtitle]]
+[[!template text="Telegram is a cloud-based" start="00:00:38.960" video="mainVideo" id=subtitle]]
+[[!template text="instant messaging platform." start="00:00:41.100" video="mainVideo" id=subtitle]]
+[[!template text="It's a popular one." start="00:00:42.879" video="mainVideo" id=subtitle]]
+[[!template text="It has more than half a billion users." start="00:00:44.079" video="mainVideo" id=subtitle]]
+[[!template text="I think one of the reasons" start="00:00:46.559" video="mainVideo" id=subtitle]]
+[[!template text="why it's so popular, it's because" start="00:00:47.840" video="mainVideo" id=subtitle]]
+[[!template text="it's really rich in features" start="00:00:49.600" video="mainVideo" id=subtitle]]
+[[!template text="while being user friendly." start="00:00:51.360" video="mainVideo" id=subtitle]]
+[[!template text="Hence, in some regions," start="00:00:52.960" video="mainVideo" id=subtitle]]
+[[!template text="Telegram has good market penetration." start="00:00:54.640" video="mainVideo" id=subtitle]]
+[[!template text="And of course, because of network effects," start="00:00:56.960" video="mainVideo" id=subtitle]]
+[[!template text="this brings even more users." start="00:00:59.039" video="mainVideo" id=subtitle]]
+[[!template new="1" text="The details of the features" start="00:01:01.120" video="mainVideo" id=subtitle]]
+[[!template text="is not particularly important." start="00:01:02.239" video="mainVideo" id=subtitle]]
+[[!template text="What I want to emphasize, though," start="00:01:03.680" video="mainVideo" id=subtitle]]
+[[!template text="is that while Telegram is mostly text-based," start="00:01:04.879" video="mainVideo" id=subtitle]]
+[[!template text="there's also support for audio/video calls and notes," start="00:01:08.400" video="mainVideo" id=subtitle]]
+[[!template text="and there's also a lot of features" start="00:01:12.000" video="mainVideo" id=subtitle]]
+[[!template text="which typically you find" start="00:01:13.600" video="mainVideo" id=subtitle]]
+[[!template text="in other instant messaging platforms:" start="00:01:15.119" video="mainVideo" id=subtitle]]
+[[!template text="you can chat with yourself," start="00:01:17.360" video="mainVideo" id=subtitle]]
+[[!template text="you can make polls," start="00:01:18.479" video="mainVideo" id=subtitle]]
+[[!template text="you can make quizzes," start="00:01:19.360" video="mainVideo" id=subtitle]]
+[[!template text="you can schedule messages," start="00:01:20.159" video="mainVideo" id=subtitle]]
+[[!template text="you can send attachments of any kind," start="00:01:21.280" video="mainVideo" id=subtitle]]
+[[!template text="even big ones, and you can send stickers." start="00:01:23.280" video="mainVideo" id=subtitle]]
+[[!template text="Telegram, overall, is quite customizable," start="00:01:25.759" video="mainVideo" id=subtitle]]
+[[!template text="and I would say that the platform is, overall, hackable." start="00:01:27.759" video="mainVideo" id=subtitle]]
+[[!template text="You can expand it with bots" start="00:01:30.560" video="mainVideo" id=subtitle]]
+[[!template text="and the clients are open source." start="00:01:32.799" video="mainVideo" id=subtitle]]
+[[!template text="In all of this, we shouldn't forget, though," start="00:01:35.280" video="mainVideo" id=subtitle]]
+[[!template text="the Telegram is centralized" start="00:01:37.280" video="mainVideo" id=subtitle]]
+[[!template text="and it is not free software." start="00:01:38.448" video="mainVideo" id=subtitle]]
+[[!template text="Nonetheless, it's still used by a number of people," start="00:01:39.840" video="mainVideo" id=subtitle]]
+[[!template text="and people use Telegram for different reasons." start="00:01:42.720" video="mainVideo" id=subtitle]]
+[[!template text="For example, some people use it to stay in touch" start="00:01:45.200" video="mainVideo" id=subtitle]]
+[[!template text="with friends and families." start="00:01:47.200" video="mainVideo" id=subtitle]]
+[[!template text="For this, Telegram offers private chats" start="00:01:48.399" video="mainVideo" id=subtitle]]
+[[!template text="or group chats with a restricted number of people." start="00:01:50.560" video="mainVideo" id=subtitle]]
+[[!template text="A lot of people use it" start="00:01:53.600" video="mainVideo" id=subtitle]]
+[[!template text="for engaging in online communities." start="00:01:55.040" video="mainVideo" id=subtitle]]
+[[!template text="For this, Telegram has super groups," start="00:01:57.600" video="mainVideo" id=subtitle]]
+[[!template text="which are groups with up to" start="00:01:59.439" video="mainVideo" id=subtitle]]
+[[!template text="hundreds of thousands of users," start="00:02:00.719" video="mainVideo" id=subtitle]]
+[[!template text="and has also channels," start="00:02:02.159" video="mainVideo" id=subtitle]]
+[[!template text="which are one-to-many ways of communicating," start="00:02:03.360" video="mainVideo" id=subtitle]]
+[[!template text="so these are ideally suited for," start="00:02:07.119" video="mainVideo" id=subtitle]]
+[[!template text="for example, following news," start="00:02:09.280" video="mainVideo" id=subtitle]]
+[[!template text="all sorts of news." start="00:02:10.959" video="mainVideo" id=subtitle]]
+[[!template text="Telegram also has bots" start="00:02:12.167" video="mainVideo" id=subtitle]]
+[[!template text="which can be useful by themselves." start="00:02:13.680" video="mainVideo" id=subtitle]]
+[[!template text="They provide value." start="00:02:15.840" video="mainVideo" id=subtitle]]
+[[!template text="And the chat with oneself" start="00:02:17.040" video="mainVideo" id=subtitle]]
+[[!template text="can be used for sending links," start="00:02:18.400" video="mainVideo" id=subtitle]]
+[[!template text="making notes, or sending reminders." start="00:02:20.400" video="mainVideo" id=subtitle]]
+[[!template text="So overall, there's multiple ways" start="00:02:23.440" video="mainVideo" id=subtitle]]
+[[!template text="in which you can use Telegram." start="00:02:24.959" video="mainVideo" id=subtitle]]
+[[!template text="When it comes to instant messaging," start="00:02:26.560" video="mainVideo" id=subtitle]]
+[[!template text="many people call Telegram home." start="00:02:28.239" video="mainVideo" id=subtitle]]
+[[!template new="1" text="It shouldn't come as a surprise, then," start="00:02:30.000" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs users want to meet" start="00:02:31.840" video="mainVideo" id=subtitle]]
+[[!template text="on Telegram as well." start="00:02:34.480" video="mainVideo" id=subtitle]]
+[[!template text="And indeed, there's an Emacs community on Telegram." start="00:02:35.680" video="mainVideo" id=subtitle]]
+[[!template text="Here I'm listing a few super groups about Emacs." start="00:02:38.480" video="mainVideo" id=subtitle]]
+[[!template text="There are language groups," start="00:02:41.519" video="mainVideo" id=subtitle]]
+[[!template text="so there's Emacs English, Emacs Russian," start="00:02:43.040" video="mainVideo" id=subtitle]]
+[[!template text="Emacs Spanish, Emacs Mandarin, Portuguese..." start="00:02:45.599" video="mainVideo" id=subtitle]]
+[[!template text="There are groups which are specific to starter packs." start="00:02:48.800" video="mainVideo" id=subtitle]]
+[[!template text="For example, there are Doom Emacs," start="00:02:51.440" video="mainVideo" id=subtitle]]
+[[!template text="Spacemacs, and there are groups" start="00:02:53.040" video="mainVideo" id=subtitle]]
+[[!template text="which are specific to packages like telega" start="00:02:54.879" video="mainVideo" id=subtitle]]
+[[!template text="which I'm going to discuss later." start="00:02:57.280" video="mainVideo" id=subtitle]]
+[[!template text="These are what you would expect" start="00:02:58.720" video="mainVideo" id=subtitle]]
+[[!template text="from traditional internet chat rooms." start="00:03:00.159" video="mainVideo" id=subtitle]]
+[[!template text="So they're used for shared links," start="00:03:02.800" video="mainVideo" id=subtitle]]
+[[!template text="they're used for discussing, troubleshooting," start="00:03:04.319" video="mainVideo" id=subtitle]]
+[[!template text="giving each other recommendations..." start="00:03:06.959" video="mainVideo" id=subtitle]]
+[[!template text="I think there are healthy communities" start="00:03:09.120" video="mainVideo" id=subtitle]]
+[[!template text="with typically a hundred" start="00:03:10.879" video="mainVideo" id=subtitle]]
+[[!template text="to a thousand members." start="00:03:12.239" video="mainVideo" id=subtitle]]
+[[!template text="An example of an initiative that's put forth" start="00:03:13.519" video="mainVideo" id=subtitle]]
+[[!template text="by the Emacs community on Telegram" start="00:03:15.280" video="mainVideo" id=subtitle]]
+[[!template text="is @emacs\_stories. @emacs\_stories" start="00:03:16.879" video="mainVideo" id=subtitle]]
+[[!template text="collects links and messages and pictures" start="00:03:18.720" video="mainVideo" id=subtitle]]
+[[!template text="that can showcase what Emacs can do." start="00:03:21.680" video="mainVideo" id=subtitle]]
+[[!template text="One of the goals here is" start="00:03:24.080" video="mainVideo" id=subtitle]]
+[[!template text="to show people that are new to emacs" start="00:03:25.680" video="mainVideo" id=subtitle]]
+[[!template text="what you can achieve" start="00:03:28.239" video="mainVideo" id=subtitle]]
+[[!template text="if you spend time with your editor." start="00:03:29.120" video="mainVideo" id=subtitle]]
+[[!template text="And here, what I'm showing you" start="00:03:31.200" video="mainVideo" id=subtitle]]
+[[!template text="is a screenshot from Telega." start="00:03:32.480" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So let's move on to the final topic" start="00:03:34.159" video="mainVideo" id=subtitle]]
+[[!template text="of this discussion," start="00:03:36.080" video="mainVideo" id=subtitle]]
+[[!template text="which is telega.el." start="00:03:37.040" video="mainVideo" id=subtitle]]
+[[!template text="Telega is a terrific piece of software." start="00:03:39.200" video="mainVideo" id=subtitle]]
+[[!template text="Telega is a interface to telegram within Emacs." start="00:03:41.440" video="mainVideo" id=subtitle]]
+[[!template text="It's developed by @zevlg," start="00:03:45.280" video="mainVideo" id=subtitle]]
+[[!template text="which is a long-time Emacs hacker," start="00:03:46.959" video="mainVideo" id=subtitle]]
+[[!template text="and it's very actively developed." start="00:03:49.680" video="mainVideo" id=subtitle]]
+[[!template text="Telegram itself is under active development," start="00:03:51.280" video="mainVideo" id=subtitle]]
+[[!template text="and telega has to implement" start="00:03:54.000" video="mainVideo" id=subtitle]]
+[[!template text="all these new features" start="00:03:55.840" video="mainVideo" id=subtitle]]
+[[!template text="that Telegram implements." start="00:03:57.200" video="mainVideo" id=subtitle]]
+[[!template text="Indeed, Telega implements" start="00:03:58.720" video="mainVideo" id=subtitle]]
+[[!template text="almost all the features" start="00:04:00.400" video="mainVideo" id=subtitle]]
+[[!template text="available in Telegram," start="00:04:01.360" video="mainVideo" id=subtitle]]
+[[!template text="even things like live location," start="00:04:02.319" video="mainVideo" id=subtitle]]
+[[!template text="except for audio/video calls" start="00:04:04.159" video="mainVideo" id=subtitle]]
+[[!template text="but these are work in progress." start="00:04:05.439" video="mainVideo" id=subtitle]]
+[[!template text="Just to give you an idea" start="00:04:07.040" video="mainVideo" id=subtitle]]
+[[!template text="of the size of this effort," start="00:04:08.000" video="mainVideo" id=subtitle]]
+[[!template text="we're talking about" start="00:04:09.040" video="mainVideo" id=subtitle]]
+[[!template text="30,000 lines of code," start="00:04:09.680" video="mainVideo" id=subtitle]]
+[[!template text="which doesn't tell you much," start="00:04:11.280" video="mainVideo" id=subtitle]]
+[[!template text="but maybe you can get a sense" start="00:04:12.720" video="mainVideo" id=subtitle]]
+[[!template text="that this is a significant project." start="00:04:14.080" video="mainVideo" id=subtitle]]
+[[!template text="In fact, I think Telega is a really remarkable" start="00:04:16.000" video="mainVideo" id=subtitle]]
+[[!template text="piece of software." start="00:04:18.400" video="mainVideo" id=subtitle]]
+[[!template text="Not only it implements all the features" start="00:04:19.199" video="mainVideo" id=subtitle]]
+[[!template text="available in Telegram," start="00:04:20.639" video="mainVideo" id=subtitle]]
+[[!template text="but implements new ones," start="00:04:21.680" video="mainVideo" id=subtitle]]
+[[!template text="which are only available to Emacs users." start="00:04:22.960" video="mainVideo" id=subtitle]]
+[[!template text="Here I'm blinking the documentation" start="00:04:25.120" video="mainVideo" id=subtitle]]
+[[!template text="for you to read if you're interested." start="00:04:26.800" video="mainVideo" id=subtitle]]
+[[!template new="1" text="What I want to mention, though," start="00:04:28.560" video="mainVideo" id=subtitle]]
+[[!template text="is that Telega is available on MELPA," start="00:04:29.759" video="mainVideo" id=subtitle]]
+[[!template text="but it requires an external library, TDlib." start="00:04:31.360" video="mainVideo" id=subtitle]]
+[[!template text="Most distributions do not pack" start="00:04:34.160" video="mainVideo" id=subtitle]]
+[[!template text="a recent version of TDlib." start="00:04:35.759" video="mainVideo" id=subtitle]]
+[[!template text="Such you have to compile yourself." start="00:04:37.360" video="mainVideo" id=subtitle]]
+[[!template text="if you don't want to compile TDlib," start="00:04:39.600" video="mainVideo" id=subtitle]]
+[[!template text="you can use the officially supported" start="00:04:41.280" video="mainVideo" id=subtitle]]
+[[!template text="Dockerfile or guix file" start="00:04:43.120" video="mainVideo" id=subtitle]]
+[[!template text="so that you can get everything" start="00:04:44.560" video="mainVideo" id=subtitle]]
+[[!template text="without too much worry." start="00:04:46.080" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Now let me tell you more about Telegram." start="00:04:48.000" video="mainVideo" id=subtitle]]
+[[!template text="Of course, the best way is to just" start="00:04:50.720" video="mainVideo" id=subtitle]]
+[[!template text="experiment with it yourself." start="00:04:52.080" video="mainVideo" id=subtitle]]
+[[!template text="And here I just want to give you" start="00:04:53.520" video="mainVideo" id=subtitle]]
+[[!template text="a glimpse of how Telega works." start="00:04:54.800" video="mainVideo" id=subtitle]]
+[[!template text="When you start Telega," start="00:04:56.720" video="mainVideo" id=subtitle]]
+[[!template text="what you see is a root buffer." start="00:04:57.840" video="mainVideo" id=subtitle]]
+[[!template text="The root buffer is essentially" start="00:05:00.000" video="mainVideo" id=subtitle]]
+[[!template text="the list of all the chats that you have," start="00:05:01.280" video="mainVideo" id=subtitle]]
+[[!template text="and, by itself, is a really powerful tool." start="00:05:02.960" video="mainVideo" id=subtitle]]
+[[!template text="You can use it for sorting" start="00:05:05.199" video="mainVideo" id=subtitle]]
+[[!template text="and filtering your chats," start="00:05:06.639" video="mainVideo" id=subtitle]]
+[[!template text="or you can create groups which are thematic." start="00:05:07.680" video="mainVideo" id=subtitle]]
+[[!template text="There's sophisticated search functions." start="00:05:10.639" video="mainVideo" id=subtitle]]
+[[!template text="For example, if you want to search only" start="00:05:12.720" video="mainVideo" id=subtitle]]
+[[!template text="for specific type of media," start="00:05:14.240" video="mainVideo" id=subtitle]]
+[[!template text="you can start new chats," start="00:05:16.800" video="mainVideo" id=subtitle]]
+[[!template text="you can get info about the chats," start="00:05:18.240" video="mainVideo" id=subtitle]]
+[[!template text="and you can even change Telegram settings" start="00:05:19.680" video="mainVideo" id=subtitle]]
+[[!template text="which are applied across the board." start="00:05:22.479" video="mainVideo" id=subtitle]]
+[[!template text="Here I'm showing you an example" start="00:05:24.720" video="mainVideo" id=subtitle]]
+[[!template text="of what it looks like." start="00:05:26.479" video="mainVideo" id=subtitle]]
+[[!template text="As you see, we're enjoying the support for emoji" start="00:05:27.520" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs has been improving upon" start="00:05:30.720" video="mainVideo" id=subtitle]]
+[[!template text="over the past years." start="00:05:33.039" video="mainVideo" id=subtitle]]
+[[!template text="Once you select one of these charts," start="00:05:34.320" video="mainVideo" id=subtitle]]
+[[!template text="you're brought to the chat buffer." start="00:05:36.400" video="mainVideo" id=subtitle]]
+[[!template text="Here I'm showing an example of" start="00:05:38.880" video="mainVideo" id=subtitle]]
+[[!template text="what a chat buffer looks like." start="00:05:40.400" video="mainVideo" id=subtitle]]
+[[!template text="So this is a screenshot" start="00:05:42.320" video="mainVideo" id=subtitle]]
+[[!template text="from the Emacs English group" start="00:05:43.360" video="mainVideo" id=subtitle]]
+[[!template text="where people were discussing about" start="00:05:45.520" video="mainVideo" id=subtitle]]
+[[!template text="compiling Emacs." start="00:05:47.840" video="mainVideo" id=subtitle]]
+[[!template text="As you can see, we see the conversation." start="00:05:49.039" video="mainVideo" id=subtitle]]
+[[!template text="We see the avatars." start="00:05:52.000" video="mainVideo" id=subtitle]]
+[[!template text="We see that there's a thread." start="00:05:53.280" video="mainVideo" id=subtitle]]
+[[!template text="We also see that" start="00:05:54.639" video="mainVideo" id=subtitle]]
+[[!template text="I'm going to send a message," start="00:05:55.440" video="mainVideo" id=subtitle]]
+[[!template text="message with emoji," start="00:05:57.360" video="mainVideo" id=subtitle]]
+[[!template text="a message with formatting," start="00:05:58.240" video="mainVideo" id=subtitle]]
+[[!template text="and I'm attaching an object." start="00:05:59.440" video="mainVideo" id=subtitle]]
+[[!template text="I can format my messages" start="00:06:01.120" video="mainVideo" id=subtitle]]
+[[!template text="using Markdown or Org Mode" start="00:06:03.680" video="mainVideo" id=subtitle]]
+[[!template text="or whatever I prefer" start="00:06:05.520" video="mainVideo" id=subtitle]]
+[[!template text="and I can attach any kind of attachment" start="00:06:06.720" video="mainVideo" id=subtitle]]
+[[!template text="I like. For example..." start="00:06:09.199" video="mainVideo" id=subtitle]]
+[[!template text="What I can also do is," start="00:06:10.560" video="mainVideo" id=subtitle]]
+[[!template text="if I'm editing a buffer," start="00:06:11.520" video="mainVideo" id=subtitle]]
+[[!template text="I can send that buffer through Telega," start="00:06:13.120" video="mainVideo" id=subtitle]]
+[[!template text="which I find quite useful" start="00:06:15.680" video="mainVideo" id=subtitle]]
+[[!template text="especially when I'm sending code." start="00:06:17.199" video="mainVideo" id=subtitle]]
+[[!template text="And again, just to show you that" start="00:06:18.720" video="mainVideo" id=subtitle]]
+[[!template text="Telegram is not just text messages" start="00:06:20.240" video="mainVideo" id=subtitle]]
+[[!template text="and Telega supports all the features in Telegram," start="00:06:22.319" video="mainVideo" id=subtitle]]
+[[!template text="here at the bottom, I'm showing" start="00:06:25.199" video="mainVideo" id=subtitle]]
+[[!template text="a voice note being played through Emacs," start="00:06:27.199" video="mainVideo" id=subtitle]]
+[[!template text="and as you see, there are some buttons" start="00:06:29.759" video="mainVideo" id=subtitle]]
+[[!template text="which are functional." start="00:06:31.919" video="mainVideo" id=subtitle]]
+[[!template text="If I hit the two times button," start="00:06:33.199" video="mainVideo" id=subtitle]]
+[[!template text="the playback speed will be twice," start="00:06:36.240" video="mainVideo" id=subtitle]]
+[[!template text="which is really neat." start="00:06:38.160" video="mainVideo" id=subtitle]]
+[[!template text="Telega and Emacs can even" start="00:06:39.600" video="mainVideo" id=subtitle]]
+[[!template text="reproduce videos or gifs," start="00:06:40.800" video="mainVideo" id=subtitle]]
+[[!template text="at least for a recent version of Emacs." start="00:06:43.039" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Finally, I want to emphasize that Telega" start="00:06:45.280" video="mainVideo" id=subtitle]]
+[[!template text="integrates really well with Emacs." start="00:06:47.520" video="mainVideo" id=subtitle]]
+[[!template text="For example, we are showing you" start="00:06:49.280" video="mainVideo" id=subtitle]]
+[[!template text="how you can use a transient interface" start="00:06:51.039" video="mainVideo" id=subtitle]]
+[[!template text="to Telega, or on the other side," start="00:06:54.319" video="mainVideo" id=subtitle]]
+[[!template text="I'm showing you how Telega integrates" start="00:06:56.720" video="mainVideo" id=subtitle]]
+[[!template text="with dashboard," start="00:06:59.280" video="mainVideo" id=subtitle]]
+[[!template text="so that we have recent chats" start="00:07:00.080" video="mainVideo" id=subtitle]]
+[[!template text="and we have the Emacs stories." start="00:07:01.440" video="mainVideo" id=subtitle]]
+[[!template text="Because, you know," start="00:07:03.120" video="mainVideo" id=subtitle]]
+[[!template text="who doesn't like Emacs with stories." start="00:07:03.840" video="mainVideo" id=subtitle]]
+[[!template text="On top, on the other hand," start="00:07:05.759" video="mainVideo" id=subtitle]]
+[[!template text="I'm showing you that we can have" start="00:07:06.880" video="mainVideo" id=subtitle]]
+[[!template text="syntax highlighting," start="00:07:08.880" video="mainVideo" id=subtitle]]
+[[!template text="which is something that Telegram by itself" start="00:07:09.919" video="mainVideo" id=subtitle]]
+[[!template text="doesn't have, this Emacs-only feature," start="00:07:11.759" video="mainVideo" id=subtitle]]
+[[!template text="and we can edit this" start="00:07:14.240" video="mainVideo" id=subtitle]]
+[[!template text="in the same way we edit" start="00:07:15.919" video="mainVideo" id=subtitle]]
+[[!template text="Org Mode source blocks," start="00:07:17.599" video="mainVideo" id=subtitle]]
+[[!template text="so we can edit this" start="00:07:19.759" video="mainVideo" id=subtitle]]
+[[!template text="with the minor mode for," start="00:07:20.880" video="mainVideo" id=subtitle]]
+[[!template text="in this case, Emacs Lisp." start="00:07:22.800" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, to conclude, I wanted to show you" start="00:07:24.080" video="mainVideo" id=subtitle]]
+[[!template text="that the Emacs community" start="00:07:26.240" video="mainVideo" id=subtitle]]
+[[!template text="also meets on Telegram," start="00:07:27.759" video="mainVideo" id=subtitle]]
+[[!template text="and we're an active and healthy community," start="00:07:29.120" video="mainVideo" id=subtitle]]
+[[!template text="and I want to present Telega" start="00:07:31.360" video="mainVideo" id=subtitle]]
+[[!template text="as a really amazing piece of software," start="00:07:32.880" video="mainVideo" id=subtitle]]
+[[!template text="one of the best clients available for" start="00:07:35.759" video="mainVideo" id=subtitle]]
+[[!template text="Telegram with Emacs." start="00:07:37.919" video="mainVideo" id=subtitle]]
+[[!template text="Even if you don't use Telegram," start="00:07:39.599" video="mainVideo" id=subtitle]]
+[[!template text="I think you should have a look at Telega" start="00:07:41.680" video="mainVideo" id=subtitle]]
+[[!template text="just to appreciate how amazing" start="00:07:43.599" video="mainVideo" id=subtitle]]
+[[!template text="a piece of software it is." start="00:07:46.080" video="mainVideo" id=subtitle]]
+[[!template text="And with this, I thank you for your attention," start="00:07:47.280" video="mainVideo" id=subtitle]]
+[[!template text="and if you like Telega," start="00:07:49.680" video="mainVideo" id=subtitle]]
+[[!template text="please consider donating" start="00:07:50.960" video="mainVideo" id=subtitle]]
+[[!template text="to support the development of the package." start="00:07:52.720" video="mainVideo" id=subtitle]]
+[[!template text="Thanks." start="00:07:54.800" video="mainVideo" id=subtitle]]
+
diff --git a/2021/captions/test.md b/2021/captions/test.md
new file mode 100644
index 00000000..d6beb515
--- /dev/null
+++ b/2021/captions/test.md
@@ -0,0 +1,167 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi! My name is Eduardo Ochs." start="00:00:00.240" video="mainVideo" id=subtitle]]
+[[!template text="I'm the author of" start="00:00:01.839" video="mainVideo" id=subtitle]]
+[[!template text="an Emacs package called eev," start="00:00:02.639" video="mainVideo" id=subtitle]]
+[[!template text="and this talk is about" start="00:00:04.319" video="mainVideo" id=subtitle]]
+[[!template text="a new feature of eev" start="00:00:05.279" video="mainVideo" id=subtitle]]
+[[!template text="called &quot;test blocks&quot;." start="00:00:06.480" video="mainVideo" id=subtitle]]
+[[!template text="Let's start by a demo." start="00:00:08.400" video="mainVideo" id=subtitle]]
+[[!template text="This is a file in Lua that defines" start="00:00:10.320" video="mainVideo" id=subtitle]]
+[[!template text="these two functions here," start="00:00:12.320" video="mainVideo" id=subtitle]]
+[[!template text="and if we type &lt;f8&gt; several times here," start="00:00:14.160" video="mainVideo" id=subtitle]]
+[[!template text="the &lt;f8&gt;s create a Lua REPL here" start="00:00:18.000" video="mainVideo" id=subtitle]]
+[[!template text="and then they send these lines" start="00:00:20.720" video="mainVideo" id=subtitle]]
+[[!template text="to the REPL, where this line here" start="00:00:22.240" video="mainVideo" id=subtitle]]
+[[!template text="loads this file into the REPL," start="00:00:25.840" video="mainVideo" id=subtitle]]
+[[!template text="and these other lines here" start="00:00:27.840" video="mainVideo" id=subtitle]]
+[[!template text="are tests for these lines." start="00:00:29.679" video="mainVideo" id=subtitle]]
+[[!template text="There's a lot of information here," start="00:00:33.200" video="mainVideo" id=subtitle]]
+[[!template text="so let me organize them" start="00:00:34.719" video="mainVideo" id=subtitle]]
+[[!template text="in a more visual way." start="00:00:36.160" video="mainVideo" id=subtitle]]
+[[!template text="This is our file in Lua." start="00:00:40.480" video="mainVideo" id=subtitle]]
+[[!template text="Lua sees this thing" start="00:00:42.960" video="mainVideo" id=subtitle]]
+[[!template text="as a multi-line comment," start="00:00:44.559" video="mainVideo" id=subtitle]]
+[[!template text="but we are going to see it" start="00:00:46.160" video="mainVideo" id=subtitle]]
+[[!template text="as a test block." start="00:00:47.520" video="mainVideo" id=subtitle]]
+[[!template text="And eev mode is active," start="00:00:48.879" video="mainVideo" id=subtitle]]
+[[!template text="so &lt;f8&gt; does the right thing." start="00:00:50.879" video="mainVideo" id=subtitle]]
+[[!template text="These three lines here" start="00:00:54.480" video="mainVideo" id=subtitle]]
+[[!template text="set up the target buffer" start="00:00:56.800" video="mainVideo" id=subtitle]]
+[[!template text="running a Lua REPL." start="00:00:58.320" video="mainVideo" id=subtitle]]
+[[!template text="You can see the the prompt" start="00:01:00.000" video="mainVideo" id=subtitle]]
+[[!template text="of the REPL here," start="00:01:02.079" video="mainVideo" id=subtitle]]
+[[!template text="and these lines here" start="00:01:03.520" video="mainVideo" id=subtitle]]
+[[!template text="are sent to the REPL." start="00:01:04.640" video="mainVideo" id=subtitle]]
+[[!template text="When we type &lt;f8&gt;" start="00:01:07.200" video="mainVideo" id=subtitle]]
+[[!template text="on a line that starts" start="00:01:08.960" video="mainVideo" id=subtitle]]
+[[!template text="with a red star," start="00:01:10.720" video="mainVideo" id=subtitle]]
+[[!template text="like these lines here," start="00:01:11.680" video="mainVideo" id=subtitle]]
+[[!template text="what &lt;f8&gt; does is that" start="00:01:13.600" video="mainVideo" id=subtitle]]
+[[!template text="it sends the rest of the line--" start="00:01:15.119" video="mainVideo" id=subtitle]]
+[[!template text="sorry, it executes" start="00:01:17.537" video="mainVideo" id=subtitle]]
+[[!template text="the rest of the line as Lisp." start="00:01:18.880" video="mainVideo" id=subtitle]]
+[[!template text="So the three &lt;f8&gt;s here" start="00:01:21.119" video="mainVideo" id=subtitle]]
+[[!template text="executes these lines as Lisp," start="00:01:23.920" video="mainVideo" id=subtitle]]
+[[!template text="and they set up the target buffer here." start="00:01:26.000" video="mainVideo" id=subtitle]]
+[[!template text="When we type &lt;f8&gt;" start="00:01:29.520" video="mainVideo" id=subtitle]]
+[[!template text="on a line that does not start" start="00:01:31.119" video="mainVideo" id=subtitle]]
+[[!template text="with a red star," start="00:01:32.720" video="mainVideo" id=subtitle]]
+[[!template text="the &lt;f8&gt; sends the line" start="00:01:34.159" video="mainVideo" id=subtitle]]
+[[!template text="to the target buffer and moves down." start="00:01:35.680" video="mainVideo" id=subtitle]]
+[[!template text="This line loads this file" start="00:01:38.799" video="mainVideo" id=subtitle]]
+[[!template text="in the REPL, and these lines are tests." start="00:01:40.619" video="mainVideo" id=subtitle]]
+[[!template text="So we just saw how to use" start="00:01:45.200" video="mainVideo" id=subtitle]]
+[[!template text="an existing test block;" start="00:01:46.799" video="mainVideo" id=subtitle]]
+[[!template text="let's now see how to create" start="00:01:48.240" video="mainVideo" id=subtitle]]
+[[!template text="a new test block." start="00:01:49.840" video="mainVideo" id=subtitle]]
+[[!template text="We just have to run this:" start="00:01:51.280" video="mainVideo" id=subtitle]]
+[[!template text="M-x ee-insert-test-block -" start="00:01:52.640" video="mainVideo" id=subtitle]]
+[[!template text="or M-x eeit." start="00:01:55.680" video="mainVideo" id=subtitle]]
+[[!template text="The result depends on the major mode." start="00:01:58.079" video="mainVideo" id=subtitle]]
+[[!template text="Let's understand that" start="00:02:01.439" video="mainVideo" id=subtitle]]
+[[!template text="by looking at the source code." start="00:02:03.920" video="mainVideo" id=subtitle]]
+[[!template text="eeit is an alias to this function here," start="00:02:06.079" video="mainVideo" id=subtitle]]
+[[!template text="and this function is just" start="00:02:08.720" video="mainVideo" id=subtitle]]
+[[!template text="five lines of code plus a docstring..." start="00:02:09.920" video="mainVideo" id=subtitle]]
+[[!template text="and the docstring explains" start="00:02:12.800" video="mainVideo" id=subtitle]]
+[[!template text="that if the major mode is foo-mode," start="00:02:14.160" video="mainVideo" id=subtitle]]
+[[!template text="then this function tries to call" start="00:02:15.920" video="mainVideo" id=subtitle]]
+[[!template text="a function called ee-insert-test-foo-mode" start="00:02:18.800" video="mainVideo" id=subtitle]]
+[[!template text="if that function exists," start="00:02:21.360" video="mainVideo" id=subtitle]]
+[[!template text="and that, if that function does not exist," start="00:02:24.800" video="mainVideo" id=subtitle]]
+[[!template text="then it yields an error." start="00:02:27.280" video="mainVideo" id=subtitle]]
+[[!template text="And here's an example" start="00:02:29.680" video="mainVideo" id=subtitle]]
+[[!template text="of one such function." start="00:02:31.120" video="mainVideo" id=subtitle]]
+[[!template text="That's a function that inserts" start="00:02:32.560" video="mainVideo" id=subtitle]]
+[[!template text="a test block in haskell-mode." start="00:02:34.800" video="mainVideo" id=subtitle]]
+[[!template text="Here we can see two functions like this:" start="00:02:37.280" video="mainVideo" id=subtitle]]
+[[!template text="one for haskell-mode and one for js-mode." start="00:02:40.959" video="mainVideo" id=subtitle]]
+[[!template text="These functions look quite similar," start="00:02:46.080" video="mainVideo" id=subtitle]]
+[[!template text="but their effects look quite different." start="00:02:48.560" video="mainVideo" id=subtitle]]
+[[!template text="To make this comparison here," start="00:02:52.720" video="mainVideo" id=subtitle]]
+[[!template text="I started by writing--" start="00:02:54.800" video="mainVideo" id=subtitle]]
+[[!template text="by creating seven files," start="00:02:57.280" video="mainVideo" id=subtitle]]
+[[!template text="each one in a different language." start="00:02:59.040" video="mainVideo" id=subtitle]]
+[[!template text="Initially, each one of these files" start="00:03:01.120" video="mainVideo" id=subtitle]]
+[[!template text="only had a comment" start="00:03:03.040" video="mainVideo" id=subtitle]]
+[[!template text="with the name of the language..." start="00:03:04.159" video="mainVideo" id=subtitle]]
+[[!template text="so: C, Haskell, Javascript, Org Mode, etc." start="00:03:06.403" video="mainVideo" id=subtitle]]
+[[!template text="In each one of these files," start="00:03:10.560" video="mainVideo" id=subtitle]]
+[[!template text="I typed M-x eeit to insert a test block." start="00:03:12.560" video="mainVideo" id=subtitle]]
+[[!template text="So here we can see that" start="00:03:16.959" video="mainVideo" id=subtitle]]
+[[!template text="these test blocks are different." start="00:03:18.319" video="mainVideo" id=subtitle]]
+[[!template text="For example, the syntax" start="00:03:20.319" video="mainVideo" id=subtitle]]
+[[!template text="for multi-line comments" start="00:03:21.440" video="mainVideo" id=subtitle]]
+[[!template text="is different depending on the language." start="00:03:22.560" video="mainVideo" id=subtitle]]
+[[!template text="This block here that selects" start="00:03:25.200" video="mainVideo" id=subtitle]]
+[[!template text="which REPL to run is also different," start="00:03:27.440" video="mainVideo" id=subtitle]]
+[[!template text="and this line here that tells the REPL" start="00:03:30.100" video="mainVideo" id=subtitle]]
+[[!template text="to load the current file" start="00:03:34.080" video="mainVideo" id=subtitle]]
+[[!template text="is also different," start="00:03:36.000" video="mainVideo" id=subtitle]]
+[[!template text="depending on the language." start="00:03:37.680" video="mainVideo" id=subtitle]]
+[[!template text="In some cases, I had to improvise a bit." start="00:03:39.680" video="mainVideo" id=subtitle]]
+[[!template text="For example, to implement test blocks" start="00:03:41.840" video="mainVideo" id=subtitle]]
+[[!template text="in shell mode, I had to use" start="00:03:45.360" video="mainVideo" id=subtitle]]
+[[!template text="this weird syntax using a here-document." start="00:03:48.560" video="mainVideo" id=subtitle]]
+[[!template text="In Tcl, I also had to improvise a bit," start="00:03:52.560" video="mainVideo" id=subtitle]]
+[[!template text="and in some cases," start="00:03:55.040" video="mainVideo" id=subtitle]]
+[[!template text="I had to improvise a lot." start="00:03:55.920" video="mainVideo" id=subtitle]]
+[[!template text="For example, in Org Mode," start="00:03:57.840" video="mainVideo" id=subtitle]]
+[[!template text="there isn't an obvious REPL to run," start="00:04:00.159" video="mainVideo" id=subtitle]]
+[[!template text="and there isn't an obvious way" start="00:04:02.400" video="mainVideo" id=subtitle]]
+[[!template text="to load the the current Org file" start="00:04:03.840" video="mainVideo" id=subtitle]]
+[[!template text="into the REPL, so the default action" start="00:04:06.480" video="mainVideo" id=subtitle]]
+[[!template text="of M-x eeit in Org Mode" start="00:04:09.360" video="mainVideo" id=subtitle]]
+[[!template text="is just to insert this thing here," start="00:04:12.560" video="mainVideo" id=subtitle]]
+[[!template text="that we can use to run a shell in a REPL." start="00:04:15.439" video="mainVideo" id=subtitle]]
+[[!template text="So these functions are quite similar." start="00:04:22.320" video="mainVideo" id=subtitle]]
+[[!template text="In the beginning," start="00:04:25.280" video="mainVideo" id=subtitle]]
+[[!template text="I was writing all of them by hand..." start="00:04:26.240" video="mainVideo" id=subtitle]]
+[[!template text="but then I got bored" start="00:04:27.919" video="mainVideo" id=subtitle]]
+[[!template text="and I wrote a function" start="00:04:29.120" video="mainVideo" id=subtitle]]
+[[!template text="to help me write functions like that." start="00:04:30.160" video="mainVideo" id=subtitle]]
+[[!template text="This function is called find-eeit-links," start="00:04:33.840" video="mainVideo" id=subtitle]]
+[[!template text="and it creates a temporary buffer," start="00:04:37.280" video="mainVideo" id=subtitle]]
+[[!template text="and the contents of this temporary buffer" start="00:04:39.919" video="mainVideo" id=subtitle]]
+[[!template text="depends on the major mode. For example," start="00:04:42.080" video="mainVideo" id=subtitle]]
+[[!template text="if the current mode is python-mode," start="00:04:44.320" video="mainVideo" id=subtitle]]
+[[!template text="then running this function here" start="00:04:45.680" video="mainVideo" id=subtitle]]
+[[!template text="creates a temporary buffer" start="00:04:48.880" video="mainVideo" id=subtitle]]
+[[!template text="that lets me write the support" start="00:04:50.160" video="mainVideo" id=subtitle]]
+[[!template text="for test blocks in python-mode," start="00:04:53.120" video="mainVideo" id=subtitle]]
+[[!template text="or rewrite the function" start="00:04:55.440" video="mainVideo" id=subtitle]]
+[[!template text="that supports test blocks" start="00:04:57.440" video="mainVideo" id=subtitle]]
+[[!template text="in python-mode." start="00:04:59.040" video="mainVideo" id=subtitle]]
+[[!template text="So if I'm in python-mode and I run this," start="00:05:00.880" video="mainVideo" id=subtitle]]
+[[!template text="I get a temporary buffer like this," start="00:05:03.600" video="mainVideo" id=subtitle]]
+[[!template text="in which this thing is my template" start="00:05:06.639" video="mainVideo" id=subtitle]]
+[[!template text="for the function. Usually, this string" start="00:05:08.639" video="mainVideo" id=subtitle]]
+[[!template text="is totally wrong," start="00:05:11.039" video="mainVideo" id=subtitle]]
+[[!template text="I have to rewrite this string," start="00:05:11.919" video="mainVideo" id=subtitle]]
+[[!template text="but the rest is right." start="00:05:13.919" video="mainVideo" id=subtitle]]
+[[!template text="You can see python-mode here" start="00:05:14.960" video="mainVideo" id=subtitle]]
+[[!template text="in the name of the function." start="00:05:16.960" video="mainVideo" id=subtitle]]
+[[!template text="So we have to edit this" start="00:05:18.479" video="mainVideo" id=subtitle]]
+[[!template text="and save that to our ~/.emacs." start="00:05:20.080" video="mainVideo" id=subtitle]]
+[[!template text="By the way, these things here" start="00:05:22.840" video="mainVideo" id=subtitle]]
+[[!template text="hyperlinks to many different things..." start="00:05:26.080" video="mainVideo" id=subtitle]]
+[[!template text="This Elisp hyperlink here" start="00:05:28.880" video="mainVideo" id=subtitle]]
+[[!template text="points to the source code," start="00:05:31.600" video="mainVideo" id=subtitle]]
+[[!template text="to the section in which these functions" start="00:05:32.880" video="mainVideo" id=subtitle]]
+[[!template text="are defined. So you can see this here," start="00:05:36.880" video="mainVideo" id=subtitle]]
+[[!template text="the function that supports C," start="00:05:39.919" video="mainVideo" id=subtitle]]
+[[!template text="the function for Haskell," start="00:05:41.759" video="mainVideo" id=subtitle]]
+[[!template text="the function for Javascript, etc..." start="00:05:42.800" video="mainVideo" id=subtitle]]
+[[!template text="and that's it!" start="00:05:46.400" video="mainVideo" id=subtitle]]
+[[!template text="This is a five-minute talk," start="00:05:47.520" video="mainVideo" id=subtitle]]
+[[!template text="so I can't say much..." start="00:05:49.440" video="mainVideo" id=subtitle]]
+[[!template text="If you want more information," start="00:05:50.960" video="mainVideo" id=subtitle]]
+[[!template text="or if you want to see real-world examples," start="00:05:52.320" video="mainVideo" id=subtitle]]
+[[!template text="how I use test blocks, etc. etc.," start="00:05:54.800" video="mainVideo" id=subtitle]]
+[[!template text="see this page here..." start="00:05:57.280" video="mainVideo" id=subtitle]]
+[[!template text="and I do not have time to explain this" start="00:05:58.639" video="mainVideo" id=subtitle]]
+[[!template text="&quot;By the way&quot; here." start="00:06:01.253" video="mainVideo" id=subtitle]]
+[[!template text="So that's it! Thanks! =)" start="00:06:02.560" video="mainVideo" id=subtitle]]
+[[!template text="captions by Eduardo Ochs" start="00:06:03.333" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/ui.md b/2021/captions/ui.md
new file mode 100644
index 00000000..c9991e91
--- /dev/null
+++ b/2021/captions/ui.md
@@ -0,0 +1,214 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template text="Hi! I'm Erik Anderson," start="00:00:07.600" video="mainVideo" id=subtitle]]
+[[!template text="and I'll be talking about tui," start="00:00:09.120" video="mainVideo" id=subtitle]]
+[[!template text="a user interface framework" start="00:00:10.559" video="mainVideo" id=subtitle]]
+[[!template text="that I've written in Emacs Lisp." start="00:00:11.840" video="mainVideo" id=subtitle]]
+[[!template text="First, I want to talk a bit about" start="00:00:15.040" video="mainVideo" id=subtitle]]
+[[!template text="the problem space of" start="00:00:16.196" video="mainVideo" id=subtitle]]
+[[!template text="user interface development," start="00:00:17.296" video="mainVideo" id=subtitle]]
+[[!template text="specifically, I want to quickly illustrate" start="00:00:18.728" video="mainVideo" id=subtitle]]
+[[!template text="some of the complexities involved" start="00:00:20.880" video="mainVideo" id=subtitle]]
+[[!template text="with UI implementation in Emacs." start="00:00:22.320" video="mainVideo" id=subtitle]]
+[[!template text="In Emacs, we have the ubiquitous" start="00:00:26.480" video="mainVideo" id=subtitle]]
+[[!template text="buffer object type that forms the container" start="00:00:27.920" video="mainVideo" id=subtitle]]
+[[!template text="for most content in Emacs." start="00:00:29.920" video="mainVideo" id=subtitle]]
+[[!template text="Most interfaces we interact with" start="00:00:31.920" video="mainVideo" id=subtitle]]
+[[!template text="consist of character based content" start="00:00:34.079" video="mainVideo" id=subtitle]]
+[[!template text="in a buffer that's presented" start="00:00:36.239" video="mainVideo" id=subtitle]]
+[[!template text="in a window in frame." start="00:00:38.239" video="mainVideo" id=subtitle]]
+[[!template text="Although the underlying content" start="00:00:40.079" video="mainVideo" id=subtitle]]
+[[!template text="may be textual, Emacs has capable APIs" start="00:00:41.520" video="mainVideo" id=subtitle]]
+[[!template text="to present rich content." start="00:00:44.320" video="mainVideo" id=subtitle]]
+[[!template text="The pervasiveness of buffers" start="00:00:47.680" video="mainVideo" id=subtitle]]
+[[!template text="affords us wonderful flexibility." start="00:00:49.200" video="mainVideo" id=subtitle]]
+[[!template text="This presentation, for instance," start="00:00:50.879" video="mainVideo" id=subtitle]]
+[[!template text="is running in an Emacs buffer." start="00:00:52.559" video="mainVideo" id=subtitle]]
+[[!template text="Using Emacs's built-in basic" start="00:00:55.520" video="mainVideo" id=subtitle]]
+[[!template text="button library, we can insert" start="00:00:57.420" video="mainVideo" id=subtitle]]
+[[!template text="an interactive button" start="00:00:59.199" video="mainVideo" id=subtitle]]
+[[!template text="that shows a message" start="00:01:00.884" video="mainVideo" id=subtitle]]
+[[!template text="in the minibuffer when clicked." start="00:01:01.760" video="mainVideo" id=subtitle]]
+[[!template text="What about UIs that express application state?" start="00:01:06.080" video="mainVideo" id=subtitle]]
+[[!template text="Most applications don't have a static UI." start="00:01:09.200" video="mainVideo" id=subtitle]]
+[[!template text="As application state changes," start="00:01:11.439" video="mainVideo" id=subtitle]]
+[[!template text="the UI should change" start="00:01:13.280" video="mainVideo" id=subtitle]]
+[[!template text="to display the desired content." start="00:01:14.320" video="mainVideo" id=subtitle]]
+[[!template text="One simplifying strategy is to simply" start="00:01:18.479" video="mainVideo" id=subtitle]]
+[[!template text="re-render the entire UI upon any change." start="00:01:20.320" video="mainVideo" id=subtitle]]
+[[!template text="First erase the contents of the buffer," start="00:01:23.600" video="mainVideo" id=subtitle]]
+[[!template text="and then reinsert your UI again" start="00:01:25.680" video="mainVideo" id=subtitle]]
+[[!template text="with desired changes," start="00:01:27.600" video="mainVideo" id=subtitle]]
+[[!template text="and restore things like point and region." start="00:01:29.040" video="mainVideo" id=subtitle]]
+[[!template text="Basic composition is possible" start="00:01:33.040" video="mainVideo" id=subtitle]]
+[[!template text="with this approach." start="00:01:34.560" video="mainVideo" id=subtitle]]
+[[!template text="Simply insert the elements" start="00:01:35.759" video="mainVideo" id=subtitle]]
+[[!template text="of the UI in sequence." start="00:01:37.200" video="mainVideo" id=subtitle]]
+[[!template text="Complex elements can be" start="00:01:39.280" video="mainVideo" id=subtitle]]
+[[!template text="composed of multiple sub-elements." start="00:01:40.640" video="mainVideo" id=subtitle]]
+[[!template text="UIs can be made extensible," start="00:01:44.320" video="mainVideo" id=subtitle]]
+[[!template text="and expose this composition," start="00:01:45.840" video="mainVideo" id=subtitle]]
+[[!template text="for example, with insertion hooks" start="00:01:47.040" video="mainVideo" id=subtitle]]
+[[!template text="like magit's status sections hook." start="00:01:49.360" video="mainVideo" id=subtitle]]
+[[!template text="This generally relies on elements" start="00:01:52.320" video="mainVideo" id=subtitle]]
+[[!template text="being well-behaved inserting themselves," start="00:01:54.159" video="mainVideo" id=subtitle]]
+[[!template text="not affecting the rest of the buffer." start="00:01:56.640" video="mainVideo" id=subtitle]]
+[[!template text="If we find ourselves with complex UIs," start="00:02:00.399" video="mainVideo" id=subtitle]]
+[[!template text="large buffers, long lines," start="00:02:02.960" video="mainVideo" id=subtitle]]
+[[!template text="or poor rendering performance," start="00:02:04.640" video="mainVideo" id=subtitle]]
+[[!template text="we might consider partial UI updates" start="00:02:06.320" video="mainVideo" id=subtitle]]
+[[!template text="rather than re-rendering completely." start="00:02:09.039" video="mainVideo" id=subtitle]]
+[[!template text="In that case, the complexity" start="00:02:11.360" video="mainVideo" id=subtitle]]
+[[!template text="for maintaining the UI quickly increases." start="00:02:12.800" video="mainVideo" id=subtitle]]
+[[!template text="As accessible as buffers are," start="00:02:15.840" video="mainVideo" id=subtitle]]
+[[!template text="we don't have high level abstractions" start="00:02:17.360" video="mainVideo" id=subtitle]]
+[[!template text="for managing portions of a UI" start="00:02:19.120" video="mainVideo" id=subtitle]]
+[[!template text="rendered to a buffer." start="00:02:20.879" video="mainVideo" id=subtitle]]
+[[!template text="(It) is left up to the programmers" start="00:02:22.160" video="mainVideo" id=subtitle]]
+[[!template text="to track and update UI state." start="00:02:23.520" video="mainVideo" id=subtitle]]
+[[!template text="This is generally done by" start="00:02:25.440" video="mainVideo" id=subtitle]]
+[[!template text="one of two methods, reflection," start="00:02:26.540" video="mainVideo" id=subtitle]]
+[[!template text="searching for strings or text properties" start="00:02:28.959" video="mainVideo" id=subtitle]]
+[[!template text="within the buffer, or tracking segments" start="00:02:30.800" video="mainVideo" id=subtitle]]
+[[!template text="of a UI buffer manually" start="00:02:34.239" video="mainVideo" id=subtitle]]
+[[!template text="using numeric offsets, or marker," start="00:02:36.080" video="mainVideo" id=subtitle]]
+[[!template text="or overlay objects." start="00:02:38.959" video="mainVideo" id=subtitle]]
+[[!template text="Here we have a basic timer component" start="00:02:45.280" video="mainVideo" id=subtitle]]
+[[!template text="that shows elapsed time" start="00:02:47.280" video="mainVideo" id=subtitle]]
+[[!template text="after it's inserted." start="00:02:48.720" video="mainVideo" id=subtitle]]
+[[!template text="It works, but has several problems." start="00:02:50.319" video="mainVideo" id=subtitle]]
+[[!template text="It doesn't restore the user's point or mark," start="00:02:52.160" video="mainVideo" id=subtitle]]
+[[!template text="so it snaps back after every render," start="00:02:55.519" video="mainVideo" id=subtitle]]
+[[!template text="after every update." start="00:02:59.120" video="mainVideo" id=subtitle]]
+[[!template text="It relies on singleton global state," start="00:03:01.040" video="mainVideo" id=subtitle]]
+[[!template text="so isn't designed to coexist" start="00:03:03.360" video="mainVideo" id=subtitle]]
+[[!template text="with other instances of itself." start="00:03:05.124" video="mainVideo" id=subtitle]]
+[[!template text="It doesn't use a marker," start="00:03:12.000" video="mainVideo" id=subtitle]]
+[[!template text="so it's sensitive to content" start="00:03:13.200" video="mainVideo" id=subtitle]]
+[[!template text="proceeding it, that's following it," start="00:03:14.640" video="mainVideo" id=subtitle]]
+[[!template text="changing in the buffer." start="00:03:16.239" video="mainVideo" id=subtitle]]
+[[!template text="The update logic doesn't even consider" start="00:03:23.519" video="mainVideo" id=subtitle]]
+[[!template text="which buffer it's trying to update." start="00:03:25.120" video="mainVideo" id=subtitle]]
+[[!template text="If I switch buffers," start="00:03:26.799" video="mainVideo" id=subtitle]]
+[[!template text="it will insert into another buffer," start="00:03:27.840" video="mainVideo" id=subtitle]]
+[[!template text="or even the minibuffer." start="00:03:29.360" video="mainVideo" id=subtitle]]
+[[!template text="It can't remove itself, or re-render" start="00:03:31.519" video="mainVideo" id=subtitle]]
+[[!template text="if it gets corrupted, as you see." start="00:03:33.360" video="mainVideo" id=subtitle]]
+[[!template text="All in all, it's not" start="00:03:34.879" video="mainVideo" id=subtitle]]
+[[!template text="a readily composable component." start="00:03:35.920" video="mainVideo" id=subtitle]]
+[[!template text="Addressing these components" start="00:03:38.400" video="mainVideo" id=subtitle]]
+[[!template text="within this logic further increases" start="00:03:39.519" video="mainVideo" id=subtitle]]
+[[!template text="the implementation complexity" start="00:03:41.920" video="mainVideo" id=subtitle]]
+[[!template text="of this component," start="00:03:43.936" video="mainVideo" id=subtitle]]
+[[!template text="and still this component" start="00:03:45.680" video="mainVideo" id=subtitle]]
+[[!template text="would likely have" start="00:03:46.640" video="mainVideo" id=subtitle]]
+[[!template text="various subtle differences" start="00:03:47.280" video="mainVideo" id=subtitle]]
+[[!template text="with other components" start="00:03:49.120" video="mainVideo" id=subtitle]]
+[[!template text="implemented by other authors." start="00:03:52.480" video="mainVideo" id=subtitle]]
+[[!template text="For those of you unfamiliar" start="00:03:58.959" video="mainVideo" id=subtitle]]
+[[!template text="with this term Yak Shaving," start="00:04:00.319" video="mainVideo" id=subtitle]]
+[[!template text="that is a quite technical term" start="00:04:02.159" video="mainVideo" id=subtitle]]
+[[!template text="for any seemingly pointless activity," start="00:04:04.080" video="mainVideo" id=subtitle]]
+[[!template text="which is actually necessary" start="00:04:07.599" video="mainVideo" id=subtitle]]
+[[!template text="to solve a problem," start="00:04:09.680" video="mainVideo" id=subtitle]]
+[[!template text="which solves a problem," start="00:04:10.879" video="mainVideo" id=subtitle]]
+[[!template text="which, several levels of recursion later," start="00:04:11.920" video="mainVideo" id=subtitle]]
+[[!template text="solves the real problem you're working on." start="00:04:14.799" video="mainVideo" id=subtitle]]
+[[!template text="The itch that led to this project" start="00:04:18.239" video="mainVideo" id=subtitle]]
+[[!template text="was the desire to display a dense summary" start="00:04:19.943" video="mainVideo" id=subtitle]]
+[[!template text="of local Git repository statuses." start="00:04:21.840" video="mainVideo" id=subtitle]]
+[[!template text="Encountering various implementation" start="00:04:24.400" video="mainVideo" id=subtitle]]
+[[!template text="complexity for building UI elements," start="00:04:26.560" video="mainVideo" id=subtitle]]
+[[!template text="it led to the yak shaving endeavor" start="00:04:30.080" video="mainVideo" id=subtitle]]
+[[!template text="that produced tui." start="00:04:31.680" video="mainVideo" id=subtitle]]
+[[!template text="When I wrote the library," start="00:04:33.680" video="mainVideo" id=subtitle]]
+[[!template text="I had recently played with" start="00:04:35.440" video="mainVideo" id=subtitle]]
+[[!template text="a popular UI framework called React," start="00:04:36.479" video="mainVideo" id=subtitle]]
+[[!template text="and had an interest in learning" start="00:04:39.360" video="mainVideo" id=subtitle]]
+[[!template text="about the internal architecture of React." start="00:04:41.840" video="mainVideo" id=subtitle]]
+[[!template text="So, rather than implement" start="00:04:44.080" video="mainVideo" id=subtitle]]
+[[!template text="a string caching layer" start="00:04:45.680" video="mainVideo" id=subtitle]]
+[[!template text="on top of tabulated list mode," start="00:04:46.960" video="mainVideo" id=subtitle]]
+[[!template text="I was rather inclined" start="00:04:49.280" video="mainVideo" id=subtitle]]
+[[!template text="to go down the path of implementing" start="00:04:50.360" video="mainVideo" id=subtitle]]
+[[!template text="the React API for Emacs Lisp." start="00:04:52.400" video="mainVideo" id=subtitle]]
+[[!template text="I'll offer a brief view of" start="00:04:58.960" video="mainVideo" id=subtitle]]
+[[!template text="the tui Emacs Lisp API." start="00:05:00.896" video="mainVideo" id=subtitle]]
+[[!template text="Inserting component content" start="00:05:05.120" video="mainVideo" id=subtitle]]
+[[!template text="is pretty straightforward." start="00:05:07.360" video="mainVideo" id=subtitle]]
+[[!template text="You take a component tree" start="00:05:08.320" video="mainVideo" id=subtitle]]
+[[!template text="and render it in an Emacs buffer." start="00:05:10.160" video="mainVideo" id=subtitle]]
+[[!template text="If any elements in that tree are updated," start="00:05:16.240" video="mainVideo" id=subtitle]]
+[[!template text="their respective content on the tree" start="00:05:18.639" video="mainVideo" id=subtitle]]
+[[!template text="is updated automatically." start="00:05:21.039" video="mainVideo" id=subtitle]]
+[[!template text="Here's a basic re-implementation" start="00:05:26.320" video="mainVideo" id=subtitle]]
+[[!template text="of the straw man timer from earlier," start="00:05:27.919" video="mainVideo" id=subtitle]]
+[[!template text="using a macro for syntactic trigger." start="00:05:29.919" video="mainVideo" id=subtitle]]
+[[!template text="You'll notice that" start="00:05:32.400" video="mainVideo" id=subtitle]]
+[[!template text="the signature includes its own" start="00:05:34.404" video="mainVideo" id=subtitle]]
+[[!template text="object reference, arguments, and state." start="00:05:36.164" video="mainVideo" id=subtitle]]
+[[!template text="Associating arguments in the state" start="00:05:44.560" video="mainVideo" id=subtitle]]
+[[!template text="with a component instance out of the box," start="00:05:46.400" video="mainVideo" id=subtitle]]
+[[!template text="makes it easy to design reusable components," start="00:05:51.360" video="mainVideo" id=subtitle]]
+[[!template text="and forms the basis for partial UI updates." start="00:05:54.400" video="mainVideo" id=subtitle]]
+[[!template text="The component rendering anchors" start="00:06:06.080" video="mainVideo" id=subtitle]]
+[[!template text="are durable, so content can be" start="00:06:07.840" video="mainVideo" id=subtitle]]
+[[!template text="added and removed surrounding content," start="00:06:09.199" video="mainVideo" id=subtitle]]
+[[!template text="or even within the region" start="00:06:11.360" video="mainVideo" id=subtitle]]
+[[!template text="of the component," start="00:06:12.479" video="mainVideo" id=subtitle]]
+[[!template text="and replaced when it re-renders." start="00:06:13.280" video="mainVideo" id=subtitle]]
+[[!template text="Components will also" start="00:06:16.319" video="mainVideo" id=subtitle]]
+[[!template text="cleanly remove themselves from a buffer" start="00:06:17.600" video="mainVideo" id=subtitle]]
+[[!template text="when instructed to." start="00:06:20.880" video="mainVideo" id=subtitle]]
+[[!template text="tui contains the core implementation" start="00:06:28.400" video="mainVideo" id=subtitle]]
+[[!template text="of the React API, so components," start="00:06:30.160" video="mainVideo" id=subtitle]]
+[[!template text="their constituent props, state," start="00:06:33.440" video="mainVideo" id=subtitle]]
+[[!template text="and all of the lifecycle methods" start="00:06:35.840" video="mainVideo" id=subtitle]]
+[[!template text="associated with them," start="00:06:38.000" video="mainVideo" id=subtitle]]
+[[!template text="as well as keys, refs," start="00:06:39.440" video="mainVideo" id=subtitle]]
+[[!template text="and the fundamental" start="00:06:41.120" video="mainVideo" id=subtitle]]
+[[!template text="reconciliation algorithm of React." start="00:06:43.228" video="mainVideo" id=subtitle]]
+[[!template text="A variety of other React APIs" start="00:06:47.520" video="mainVideo" id=subtitle]]
+[[!template text="that haven't been implemented yet." start="00:06:52.188" video="mainVideo" id=subtitle]]
+[[!template text="It contains some useful features so far," start="00:06:58.080" video="mainVideo" id=subtitle]]
+[[!template text="such as hot reloading, reflection," start="00:07:00.080" video="mainVideo" id=subtitle]]
+[[!template text="and various debugging tools," start="00:07:02.639" video="mainVideo" id=subtitle]]
+[[!template text="and some reconciliation logging." start="00:07:06.164" video="mainVideo" id=subtitle]]
+[[!template text="Lastly, I'd like to give you some quick" start="00:07:12.639" video="mainVideo" id=subtitle]]
+[[!template text="visual taste of components built with tui." start="00:07:14.880" video="mainVideo" id=subtitle]]
+[[!template text="The grid view that motivated" start="00:07:19.039" video="mainVideo" id=subtitle]]
+[[!template text="my development of this package" start="00:07:20.240" video="mainVideo" id=subtitle]]
+[[!template text="is very similar to Magit's" start="00:07:21.520" video="mainVideo" id=subtitle]]
+[[!template text="list repositories functionality." start="00:07:23.039" video="mainVideo" id=subtitle]]
+[[!template text="Essentially, tabulated list mode" start="00:07:30.720" video="mainVideo" id=subtitle]]
+[[!template text="but portable and has a separated model" start="00:07:36.080" video="mainVideo" id=subtitle]]
+[[!template text="and presentation layers." start="00:07:39.440" video="mainVideo" id=subtitle]]
+[[!template text="Here's a basic xkcd comic viewer" start="00:07:49.360" video="mainVideo" id=subtitle]]
+[[!template text="showing a couple classics." start="00:07:51.840" video="mainVideo" id=subtitle]]
+[[!template text="A long-standing React tutorial is" start="00:08:07.360" video="mainVideo" id=subtitle]]
+[[!template text="building a tic-tac-toe game" start="00:08:10.080" video="mainVideo" id=subtitle]]
+[[!template text="as a bit of a gimmick," start="00:08:13.280" video="mainVideo" id=subtitle]]
+[[!template text="and I'm not quite satisfied with" start="00:08:14.879" video="mainVideo" id=subtitle]]
+[[!template text="the buffering direction," start="00:08:17.039" video="mainVideo" id=subtitle]]
+[[!template text="but it got me thinking about" start="00:08:25.599" video="mainVideo" id=subtitle]]
+[[!template text="layout engines with text," start="00:08:27.120" video="mainVideo" id=subtitle]]
+[[!template text="so it was interesting." start="00:08:28.639" video="mainVideo" id=subtitle]]
+[[!template text="And here's a small" start="00:08:35.120" video="mainVideo" id=subtitle]]
+[[!template text="Unicode character viewer" start="00:08:38.560" video="mainVideo" id=subtitle]]
+[[!template text="capable of showing a bunch of characters." start="00:08:46.080" video="mainVideo" id=subtitle]]
+[[!template text="If this piques your interest," start="00:08:55.279" video="mainVideo" id=subtitle]]
+[[!template text="I would encourage you to check it out." start="00:08:57.279" video="mainVideo" id=subtitle]]
+[[!template text="tui should be usable by anyone" start="00:08:59.200" video="mainVideo" id=subtitle]]
+[[!template text="with some basic Elisp familiarity," start="00:09:01.440" video="mainVideo" id=subtitle]]
+[[!template text="no prior knowledge about JavaScript" start="00:09:04.640" video="mainVideo" id=subtitle]]
+[[!template text="or React is necessary." start="00:09:09.680" video="mainVideo" id=subtitle]]
+[[!template text="I'd absolutely love to talk with people" start="00:09:12.080" video="mainVideo" id=subtitle]]
+[[!template text="about the tui package," start="00:09:13.732" video="mainVideo" id=subtitle]]
+[[!template text="textual user interfaces in general," start="00:09:14.880" video="mainVideo" id=subtitle]]
+[[!template text="and really anything in Emacs." start="00:09:17.440" video="mainVideo" id=subtitle]]
+[[!template text="If you have any ideas, feedback," start="00:09:19.040" video="mainVideo" id=subtitle]]
+[[!template text="or want to contribute," start="00:09:20.693" video="mainVideo" id=subtitle]]
+[[!template text="please reach out." start="00:09:21.680" video="mainVideo" id=subtitle]]
+[[!template text="Thank you all for listening." start="00:09:23.360" video="mainVideo" id=subtitle]]
+[[!template text="captions by bhavin192 (Bhavin Gandhi)" start="00:09:24.360" video="mainVideo" id=subtitle]]
diff --git a/2021/captions/unix.md b/2021/captions/unix.md
new file mode 100644
index 00000000..834b2047
--- /dev/null
+++ b/2021/captions/unix.md
@@ -0,0 +1,258 @@
+<a name="transcript"></a>
+# Transcript
+
+[[!template new="1" text="Hello!" start="00:00:00.080" video="mainVideo" id=subtitle]]
+[[!template text="My name is Daniel or Daniil Rose." start="00:00:01.199" video="mainVideo" id=subtitle]]
+[[!template text="I use Emacs in my everyday life," start="00:00:04.000" video="mainVideo" id=subtitle]]
+[[!template text="from programming in C or Rust for work," start="00:00:05.680" video="mainVideo" id=subtitle]]
+[[!template text="to writing reports for classes." start="00:00:08.320" video="mainVideo" id=subtitle]]
+[[!template text="I'd like to start by adding" start="00:00:11.120" video="mainVideo" id=subtitle]]
+[[!template text="an overarching theme to this talk." start="00:00:12.389" video="mainVideo" id=subtitle]]
+[[!template text="If there's only one thing" start="00:00:14.719" video="mainVideo" id=subtitle]]
+[[!template text="that you remember from today," start="00:00:15.603" video="mainVideo" id=subtitle]]
+[[!template text="I'd like you to walk away" start="00:00:16.670" video="mainVideo" id=subtitle]]
+[[!template text="with the understanding" start="00:00:17.886" video="mainVideo" id=subtitle]]
+[[!template text="that the philosophies or ideologies" start="00:00:18.550" video="mainVideo" id=subtitle]]
+[[!template text="are just that." start="00:00:20.720" video="mainVideo" id=subtitle]]
+[[!template text="By trying to box yourself in with a concept" start="00:00:21.280" video="mainVideo" id=subtitle]]
+[[!template text="you might be blind to other methods." start="00:00:24.400" video="mainVideo" id=subtitle]]
+[[!template text="We live in an ever-changing world," start="00:00:25.440" video="mainVideo" id=subtitle]]
+[[!template text="and I hope that you can appreciate" start="00:00:27.360" video="mainVideo" id=subtitle]]
+[[!template text="being flexible and adaptable." start="00:00:28.880" video="mainVideo" id=subtitle]]
+[[!template new="1" text="UNIX philosophy? As a quick intro" start="00:00:31.599" video="mainVideo" id=subtitle]]
+[[!template text="for those who don't know," start="00:00:33.280" video="mainVideo" id=subtitle]]
+[[!template text="the UNIX philosophy" start="00:00:34.720" video="mainVideo" id=subtitle]]
+[[!template text="was written by Doug McIlroy." start="00:00:35.680" video="mainVideo" id=subtitle]]
+[[!template text="It's wordy, so there is" start="00:00:37.920" video="mainVideo" id=subtitle]]
+[[!template text="a great summarization" start="00:00:39.136" video="mainVideo" id=subtitle]]
+[[!template text="by Peter H. Salus:" start="00:00:40.000" video="mainVideo" id=subtitle]]
+[[!template text="Write programs that do one thing" start="00:00:42.719" video="mainVideo" id=subtitle]]
+[[!template text="and do it well." start="00:00:43.920" video="mainVideo" id=subtitle]]
+[[!template text="Write programs to work together," start="00:00:46.879" video="mainVideo" id=subtitle]]
+[[!template text="and write programs to handle text streams," start="00:00:50.000" video="mainVideo" id=subtitle]]
+[[!template text="because they are the universal interface." start="00:00:52.750" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So enter Emacs." start="00:00:57.600" video="mainVideo" id=subtitle]]
+[[!template text="Emacs doesn't quite adhere" start="00:00:59.233" video="mainVideo" id=subtitle]]
+[[!template text="to those principles." start="00:01:01.020" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Do one thing and do it well&quot;" start="00:01:01.983" video="mainVideo" id=subtitle]]
+[[!template text="surely doesn't apply," start="00:01:03.680" video="mainVideo" id=subtitle]]
+[[!template text="since Emacs does /a lot/ of things" start="00:01:04.640" video="mainVideo" id=subtitle]]
+[[!template text="and does the majority of those things well." start="00:01:06.261" video="mainVideo" id=subtitle]]
+[[!template text="It might apply if you consider Emacs" start="00:01:08.640" video="mainVideo" id=subtitle]]
+[[!template text="purely as a Lisp environment, however." start="00:01:10.240" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Write programs to work together?&quot;" start="00:01:12.560" video="mainVideo" id=subtitle]]
+[[!template text="Arguably the thing Emacs is best" start="00:01:14.141" video="mainVideo" id=subtitle]]
+[[!template text="out of the three," start="00:01:15.767" video="mainVideo" id=subtitle]]
+[[!template text="proven especially" start="00:01:16.320" video="mainVideo" id=subtitle]]
+[[!template text="by all the various packages" start="00:01:17.370" video="mainVideo" id=subtitle]]
+[[!template text="that work with external programs," start="00:01:18.619" video="mainVideo" id=subtitle]]
+[[!template text="LSP, and whatever else." start="00:01:20.240" video="mainVideo" id=subtitle]]
+[[!template text="&quot;Handle text streams?&quot;" start="00:01:22.560" video="mainVideo" id=subtitle]]
+[[!template text="Well, that one depends." start="00:01:23.703" video="mainVideo" id=subtitle]]
+[[!template new="1" text="So, Emacs versus the original ideas." start="00:01:25.439" video="mainVideo" id=subtitle]]
+[[!template text="The summarizations are good," start="00:01:27.583" video="mainVideo" id=subtitle]]
+[[!template text="but they aren't truly what was said." start="00:01:29.317" video="mainVideo" id=subtitle]]
+[[!template text="If we look back at the originals," start="00:01:31.067" video="mainVideo" id=subtitle]]
+[[!template text="we'll see that Emacs strongly adheres" start="00:01:32.800" video="mainVideo" id=subtitle]]
+[[!template text="to the second rule:" start="00:01:34.517" video="mainVideo" id=subtitle]]
+[[!template text="Design and build software," start="00:01:35.759" video="mainVideo" id=subtitle]]
+[[!template text="even operating systems," start="00:01:37.267" video="mainVideo" id=subtitle]]
+[[!template text="to be tried early," start="00:01:38.433" video="mainVideo" id=subtitle]]
+[[!template text="ideally within weeks." start="00:01:39.233" video="mainVideo" id=subtitle]]
+[[!template text="Don't hesitate to throw away" start="00:01:40.633" video="mainVideo" id=subtitle]]
+[[!template text="the clumsy parts" start="00:01:41.479" video="mainVideo" id=subtitle]]
+[[!template text="and rebuild them." start="00:01:42.367" video="mainVideo" id=subtitle]]
+[[!template text="The concept of LISP," start="00:01:43.600" video="mainVideo" id=subtitle]]
+[[!template text="self documentation of Emacs," start="00:01:45.003" video="mainVideo" id=subtitle]]
+[[!template text="and the &quot;REPL&quot; style all make it" start="00:01:46.933" video="mainVideo" id=subtitle]]
+[[!template text="a shining example of this rule." start="00:01:48.159" video="mainVideo" id=subtitle]]
+[[!template new="1" text="But why compare to UNIX?" start="00:01:50.799" video="mainVideo" id=subtitle]]
+[[!template text="Truly, why compare to the UNIX philosophy?" start="00:01:52.880" video="mainVideo" id=subtitle]]
+[[!template text="Although the &quot;rules&quot; set down are good ones" start="00:01:55.520" video="mainVideo" id=subtitle]]
+[[!template text="for most programs," start="00:01:57.360" video="mainVideo" id=subtitle]]
+[[!template text="Emacs isn't most programs." start="00:01:58.467" video="mainVideo" id=subtitle]]
+[[!template text="The rules and summarizations" start="00:02:00.000" video="mainVideo" id=subtitle]]
+[[!template text="even were written decades ago," start="00:02:01.920" video="mainVideo" id=subtitle]]
+[[!template text="before we had REST APIs, JSON," start="00:02:03.532" video="mainVideo" id=subtitle]]
+[[!template text="or any other modern interface." start="00:02:05.717" video="mainVideo" id=subtitle]]
+[[!template text="If the world adapts," start="00:02:07.150" video="mainVideo" id=subtitle]]
+[[!template text="why too can't we adapt the past?" start="00:02:08.467" video="mainVideo" id=subtitle]]
+[[!template text="This concept of breaking the rules" start="00:02:10.640" video="mainVideo" id=subtitle]]
+[[!template text="and forging its own path" start="00:02:11.966" video="mainVideo" id=subtitle]]
+[[!template text="has allowed Emacs to continue" start="00:02:13.250" video="mainVideo" id=subtitle]]
+[[!template text="and be reworked for modern eras." start="00:02:14.467" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Emacs /does/ work with the UNIX philosophy." start="00:02:17.440" video="mainVideo" id=subtitle]]
+[[!template text="By looking at both of these ideologies," start="00:02:20.480" video="mainVideo" id=subtitle]]
+[[!template text="why must they be mutually exclusive?" start="00:02:22.239" video="mainVideo" id=subtitle]]
+[[!template text="Emacs does work with text:" start="00:02:24.319" video="mainVideo" id=subtitle]]
+[[!template text="Magit is a wrapper for the git CLI" start="00:02:26.239" video="mainVideo" id=subtitle]]
+[[!template text="Dired is a wrapper for ls," start="00:02:28.800" video="mainVideo" id=subtitle]]
+[[!template text="Consult grep for grep, and so on." start="00:02:30.733" video="mainVideo" id=subtitle]]
+[[!template text="Why rewrite poorly tools," start="00:02:32.450" video="mainVideo" id=subtitle]]
+[[!template text="when we can use the existing powerful ones?" start="00:02:34.867" video="mainVideo" id=subtitle]]
+[[!template text="Well, that in itself" start="00:02:37.200" video="mainVideo" id=subtitle]]
+[[!template text="is part of the UNIX philosophy." start="00:02:38.253" video="mainVideo" id=subtitle]]
+[[!template text="It seems that most strongly" start="00:02:39.242" video="mainVideo" id=subtitle]]
+[[!template text="the UNIX philosophy" start="00:02:40.567" video="mainVideo" id=subtitle]]
+[[!template text="applies to the command line." start="00:02:41.453" video="mainVideo" id=subtitle]]
+[[!template text="If we look at most graphical applications," start="00:02:42.319" video="mainVideo" id=subtitle]]
+[[!template text="these notions fall apart." start="00:02:44.183" video="mainVideo" id=subtitle]]
+[[!template text="But that isn't true for Emacs." start="00:02:45.550" video="mainVideo" id=subtitle]]
+[[!template text="It is a graphical application" start="00:02:47.133" video="mainVideo" id=subtitle]]
+[[!template text="(at least for me)" start="00:02:49.000" video="mainVideo" id=subtitle]]
+[[!template text="but it does use many other tools." start="00:02:49.817" video="mainVideo" id=subtitle]]
+[[!template text="Some have proposed" start="00:02:51.133" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs should be looked at" start="00:02:52.283" video="mainVideo" id=subtitle]]
+[[!template text="alongside UNIX, as its own OS." start="00:02:53.367" video="mainVideo" id=subtitle]]
+[[!template text="It has windowing capabilities" start="00:02:55.350" video="mainVideo" id=subtitle]]
+[[!template text="handles its own formats," start="00:02:56.567" video="mainVideo" id=subtitle]]
+[[!template text="and so on, but I disagree with this concept." start="00:02:57.567" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Philosophies don't really matter" start="00:02:59.650" video="mainVideo" id=subtitle]]
+[[!template text="in computing." start="00:03:02.103" video="mainVideo" id=subtitle]]
+[[!template text="It's true, they don't." start="00:03:03.050" video="mainVideo" id=subtitle]]
+[[!template text="As people, we like to group things." start="00:03:03.967" video="mainVideo" id=subtitle]]
+[[!template text="We like to have our set ways" start="00:03:05.683" video="mainVideo" id=subtitle]]
+[[!template text="to describe them," start="00:03:06.603" video="mainVideo" id=subtitle]]
+[[!template text="but that doesn't always work." start="00:03:07.267" video="mainVideo" id=subtitle]]
+[[!template text="By sticking with a common concept" start="00:03:08.300" video="mainVideo" id=subtitle]]
+[[!template text="in the Emacs community," start="00:03:10.017" video="mainVideo" id=subtitle]]
+[[!template text="do everything in Emacs," start="00:03:11.033" video="mainVideo" id=subtitle]]
+[[!template text="is it truly benefitting me and you?" start="00:03:13.117" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Android Studio. Here's an example." start="00:03:15.050" video="mainVideo" id=subtitle]]
+[[!template text="I work most often in Emacs." start="00:03:18.017" video="mainVideo" id=subtitle]]
+[[!template text="But I also have courses" start="00:03:20.083" video="mainVideo" id=subtitle]]
+[[!template text="in Android and iOS development." start="00:03:21.067" video="mainVideo" id=subtitle]]
+[[!template text="I can absolutely install" start="00:03:22.567" video="mainVideo" id=subtitle]]
+[[!template text="~android-mode~ and ~kotlin-mode~," start="00:03:24.367" video="mainVideo" id=subtitle]]
+[[!template text="and use ~adb~ in Emacs," start="00:03:25.317" video="mainVideo" id=subtitle]]
+[[!template text="but at that point," start="00:03:26.517" video="mainVideo" id=subtitle]]
+[[!template text="I am creating more work than it's worth." start="00:03:27.800" video="mainVideo" id=subtitle]]
+[[!template text="When unmaintained," start="00:03:29.050" video="mainVideo" id=subtitle]]
+[[!template text="things tend to fall apart," start="00:03:30.300" video="mainVideo" id=subtitle]]
+[[!template text="and many features of ~android-mode~" start="00:03:31.333" video="mainVideo" id=subtitle]]
+[[!template text="no longer work for me." start="00:03:33.100" video="mainVideo" id=subtitle]]
+[[!template text="So I have two main options:" start="00:03:33.967" video="mainVideo" id=subtitle]]
+[[!template text="fix the existing mode or write my own," start="00:03:35.817" video="mainVideo" id=subtitle]]
+[[!template text="or use the assumed tools for the job," start="00:03:37.500" video="mainVideo" id=subtitle]]
+[[!template text="like Android Studio and/or IntelliJ." start="00:03:39.683" video="mainVideo" id=subtitle]]
+[[!template text="Looking at Android Studio:" start="00:03:41.517" video="mainVideo" id=subtitle]]
+[[!template text="I have plenty of plugins for colour themes," start="00:03:43.017" video="mainVideo" id=subtitle]]
+[[!template text="just like Emacs." start="00:03:45.083" video="mainVideo" id=subtitle]]
+[[!template text="I have Emacs keybindings built in," start="00:03:45.733" video="mainVideo" id=subtitle]]
+[[!template text="and other quality-of-life features." start="00:03:47.300" video="mainVideo" id=subtitle]]
+[[!template text="According to the UNIX philosophy," start="00:03:48.800" video="mainVideo" id=subtitle]]
+[[!template text="in a round-about way," start="00:03:50.833" video="mainVideo" id=subtitle]]
+[[!template text="I should be using one tool" start="00:03:51.933" video="mainVideo" id=subtitle]]
+[[!template text="that does its job well." start="00:03:53.367" video="mainVideo" id=subtitle]]
+[[!template text="While not minimal," start="00:03:54.683" video="mainVideo" id=subtitle]]
+[[!template text="Android Studio accomplishes this job." start="00:03:55.500" video="mainVideo" id=subtitle]]
+[[!template text="Does that mean that I shouldn't use Emacs at all?" start="00:03:57.650" video="mainVideo" id=subtitle]]
+[[!template text="Of course not!" start="00:03:59.733" video="mainVideo" id=subtitle]]
+[[!template text="And while it may seem obvious," start="00:04:00.300" video="mainVideo" id=subtitle]]
+[[!template text="I feel we in this group" start="00:04:01.700" video="mainVideo" id=subtitle]]
+[[!template text="often get caught up" start="00:04:03.050" video="mainVideo" id=subtitle]]
+[[!template text="finding solutions" start="00:04:03.867" video="mainVideo" id=subtitle]]
+[[!template text="in the one particular way" start="00:04:04.533" video="mainVideo" id=subtitle]]
+[[!template text="we want it." start="00:04:05.983" video="mainVideo" id=subtitle]]
+[[!template text="This is where being adaptable" start="00:04:06.783" video="mainVideo" id=subtitle]]
+[[!template text="comes in again." start="00:04:08.467" video="mainVideo" id=subtitle]]
+[[!template text="I need to learn how to mold my tools" start="00:04:09.183" video="mainVideo" id=subtitle]]
+[[!template text="to my workflow," start="00:04:11.000" video="mainVideo" id=subtitle]]
+[[!template text="but also mold my workflow" start="00:04:11.800" video="mainVideo" id=subtitle]]
+[[!template text="to the tools available." start="00:04:13.133" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Window Managers." start="00:04:14.383" video="mainVideo" id=subtitle]]
+[[!template text="Another example of this is window managers." start="00:04:15.683" video="mainVideo" id=subtitle]]
+[[!template text="Although I've probably dabbled" start="00:04:18.050" video="mainVideo" id=subtitle]]
+[[!template text="in window managers or desktop environments" start="00:04:19.367" video="mainVideo" id=subtitle]]
+[[!template text="as much as the next person," start="00:04:21.083" video="mainVideo" id=subtitle]]
+[[!template text="I have usually stuck with DWM." start="00:04:22.583" video="mainVideo" id=subtitle]]
+[[!template text="But DWM doesn't follow" start="00:04:23.817" video="mainVideo" id=subtitle]]
+[[!template text="any of the Emacs concepts:" start="00:04:25.633" video="mainVideo" id=subtitle]]
+[[!template text="it has different keybindings--" start="00:04:26.833" video="mainVideo" id=subtitle]]
+[[!template text="you can sort of do Emacs ones," start="00:04:27.967" video="mainVideo" id=subtitle]]
+[[!template text="no REPL (it's a C program after all)." start="00:04:29.250" video="mainVideo" id=subtitle]]
+[[!template text="But I can still mold it to my workflow." start="00:04:31.283" video="mainVideo" id=subtitle]]
+[[!template text="If I run Emacs as a daemon and a client," start="00:04:33.617" video="mainVideo" id=subtitle]]
+[[!template text="what difference is it?" start="00:04:35.833" video="mainVideo" id=subtitle]]
+[[!template text="My WM is essentially a wrapper" start="00:04:36.700" video="mainVideo" id=subtitle]]
+[[!template text="for Emacs and my other vital programs." start="00:04:37.850" video="mainVideo" id=subtitle]]
+[[!template text="I don't need to make Emacs my WM," start="00:04:39.583" video="mainVideo" id=subtitle]]
+[[!template text="and bring along all the other issues." start="00:04:41.533" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Browsers are a similar conversation." start="00:04:42.900" video="mainVideo" id=subtitle]]
+[[!template text="Initially, I understand the value" start="00:04:45.383" video="mainVideo" id=subtitle]]
+[[!template text="of having my browser in Emacs, but why?" start="00:04:46.883" video="mainVideo" id=subtitle]]
+[[!template text="If a tool exists that works well," start="00:04:48.750" video="mainVideo" id=subtitle]]
+[[!template text="ignoring the UNIX philosophy for a moment," start="00:04:49.883" video="mainVideo" id=subtitle]]
+[[!template text="why should I take the effort to rewrite it?" start="00:04:51.233" video="mainVideo" id=subtitle]]
+[[!template text="Now, don't misinterpret what I'm saying." start="00:04:52.817" video="mainVideo" id=subtitle]]
+[[!template text="If you have a better way to do something:" start="00:04:54.617" video="mainVideo" id=subtitle]]
+[[!template text="you can make it faster, easier to use," start="00:04:56.083" video="mainVideo" id=subtitle]]
+[[!template text="that I understand." start="00:04:57.583" video="mainVideo" id=subtitle]]
+[[!template text="But if I have, say, Nyxt or Firefox?" start="00:04:58.717" video="mainVideo" id=subtitle]]
+[[!template text="Why would I take the effort" start="00:05:00.800" video="mainVideo" id=subtitle]]
+[[!template text="to try and rewrite that into Emacs?" start="00:05:01.517" video="mainVideo" id=subtitle]]
+[[!template text="Instead, this is a scenario" start="00:05:02.750" video="mainVideo" id=subtitle]]
+[[!template text="where using a different tool" start="00:05:04.267" video="mainVideo" id=subtitle]]
+[[!template text="alongside Emacs might be better." start="00:05:05.217" video="mainVideo" id=subtitle]]
+[[!template text="There's a talk later on in the conference" start="00:05:06.567" video="mainVideo" id=subtitle]]
+[[!template text="about that from someone else." start="00:05:08.350" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Vim. Even vim, jokingly," start="00:05:09.300" video="mainVideo" id=subtitle]]
+[[!template text="is the enemy of our community," start="00:05:12.017" video="mainVideo" id=subtitle]]
+[[!template text="but it's a good tool." start="00:05:13.500" video="mainVideo" id=subtitle]]
+[[!template text="Sometimes I just don't want to" start="00:05:15.383" video="mainVideo" id=subtitle]]
+[[!template text="run Emacs as a daemon with evil-mode" start="00:05:16.667" video="mainVideo" id=subtitle]]
+[[!template text="and I just want to quickly do something." start="00:05:17.983" video="mainVideo" id=subtitle]]
+[[!template text="And most people come from" start="00:05:19.883" video="mainVideo" id=subtitle]]
+[[!template text="a power user terminal background," start="00:05:21.267" video="mainVideo" id=subtitle]]
+[[!template text="or at least I would assume s,." start="00:05:22.733" video="mainVideo" id=subtitle]]
+[[!template text="and those I have spoken with." start="00:05:24.167" video="mainVideo" id=subtitle]]
+[[!template text="If I need to quickly edit something," start="00:05:25.900" video="mainVideo" id=subtitle]]
+[[!template text="it might benefit me to" start="00:05:27.150" video="mainVideo" id=subtitle]]
+[[!template text="just run a quick vim ./file" start="00:05:27.840" video="mainVideo" id=subtitle]]
+[[!template text="in the terminal." start="00:05:29.917" video="mainVideo" id=subtitle]]
+[[!template text="I often have terminals open anyway" start="00:05:30.333" video="mainVideo" id=subtitle]]
+[[!template text="due to the graphic acceleration" start="00:05:32.183" video="mainVideo" id=subtitle]]
+[[!template text="from things like Alacritty." start="00:05:33.417" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Speaking of terminals," start="00:05:34.639" video="mainVideo" id=subtitle]]
+[[!template text="this is the main tool I don't use in Emacs." start="00:05:36.167" video="mainVideo" id=subtitle]]
+[[!template text="While vterm might be nice," start="00:05:38.383" video="mainVideo" id=subtitle]]
+[[!template text="I often want to use a TUI tool." start="00:05:39.850" video="mainVideo" id=subtitle]]
+[[!template text="I most often write programs in C or Rust" start="00:05:41.433" video="mainVideo" id=subtitle]]
+[[!template text="due to those being my main languages" start="00:05:43.667" video="mainVideo" id=subtitle]]
+[[!template text="that I use professionally." start="00:05:45.200" video="mainVideo" id=subtitle]]
+[[!template text="If I can write a faster C or Rust program" start="00:05:46.050" video="mainVideo" id=subtitle]]
+[[!template text="in half the time it'll take for me" start="00:05:48.250" video="mainVideo" id=subtitle]]
+[[!template text="to write a slower Elisp one," start="00:05:49.400" video="mainVideo" id=subtitle]]
+[[!template text="I might prefer to do just that." start="00:05:50.483" video="mainVideo" id=subtitle]]
+[[!template text="Especially in the case of a TUI program," start="00:05:52.283" video="mainVideo" id=subtitle]]
+[[!template text="Alacritty helps me develop them faster" start="00:05:53.633" video="mainVideo" id=subtitle]]
+[[!template text="but also run them." start="00:05:55.517" video="mainVideo" id=subtitle]]
+[[!template text="So if you've been using systemd" start="00:05:56.639" video="mainVideo" id=subtitle]]
+[[!template text="or running commands in the terminal for years," start="00:05:58.850" video="mainVideo" id=subtitle]]
+[[!template text="it might take more effort to learn" start="00:06:00.500" video="mainVideo" id=subtitle]]
+[[!template text="the way to do it in an Emacs frontend" start="00:06:01.680" video="mainVideo" id=subtitle]]
+[[!template text="than in the terminal." start="00:06:03.680" video="mainVideo" id=subtitle]]
+[[!template text="And remember, most shells come with" start="00:06:04.933" video="mainVideo" id=subtitle]]
+[[!template text="Emacs key bindings by default" start="00:06:07.117" video="mainVideo" id=subtitle]]
+[[!template text="and macOS, for example," start="00:06:07.567" video="mainVideo" id=subtitle]]
+[[!template text="can use Emacs keybindings in most places" start="00:06:09.350" video="mainVideo" id=subtitle]]
+[[!template text="including browsers." start="00:06:11.200" video="mainVideo" id=subtitle]]
+[[!template new="1" text="Do what helps you most," start="00:06:12.233" video="mainVideo" id=subtitle]]
+[[!template text="not what a philosophy or group tells you to do." start="00:06:13.567" video="mainVideo" id=subtitle]]
+[[!template text="I hope this illustrated some ways" start="00:06:16.000" video="mainVideo" id=subtitle]]
+[[!template text="that Emacs is a tool in your belt," start="00:06:17.467" video="mainVideo" id=subtitle]]
+[[!template text="but not the belt itself." start="00:06:18.750" video="mainVideo" id=subtitle]]
+[[!template text="Do what works best for you," start="00:06:19.733" video="mainVideo" id=subtitle]]
+[[!template text="as being the most efficient" start="00:06:21.520" video="mainVideo" id=subtitle]]
+[[!template text="doesn't always grant the best results." start="00:06:22.717" video="mainVideo" id=subtitle]]
+[[!template text="If you're used to doing something one way," start="00:06:24.233" video="mainVideo" id=subtitle]]
+[[!template text="consider still doing it that way" start="00:06:25.983" video="mainVideo" id=subtitle]]
+[[!template text="while learning new skills" start="00:06:27.183" video="mainVideo" id=subtitle]]
+[[!template text="and being adaptable. And after all," start="00:06:28.117" video="mainVideo" id=subtitle]]
+[[!template text="this is an Emacs conference" start="00:06:29.250" video="mainVideo" id=subtitle]]
+[[!template text="so maybe consider learning a tool" start="00:06:30.683" video="mainVideo" id=subtitle]]
+[[!template text="for both Emacs and the terminal," start="00:06:32.150" video="mainVideo" id=subtitle]]
+[[!template text="and then you might be" start="00:06:33.517" video="mainVideo" id=subtitle]]
+[[!template text="just a little bit more flexible" start="00:06:34.367" video="mainVideo" id=subtitle]]
+[[!template text="in the future." start="00:06:35.440" video="mainVideo" id=subtitle]]
+[[!template text="Thank you for listening to my talk today." start="00:06:36.720" video="mainVideo" id=subtitle]]
diff --git a/2021/contribute.md b/2021/contribute.md
new file mode 100644
index 00000000..b8d489fa
--- /dev/null
+++ b/2021/contribute.md
@@ -0,0 +1,117 @@
+[[!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
+
+Excited about EmacsConf 2021? Want to give back? We could still use your help!
+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.
+- [[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?
+ - How can we improve the experience for speakers and participants?
+ - How can we experiment with other ways to chat?
+ - How can we get the tech stack to be more reliable?
+- ... 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!) or check out the [volunteer pad](https://etherpad.wikimedia.org/p/emacsconf-2021-volunteers). We'd love to hear from you!
+
+<a name="chapter-markers"></a>
+# Add chapter markers
+
+See [[Help_with_chapter_markers]] for instructions and a list of pages that need help.
+
+<a name="update-discussion"></a>
+# Update the discussion section with answers or timestamps
+
+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
+
+Many sessions will have live question and answer sessions via BigBlueButton
+(BBB). Everything works more smoothly when the speakers are all set up and
+ready to go: their audio works, their screen can be shared properly, and so
+on. You can help by testing their setup beforehand.
+
+You can test your own connection at <https://test.bigbluebutton.org>. If that
+works for you, you can be a tech-check volunteer! You can add yourself to the
+table on our [Prepare](https://emacsconf.org/2021/prepare/) page and let us
+know what your availability is so that we may match you up with speakers who
+want to doublecheck their setup before the conference. All you'd need to do is
+to go through a checklist with them.
+
+Here are some notes on the process:
+
+- Can you hear me? Can I hear you?
+- Explain process
+- Test audio, webcam, screensharing
+ - Encourage webcam for Q&A, although make it clear that it's totally optional
+ - Audio: System audio will generally not be picked up by BBB unless
+ there's a virtual loopback device, so music demos and other things
+ that use system audio will need to be prerecorded
+ - Multi-monitor setups might not be handled well by BBB; share
+ window instead of desktop
+ - Difficult to show webcam and shared screen at the same time
+ because BBB makes the shared screen too small. If the speaker is
+ interested, consider using a webcam app (Windows: their webcam's
+ camera app, Linux: Cheese, set to Always on Top)
+- Check if comfortable checking into IRC: #emacsconf-org channel via
+ https://chat.emacsconf.org or their favorite IRC client (libera.chat
+ network)
+- Check if the speaker is comfortable finding their section in the
+ [test Etherpad](https://etherpad.wikimedia.org/p/emacsconf-2021-test),
+ typing in text, etc.
+- Write down IRC nick, preferred public contact info, name
+ pronunciation, and pronouns for inclusion in the public wiki if not
+ already on their talk page
+
+# Run alternate streams
+
+Do you have a pretty good network connection and a computer capable of
+livestreaming? Consider becoming an alternate streamer! You can pick
+one or more of your favorite sessions from the [[schedule]] and get
+set up for doing an extended stream, allowing more time for Q&A and
+live demonstrations.
+
+# Capture questions and answers
+
+During the conference, people will be sending questions via Etherpad
+and IRC, and speakers might answer live or via Etherpad or IRC. As a
+volunteer, you can help make sure those questions and answers don't
+get lost. It would be great to get as many questions as possible
+written down in the Etherpad, along with their answers. This means
+copying questions and answers from IRC, typing in answers given live,
+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.
+
+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!
+
+Thanks for contributing to EmacsConf 2021 or future EmacsConfs!
diff --git a/2021/emacsconf-pentabarf.xml b/2021/emacsconf-pentabarf.xml
new file mode 100644
index 00000000..726f667f
--- /dev/null
+++ b/2021/emacsconf-pentabarf.xml
@@ -0,0 +1,107 @@
+<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.
+
+</description><url>https://emacsconf.org/2021/talks/news</url><persons><person>Sacha Chua</person></persons></event><event id="03" guid="06df8309-bd04-eb24-d443-a780c56adc0a"><date>2021-11-27T14:25:00Z</date><start>09:25</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-frownies</slug><duration>0:20</duration><title>The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/frownies</url><persons><person>Case Duckworth</person></persons></event><event id="04" guid="db4ccb28-867f-df24-c073-eaca6edad438"><date>2021-11-27T14:59:00Z</date><start>09:59</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-omegat</slug><duration>0:10</duration><title>Emacs manuals translation and OmegaT</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/omegat</url><persons><person>Jean-Christophe Helary</person></persons></event><event id="11" guid="ea5bab3c-f31e-68a4-fa23-81ca67fa1990"><date>2021-11-27T15:13:00Z</date><start>10:13</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-unix</slug><duration>0:07</duration><title>GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/unix</url><persons><person>Daniel Rose</person></persons></event><event id="29" guid="6fccae45-04b5-5524-662b-fdba87754d06"><date>2021-11-27T15:25:00Z</date><start>10:25</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-montessori</slug><duration>0:11</duration><title>Emacs and Montessori Philosophy</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/montessori</url><persons><person>Grant Shangreaux</person></persons></event><event id="51" guid="fe959e43-441b-ed34-854b-87f6f481f55a"><date>2021-11-27T15:40:00Z</date><start>10:40</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-pattern</slug><duration>0:24</duration><title>Emacs as Design Pattern Learning</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/pattern</url><persons><person>Greta Goetz</person></persons></event><event id="27" guid="48a8580f-52ce-cc84-6a23-1eddf720ae02"><date>2021-11-27T16:07:00Z</date><start>11:07</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-freedom</slug><duration>0:39</duration><title>How Emacs made me appreciate software freedom</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/freedom</url><persons><person>Protesilaos Stavrou</person></persons></event><event id="05" guid="525d972d-1e34-bcb4-e9c3-861942549357"><date>2021-11-27T16:46:00Z</date><start>11:46</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-nongnu</slug><duration>0:07</duration><title>NonGNU ELPA Update</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/nongnu</url><persons><person>Philip Kaludercic</person></persons></event><event id="06" guid="245a575a-965a-caa4-8d3b-75f8519c2f3e"><date>2021-11-27T16:55:00Z</date><start>11:55</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-borg</slug><duration>0:08</duration><title>Manual Package Management in The Era of Repositories - Why and How</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/borg</url><persons><person>Dhavan (codingquark)</person></persons></event><event id="08" guid="e4bdc2c1-e4b6-67e4-aafb-87ec9aaf846b"><date>2021-11-27T17:03:00Z</date><start>12:03</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-nangulator</slug><duration>0:10</duration><title>Introducing N-Angulator</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/nangulator</url><persons><person>Kevin Haddock</person></persons></event><event id="12" guid="716d913f-de8b-91a4-5f33-e04ba0905fa5"><date>2021-11-27T17:14:00Z</date><start>12:14</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-gregorian</slug><duration>0:09</duration><title>Typesetting Gregorian Chant with Emacs</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/gregorian</url><persons><person>Spencer King</person></persons></event><event id="07" guid="86158391-53a2-7cb4-d7d3-020afbf6d8d9"><date>2021-11-27T18:01:00Z</date><start>13:01</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-telega</slug><duration>0:08</duration><title>telega.el and the Emacs community on Telegram</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/telega</url><persons><person>Gabriele Bozzola</person></persons></event><event id="09" guid="14ab7a54-d75d-45e4-85ab-8fd2e391ea41"><date>2021-11-27T18:10:00Z</date><start>13:10</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-janitor</slug><duration>0:26</duration><title>A day in the life of a janitor</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/janitor</url><persons><person>Stefan Monnier</person></persons></event><event id="52" guid="9cee7e43-bcb1-7f64-c40b-5f9ea938d11a"><date>2021-11-27T18:51:00Z</date><start>13:51</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-erg</slug><duration>0:11</duration><title>Emacs Research Group, Season Zero: What we did together with Emacs in 2 hours a week for a year</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/erg</url><persons><person>Noorah Alhasan</person><person>Joe Corneli</person><person>Raymond Puzio</person><person>Leo Vivier</person></persons></event><event id="13" guid="0f98a5bb-53ce-fb74-1003-0b1f320d414e"><date>2021-11-27T19:03:00Z</date><start>14:03</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-cs</slug><duration>0:10</duration><title>One effective CS grad student workflow</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/cs</url><persons><person>Greg Coladonato</person></persons></event><event id="16" guid="43cc5db4-e26f-fb44-9aeb-b16c38d8cef3"><date>2021-11-27T19:15:00Z</date><start>14:15</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-professional</slug><duration>0:11</duration><title>Using Org-Mode For Recording Continuous Professional Development</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/professional</url><persons><person>Philip Beadling</person></persons></event><event id="23" guid="a10ce62e-6454-d784-21bb-f6a0488e883c"><date>2021-11-27T19:26:00Z</date><start>14:26</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-tech</slug><duration>0:11</duration><title>Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/tech</url><persons><person>Jan Ypma</person></persons></event><event id="18" guid="b092bc88-e74c-a9c4-611b-d47c99ef578c"><date>2021-11-27T19:38:00Z</date><start>14:38</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-exec</slug><duration>0:08</duration><title>Org as an executable format</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/exec</url><persons><person>Tom Gillespie</person></persons></event><event id="17" guid="69763d57-be4e-7e74-509b-92e48a0e7ba6"><date>2021-11-27T19:46:00Z</date><start>14:46</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-org-outside</slug><duration>0:13</duration><title>The use of Org mode syntax outside of GNU/Emacs</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/org-outside</url><persons><person>Karl Voit</person></persons></event><event id="22" guid="aed5e190-66a0-3dd4-e5eb-be09be94e6c3"><date>2021-11-27T20:00:00Z</date><start>15:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-teach</slug><duration>0:21</duration><title>Using Org-mode to teach programming</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/teach</url><persons><person>Daniel German</person></persons></event><event id="19" guid="db5821ed-fef4-4934-8fb3-87a0282714de"><date>2021-11-27T20: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-babel</slug><duration>0:10</duration><title>Babel for academics</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/babel</url><persons><person>Asilata Bapat</person></persons></event><event id="20" guid="fd246cee-b5d6-7cc4-2b63-20e87bb7d750"><date>2021-11-27T20:33:00Z</date><start>15:33</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-research</slug><duration>0:09</duration><title>Managing a research workflow (bibliographies, note-taking, and arXiv)</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/research</url><persons><person>Ahmed Khaled</person></persons></event><event id="21" guid="1fc4917c-aab4-1924-2983-e78f8bca6af9"><date>2021-11-27T20:42:00Z</date><start>15:42</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-molecular</slug><duration>0:09</duration><title>Reproducible molecular graphics with Org-mode</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/molecular</url><persons><person>Blaine Mooers</person></persons></event><event id="15" guid="c9870e10-2600-85a4-24fb-793dfc51164e"><date>2021-11-27T20:53:00Z</date><start>15:53</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-invoice</slug><duration>0:10</duration><title>Finding Your (In)voice: Emacs for Invoicing</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/invoice</url><persons><person>Bala Ramadurai</person></persons></event><event id="14" guid="c54c7930-51cc-5184-9dfb-5033e577b95e"><date>2021-11-27T21:03:00Z</date><start>16:03</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-project</slug><duration>0:10</duration><title>Budgeting, Project Monitoring and Invoicing with Org Mode</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/project</url><persons><person>Adolfo Villafiorita</person></persons></event><event id="24" guid="e4e995c0-6e06-8544-a8c3-5f9a06c856fb"><date>2021-11-27T21:14:00Z</date><start>16:14</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-dashboard</slug><duration>0:09</duration><title>Productivity Dashboards with Emacs and Kindle</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/dashboard</url><persons><person>Mehmet Tekman</person></persons></event><event id="25" guid="33776e08-e815-db94-971b-a151236e11be"><date>2021-11-27T21:26:00Z</date><start>16:26</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-nyxt</slug><duration>0:09</duration><title>Emacs with Nyxt: extend your editor with the power of a Lisp browser</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/nyxt</url><persons><person>Andrea</person></persons></event><event id="53" guid="59e4daca-1e46-9054-9573-9c91966d6987"><date>2021-11-27T21:41:00Z</date><start>16:41</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-dev-update</slug><duration>0:08</duration><title>Emacs development updates</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/dev-update</url><persons><person>John Wiegley</person></persons></event><event id="26" guid="86d4470a-8d19-7bd4-0c53-6aba1b49baef"><date>2021-11-27T21:49:00Z</date><start>16:49</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-design</slug><duration>0:07</duration><title>On the design of text editors</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</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: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.
+
+</description><url>https://emacsconf.org/2021/talks/faster</url><persons><person>Dmitry Gutov</person></persons></event><event id="33" guid="599ef3fa-4c73-6c94-4953-75bbc7830681"><date>2021-11-28T15:00:00Z</date><start>10:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-structural</slug><duration>0:11</duration><title>Tree-edit: Structural editing for Java, Python, C, and beyond!</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/structural</url><persons><person>Ethan Leba</person></persons></event><event id="32" guid="29d45a6f-9425-f5a4-bd23-297292e4ab7a"><date>2021-11-28T15:12:00Z</date><start>10:12</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-dsl</slug><duration>0:20</duration><title>Self-Describing Smart DSL's: The Next Magits</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/dsl</url><persons><person>Psionic</person></persons></event><event id="34" guid="8f62e571-91da-bd14-e7c3-b445c7b19d23"><date>2021-11-28T15:19:00Z</date><start>10:19</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-ui</slug><duration>0:10</duration><title>Yak-shaving to a UI framework</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/ui</url><persons><person>Erik Anderson</person></persons></event><event id="50" guid="4cd6de26-cf48-95c4-9d3b-28895a43ec53"><date>2021-11-28T15:41:00Z</date><start>10:41</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-devel</slug><duration>0:20</duration><title>Don't write that package! or: How I learned to stop worrying and love emacs-devel</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/devel</url><persons><person>Stefan Kangas</person></persons></event><event id="35" guid="b073d391-6c37-6bf4-7afb-47edc79631a9"><date>2021-11-28T15:19:00Z</date><start>10:19</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-rust</slug><duration>0:20</duration><title>Extending Emacs in Rust with Dynamic Modules</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/rust</url><persons><person>Tuấn-Anh Nguyễn</person></persons></event><event id="43" guid="3364aedb-a496-5c64-5383-b0080afa6d7b"><date>2021-11-28T15:38:00Z</date><start>10:38</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-mold</slug><duration>0:10</duration><title>Moldable Emacs, a step towards sustainable software</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/mold</url><persons><person>Andrea</person></persons></event><event id="47" guid="5e1baaaf-56a3-b5b4-31cb-5437cf465cf9"><date>2021-11-28T15:49:00Z</date><start>10:49</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-model</slug><duration>0:10</duration><title>Extending the "model" of Emacs to other applications</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/model</url><persons><person>Laszlo Krajnikovszkij</person></persons></event><event id="39" guid="1ddbe380-b4f3-2b84-3cc3-9e799536db8e"><date>2021-11-28T16:00:00Z</date><start>11:00</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-native</slug><duration>0:40</duration><title>Emacs Lisp native compiler, current status and future developments</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/native</url><persons><person>Andrea Corallo</person></persons></event><event id="40" guid="5947c3e9-93c1-1014-7ffb-aa0e0097e3e4"><date>2021-11-28T18:01:00Z</date><start>13:01</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-form</slug><duration>0:13</duration><title>Old McCarthy Had a Form</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/form</url><persons><person>Ian Eure</person></persons></event><event id="36" guid="49a35f05-b71f-1d14-2343-a6638bec0d08"><date>2021-11-28T18:19:00Z</date><start>13:19</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-bindat</slug><duration>0:30</duration><title>Turbo Bindat</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/bindat</url><persons><person>Stefan Monnier</person></persons></event><event id="37" guid="5e162d34-ea19-8544-b693-dd6da0e885cd"><date>2021-11-28T18:55:00Z</date><start>13:55</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-test</slug><duration>0:07</duration><title>Test blocks</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/test</url><persons><person>Eduardo Ochs</person></persons></event><event id="42" guid="1407591a-29fd-3f64-1beb-01dea6e9d7d2"><date>2021-11-28T19:03:00Z</date><start>14:03</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-bidi</slug><duration>0:20</duration><title>Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</description><url>https://emacsconf.org/2021/talks/bidi</url><persons><person>Mohsen BANAN</person></persons></event><event id="38" guid="e7981936-6d72-93d4-8783-5ac64a0ae5bb"><date>2021-11-28T19:29:00Z</date><start>14:29</start><language>en</language><room>Main</room><subtitle></subtitle><type>Talk</type><track>Main</track><slug>emacsconf-2021-talk-eaf</slug><duration>0:10</duration><title>Emacs Application Framework: A 2021 Update</title><abstract></abstract><description>Times are approximate and will probably change.
+
+</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: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: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: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: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-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
new file mode 100644
index 00000000..6c971270
--- /dev/null
+++ b/2021/emacsconf.ics
@@ -0,0 +1,659 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:EmacsConf
+X-WR-CALNAME:EmacsConf 2021
+X-WR-CALNAME:EmacsConf
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+BEGIN:VEVENT
+SUMMARY:Opening remarks
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:dc07efcd-6d79-cfd4-fed3-59c885fe2922
+URL:https://emacsconf.org/2021/talks/day1-open
+DTSTART:20211127T140000Z
+DTEND:20211127T141800Z
+DTSTAMP:20211207T015326Z
+DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
+ conf.org/2021/talks/day1-open\n
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs News Highlights - Sacha Chua
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:393ba3c2-b2a6-6a84-44eb-872aa333d08d
+URL:https://emacsconf.org/2021/talks/news
+DTSTART:20211127T141900Z
+DTEND:20211127T142400Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:The True Frownies are the Friends We Made Along the Way: An Anecdot
+ e of Emacs's Malleability - Case Duckworth
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:06df8309-bd04-eb24-d443-a780c56adc0a
+URL:https://emacsconf.org/2021/talks/frownies
+DTSTART:20211127T142500Z
+DTEND:20211127T144500Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs manuals translation and OmegaT - Jean-Christophe Helary
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:db4ccb28-867f-df24-c073-eaca6edad438
+URL:https://emacsconf.org/2021/talks/omegat
+DTSTART:20211127T145900Z
+DTEND:20211127T150900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Al
+ ways The Only Answer - Daniel Rose
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:ea5bab3c-f31e-68a4-fa23-81ca67fa1990
+URL:https://emacsconf.org/2021/talks/unix
+DTSTART:20211127T151300Z
+DTEND:20211127T152000Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs and Montessori Philosophy - Grant Shangreaux
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:6fccae45-04b5-5524-662b-fdba87754d06
+URL:https://emacsconf.org/2021/talks/montessori
+DTSTART:20211127T152500Z
+DTEND:20211127T153600Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs as Design Pattern Learning - Greta Goetz
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:fe959e43-441b-ed34-854b-87f6f481f55a
+URL:https://emacsconf.org/2021/talks/pattern
+DTSTART:20211127T154000Z
+DTEND:20211127T160400Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:How Emacs made me appreciate software freedom - Protesilaos Stavrou
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:48a8580f-52ce-cc84-6a23-1eddf720ae02
+URL:https://emacsconf.org/2021/talks/freedom
+DTSTART:20211127T160700Z
+DTEND:20211127T164600Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:NonGNU ELPA Update - Philip Kaludercic
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:525d972d-1e34-bcb4-e9c3-861942549357
+URL:https://emacsconf.org/2021/talks/nongnu
+DTSTART:20211127T164600Z
+DTEND:20211127T165300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Manual Package Management in The Era of Repositories - Why and How
+ - Dhavan (codingquark)
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:245a575a-965a-caa4-8d3b-75f8519c2f3e
+URL:https://emacsconf.org/2021/talks/borg
+DTSTART:20211127T165500Z
+DTEND:20211127T170300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Introducing N-Angulator - Kevin Haddock
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:e4bdc2c1-e4b6-67e4-aafb-87ec9aaf846b
+URL:https://emacsconf.org/2021/talks/nangulator
+DTSTART:20211127T170300Z
+DTEND:20211127T171300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Typesetting Gregorian Chant with Emacs - Spencer King
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:716d913f-de8b-91a4-5f33-e04ba0905fa5
+URL:https://emacsconf.org/2021/talks/gregorian
+DTSTART:20211127T171400Z
+DTEND:20211127T172300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:telega.el and the Emacs community on Telegram - Gabriele Bozzola
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:86158391-53a2-7cb4-d7d3-020afbf6d8d9
+URL:https://emacsconf.org/2021/talks/telega
+DTSTART:20211127T180100Z
+DTEND:20211127T180900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:A day in the life of a janitor - Stefan Monnier
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:14ab7a54-d75d-45e4-85ab-8fd2e391ea41
+URL:https://emacsconf.org/2021/talks/janitor
+DTSTART:20211127T181000Z
+DTEND:20211127T183600Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs Research Group\, Season Zero: What we did together with Emacs
+ in 2 hours a week for a year - Noorah Alhasan\, Joe Corneli\, Raymond Puz
+ io\, Leo Vivier
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:9cee7e43-bcb1-7f64-c40b-5f9ea938d11a
+URL:https://emacsconf.org/2021/talks/erg
+DTSTART:20211127T185100Z
+DTEND:20211127T190200Z
+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
+ATTENDEE;ROLE=REQ-PARTICIPANT;CUTYPE=INDIVIDUAL;CN="Leo Vivier":invalid:nomail
+DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
+ conf.org/2021/talks/erg\n
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:One effective CS grad student workflow - Greg Coladonato
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:0f98a5bb-53ce-fb74-1003-0b1f320d414e
+URL:https://emacsconf.org/2021/talks/cs
+DTSTART:20211127T190300Z
+DTEND:20211127T191300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Using Org-Mode For Recording Continuous Professional Development -
+ Philip Beadling
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:43cc5db4-e26f-fb44-9aeb-b16c38d8cef3
+URL:https://emacsconf.org/2021/talks/professional
+DTSTART:20211127T191500Z
+DTEND:20211127T192600Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Creating technical API documentation and presentations using org-ba
+ bel\, restclient\, and org-treeslide - Jan Ypma
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:a10ce62e-6454-d784-21bb-f6a0488e883c
+URL:https://emacsconf.org/2021/talks/tech
+DTSTART:20211127T192600Z
+DTEND:20211127T193700Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Org as an executable format - Tom Gillespie
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:b092bc88-e74c-a9c4-611b-d47c99ef578c
+URL:https://emacsconf.org/2021/talks/exec
+DTSTART:20211127T193800Z
+DTEND:20211127T194600Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:The use of Org mode syntax outside of GNU/Emacs - Karl Voit
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:69763d57-be4e-7e74-509b-92e48a0e7ba6
+URL:https://emacsconf.org/2021/talks/org-outside
+DTSTART:20211127T194600Z
+DTEND:20211127T195900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Using Org-mode to teach programming - Daniel German
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:aed5e190-66a0-3dd4-e5eb-be09be94e6c3
+URL:https://emacsconf.org/2021/talks/teach
+DTSTART:20211127T200000Z
+DTEND:20211127T202100Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Babel for academics - Asilata Bapat
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:db5821ed-fef4-4934-8fb3-87a0282714de
+URL:https://emacsconf.org/2021/talks/babel
+DTSTART:20211127T202100Z
+DTEND:20211127T203100Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Managing a research workflow (bibliographies\, note-taking\, and ar
+ Xiv) - Ahmed Khaled
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:fd246cee-b5d6-7cc4-2b63-20e87bb7d750
+URL:https://emacsconf.org/2021/talks/research
+DTSTART:20211127T203300Z
+DTEND:20211127T204200Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Reproducible molecular graphics with Org-mode - Blaine Mooers
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:1fc4917c-aab4-1924-2983-e78f8bca6af9
+URL:https://emacsconf.org/2021/talks/molecular
+DTSTART:20211127T204200Z
+DTEND:20211127T205100Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Finding Your (In)voice: Emacs for Invoicing - Bala Ramadurai
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:c9870e10-2600-85a4-24fb-793dfc51164e
+URL:https://emacsconf.org/2021/talks/invoice
+DTSTART:20211127T205300Z
+DTEND:20211127T210300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Budgeting\, Project Monitoring and Invoicing with Org Mode - Adolfo
+ Villafiorita
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:c54c7930-51cc-5184-9dfb-5033e577b95e
+URL:https://emacsconf.org/2021/talks/project
+DTSTART:20211127T210300Z
+DTEND:20211127T211300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Productivity Dashboards with Emacs and Kindle - Mehmet Tekman
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:e4e995c0-6e06-8544-a8c3-5f9a06c856fb
+URL:https://emacsconf.org/2021/talks/dashboard
+DTSTART:20211127T211400Z
+DTEND:20211127T212300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs with Nyxt: extend your editor with the power of a Lisp browse
+ r - Andrea
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:33776e08-e815-db94-971b-a151236e11be
+URL:https://emacsconf.org/2021/talks/nyxt
+DTSTART:20211127T212600Z
+DTEND:20211127T213500Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs development updates - John Wiegley
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:59e4daca-1e46-9054-9573-9c91966d6987
+URL:https://emacsconf.org/2021/talks/dev-update
+DTSTART:20211127T214100Z
+DTEND:20211127T214900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:On the design of text editors - Nicolas P. Rougier
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:86d4470a-8d19-7bd4-0c53-6aba1b49baef
+URL:https://emacsconf.org/2021/talks/design
+DTSTART:20211127T214900Z
+DTEND:20211127T215600Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Closing remarks day 1
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:5287b003-f368-36c4-4f9b-8135734cad39
+URL:https://emacsconf.org/2021/talks/day1-close
+DTSTART:20211127T220000Z
+DTEND:20211127T220500Z
+DTSTAMP:20211207T015326Z
+DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
+ conf.org/2021/talks/day1-close\n
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Opening remarks day 2
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:d877a57a-14cf-a194-99c3-a344ecb24acc
+URL:https://emacsconf.org/2021/talks/day2-open
+DTSTART:20211128T140000Z
+DTEND:20211128T140500Z
+DTSTAMP:20211207T015326Z
+DESCRIPTION: Times are approximate and will probably change.\nhttps://emacs
+ conf.org/2021/talks/day2-open\n
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Optimizing Emacs Lisp Code - Dmitry Gutov
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:35d1d9e4-dfdf-f254-6aab-7a466fbfaf09
+URL:https://emacsconf.org/2021/talks/faster
+DTSTART:20211128T140700Z
+DTEND:20211128T144300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Tree-edit: Structural editing for Java\, Python\, C\, and beyond! -
+ Ethan Leba
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:599ef3fa-4c73-6c94-4953-75bbc7830681
+URL:https://emacsconf.org/2021/talks/structural
+DTSTART:20211128T150000Z
+DTEND:20211128T151100Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Yak-shaving to a UI framework - Erik Anderson
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:8f62e571-91da-bd14-e7c3-b445c7b19d23
+URL:https://emacsconf.org/2021/talks/ui
+DTSTART:20211128T151900Z
+DTEND:20211128T152900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Moldable Emacs\, a step towards sustainable software - Andrea
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:3364aedb-a496-5c64-5383-b0080afa6d7b
+URL:https://emacsconf.org/2021/talks/mold
+DTSTART:20211128T153800Z
+DTEND:20211128T154800Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Extending the "model" of Emacs to other applications - Laszlo Krajn
+ ikovszkij
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:5e1baaaf-56a3-b5b4-31cb-5437cf465cf9
+URL:https://emacsconf.org/2021/talks/model
+DTSTART:20211128T154900Z
+DTEND:20211128T155900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs Lisp native compiler\, current status and future developments
+ - Andrea Corallo
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:1ddbe380-b4f3-2b84-3cc3-9e799536db8e
+URL:https://emacsconf.org/2021/talks/native
+DTSTART:20211128T160000Z
+DTEND:20211128T164000Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Old McCarthy Had a Form - Ian Eure
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:5947c3e9-93c1-1014-7ffb-aa0e0097e3e4
+URL:https://emacsconf.org/2021/talks/form
+DTSTART:20211128T180100Z
+DTEND:20211128T181400Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Turbo Bindat - Stefan Monnier
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:49a35f05-b71f-1d14-2343-a6638bec0d08
+URL:https://emacsconf.org/2021/talks/bindat
+DTSTART:20211128T181900Z
+DTEND:20211128T184900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Test blocks - Eduardo Ochs
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:5e162d34-ea19-8544-b693-dd6da0e885cd
+URL:https://emacsconf.org/2021/talks/test
+DTSTART:20211128T185500Z
+DTEND:20211128T190200Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware -
+ Mohsen BANAN
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:1407591a-29fd-3f64-1beb-01dea6e9d7d2
+URL:https://emacsconf.org/2021/talks/bidi
+DTSTART:20211128T190300Z
+DTEND:20211128T192300Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Emacs Application Framework: A 2021 Update - Matthew Zeng
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:e7981936-6d72-93d4-8783-5ac64a0ae5bb
+URL:https://emacsconf.org/2021/talks/eaf
+DTSTART:20211128T192900Z
+DTEND:20211128T193900Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Imaginary Programming - Shane Mulligan
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:f03ae971-4d2b-ccc4-2643-4ae2391ce1ab
+URL:https://emacsconf.org/2021/talks/imaginary
+DTSTART:20211128T193900Z
+DTEND:20211128T195000Z
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:CLEDE: the Common Lisp Emacs Development Environment - Fermin MF
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:daf3570b-3df3-9db4-a1f3-ce98d9863717
+URL:https://emacsconf.org/2021/talks/clede
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:How to help Emacs maintainers? - Bastien Guerry
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:51c360e6-188f-9a34-05bb-0a8d2eb09cdc
+URL:https://emacsconf.org/2021/talks/maintainers
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:How to build an Emacs - Fermin MF
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:27595637-b6b9-f764-805b-ff1b7f009006
+URL:https://emacsconf.org/2021/talks/build
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:M-x Forever: Why Emacs will outlast text editor trends - David Wils
+ on (System Crafters)
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:80d1ad02-5fe4-03b4-c573-17ea6cdb61aa
+URL:https://emacsconf.org/2021/talks/forever
+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
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Closing remarks day 2
+ORGANIZER:EmacsConf
+LOCATION:https://emacsconf.org/
+UID:828e7c62-8430-f1a4-431b-63c308d58688
+URL:https://emacsconf.org/2021/talks/day2-close
+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
+END:VCALENDAR \ No newline at end of file
diff --git a/2021/info/adventure-nav.md b/2021/info/adventure-nav.md
deleted file mode 100644
index e83ae6d4..00000000
--- a/2021/info/adventure-nav.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Back to the [[schedule]]
-Previous: <a href="/2021/talks/frownies">The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</a>
-Next: <a href="/2021/talks/unix">"GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer"</a>
diff --git a/2021/info/adventure-schedule.md b/2021/info/adventure-schedule.md
deleted file mode 100644
index 934f93d8..00000000
--- a/2021/info/adventure-schedule.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!-- Automatically generated by conf-create-info-pages -->
-
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/adventure">/2021/talks/adventure</a>
-
-
diff --git a/2021/info/babel-nav.md b/2021/info/babel-nav.md
index fd1e6590..e3acd3aa 100644
--- a/2021/info/babel-nav.md
+++ b/2021/info/babel-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a>
-Next: <a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a>
+Previous: <a href="/2021/talks/teach">Using Org-mode to teach programming</a>
+Next: <a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a>
diff --git a/2021/info/babel-schedule.md b/2021/info/babel-schedule.md
index 2d9c9918..37ee874d 100644
--- a/2021/info/babel-schedule.md
+++ b/2021/info/babel-schedule.md
@@ -1,15 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: maybe live (early morning in Australia)
+Duration: 9:58
-Waiting for confirmation from the speaker(s)
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/babel">/2021/talks/babel</a>
+
+# 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-nav.md b/2021/info/bidi-nav.md
index c30fd92f..8bbb65d0 100644
--- a/2021/info/bidi-nav.md
+++ b/2021/info/bidi-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/bug">Let's talk about bug trackers</a>
-Next: <a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a>
+Previous: <a href="/2021/talks/test">Test blocks</a>
+Next: <a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a>
diff --git a/2021/info/bidi-schedule.md b/2021/info/bidi-schedule.md
index e810f15c..931bd976 100644
--- a/2021/info/bidi-schedule.md
+++ b/2021/info/bidi-schedule.md
@@ -1,15 +1,31 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 19:52
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 20 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/bidi">/2021/talks/bidi</a>
+
+# 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-nav.md b/2021/info/bindat-nav.md
index 55a7dadf..cb087c2c 100644
--- a/2021/info/bindat-nav.md
+++ b/2021/info/bindat-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/devel">Don't write that package! or: How I learned to stop worrying and love emacs-devel</a>
-Next: <a href="/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a>
+Previous: <a href="/2021/talks/form">Old McCarthy Had a Form</a>
+Next: <a href="/2021/talks/test">Test blocks</a>
diff --git a/2021/info/bindat-schedule.md b/2021/info/bindat-schedule.md
index 03f12ee0..d30d1e0c 100644
--- a/2021/info/bindat-schedule.md
+++ b/2021/info/bindat-schedule.md
@@ -1,15 +1,69 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 29:48
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 20 minutes
+# 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
+"""]]
-Friendly URL: <a href="/2021/talks/bindat">/2021/talks/bindat</a>
+# 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-nav.md b/2021/info/borg-nav.md
index fc45409b..2413f631 100644
--- a/2021/info/borg-nav.md
+++ b/2021/info/borg-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/nongnu">NonGNU ELPA Update</a>
-Next: <a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a>
+Next: <a href="/2021/talks/nangulator">Introducing N-Angulator</a>
diff --git a/2021/info/borg-schedule.md b/2021/info/borg-schedule.md
index 2473f125..e9d2d264 100644
--- a/2021/info/borg-schedule.md
+++ b/2021/info/borg-schedule.md
@@ -1,15 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: IRC
+Duration: 7:49
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/borg">/2021/talks/borg</a>
+# Description
diff --git a/2021/info/bug-nav.md b/2021/info/bug-nav.md
index 612ad4e0..e126b09b 100644
--- a/2021/info/bug-nav.md
+++ b/2021/info/bug-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/test">Test blocks</a>
-Next: <a href="/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a>
+Previous: <a href="/2021/talks/maintainers">How to help Emacs maintainers?</a>
+Next: <a href="/2021/talks/build">How to build an Emacs</a>
diff --git a/2021/info/bug-schedule.md b/2021/info/bug-schedule.md
index c7e96a66..d02be932 100644
--- a/2021/info/bug-schedule.md
+++ b/2021/info/bug-schedule.md
@@ -1,15 +1,10 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+Q&A: IRC
+Status: Cancelled
+Duration: 20 minutes
-Waiting for speaker to send prerecorded video
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/bug">/2021/talks/bug</a>
+# Description
diff --git a/2021/info/build-nav.md b/2021/info/build-nav.md
index b9adaa0b..03be36e8 100644
--- a/2021/info/build-nav.md
+++ b/2021/info/build-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/imaginary">Imaginary Programming</a>
+Previous: <a href="/2021/talks/maintainers">How to help Emacs maintainers?</a>
Next: <a href="/2021/talks/forever">M-x Forever: Why Emacs will outlast text editor trends</a>
diff --git a/2021/info/build-schedule.md b/2021/info/build-schedule.md
index 522522e7..bc5ee716 100644
--- a/2021/info/build-schedule.md
+++ b/2021/info/build-schedule.md
@@ -1,15 +1,27 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 16:54
-Waiting for confirmation from the speaker(s)
-# Schedule
+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.
-Allocated 20 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/build">/2021/talks/build</a>
+
+# 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-nav.md b/2021/info/clede-nav.md
index e0bcdb46..1717f3f5 100644
--- a/2021/info/clede-nav.md
+++ b/2021/info/clede-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a>
-Next: <a href="/2021/talks/imaginary">Imaginary Programming</a>
+Previous: <a href="/2021/talks/imaginary">Imaginary Programming</a>
+Next: <a href="/2021/talks/maintainers">How to help Emacs maintainers?</a>
diff --git a/2021/info/clede-schedule.md b/2021/info/clede-schedule.md
index d498d988..702f0209 100644
--- a/2021/info/clede-schedule.md
+++ b/2021/info/clede-schedule.md
@@ -1,15 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 18:55
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 20 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/clede">/2021/talks/clede</a>
+
+# 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 a11f9b11..28b03909 100644
--- a/2021/info/cs-schedule.md
+++ b/2021/info/cs-schedule.md
@@ -1,15 +1,40 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A
+Duration: 9:28
-Waiting for confirmation from the speaker(s)
-# Schedule
+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.
-Allocated 10 minutes
+# 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
+"""]]
-Friendly URL: <a href="/2021/talks/cs">/2021/talks/cs</a>
+# 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-nav.md b/2021/info/dashboard-nav.md
index a7a30028..9ffa190f 100644
--- a/2021/info/dashboard-nav.md
+++ b/2021/info/dashboard-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/invoice">Find Your (In)voice: Emacs for Invoicing</a>
+Previous: <a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a>
Next: <a href="/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a>
diff --git a/2021/info/dashboard-schedule.md b/2021/info/dashboard-schedule.md
index e6525feb..1ed954d2 100644
--- a/2021/info/dashboard-schedule.md
+++ b/2021/info/dashboard-schedule.md
@@ -1,15 +1,27 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A and Matrix Chat (@mtekman:matrix.org)
+Duration: 8:31
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/dashboard">/2021/talks/dashboard</a>
+
+# 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-nav.md b/2021/info/day1-close-nav.md
index 4cd82c78..2887fd42 100644
--- a/2021/info/day1-close-nav.md
+++ b/2021/info/day1-close-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a>
+Previous: <a href="/2021/talks/design">On the design of text editors</a>
Next: <a href="/2021/talks/day2-open">Opening remarks day 2</a>
diff --git a/2021/info/day1-close-schedule.md b/2021/info/day1-close-schedule.md
index 8462497c..f80dc8e3 100644
--- a/2021/info/day1-close-schedule.md
+++ b/2021/info/day1-close-schedule.md
@@ -1,15 +1,12 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Duration: 5 minutes
-Will be live
-# Schedule
+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.
-Allocated 5 minutes
-
-
-Friendly URL: <a href="/2021/talks/day1-close">/2021/talks/day1-close</a>
+# Description
diff --git a/2021/info/day1-open-schedule.md b/2021/info/day1-open-schedule.md
index 1a11844b..05eaea7f 100644
--- a/2021/info/day1-open-schedule.md
+++ b/2021/info/day1-open-schedule.md
@@ -1,15 +1,13 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Duration: 18 minutes
-Will be live
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 5 minutes
-
-
-Friendly URL: <a href="/2021/talks/day1-open">/2021/talks/day1-open</a>
+# Description
diff --git a/2021/info/day2-close-schedule.md b/2021/info/day2-close-schedule.md
index c2a6785e..dd041cfe 100644
--- a/2021/info/day2-close-schedule.md
+++ b/2021/info/day2-close-schedule.md
@@ -1,15 +1,12 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Duration: 10 minutes
-Will be live
-# Schedule
+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.
-Allocated 10 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/day2-close">/2021/talks/day2-close</a>
+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-nav.md b/2021/info/day2-open-nav.md
index ec25c8da..c53c11ee 100644
--- a/2021/info/day2-open-nav.md
+++ b/2021/info/day2-open-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/day1-close">Closing remarks day 1</a>
-Next: <a href="/2021/talks/faster">How to write faster Emacs Lisp</a>
+Next: <a href="/2021/talks/faster">Optimizing Emacs Lisp Code</a>
diff --git a/2021/info/day2-open-schedule.md b/2021/info/day2-open-schedule.md
index d2b465b2..f80dc8e3 100644
--- a/2021/info/day2-open-schedule.md
+++ b/2021/info/day2-open-schedule.md
@@ -1,15 +1,12 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Duration: 5 minutes
-Will be live
-# Schedule
+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.
-Allocated 5 minutes
-
-
-Friendly URL: <a href="/2021/talks/day2-open">/2021/talks/day2-open</a>
+# Description
diff --git a/2021/info/design-nav.md b/2021/info/design-nav.md
index 80b9bd3f..24c85886 100644
--- a/2021/info/design-nav.md
+++ b/2021/info/design-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a>
-Next: <a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a>
+Previous: <a href="/2021/talks/dev-update">Emacs development updates</a>
+Next: <a href="/2021/talks/day1-close">Closing remarks day 1</a>
diff --git a/2021/info/design-schedule.md b/2021/info/design-schedule.md
index 11b9996e..582fe240 100644
--- a/2021/info/design-schedule.md
+++ b/2021/info/design-schedule.md
@@ -1,15 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: maybe live
+Duration: 6:39
-Waiting for confirmation from the speaker(s)
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/design">/2021/talks/design</a>
+
+# 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-nav.md b/2021/info/dev-update-nav.md
new file mode 100644
index 00000000..643aba61
--- /dev/null
+++ b/2021/info/dev-update-nav.md
@@ -0,0 +1,3 @@
+Back to the [[schedule]]
+Previous: <a href="/2021/talks/nyxt">Emacs with Nyxt: extend your editor with the power of a Lisp browser</a>
+Next: <a href="/2021/talks/design">On the design of text editors</a>
diff --git a/2021/info/dev-update-schedule.md b/2021/info/dev-update-schedule.md
new file mode 100644
index 00000000..de6b6940
--- /dev/null
+++ b/2021/info/dev-update-schedule.md
@@ -0,0 +1,38 @@
+<!-- Automatically generated by conf-create-info-pages -->
+
+[[!toc ]]
+Q&A: maybe after the conference; will try to attend
+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.
+
+[[!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/devel-nav.md b/2021/info/devel-nav.md
index 2faaa18a..e8c82fd5 100644
--- a/2021/info/devel-nav.md
+++ b/2021/info/devel-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a>
-Next: <a href="/2021/talks/bindat">Turbo Bindat</a>
+Previous: <a href="/2021/talks/ui">Yak-shaving to a UI framework</a>
+Next: <a href="/2021/talks/rust">Extending Emacs in Rust with Dynamic Modules</a>
diff --git a/2021/info/devel-schedule.md b/2021/info/devel-schedule.md
index ebe53365..c10ffc4b 100644
--- a/2021/info/devel-schedule.md
+++ b/2021/info/devel-schedule.md
@@ -1,15 +1,9 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+Status: Cancelled
+Duration: 20 minutes
-Waiting for confirmation from the speaker(s)
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/devel">/2021/talks/devel</a>
+# Description
diff --git a/2021/info/dsl-nav.md b/2021/info/dsl-nav.md
index df0175ce..ce9fede7 100644
--- a/2021/info/dsl-nav.md
+++ b/2021/info/dsl-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/structural">Tree-edit: Structural editing for Java, Python, C, and beyond!</a>
-Next: <a href="/2021/talks/ui">"Yak-shaving to a UI framework" (/"Help! I accidentally yak-shaved my way to writing a UI framework because overlays were slow")</a>
+Next: <a href="/2021/talks/ui">Yak-shaving to a UI framework</a>
diff --git a/2021/info/dsl-schedule.md b/2021/info/dsl-schedule.md
index 4340314a..3ae4bc6c 100644
--- a/2021/info/dsl-schedule.md
+++ b/2021/info/dsl-schedule.md
@@ -1,15 +1,10 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+Q&A: answering after the conference
+Status: Cancelled
+Duration: 20 minutes
-Waiting for speaker to send prerecorded video
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/dsl">/2021/talks/dsl</a>
+# Description
diff --git a/2021/info/eaf-nav.md b/2021/info/eaf-nav.md
index fa838792..326ea98b 100644
--- a/2021/info/eaf-nav.md
+++ b/2021/info/eaf-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/rust">Extending Emacs in Rust with Dynamic Modules</a>
-Next: <a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a>
+Previous: <a href="/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a>
+Next: <a href="/2021/talks/imaginary">Imaginary Programming</a>
diff --git a/2021/info/eaf-schedule.md b/2021/info/eaf-schedule.md
index 99a01f32..04e92fbf 100644
--- a/2021/info/eaf-schedule.md
+++ b/2021/info/eaf-schedule.md
@@ -1,15 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for confirmation from the speaker(s)
-
-# Schedule
-
-Allocated 10 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/eaf">/2021/talks/eaf</a>
+[[!toc ]]
+Q&A: IRC or Etherpad
+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.
+
+[[!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-nav.md b/2021/info/erg-nav.md
index fe52e4af..91de3218 100644
--- a/2021/info/erg-nav.md
+++ b/2021/info/erg-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/montessori">Emacs and Montessori Philosophy</a>
+Previous: <a href="/2021/talks/janitor">A day in the life of a janitor</a>
Next: <a href="/2021/talks/cs">One effective CS grad student workflow</a>
diff --git a/2021/info/erg-schedule.md b/2021/info/erg-schedule.md
index 95452452..fbe0c9ef 100644
--- a/2021/info/erg-schedule.md
+++ b/2021/info/erg-schedule.md
@@ -1,15 +1,47 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 15 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/erg">/2021/talks/erg</a>
+[[!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.
+
+# 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 ea08070a..34f1fa1f 100644
--- a/2021/info/exec-schedule.md
+++ b/2021/info/exec-schedule.md
@@ -1,15 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 7:09
-Waiting for confirmation from the speaker(s)
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/exec">/2021/talks/exec</a>
+
+# 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 0498c737..4ae1edb7 100644
--- a/2021/info/faster-schedule.md
+++ b/2021/info/faster-schedule.md
@@ -1,15 +1,55 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for confirmation from the speaker(s)
-
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/faster">/2021/talks/faster</a>
+[[!toc ]]
+Q&A: live
+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.
+
+# 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 00762619..6131ff19 100644
--- a/2021/info/forever-schedule.md
+++ b/2021/info/forever-schedule.md
@@ -1,15 +1,81 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 24:52
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 40 minutes
+# Talk
+[[!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...
+"""]]
-Friendly URL: <a href="/2021/talks/forever">/2021/talks/forever</a>
+# 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-nav.md b/2021/info/form-nav.md
index a196e3b8..a4dbf4e7 100644
--- a/2021/info/form-nav.md
+++ b/2021/info/form-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a>
-Next: <a href="/2021/talks/test">Test blocks</a>
+Next: <a href="/2021/talks/bindat">Turbo Bindat</a>
diff --git a/2021/info/form-schedule.md b/2021/info/form-schedule.md
index d8909b0b..106dfef6 100644
--- a/2021/info/form-schedule.md
+++ b/2021/info/form-schedule.md
@@ -1,15 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: IRC
+Duration: 12:44
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/form">/2021/talks/form</a>
+
+# 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-nav.md b/2021/info/freedom-nav.md
index 00304a45..c99816b0 100644
--- a/2021/info/freedom-nav.md
+++ b/2021/info/freedom-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/design">On the design of text editors</a>
-Next: <a href="/2021/talks/day1-close">Closing remarks day 1</a>
+Previous: <a href="/2021/talks/pattern">Emacs as Design Pattern Learning</a>
+Next: <a href="/2021/talks/nongnu">NonGNU ELPA Update</a>
diff --git a/2021/info/freedom-schedule.md b/2021/info/freedom-schedule.md
index 9700ca40..c3871089 100644
--- a/2021/info/freedom-schedule.md
+++ b/2021/info/freedom-schedule.md
@@ -1,15 +1,32 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 40 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/freedom">/2021/talks/freedom</a>
+[[!toc ]]
+Q&A: IRC
+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.
+
+[[!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-nav.md b/2021/info/frownies-nav.md
index c836405d..124a2b2d 100644
--- a/2021/info/frownies-nav.md
+++ b/2021/info/frownies-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/news">Emacs News Highlights</a>
-Next: <a href="/2021/talks/adventure">Choose Your Own (Technology-Enhanced Learning) Adventure</a>
+Next: <a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a>
diff --git a/2021/info/frownies-schedule.md b/2021/info/frownies-schedule.md
index f58e821f..bdb26131 100644
--- a/2021/info/frownies-schedule.md
+++ b/2021/info/frownies-schedule.md
@@ -1,15 +1,44 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for confirmation from the speaker(s)
-
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/frownies">/2021/talks/frownies</a>
+[[!toc ]]
+Q&A: maybe live
+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.
+
+# 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-nav.md b/2021/info/gregorian-nav.md
index 938b66af..d6f62377 100644
--- a/2021/info/gregorian-nav.md
+++ b/2021/info/gregorian-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/maintainers">How to help Emacs maintainers?</a>
-Next: <a href="/2021/talks/montessori">Emacs and Montessori Philosophy</a>
+Previous: <a href="/2021/talks/nangulator">Introducing N-Angulator</a>
+Next: <a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a>
diff --git a/2021/info/gregorian-schedule.md b/2021/info/gregorian-schedule.md
index 1fb2c491..37defbee 100644
--- a/2021/info/gregorian-schedule.md
+++ b/2021/info/gregorian-schedule.md
@@ -1,15 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 10 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/gregorian">/2021/talks/gregorian</a>
+[[!toc ]]
+Q&A: IRC
+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.
+
+[[!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-nav.md b/2021/info/imaginary-nav.md
index 402dffae..30e50199 100644
--- a/2021/info/imaginary-nav.md
+++ b/2021/info/imaginary-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/clede">CLEDE the Common Lisp Emacs Development Environment.</a>
-Next: <a href="/2021/talks/build">How to build an Emacs</a>
+Previous: <a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a>
+Next: <a href="/2021/talks/clede">CLEDE: the Common Lisp Emacs Development Environment</a>
diff --git a/2021/info/imaginary-schedule.md b/2021/info/imaginary-schedule.md
index 1d036700..21e9eda8 100644
--- a/2021/info/imaginary-schedule.md
+++ b/2021/info/imaginary-schedule.md
@@ -1,15 +1,30 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 10:17
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/imaginary">/2021/talks/imaginary</a>
+
+# 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-nav.md b/2021/info/invoice-nav.md
index e802434b..58d2665b 100644
--- a/2021/info/invoice-nav.md
+++ b/2021/info/invoice-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a>
-Next: <a href="/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a>
+Previous: <a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a>
+Next: <a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a>
diff --git a/2021/info/invoice-schedule.md b/2021/info/invoice-schedule.md
index 0dcc666a..842c97f3 100644
--- a/2021/info/invoice-schedule.md
+++ b/2021/info/invoice-schedule.md
@@ -1,15 +1,21 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: answering after the conference
+Duration: 9:59
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/invoice">/2021/talks/invoice</a>
+# Description
diff --git a/2021/info/janitor-nav.md b/2021/info/janitor-nav.md
index 661c3dba..68f0060c 100644
--- a/2021/info/janitor-nav.md
+++ b/2021/info/janitor-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/nangulator">Introducing N-Angulator</a>
-Next: <a href="/2021/talks/maintainers">How to help Emacs maintainers?</a>
+Previous: <a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a>
+Next: <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>
diff --git a/2021/info/janitor-schedule.md b/2021/info/janitor-schedule.md
index 2589b8ae..f84df3e2 100644
--- a/2021/info/janitor-schedule.md
+++ b/2021/info/janitor-schedule.md
@@ -1,15 +1,65 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 25:57
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 20 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/janitor">/2021/talks/janitor</a>
+
+# 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-nav.md b/2021/info/maintainers-nav.md
index 2def9174..3e739681 100644
--- a/2021/info/maintainers-nav.md
+++ b/2021/info/maintainers-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/janitor">A day in the life of a janitor</a>
-Next: <a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a>
+Previous: <a href="/2021/talks/clede">CLEDE: the Common Lisp Emacs Development Environment</a>
+Next: <a href="/2021/talks/build">How to build an Emacs</a>
diff --git a/2021/info/maintainers-schedule.md b/2021/info/maintainers-schedule.md
index 8453ae55..44c78276 100644
--- a/2021/info/maintainers-schedule.md
+++ b/2021/info/maintainers-schedule.md
@@ -1,15 +1,67 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 10:07
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+# 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
+"""]]
-Friendly URL: <a href="/2021/talks/maintainers">/2021/talks/maintainers</a>
+# 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-nav.md b/2021/info/model-nav.md
index 382d8169..9705309d 100644
--- a/2021/info/model-nav.md
+++ b/2021/info/model-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a>
-Next: <a href="/2021/talks/devel">Don't write that package! or: How I learned to stop worrying and love emacs-devel</a>
+Previous: <a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a>
+Next: <a href="/2021/talks/native">Emacs Lisp native compiler, current status and future developments</a>
diff --git a/2021/info/model-schedule.md b/2021/info/model-schedule.md
index 06bdf97b..1c9dee62 100644
--- a/2021/info/model-schedule.md
+++ b/2021/info/model-schedule.md
@@ -1,15 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: after the conference
+Duration: 9:49
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/model">/2021/talks/model</a>
+# Description
diff --git a/2021/info/mold-nav.md b/2021/info/mold-nav.md
index bfb1f2ae..82381b8a 100644
--- a/2021/info/mold-nav.md
+++ b/2021/info/mold-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a>
-Next: <a href="/2021/talks/clede">CLEDE the Common Lisp Emacs Development Environment.</a>
+Previous: <a href="/2021/talks/ui">Yak-shaving to a UI framework</a>
+Next: <a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a>
diff --git a/2021/info/mold-schedule.md b/2021/info/mold-schedule.md
index 54a253ed..f277166a 100644
--- a/2021/info/mold-schedule.md
+++ b/2021/info/mold-schedule.md
@@ -1,15 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: IRC or Etherpad
+Duration: 9:34
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/mold">/2021/talks/mold</a>
+# Description
diff --git a/2021/info/molecular-nav.md b/2021/info/molecular-nav.md
index 24447c94..b6a6ea4c 100644
--- a/2021/info/molecular-nav.md
+++ b/2021/info/molecular-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/babel">Babel for academics</a>
-Next: <a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a>
+Previous: <a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a>
+Next: <a href="/2021/talks/invoice">Finding Your (In)voice: Emacs for Invoicing</a>
diff --git a/2021/info/molecular-schedule.md b/2021/info/molecular-schedule.md
index 18a4f296..e978279b 100644
--- a/2021/info/molecular-schedule.md
+++ b/2021/info/molecular-schedule.md
@@ -1,15 +1,21 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or Etherpad
+Duration: 8:04
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/molecular">/2021/talks/molecular</a>
+# Description
diff --git a/2021/info/montessori-nav.md b/2021/info/montessori-nav.md
index 74cc0190..db08ce44 100644
--- a/2021/info/montessori-nav.md
+++ b/2021/info/montessori-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a>
-Next: <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>
+Previous: <a href="/2021/talks/unix">GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</a>
+Next: <a href="/2021/talks/pattern">Emacs as Design Pattern Learning</a>
diff --git a/2021/info/montessori-schedule.md b/2021/info/montessori-schedule.md
index 1f22468c..75891ba0 100644
--- a/2021/info/montessori-schedule.md
+++ b/2021/info/montessori-schedule.md
@@ -1,15 +1,48 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for confirmation from the speaker(s)
-
-# Schedule
-
-Allocated 10 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/montessori">/2021/talks/montessori</a>
+[[!toc ]]
+Q&A: live
+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.
+
+# 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-nav.md b/2021/info/nangulator-nav.md
index d55cfc3f..53d8f118 100644
--- a/2021/info/nangulator-nav.md
+++ b/2021/info/nangulator-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a>
-Next: <a href="/2021/talks/janitor">A day in the life of a janitor</a>
+Previous: <a href="/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a>
+Next: <a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a>
diff --git a/2021/info/nangulator-schedule.md b/2021/info/nangulator-schedule.md
index ee64fae7..21604bb8 100644
--- a/2021/info/nangulator-schedule.md
+++ b/2021/info/nangulator-schedule.md
@@ -1,15 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: IRC
+Duration: 9:58
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/nangulator">/2021/talks/nangulator</a>
+
+# 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-nav.md b/2021/info/native-nav.md
index d89c0f74..b69fa020 100644
--- a/2021/info/native-nav.md
+++ b/2021/info/native-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/bindat">Turbo Bindat</a>
+Previous: <a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a>
Next: <a href="/2021/talks/form">Old McCarthy Had a Form</a>
diff --git a/2021/info/native-schedule.md b/2021/info/native-schedule.md
index a36fef40..49712db5 100644
--- a/2021/info/native-schedule.md
+++ b/2021/info/native-schedule.md
@@ -1,15 +1,62 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/native">/2021/talks/native</a>
+[[!toc ]]
+Q&A: live
+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.
+
+# 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 ea2dd5a9..17eabbb3 100644
--- a/2021/info/news-schedule.md
+++ b/2021/info/news-schedule.md
@@ -1,15 +1,35 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 5 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/news">/2021/talks/news</a>
+[[!toc ]]
+Q&A: answering after the conference
+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.
+
+[[!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-nav.md b/2021/info/nongnu-nav.md
index a7325174..4b054ec0 100644
--- a/2021/info/nongnu-nav.md
+++ b/2021/info/nongnu-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a>
+Previous: <a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a>
Next: <a href="/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a>
diff --git a/2021/info/nongnu-schedule.md b/2021/info/nongnu-schedule.md
index 74e71a21..e0faeac9 100644
--- a/2021/info/nongnu-schedule.md
+++ b/2021/info/nongnu-schedule.md
@@ -1,15 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 6:28
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/nongnu">/2021/talks/nongnu</a>
+# Description
diff --git a/2021/info/nyxt-nav.md b/2021/info/nyxt-nav.md
index b9268f37..5900f8ec 100644
--- a/2021/info/nyxt-nav.md
+++ b/2021/info/nyxt-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a>
-Next: <a href="/2021/talks/design">On the design of text editors</a>
+Next: <a href="/2021/talks/dev-update">Emacs development updates</a>
diff --git a/2021/info/nyxt-schedule.md b/2021/info/nyxt-schedule.md
index 644430df..0b4003b3 100644
--- a/2021/info/nyxt-schedule.md
+++ b/2021/info/nyxt-schedule.md
@@ -1,15 +1,20 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: IRC or Etherpad
+Duration: 8:26
-Waiting for confirmation from the speaker(s)
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/nyxt">/2021/talks/nyxt</a>
+# Description
diff --git a/2021/info/omegat-nav.md b/2021/info/omegat-nav.md
index d021dacf..13d1bf25 100644
--- a/2021/info/omegat-nav.md
+++ b/2021/info/omegat-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/unix">"GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer"</a>
-Next: <a href="/2021/talks/nongnu">NonGNU ELPA Update</a>
+Previous: <a href="/2021/talks/frownies">The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability</a>
+Next: <a href="/2021/talks/unix">GNU's Not UNIX: Why Emacs Demonstrates The UNIX Philosophy Isn't Always The Only Answer</a>
diff --git a/2021/info/omegat-schedule.md b/2021/info/omegat-schedule.md
index 7fa0a17a..5d2312d0 100644
--- a/2021/info/omegat-schedule.md
+++ b/2021/info/omegat-schedule.md
@@ -1,15 +1,23 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A / IRC / pad
+Duration: 9:07
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/omegat">/2021/talks/omegat</a>
+# Description
diff --git a/2021/info/org-outside-schedule.md b/2021/info/org-outside-schedule.md
index 1ab76033..eabc3e85 100644
--- a/2021/info/org-outside-schedule.md
+++ b/2021/info/org-outside-schedule.md
@@ -1,15 +1,27 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 12:09
-Waiting for confirmation from the speaker(s)
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/org-outside">/2021/talks/org-outside</a>
+
+# 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-nav.md b/2021/info/pattern-nav.md
new file mode 100644
index 00000000..bcd8c1bc
--- /dev/null
+++ b/2021/info/pattern-nav.md
@@ -0,0 +1,3 @@
+Back to the [[schedule]]
+Previous: <a href="/2021/talks/montessori">Emacs and Montessori Philosophy</a>
+Next: <a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a>
diff --git a/2021/info/pattern-schedule.md b/2021/info/pattern-schedule.md
new file mode 100644
index 00000000..8ac855cc
--- /dev/null
+++ b/2021/info/pattern-schedule.md
@@ -0,0 +1,33 @@
+<!-- Automatically generated by conf-create-info-pages -->
+
+[[!toc ]]
+Q&A: IRC
+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.
+
+[[!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 3a7e5a61..c86ca03c 100644
--- a/2021/info/professional-schedule.md
+++ b/2021/info/professional-schedule.md
@@ -1,15 +1,19 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 10:33
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/professional">/2021/talks/professional</a>
+# Description
diff --git a/2021/info/project-nav.md b/2021/info/project-nav.md
index f519f4c7..a7234abc 100644
--- a/2021/info/project-nav.md
+++ b/2021/info/project-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a>
-Next: <a href="/2021/talks/invoice">Find Your (In)voice: Emacs for Invoicing</a>
+Previous: <a href="/2021/talks/invoice">Finding Your (In)voice: Emacs for Invoicing</a>
+Next: <a href="/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a>
diff --git a/2021/info/project-schedule.md b/2021/info/project-schedule.md
index 26e78b0b..bea8f069 100644
--- a/2021/info/project-schedule.md
+++ b/2021/info/project-schedule.md
@@ -1,15 +1,32 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 10 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/project">/2021/talks/project</a>
+[[!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.
+
+[[!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-nav.md b/2021/info/research-nav.md
index 7ed45ce5..b33750bc 100644
--- a/2021/info/research-nav.md
+++ b/2021/info/research-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/teach">Using Org-mode to teach programming</a>
-Next: <a href="/2021/talks/babel">Babel for academics</a>
+Previous: <a href="/2021/talks/babel">Babel for academics</a>
+Next: <a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a>
diff --git a/2021/info/research-schedule.md b/2021/info/research-schedule.md
index e376ae83..0513a189 100644
--- a/2021/info/research-schedule.md
+++ b/2021/info/research-schedule.md
@@ -1,15 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 5 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/research">/2021/talks/research</a>
+[[!toc ]]
+Q&A: maybe live
+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.
+
+[[!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/rust-nav.md b/2021/info/rust-nav.md
index 1889f745..5466829e 100644
--- a/2021/info/rust-nav.md
+++ b/2021/info/rust-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/ui">"Yak-shaving to a UI framework" (/"Help! I accidentally yak-shaved my way to writing a UI framework because overlays were slow")</a>
-Next: <a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a>
+Previous: <a href="/2021/talks/devel">Don't write that package! or: How I learned to stop worrying and love emacs-devel</a>
+Next: <a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a>
diff --git a/2021/info/rust-schedule.md b/2021/info/rust-schedule.md
index 9a4cb61e..714d33ef 100644
--- a/2021/info/rust-schedule.md
+++ b/2021/info/rust-schedule.md
@@ -1,15 +1,10 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+Q&A: talk cancelled
+Status: Cancelled
+Duration: 20 minutes
-Waiting for speaker to send prerecorded video
-# Schedule
-
-Allocated 20 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/rust">/2021/talks/rust</a>
+# Description
diff --git a/2021/info/structural-nav.md b/2021/info/structural-nav.md
index bf8f4de3..36d0ed3e 100644
--- a/2021/info/structural-nav.md
+++ b/2021/info/structural-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/faster">How to write faster Emacs Lisp</a>
-Next: <a href="/2021/talks/dsl">Self-Describing Smart DSL's: The Next Magits</a>
+Previous: <a href="/2021/talks/faster">Optimizing Emacs Lisp Code</a>
+Next: <a href="/2021/talks/ui">Yak-shaving to a UI framework</a>
diff --git a/2021/info/structural-schedule.md b/2021/info/structural-schedule.md
index 9c77201f..1bd2d149 100644
--- a/2021/info/structural-schedule.md
+++ b/2021/info/structural-schedule.md
@@ -1,15 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live
+Duration: 10:24
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/structural">/2021/talks/structural</a>
+
+# 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-nav.md b/2021/info/teach-nav.md
index 2be2135c..6f69846e 100644
--- a/2021/info/teach-nav.md
+++ b/2021/info/teach-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
Previous: <a href="/2021/talks/org-outside">The use of Org mode syntax outside of GNU/Emacs</a>
-Next: <a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a>
+Next: <a href="/2021/talks/babel">Babel for academics</a>
diff --git a/2021/info/teach-schedule.md b/2021/info/teach-schedule.md
index 70d6c2c7..3159ab62 100644
--- a/2021/info/teach-schedule.md
+++ b/2021/info/teach-schedule.md
@@ -1,15 +1,28 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 20:49
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 20 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/teach">/2021/talks/teach</a>
+
+# 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 19304c4e..397c0e10 100644
--- a/2021/info/tech-schedule.md
+++ b/2021/info/tech-schedule.md
@@ -1,15 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or IRC
+Duration: 10:22
-Waiting for speaker to send prerecorded video
+[[!inline pages="internal(2021/inline-alternate)" raw="yes"]]
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/tech">/2021/talks/tech</a>
+
+# 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-nav.md b/2021/info/telega-nav.md
index a9519ad2..5ae45d7b 100644
--- a/2021/info/telega-nav.md
+++ b/2021/info/telega-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/borg">Manual Package Management in The Era of Repositories - Why and How</a>
-Next: <a href="/2021/talks/nangulator">Introducing N-Angulator</a>
+Previous: <a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a>
+Next: <a href="/2021/talks/janitor">A day in the life of a janitor</a>
diff --git a/2021/info/telega-schedule.md b/2021/info/telega-schedule.md
index e417ef4c..633faf90 100644
--- a/2021/info/telega-schedule.md
+++ b/2021/info/telega-schedule.md
@@ -1,15 +1,19 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: after the conference
+Duration: 7:58
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 10 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/telega">/2021/talks/telega</a>
+# Description
diff --git a/2021/info/test-nav.md b/2021/info/test-nav.md
index d84330c1..387ab000 100644
--- a/2021/info/test-nav.md
+++ b/2021/info/test-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/form">Old McCarthy Had a Form</a>
-Next: <a href="/2021/talks/bug">Let's talk about bug trackers</a>
+Previous: <a href="/2021/talks/bindat">Turbo Bindat</a>
+Next: <a href="/2021/talks/bidi">Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware</a>
diff --git a/2021/info/test-schedule.md b/2021/info/test-schedule.md
index a3cbe305..e5c0b9b0 100644
--- a/2021/info/test-schedule.md
+++ b/2021/info/test-schedule.md
@@ -1,15 +1,19 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: IRC
+Duration: 6:04
-Waiting for speaker to send prerecorded video
-# Schedule
+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.
-Allocated 5 minutes
+[[!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)
+"""]]
-
-Friendly URL: <a href="/2021/talks/test">/2021/talks/test</a>
+# Description
diff --git a/2021/info/ui-nav.md b/2021/info/ui-nav.md
index 6ec7a2c7..a400cea8 100644
--- a/2021/info/ui-nav.md
+++ b/2021/info/ui-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/dsl">Self-Describing Smart DSL's: The Next Magits</a>
-Next: <a href="/2021/talks/rust">Extending Emacs in Rust with Dynamic Modules</a>
+Previous: <a href="/2021/talks/structural">Tree-edit: Structural editing for Java, Python, C, and beyond!</a>
+Next: <a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a>
diff --git a/2021/info/ui-schedule.md b/2021/info/ui-schedule.md
index c3fa206b..c01ea6e1 100644
--- a/2021/info/ui-schedule.md
+++ b/2021/info/ui-schedule.md
@@ -1,15 +1,29 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
+[[!toc ]]
+Q&A: live Q&A or Etherpad
+Duration: 9:28
-Waiting for confirmation from the speaker(s)
-# Schedule
+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.
-Allocated 10 minutes
+# 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)
+"""]]
-Friendly URL: <a href="/2021/talks/ui">/2021/talks/ui</a>
+
+# 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-nav.md b/2021/info/unix-nav.md
index 3acaafd1..d6905af2 100644
--- a/2021/info/unix-nav.md
+++ b/2021/info/unix-nav.md
@@ -1,3 +1,3 @@
Back to the [[schedule]]
-Previous: <a href="/2021/talks/adventure">Choose Your Own (Technology-Enhanced Learning) Adventure</a>
-Next: <a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a>
+Previous: <a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a>
+Next: <a href="/2021/talks/montessori">Emacs and Montessori Philosophy</a>
diff --git a/2021/info/unix-schedule.md b/2021/info/unix-schedule.md
index 6a8e311e..7c8e0715 100644
--- a/2021/info/unix-schedule.md
+++ b/2021/info/unix-schedule.md
@@ -1,15 +1,46 @@
<!-- Automatically generated by conf-create-info-pages -->
-# Status
-
-Waiting for speaker to send prerecorded video
-
-# Schedule
-
-Allocated 10 minutes
-
-
-
-Friendly URL: <a href="/2021/talks/unix">/2021/talks/unix</a>
+[[!toc ]]
+Q&A: live
+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.
+
+# 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
new file mode 100644
index 00000000..22257c05
--- /dev/null
+++ b/2021/inline-alternate.md
@@ -0,0 +1 @@
+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 c3d89222..0a29043f 100644
--- a/2021/meetings.org
+++ b/2021/meetings.org
@@ -18,7 +18,9 @@
- Tech
- Figuring out a better streaming workflow (speakers & OBS)
- CDN with Nate Sales: mplsCorwin, bandali
- - Stand-by until late-April
+ - maybe also FTP upload for speakers
+ - Stand-by for now
+ - Separate from Fosshost
- Documenting our infrastructure
- bandali and gopar's podcast: bandali, gopar
@@ -73,6 +75,7 @@
- EmacsConf 2022 and onwards
This entry is mostly for points we cannot address for EmacsConf 2021 (for lack of time), but that we’d still like to track for the future.
+ - We have plenty of lessons learned in conf.org. :)
- Improving the review process
- Involving the public (i.e. doing it publicly)
- Involving more communities
@@ -93,15 +96,479 @@
- We should make it easier for other people to edit the conf.org for publishing the schedule; for 2021, sachac and zaeph were able to do it, but we should make it more our functions more robust.
- Add edit-in-place functionality to ikiwiki
- An alternative would be to enable push-via-https, but bandali isn’t enthused by it.
+ - Move the video-files to one of our FH server.
+ - We could have an alternate stream for captioned talks
+ - For 2021, we can just direct people to watching the talks from the talk-page.
+ - Working with BBB
+ - We could suggest some improvements to BBB based on our needs. Plenty of FLOSS projects rely on BBB, and I think it’d be fair to make some suggestions to them.
+ - Possible suggestions:
+ - Presentation layouts (based the CSS provided by bandali’s FSF colleague)
+ - Figuring out a better way to collate audio streams (normalisation, codecs)
- EmacsVerse
- Vet Mailman and exim instance for usergroups: bandali
+ - Figure out the interactions between (potential) emacsverse.org and emacs.org
+ - It’s about control domains and sources of truth
- Misc
- Writing about Emacs: zaeph
- mplsCorwin's livestreaming project, working on trimming
- Diversity outreach: gopar, sachac, zaeph, mplsCorwin
+* 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:
+ - sachac:
+ - Doing good!
+ - bandali:
+ - Doing better!
+ - zaeph:
+ - Doing good!
+
+- Dry run, see playbook.org
+ - DONE Working together via upcoming.org
+ - DONE Streaming [[https://live0.emacsconf.org/main.webm][main.webm]]
+ - DONE Streaming [[https://live0.emacsconf.org/main-480p.webm"][main-480p.webm]]
+ - CXLD Streaming [[https://live0.emacsconf.org/alt.webm"][alt.webm]]
+ - Doesn’t really work for corwin because of some weird setting problem
+ - STRT Streaming to YouTube
+- Next actions:
+ - streaming to alternate servers (youtube, toobnix)
+ - add 2021 link to all the schedule and talk pages so that people know how to watch/participate
+
+- media.emacsconf.org files will be moved to a mirror eventually
+
+(A lot of the work in this session was done in another file, which is why we have very little note here. What we’ve done will eventually end up in the wiki.)
+
+* November 13, 2021
+
+- TODOs/agenda: (two weeks to conference!)
+ - Status review of schedule, possibly follow up with day 2 (lots of missing talks)
+ - Lunch time is tight, want to end at 5:30 instead? (12:05-12:30 Sat, 12:06-12:40 Sat)
+ - Lunch time is tight, want to end at 5:30 instead?
+ - might be late for Leo, let's stick with the current schedule
+ - Sacha: Publish detailed schedule
+ - Get in touch with speakers regarding schedule, check-in 30 minutes before
+ - streaming process: Amin streams whatever room he's in, then switches to the next room? lots of sound checks for Amin, but it'll be fine
+ - OBS scenes for streaming prerec separately from whatever Amin is actually doing
+ - Hosting: zaeph to review the talks and think about the introductions
+ - Start working on list of speakers expected for live Q&A or live presentation? Actually, we'll want all the speakers to check in if available anyway, since we want to mention IRC/etherpad availability
+ - zaeph: Figured out MPV setup for open captions, yay! Will post the MPV profile so that we can all have fun with it.
+
+ - sachac: Figure out day-of publishing
+ - Will try to post prerecs on media.emacsconf.org, wiki pages, and YouTube during talk; ToobNix? bandali will send sachac the account information and then sachac can queue things up for publishing
+ - redirect to proper host if node is too small afterwards
+ - audio normalized
+ - Dry run next weekend?
+ - Rooms
+ - Streaming
+ - Script for low-res, YouTube
+ - Check-in
+ - Alternate stream?
+ - Alternate stream
+ - bandali will test things around with dragestil
+ - test Etherpad template: https://etherpad.wikimedia.org/p/emacsconf-2021-test
+ - conference schedule updater
+ - are we going to use honorifics like Dr.? zaeph - no
+- Tech-checks
+ - We’ve got two extra volunteers
+ - Considering that none of the speakers but one wanted to do tech-check so far
+- Other notes
+ - Sacha: checked IRC scripts, everything still seems fine
+ - https://github.com/emacsconf/emacsconf-el - zaeph to try
+ - TODO bandali: figure out how to deal with the back behaviour!
+ - xdg-open actually works in opening an URL without a preceding one
+ - MOSTLY-DONE :)
+ - Profiles for captions
+ - Figure out day-of publishing
+ - We should articulate the process on the pre-rec with updating the talk-pages on the wiki.
+ - On captions
+ - We’ve captioned most of the org talks on Saturday, yay!
+ - Considering how many recordings
+ - On talks we’ve already received
+ - Frownies might get re-submitted.
+ - Lunch time is tight, want to end at 5:30 instead? (12:05-12:30 Sat, 12:06-12:40 Sat)
+ - We’ll keep it to 5:30pm latest, since it gets quite late for.
+ - Handling check-ins for speakers
+ - sachac and zaeph
+ - 30 min before is less stressful for us
+ - 4-5 rooms need to be created on BBB
+
+- Summary of actions
+ - sachac:
+ - Publish schedule to the public wiki
+ - zaeph can take this information afterwards to figure out what to email to the speakers
+ - Figure out workflow for publishing prerecs on the day of the presentation
+ - It’ll be nice to have one command and have everything happen in the background
+ - Doublecheck ffmpeg commands for low-res, YouTube restreams
+ - Scrape pronunciations and pronouns from wiki pages / email, put them into conf.org (:PRONOUNS: and :PRONUNCIATIONS:)
+ - zaeph will take care of updating :PRONUNCIATIONS: when he receives email
+ - Modify scripts to msg bandali and zaeph with check-in info, include pronouns and pronunciation
+ - zaeph:
+ - Draft e-mail to ask speakers to check schedule, check again day of the conference if live, check in 30 minutes before their session, collect emergency contact information
+ - Re: ICE; figure out a workflow for storing/accessing the data (GPG, etc.)
+ - Draft general announcement e-mail for schedule, ICS
+ - Include MPV profile in conf.org so that bandali and dragestil can try it out
+ - Next week: Keep answering emails, Update talk pages/conf.org with extra info, Review talks, think about introductions
+ - Create BBBB rooms A, B, C, D for check-ins, and share rights with bandali and sachac
+ - bandali:
+ - send sachac Toobnix credentials which is tied to the one with EmacsConf
+ - look into BBB layout options from FSF colleague, and test how robust it is
+ - As long as it doesn’t do anything crazy (like covering the video), it’s fine
+ - coordinate with alternate streamers
+ - Figure out if chat.emacsconf.org can support URL-append to connect to #emacsconf-org for speakers
+ - corwin:
+ - OBS chores
+ - update graphics for 2021
+ - save out a "clean" set of scenes
+ - Create a 6 sec video
+ - Test Push to IceCast
+ - Dig logs from Bandali from bouncer
+ - If he had to do a talk for EmacsConf, a clever idea he had would be ‘Using org-mode to create an impromptu talk, and do a head-first recording approach’
+
+* November 6, 2021
+- Check-ins
+ - zaeph is dealing with TZ change
+
+- TODOs:
+ - Everyone:
+ - [X] Get working on contribute.md by Tue-Wed
+ - Non-exhaustive list of tasks to mention (relevant for this year):
+ 1. Editing captions or writing new ones
+ 2. Helping with tech-checks
+ 3. Looking at the schedule, and if there’s something they particularly like, they could run get ready for a prolonged Q&A session
+ - bandali:
+ - [X] ASAP: Give SSH access to sachac on ftp-upload@emacsconf.org
+ - Ping corwin to get another distro installed on vm02 (possibly Trisquel or Alpine)
+ - [X] Look into making TLS/SSL optional
+ - sachac: Right now, the configuration for the ftp server forces it.
+ - bandali is looking into FTP for resume, no worries about being able to see filenames (not allowed to download files)
+ - probably no risk from other people maliciously "resuming" other people's files
+ - ideas for the future:
+ - can have speaker accounts for FTP (... maybe if Amin gets the hang of automating e-mails =) )
+ - region servers to upload to, maybe as part of CDN project
+ - TODO enable continuation for FTP
+ - Fosshost: Drop an application for another storage-server for the prerecs
+ - zaeph:
+ - [X] ASAP: Email designated volunteers
+ - Create BBB accounts for new tech-checkers
+ - Publicise contribute.md on r/emacs when it’s published
+ - Make a pinned comment on the program announcement asking for volunteers, linking to contribute.md, and maybe keeping it up to date by editing it to reflect current needs
+ - corwin:
+ - Record a 6-second video ad
+ - Go through the script together
+- sachac: Status update: 9 prerecs received
+ - 7 talks captioned
+ - Emacs News Highlights
+ - NonGNU ELPA Update
+ - telega.el and the Emacs community on Telegram
+ - Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide (thanks bhavin!)
+ - The use of Org mode syntax outside of GNU/Emacs - checked with speaker
+ - How Emacs made me appreciate software freedom
+ - Moldable Emacs, a step towards sustainable software - checked with speaker
+ - 2 more talks waiting for captions from bhavin:
+ - Using Org-Mode For Recording Continuous Professional Development
+ - Emacs with Nyxt: extend your editor with the power of a Lisp browser
+ - Compressed with q=56 script from last year, uploaded to front:/var/www/media.emacsconf.org/2021/protected , see private wiki for password
+ - Things to consider:
+ - Broadcast with open captions or direct people who need closed
+ captions to the wiki page? Spam #emacsconf-accessible with
+ caption text?
+ - Sample: https://emacsconf.org/2021/talks/news/
+ - Compression okay? Do we need to dial it back?
+ - Plan for handling compression for the talks coming in this weekend; can we run it on the VM?
+ - Audio normalization?
+ - Low-res version?
+ - More proof-reading welcome
+ - Start thinking about workflow for publishing talks, maybe even concurrently with the stream
+ - No reason not to make them public right away, so if we want them to be available on something else in addition to emacsconf.org and Youtube (Toobnix?), we can plan ahead
+- TODO bandali also, icecast fallback override possibility so that bandali might be
+ able to use ffmpeg to broadcast directly to icecast while handling
+ continuity? Does anyone want to experiment with that?
+- does anyone want to write an ICS to Org thing that can handle
+ schedule updates, maybe taking advantage of icalendar?
+- pronouns/website/sponsor info can probably be an e-mail to speakers
+- e-mail to send on the deadline (tomorrow)
+ - reminder to send it
+ - let's use a carrot approach, not stick (10 talks have already been submitted, yay, and most of them have been captioned!); we're actually okay with dealing with prerecs or live on the day of the event
+ - nudge script submission esp. close to the deadline to help with captions
+- publishing the schedule with the times, ICS; maybe Nov 14?
+ - probably can do even with the uncertainty
+- 10 minutes hard to do live (or record); 15 min next time?
+- maybe postpone letting people plan for live presentation until a little bit later
+- future: shorter CFP, longer prep period
+
+#+begin_example
+Hello, ____!
+
+,* TODO [#A] Send pre-recording to EmacsConf
+
+Lots of speakers have already submitted their talks for EmacsConf
+2021, and we've even be able to caption them. Yay! Here are some of
+the presentations that have already come in:
+
+ - Emacs News Highlights
+ - NonGNU ELPA Update
+ - telega.el and the Emacs community on Telegram
+ - Creating technical API documentation and presentations using org-babel, restclient, and org-treeslide
+ - The use of Org mode syntax outside of GNU/Emacs
+ - How Emacs made me appreciate software freedom
+ - Moldable Emacs, a step towards sustainable software
+
+We're looking forward to getting your presentation. If you send it in
+as soon as you can, we can add it to the queue for captioning. We'd
+like to stream as many talks with captions to make things more
+accessible, and the text makes it easier to search too. Also, sending
+the prerecorded video will make the conference day less stressful for
+everyone. =) If you need extra time to get your prerecorded video, no
+worries, we'll figure it out somehow. Please try to do it as soon as
+you can!
+
+,* TODO Send page information (name pronunciation, pronouns, homepage, contact, sponsor links)
+
+We'd also like to add some standard information to the talk
+information page to make it easier for people to talk about your talk,
+find more information, contact you, or support you.
+
+Name pronunciation:
+Pronouns:
+Homepage:
+Preferred contact info:
+Links for sponsoring/supporting (if any):
+
+For example, Sacha's is:
+
+Name pronunciation: SA-sha CHEW-ah
+Pronouns: she/her
+Homepage: https://sachachua.com
+Preferred contact info: sacha@sachachua.com
+Links for sponsoring/supporting (if any):
+
+,* TODO Plan tech check if you're doing live Q&A
+
+Also, if you are planning to do live Q&A and you've already done the
+tech check at test.bigbluebutton.org, we can set up a tech check call
+with an organizer or volunteer. Sometimes there are technical issues
+with sharing desktops or hearing audio, so it's good to get it sorted
+out as soon as possible. Please check _____ for some options for a
+live tech check and reach out to someone who's available when you are.
+We hope to get more volunteers for tech checks, so if you can't find
+someone whose availability matches yours, please e-mail us at _____
+and we'll try to find something that works.
+
+,* Also, sneak preview of talks =)
+
+As a thank-you for working on a talk for EmacsConf, here's a sneak
+preview of the talks that have been submitted so far. Please don't
+share it widely. If you want to refer to other people's talks in
+yours, it's a good time to check out related talks!
+
+(TODO - info not in here)
+
+Thank you so much!
+
+Amin
+#+end_example
+
+---
+TODO Sneak preview e-mail for people who have already submitted
+
+
+---
+- Also do we want to give speakers early access to each other's talks?
+ - OK, ask them not to share yet
+- ffmpeg installed on FTP upload
+- TODO bandali to check compressed video and see if we want to change the settings
+- TODO: Sacha - Make Etherpad template for speakers? Actually, e-mail might be easier to copy and paste from
+ - Name pronunciation
+ - Pronouns
+ - Links
+ - Homepage, socials
+ - Sponsor
+- TODO: Sacha - send bandali Bcc list for nudge e-mails
+- How many people did we do live tech checks last year?
+- zaeph will not be very available.
+- TODO maybe seabass? zaeph will e-mail.
+- publicize contribute page to the mailing list? and stress the need for tech checkers
+- TODO sachac: add current captioning results
+- Future: bake it into the submission process (when will be a good time over the next 1-2 months)
+- If we don't have enough people to do the tech checks, Leo will step up and maybe do some kind of office hours thing
+- Process:
+ 1. E-mail the volunteers
+ 2. Update the table on the page
+ 3. If anyone wants to get started now, you can e-mail us
+- BBB slide presentation feature broken, may be related to LetsEncrypt, can't leave messages on the screen; probably won't need it for EmacsConf
+- DECISION Yes, broadcast open captions; published videos can be CC
+- TODO zaeph will come up with the MPV settings for displaying open captions
+- EmacsConf: friendly and relaxed =)
+
+- Summary
+ - #A zaeph: Set up tech check information, e-mail volunteers
+ - #A zaeph: Finish draft of e-mail for tomorrow or the day after
+ - zaeph: Figure out mpv settings
+ - bandali: Check video settings, see if we need to tweak compression/audio
+ - sachac: Keep captioning
+
+* October 30, 2021 meeting
+
+- Check-ins
+ - sachac:
+ - Using Emacs itself to record her talk, and has even managed to get a spectrum analyser right into it!
+ - [[https://github.com/sachac/subed-waveform][sachac/subed-waveform: Minor mode for displaying the waveform for the current subtitle in an Emacs subed-mode buffer]]
+ - bandali:
+ - Busy with the emails and around GNU in general
+ - Almost finished with a paper building on parts of his MA dissertation
+ - Last week’s presentation went well despite some minor hiccups
+ - It was a *long* session, so a 5-min break can be glossed over
+ - zaeph:
+ - All is well! A lot of swimming and fun experimentations!
+ - corwin:
+ - Pretty rested!
+ - Lots of stuff brewing with Fosshost
+
+- FTP:
+ - sachac: Where can I find the recordings?
+ - If we get talks early, we might get started on the subtitling
+ - bandali: Tried to setup the 2nd upload server
+ - Couldn’t get it to work; the same configuration on front0 for testing was working, but not onl
+ - The FSF sysadmins gave us access to a session/server which we might use as replacement
+ - sachac: Where can we keep the talks on front0?
+ - Reasoning:
+ - Last year, one of the issue that th epeople who had missed a talk wished they could have watched it
+ - Whilst the prerec is playing on the stream, we could put in a public directory to be able to watch it
+ - It’d be amazing if we could get the recordings ASAP this year, since most of them will be prerecs
+ - People need to be uploading files to the very server that we will be storing them on.
+ - Discussion:
+ - bandali: The main VMs that we have (live0 and front0) are fairly small, 20-25GB each. What we’ve been doing for the past couple EmacsConf has been to upload to a server provided Computer Science of the University of Waterloo
+ - Options:
+ - Fosshost
+ - corwin: Disk-space comes super-cheap to Fosshost, which means that it might be a good option.
+ - Could become our primary source (vs. CS Club which we use currently)
+ - CS Club (University of Waterloo); we might not have it eternally
+ - At the moment, it is our primary source
+ - We can still use it as a mirror
+ - audio-video.gnu.org (FSF)
+ - yang’s 2 mirrors in Europe
+ - Other options that we might consider for other editions:
+ - Justification:
+ - corwin: The footprint of EmacsConf will always grow as long as we maintain older publications for posterity, even if the grow is fairly linear.
+ - Linode block storage
+ - 1$/month for 10 GB
+ - corwin’s favourite provider
+ - Meta:
+ - Having 3 ISP is better than having 2
+ - From a growth perspective, it’s good to have some cash outlay to help people understand that we have a need for money
+ - This also appeared with the android-app
+ - Other considerations
+ - Using emacsconf.org for redirections
+ - bandali: Someone set up two mirrors for us in Europe; it’d be nice to have mirror-resolve/-rotator that we could put in front to do the redirecting
+ - sachac: That would put more sysad work on bandali, though
+ - How do we handle the private→public publishing of the recording?
+ 1. Upload all the files to the public server
+ 2. chmod o-r on all the talks
+ 3. When a talk goes live: chmod o+r
+ - Handling redirections à la CDN
+ - bandali:
+ - We might want to add A records pointing to all the servers that we’re using as mirrors (in a round-robin fashion)
+ - GNU might have solutions
+
+- Asking new domains to the FSF sysadmins, especially on .emacs.org
+ - Have we considered having a .gnu.org domain linking to emacs.org?
+ - conf.emacs.org could be very nice for visibility.
+ - corwin: Could we do the same with orgmode.org?
+ - Imagine if the org-mode website had a featured talk from the EmacsConf!
+ - corwin: Once the relationship exists between emacs.org and orgmode.org, a lot of bridges can be built between the communities with mutual benefits
+
+- Alternate streams & Rebroadcasts
+ - APAC:
+ - sachac: As the prerecs come in, we can touch base with dragestil re: APAC event
+ - Other streamers:
+ - sachac: These next few weeks are also the best time to onboard alternate streamers
+ - corwin: Our must important work right now is bringing more talents/newcommers, and get them to the level where they feel technically-competent and empowered to help us further.
+
+- How to get new organisers involved as well they could be with the project?
+ - Doing tech-checks is a pretty good and easy to get started with volunteers.
+ - sachac: When we activate the other volunteers, what should we be asking them to consider? *Ordered by priority*, and which we should mention on the ~contribute.md~:
+ 1. Editing captions or writing new ones
+ 2. Helping with tech-checks
+ 3. Looking at the schedule, and if there’s something they particularly like, they could run get ready for a prolonged Q&A session
+ - sachac: We might have a ~contribute.md~ page similar to the prepare.md page
+ - We should link from /2021 to /2021/contribute.md.
+ - Also, other people who could come across it rather than just our current volunteers.
+ - corwin: ~contribute.md~ is the invitation, and the ~prepare.md~ is the directions to the party.
+ - How do we publicise this contribue.md?
+ - zaeph: Could we publicise contribute.md on r/emacs
+ - corwin: Yes! It’s a great piece of promotion to do.
+ - bandali: It might make sense to mention contribute.md to speakers
+ - Our next email to speakers should link to contribute.md
+
+- Tech-checks
+ - Getting organisers on board with tech-checks
+ - Which new volunteers could be bring along on this project?
+ - acdw (AM)
+ - dragestil (APAC)
+ - bhavin192 (APAC)
+ - seabass (EU)
+ - zleap (EU)
+ - ullbeking (?)
+ - zaeph (EU)
+ - corwin (AM)
+ - ???
+ - bandali (AM)
+ - Putting the finishing touches on the checklist
+ #+begin_quote
+ - Would you please share your pronouns?
+ - Can you tell us how to pronounce your name?
+ - Can you speak and be heard? Is there echo?
+ - Can you hear the organizer (me)?
+ - Can you share your screen? Is the screen readable?
+ - If you plan to show your keystrokes, is that display visible?
+ - If you want to share your webcam (optional), can you enable it? Is it visible? Will there likely be distractions in the background?
+ - Can you view the collaborative pad? Will you be comfortable reviewing questions on your own (perhaps by keeping it open beside your shared window), or will you need a volunteer to relay questions to you?
+ - Can you share contact information (ex: phone number) so that we can get in touch with you in case of technical issues or scheduling changes?
+ - Do you need help finding your way around IRC so that you can check into `#emacsconf-org`? What is your IRC nickname?
+ #+end_quote
+
+- What to mention in our closing remarks
+ - Acknowledging volunteers
+ - Inviting other volunteers
+ - Alternate streams / Multiple tracks
+
+
* October 23, 2021 meeting
- TODO
@@ -1710,7 +2177,8 @@ Which again could be somewhere to promote emacs / emacs conf
- mplsCorwin: Talk with Nate Sales
- We want to talk with Nate Sales about CDN stuff
- mplsCorwin will be asking Nate Sales to come again on [2021-05-01 Sat]
-
+ - Also to be used for FTP uploads
+
- mplsCorwin update on FH
- mplsCorwin is mentioning that we might get another server to handle
- Depending on the location
@@ -2887,3 +3355,415 @@ rganising the names on that page in a more relevant fashion?
pad, for e-mailing out?
- Braindumps welcome =)
- Week after: public meeting/recording
+* Some notes from the debrief after last year's conference
+Proceedings:
+
+** On tech
+*** Observations
+- BBB worked better than last year's Jitsi. It was nice to be able to set up several moderators and have consistent URLs. This year's Jitsi
+ seemed more polished than last year's Jitsi, so maybe they've resolved their technical issues, but it was still nice to have a reliable host.
+- amin generally happy. Leo ran into technical difficulties with BBB, also some speakers may have had Internet connectivity issues or BBB issues
+- gstreamer seemed to hold up fine; might want to figure out how to switch scenes or send only the BBB audio
+ - amin: Very nice, happy about that, gstreamer not as harsh on laptop.
+- low-res stream was handy, and running the ffmpeg command on live0 was fine
+ - amin: Super happy about that
+- Audio check with a decibel meter was great (sachac)
+- ffmpeg splitting had an i-frame issue when using -c:v copy:
+ https://superuser.com/a/704118 and
+ https://trac.ffmpeg.org/wiki/Seeking#Seekingwhiledoingacodeccopy
+ - https://etherpad.wikimedia.org/p/7XrMLmwLBQ0mp2RQ8S6l - technical
+ notes, looks like we can adjust -ss to the keyframes that happen
+ every 4 seconds in the captured stream
+- karl: BBB doesn't audio-level as well as other platforms. bandali
+ was loud, zaeph is not as loud, need to manually adjust. Other web
+ conference platforms handle it better.
+ - zaeph: BBB seems to aggressively add gain. Video fairly
+ low-quality when viewing both webcam and screensharing, probably
+ lost a lot of pixels. Recording quality is not that great, big
+ quality difference compared to prerecs.
+ - Might need to be more active shifting between webcam+screenshare and just screenshare.
+ - OBS can stream with picture-in-picture, maybe, but a burden for live presenters if there are too many technical hoops
+ - Cheese etc. can display their webcam while they're sharing their desktop
+ - BBB didn't handle multi-monitor sharing desktops well - one of the presenters couldn't share just one monitor's desktop
+ - Bit wasteful use of screen real estate. Jitsi might do it better.
+ - Focusing on speaker webcam during Q&A might help.
+*** Improving
+- Can test improvements throughout the year instead of waiting for next conference
+- System audio out isn't captured by BBB. Maybe presenters can set up a virtual audio loopback device and test during the tech check?
+- Play intermission audio from Emacs, naturally ;)
+- Normalize audio for prerecs?
+ - We could also use a compressor on all the ones which are 'voice-only' (i.e. not those with music/video in them)
+- Re: decibel meter, it might have been even better to use PulseEffects which would have allowed bandali to apply auto-gain and a limiter to the sound output of selected apps on his sytems (mpv & FF for BBB). ( https://github.com/wwmm/pulseeffects )
+ - In my experience, it very rarely misbehave.
+ - It could also save us the trouble of applying gain to the talks which happened live.
+- Make sure I've copied the right low res command line into my notes, and test it again
+- Start streaming even earlier if possible, so that there's plenty of room to stress out about mirroring, update the status page, etc.=)
+- Write a script to curl the total live viewers across streams.
+ - I prototyped something during the breaks, but gave up halfway because making it with scrapy would have been much faster than what I'd been doing.
+ - live0.emacsconf.org tracked peak viewers, so it was fine to not worry too much about it
+- Find a better solution for streamers to toggle mute/unmute for BBB and the stream
+ - As a temporary backup, I visualised the stream's audio spectrum to make sure that, when bandali was speaking, I could see speech waveforms on the stream.
+ - mpv --config=no --quiet --vo=tct --lavfi-complex='[aid1]asplit[ao][a1];[a1]showwaves=mode=cline:colors=white:rate=25[vo]' "https://live0.emacsconf.org/main.webm" --mute
+- Have an easy command to show local time.
+ - On GNU/Linux:
+ - watch TZ=America/New_York date
+ - http://www.tmzns.com/ looks nice but it doesn't understand "UTC" as a time-zone and you need to find a matching city
+- If we find a way to publicly serve the icecast dump, I wonder if we can make it quickly viewable with offsets on the day of, like with videojs-offset, so that people can access quick replays of talks they've missed
+- It might be interesting to have an overlay of time - talk title - speaker name - info page etc., maybe on the bottom of the stream. That way, people tuning in mid-stream can see what's playing. People would need to plan for that in their recording.
+** On emails
+*** Observations
+- bandali struggled a bit getting all the speakers in the Bcc, always seeming to forget some of them.
+*** Improving
+- Create lists.
+- Have one source of truth (in the private wiki), and use that to prepopulate the emails.
+ - TODO sacha: export uniquified list for copying, also do mail merge (maybe based on https://github.com/jkitchin/jmax/blob/master/mail-merge.el )
+ - index.org doesn't contain all the e-mail addresses at the moment. Maybe an org-capture for grabbing the initial submission from the e-mail might be nice in the future.
+** On time-keeping
+*** Observations
+- We managed to stay on schedule throughout the entire conference with minor adjustments.
+ - This was totally surprising because I expected the schedule to be
+ penciled in, given our experience last year with dropped talks and
+ technical issues.
+ - Come to think of it, automatically scheduling all the sessions
+ with some nifty Org code worked great for both planning (do we
+ have enough time for the talks?) and timing on the day of the
+ talk. In 2019, we relied on playing pre-recorded talks with no
+ live Q&A in order to manage our time, playing them ahead when we
+ needed to cover technical issues and sticking all the rest at the
+ end of the conference when we reached the end of the time. In
+ 2020, we actually followed a plan instead of adjusting on the fly,
+ and it was great!
+- Check-ins were done sufficiently in advance (we said 15 minutes, but
+ ~30 min before was nice).
+- Problems with check-in were minimal due to prior tech-checks with
+ the speakers. Thanks to all the people who helped with tech checks,
+ and to Amin's repeated nudges to do tech checks!
+- Small adjustments were pushed when needed.
+- The pre-recorded talks had set durations, which removed variables.
+- zaeph watched time like a hawk.
+- zaeph even called people thanks to the emergency contact information
+ we collected during the tech-checks.
+ - Karl is curious: how often did you call people via phone?
+ - 5 phonecalls total.
+- We allowed for 3 minutes of buffer between talks, which let us juuuuust squeeze in the talks with a little bit of overtime.
+*** Remarks
+- Time-keeping on D1 was good, but on D2, it was great.
+*** Improving
+- More buffer might have been nice for questions, but then we would
+ have had to say no to talks. Switching between talks was smoother
+ last year because bandali used OBS to stream prerecorded videos, so
+ he could join the other conference room while the prerecorded video
+ was playing. But OBS killed his laptop, so that's why he used
+ gstreamer. Maybe we can look into a way for gstreamer or another
+ tool to stream a file while bandali joins the next room? Then we
+ don't have the echo test showing up in the stream, and bandali can
+ more smoothly give the go-ahead off-camera.
+- People had strong fear-of-missing-out despite the heads-up about
+ prerecorded presentations. If we have the opportunity to do so, it
+ might be good to build in more breaks.
+- We can make a list of pre-recs and their durations to avoid bugging
+ Amin all the time. It was challenging for Amin to deal with late
+ pre-rec submissions, but maybe he can stash the submissions on the
+ shared server, or have a shell script that can list all the
+ filenames and times and copy them to a file on the server. He made
+ me a list of prerecs that I could use to quickly check which talks
+ were actually available, so it just needed duration to be perfect.
+- I wonder what an Org command for quickly adjusting timestamps could look like... What would that interface be?
+ - Don't we have a way to shift <...>--<...> timestamps by min ?
+ - Oh, we recalculate the timestamps for all talks based on
+ MIN_TIME properties, actually, so I'm thinking more along the
+ lines of an interactive command that lets me say that [talk]
+ actually started at [time] and then it adjusts all the talks and
+ republishes the schedule files and pushes them. I already have
+ something that goes off the FIXED_TIME property, so I think it's
+ more like a matter of kicking it off with fewer keystrokes and
+ making it part of the talk transition process. And maybe
+ something that sets a QA_START property for the timestamp of the
+ Q&A.
+** On starting early
+ Observations Starting early caused frustration for some people
+ who had written down the times. We had disclaimers, but of
+ course people skipped right over them. =) Explanation Our
+ opening remarks were designed to buffer technical problems, but
+ we didn't have any. Well, I was stressing over the 480p thing,
+ but that wasn't worth holding up the talks. Remarks It's better
+ to be early than late during those events. (Well, maybe...
+ People regret missing out on talks they were looking forward
+ to, but we also don't want to run way past our time.) Improving
+ The problem was addressed live by prepending all the times with
+ ~; we could do the same next year. Since we were great at
+ keeping time this year, we might do away with with the
+ buffering time at the onset. *knocks on wood*
+** On accessibility
+*** Observations
+- jcorneli and dto did an amazing job of describing the talks.
+- jcorneli and dto had to sign off at times, and despite calls for volunteers in #emacsconf, nobody took over.
+*** Improving
+- Get more volunteers on-board beforehand.
+- (possibly) ask volunteers to commit to various morning/afternoon
+ shifts ahead of time so that there is always at least one planned
+ volunteer, but preferably two "on duty". I.e. a simple schedule for
+ volunteers.
+ - I said I was probably mostly available for day 1, but day 2 might
+ be a bit tougher. I can make sure people are more comfortable with
+ checking in people in case kid stuff comes up
+- I recommend breaking things into two-hour shifts, the transcribing
+ is a bit brain-heavy and kind of burned me out.
+- Choosing particular time blocks would make it a bit easier to
+ coordinate "interruption free" times with family/housemates. (This
+ was a big factor for me on Sunday afternoon, multiple kids and dog
+ plus other people. Next time I'll probably commit to transcribing
+ more on Saturday and then Sunday morning, and see if we can find
+ someone besides me for Sunday afternoon)
+ - Hah, there are no real interruption-free times with a 4-year-old
+- Get OK from jcorneli, dto, and other volunteers to add the
+ timestamped logs as possible descriptive text for the videos as
+ temporary subtitles while there are no proper transcripts.
+ - (ok from dto)
+- have opportunities for different levels of time sensitivity of
+ commitments (e.g. stuff people who can just drop in sometimes can
+ usually learn to do pretty easily and that helps).
+- A green-room could be fun, inviting speakers a "quiet" place to
+ talk about things before they "happen", answering questions, even
+ FAQs for speakers on a priority then becomes both a thanks and an
+ easy starter voluntering opportunity with obvious perks built in.
+ - I thought about having speakers check into a green room so that
+ the audio alert from it could be always available, but I thought
+ that having them check in directly to their room would be less of
+ a hassle than two successive echo checks. It was nice to have
+ zaeph join me as I checked in some people.
+- Cuttings streams as point-in-time markers collectievly assembled
+ could provide a path to CI/CD flows toward speach-to-text during the
+ event, or at least faster and eventually less manually after.
+ - The pad had timestamps with some formatting differences, so I was
+ able to pull them out and set them as properties. I ended up
+ manually reviewing the stream to see where to set the timestamps
+ anyway, since that felt like it might be easier. It mostly worked
+ except for the part where I accidentally included the prerec that
+ followed one of zaeph's talks. =) Maybe if we displayed a clear
+ timestamp at the start of the stream and then had some code that
+ would take that timestamp and calculate the correct offset for any
+ timestamps from the file... Yeah, that could work.
+ - So, like, a step in the check-in process that tells Emacs "All
+ right, this talk has started" (or "Oops, this talk started at X
+ time and I was distracted"), and it announces it to IRC and
+ stores the timestamp, and maaaaabye even spits out the ffmpeg
+ command to extract the previous talk out of the Icecast dump
+** On the pad
+ Observations The pad was opened by many people. I believe we
+ peaked at 145. On top of being opened, many people used the
+ pad. People appreciated being able to immediately access links
+ and notes from previous talks publicvoit kept the pad up to
+ date and super clean. It probably was quite exhausting to do
+ all this by himself, even though he had some help from ??? (b-
+ something, I've closed the query in IRC. :( ) Karl was the only
+ person who contributed to the time-stamp logging. As long as
+ Karl is at the event, that's perfectly fine but I had to leave
+ earlier because of time-zone shift and exhaustion. Clearing pad
+ colours periodically helped speakers focus The Q4: Q3: Q2: Q1:
+ template that evolved by the end of the conference was really
+ handy, since experienced volunteers could keep adding slots and
+ people could add in the convenient blank spots. Might be handy
+ to keep a copy of the boilerplate ready for pasting in. The pad
+ got zapped once, and the Wikimedia Etherpad didn't have an easy
+ way to restore to a certain point aside from copying and
+ pasting. If there's another pad with good revision history
+ management, that might be worth checking. Winding back a few
+ minutes and cutting/pasting the contents back to the current
+ pad, worked okay in a pinch but probably isn't ideal. Karl
+ agrees: restoring content once for the whole event with ~140
+ people reading/contributing is actually much better than
+ anticipated. However, when there is a better alternative: let's
+ switch. Reverse-chronological order worked better than
+ chronological order for typing things in. I don't know if
+ chronological order might be manageable if we have a Q1: Q2:
+ Q3: Q4: template so that people aren't accidentally pressing
+ enter in the middle of someone else's question. Also,
+ chronological might require more scrolling on the presenter's
+ part, and the questions move when people type things above
+ them. Karl: I don't see any advantage with
+ reverse-chronological order but several disadvantages: People
+ had hard time to add a new itemize-item at the top: I had to
+ fix many questions that were normal paragraphs. This cancels
+ out the main reason we had for starting the reverse order IMHO.
+ Everybody had to learn not to use the "normal" order of things
+ people are doing all the time: from top to bottom. Most
+ speakers on day one started with the topmost question for
+ answering as well. Karl: If the majority thinks, this is worth
+ the effort, let's continue with that. Otherwise, my guess would
+ be that having a few Q1, Q2, Q3 (in order), people will be fine
+ adding questions. I think some IRC questions fell through the
+ cracks. For people only posting questions on IRC, we would need
+ to teach them to prepend them with something like "Q:" or
+ similar. Otherwise, IRC is hard to skim for questions among the
+ chitchat.
+** On the topic of the talks
+*** Observations
+- Plenty of topics.
+- Varied topics.
+- People enjoyed the more personal talks.
+ - shoshin's talks.
+ - Pierce Wang's talk.
+ - My user/developer story.
+ - People liked the face-to-face.
+ - I'm so happy about that! I think people's stories are an important part of humanizing Emacs, and I'm glad we made space for those talks.
+- People liked the sequence of talks, too, which meant the time that we spent fiddling around with the flow of the talks worked out.
+- Even though it was tough for speakers to squeeze their talks into even smaller timeframes than they asked for, I think it worked out well that people got a taste of lots of different topics + Q&A time afterwards. I'm glad we were able to accept all the talks. As Karl pointed out before, most conference committees have to make tough decisions about which talks to accept and which talks to reject. If we can figure out a way to make it happen time-wise, I'd like to make our role more of accepting as much as we can, and then sorting and shaping talks so that they flow well together.
+*** Questions
+- Should we develop the idea of tracks?
+ - This year, we had an org-mode track which allowed people interested in org-mode to tune in at a precise time, and have many topics that could interest them in quick succession.
+ - Parallel tracks split organizer attention and result in high fear-of-missing-out; not sure we could have pulled it off this year, but maybe with more practice? I think it would be super-cool to have workshops if volunteers wanted to do them, like an Emacs Lisp workshop or an Org workshop where people can just drop in and ask questions or show stuff. Gotta have people, though.
+ - dto: I like the workshop idea
+ - Karl would love to see a switcher-track since approx. 97% of all people I work with are using vim and still do think that it's just about editing. Furthermore, a switcher-track overlaps with the newbie-track - so it's probably a matter of track-name marketing ;-)
+*** Improving
+- Finding more use for the alt-stream.
+ - ~30 people, 10% of the stream, like I thought! =) Didn't have the brainspace to pull it off on the first day, and narrowly had enough brainspace to do it on the second day. Might be able to do it more easily next time, now that I've remembered my laptop has a mute shortcut. That was only an issue because wasamasa couldn't play a game full-screen while looking at the Etherpad. Other speakers would have been able to look at the Etherpad on their own, so I wouldn't need to read things out to them and can stay muted for the whole time. It also tied me up attention-wise, so it was great that zaeph could handle checkins too (and I appreciated how he could drop in and say stuff). If I get bbb-recorder or some other virtual framebuffer-based streamer working next time, I might be able to run the alternate stream with less attention.
+ - Wouldn't it be amazing if next year we nailed the implementation of alternate streams and were able to pack in tons of talks, maybe with 10 minute summaries on the main stream and then extended demo/Q&A on the alternate streams...
+** On coordination
+*** Observations
+Stellar coordination on #emacsconf-org.
+*** Improving
+- We lost contact with mplsCorwin during his talk because the rtmp stream was one-way.
+ - We should have told him to keep an IRC window opened.
+ - Phoning him did the trick, but it was definitely more stressful for the speaker than just casually looking at the IRC window.
+ - I had the wrong channel open and wasn't watching the right screen. Thanks so much for the call Leo! The personal touch, like a call from an organizer when things aren't going right, can be huge.
+** On tech-checks
+*** Observations
+- We had a check-list to make sure that we weren't forgetting anything.
+- Asking for emergency contact info was a great idea.
+ - It saved our butts many times this year. =) =)
+*** Improving
+- Filling a table with all the info we gather (pre-rec or live: Q&A: live or pad/IRC, contact information, IRCnick)
+ - Our private repo was a good start, but we didn't prepare enough for the format.
+ - I like formalized processes, even when their steps might seem a little pedantic. Often there are complexities that we have the opportunity to prepare better for "between the lines" given such orginization. Maybe tech check is an easy place to start? IDK. I'm going to be trying to take this approach to everthing now, having hit upon it over the course of the conference at. al. Can we have too much org? ¯\_(ツ)_/¯
+- It was nice being able to add things to the tech checklist, such as making sure speakers knew how to check in via IRC.
+- Karl would like to be able to use a BBB room for tech-check so that we could share the load on those checks.
+** On asking for pre-recs
+*** Observations
+- We pushed speakers to send us more pre-recs this year.
+- As a result, we received more pre-recs (% ? I'd eyeball it at 60%)
+- Speakers mentioned struggling with recording. Maybe we can provide more explicit help: here are the settings for recording with OBS, here's a tutorial for video editing, here's an ffmpeg example for stitching images/videos+audio together and converting them to the right encoding
+*** Questions
+- Pre-recs are nice for us, but aren't we losing a bit of interaction with the public?
+ - Especially if we're having more tracks in the future like org-mode, it's nice to have the ability to react to what was said before you (cf. the talks on org-roam)
+ - We encouraged interactions between talk topics by asking speakers to coordinate beforehand, and I think everyone took us up on our suggestions. Tech demonstrations are always a little nerve-wracking, so it's nice to have everything smoothly running. (And it's hard to properly focus on someone else's presentation when you're worrying about yours and whether it'll still work... =) )
+- If pre-recs have a negative impact on interaction with the public, do we feel capable of handling more live presentations?
+ - Some moments during the conference were particularly stressful: on the one hand, I couldn't take a pause for 3h straight on D2 because of the late check-ins. On the other hand, some other moments were particularly calm. I believe we've gained some valuable experience on this, and we might be better at this the next time.
+ - We can stress a little less about checkins knowing that we can either check people in during the playing of their prerec or say that the Q&A for them will be deferred, or by asking people to check in even earlier if they can. It would be nice to get their IRC nick during the tech check, so we can check if they're around.
+- Short prerecs worked better than expected. Short prerec + live Q&A. 40-minute prerec talks are a little harder to stay engaged with
+** On animation/hosting
+*** Observations
+- My style of animation seems to have gone well with the public
+ - Self-deprecating humour.
+ - Making fun of tech-problems.
+** On check-ins
+*** Observations
+- Check-ins were done efficiently.
+- Protocols helped us streamline the process so that 1) we didn't forget anything, and 2) we could get things done quickly. Final protocol:
+ - Say hello, thank them
+ - Check if people's mics/screensharing work
+ - Check screen readability
+ - Check live talk vs prerec preference, live Q&A vs IRC/pad, and whether they want to read the pad themselves or have Amin read questions to them
+ - Let them know that they can answer questions in any order and skip questions if they want
+ - Tell them Amin will join and then give them the go-ahead
+ - Remind people about personal information (especially Org)
+ - Coach people to start their segment by saying their name and a quick intro to their talk (so that Amin doesn't have to stress out about remembering pronunciations)
+ - Give them a brief heads-up shortly before Amin joins
+ - Start recording when Amin joins
+ - Track timestamp of start
+ - Announce topic in IRC
+ - Leave
+ - TODO: automate scheduling, announcement, publishing previous talk, etc.
+- I like the ERC commands I made for sending people URLs and telling Amin who's ready where. =) They're in emacsconf-2020-private/index.org.
+** On live Q&A
+*** Observations
+ Check-in involved asking speakers if they wanted to do a live Q&A.
+*** Improving
+- Our tech-check should include if speakers want to do a live Q&A
+- Letting speakers know that they're almost out of time
+ - bandali suggested warning them via BBB whilst keeping his mic muted to the stream
+ - Problem: Speaker are startled and look like they're hearing voices :o)
+ - A bell? A chime? Something instrumental? If BBB webcam video is visible, Amin can hold up a sign.
+ - fun video of time-boxing Ig Nobel talks you need to watch: https://www.youtube.com/watch?v=xAnVNXaa5oA
+- sachac had a great idea of writing it in the pad, so that the speakers may know that they only have one minute/one question left.
+ - Yup, especially since most people were able to watch the pad for their own questions, and the ones who didn't were getting questions from Amin.
+** On publishing the recordings
+*** Observations
+- Figuring out the timestamps and splitting up the bulk recording into individual talks/Q&A takes time
+- We can satisfy the initial "Aaaaah! I want more!" by posting the
+ prerecs. If Amin keeps all of the day 1 prerecs in one folder, he
+ can just mv them into a public folder, and add any last-minute ones
+ as they come in. If we want to be super-fancy, maybe we can even
+ move them one at a time after each talk. although I think Amin likes
+ keeping them on that uwaterloo server, so it would be one more thing
+ he has to do.
+- Slicing is actually pretty fast and can be done on a partial copy of
+ the stream, so we might be able to do it in the future. We can
+ quietly replace them with higher-quality versions if we want to. **
+ Improving
+** On publishing the Q&A logs (brought up by bhavin192)
+*** Observations
+- Some of the logs have lots of '+1' which are a tad useless now.
+- We've mostly plopped whatever was in the pad in the relevant section on emacsconf.org.
+*** Improving
+- Process the logs to remove the extra stuff.
+ - It's definitely not a hgih-priority item, and I'd much rather have us on publishing the recordings as we have this year. (zaeph)
+- Rethink the format.
+ - Go for a newspaper style.
+ - Questions in bold.
+ - Answer below with the name of the speaker prepended.
+** On live viewership
+ ** Observations
+- We peaked at ~400 viewers during RMS talks.
+ - dto: wow!
+ - Last year peak viewers = ~270
+- D1 averaged at ~340 viewers. (eyeballing)
+- D2 averaged at ~250 viewers. (eyeballing)
+** On asking feedback
+*** Observations
+- Viewers gave us quite a lot of feedback in the Other Pad™.
+*** Questions
+- How are we going to ask speakers for feedback? Etherpad/email
+ - Form to fill send via email?
+ - FOSS online form?
+ - (Off-topic: Do we have news from the Emacs Developer Survey?)
+ - I think the number-crunching from the Emacs Survey will take a while
+** On having talks which could be construed as 'commercial product pitches'
+*** Observations
+- gmj`` on #emacsconf brought up the fact that Rainer König's talk
+ could have been associated to his Udemy course on org-mode (which
+ requires a fee).
+ - His Org talks are actually also available on Youtube for free. I
+ would have had no problem with Mickey Petersen plugging Mastering
+ Emacs update, too.
+*** Remarks
+- There's a general aversion to 'paying for stuff' in FOSS because it's often conflated with non-FOSS practices.
+ - This sentiment is problematic because it makes it hard for developers and community-figures to sustain themselves financially.
+ - FOSS has always allowed people to get paid for it; F doesn't mean $, but freedom. Also, it looks like the sentiment is shifting - more people are looking for ways to support the people who work on the stuff they like
+ - The systems of donations and patronage are the most widely accepted, but they're also the poorest in terms of results.
+ - Donations disproportionally favour prominent members of the community.
+ - The 'buy me a coffee' attitude downplays the amount of effort that goes into writing and maintaining software.
+ - A better solution for developers is project- or milestone-based financial goals: 'To develop feature X, it's going to take Y amount of money.'
+ - The idea is developed in https://sustainoss.org/
+ - To quote François Élie, an influent FOSS advocate in France:
+ - Free/libre software is free once it has been paid for.
+ - Having a service industry around FOSS is what allows plenty of non-dev actors (educators, tech-writers, etc.) to sustain themselves.
+*** Improving
+- Develop arguments to use with people who conflate 'paid services' with 'non-FOSS practices'.
+- Anticipate those problems by asking speakers how they sustain themselves in the FOSS world during the CFP.
+ - What would we do with the information?
+** On the CFP
+*** Observations
+- People appreciated the nudge to talk to people who might be having imposter syndrome
+*** Questions
+- Do we want submissions to be anonymized next year? I think it adds quite a bit of load on the volunteer handling the incoming submissions.
+- Do we want to experiment with the accept-as-much-as-possible approach next year as well?
+** On BBB
+*** Observations
+- Audio quality was all over the place.
+ - BBB aggressively adds gain to participants, but it doesn't seem to be doing it in an intelligent way.
+*** Remarks
+*** Improving
+- Prefer pre-recs?
+ - Has problems, cf. previous point on pre-recs.
+- Find other tools?
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/poster.md b/2021/poster.md
new file mode 100644
index 00000000..549e6f25
--- /dev/null
+++ b/2021/poster.md
@@ -0,0 +1,58 @@
+[[!meta title="EmacsConf 2021 posters"]]
+[[!meta copyright="Copyright &copy; 2020 Paul Sutton, Amin Bandali<br />Copyright &copy; 2021 Paul Sutton, Amin Bandali, Garulfo Azules, Adam Porter"]]
+
+[[Paul Sutton|poster#zleap]], [[Garulfo Azules|poster#garulfo]], and
+[[Adam Porter|poster#alphapapa]] have created beautiful posters for
+EmacsConf 2021 for folks to share with others to help spread the word
+about the conference! All three posters are licensed freely, under
+the same terms as the rest of the EmacsConf wiki (see [[COPYING]]).
+
+Please see below for previews and details about each of the posters.
+
+
+<a name="zleap"></a>
+## Paul Sutton
+
+The poster and its accompanying sources are available from Paul's
+repository on Debian Salsa, at
+<https://salsa.debian.org/zleap-guest/emacsconf>.
+
+The poster is available in the PDF and PNG formats, along with the
+original ODG source file for it. Direct download links:
+
+- <https://salsa.debian.org/zleap-guest/emacsconf/-/raw/master/emacsconf.pdf>
+- <https://salsa.debian.org/zleap-guest/emacsconf/-/raw/master/emacsconf.png>
+- <https://salsa.debian.org/zleap-guest/emacsconf/-/raw/master/emacsconf.odg>
+
+[[!img /i/emacsconf-2021-poster-zleap.png
+ size=600x
+ alt="EmacsConf 2021 poster by Paul Sutton" class="center"]]
+
+
+<a name="garulfo"></a>
+## Garulfo Azules
+
+The poster and its accompanying sources are available from the
+following repository on Debian Salsa:
+<https://salsa.debian.org/zleap-guest/emacsconfposter>
+
+The poster is available in the PDF format, along with the original ConTeXt
+source file. Direct download links:
+
+- <https://salsa.debian.org/zleap-guest/emacsconfposter/-/raw/master/ConTeXt_version/poster_emacs_v02.pdf>
+- <https://salsa.debian.org/zleap-guest/emacsconfposter/-/raw/master/ConTeXt_version/poster_emacs_v02.tex>
+
+[[!img /i/emacsconf-2021-poster-garulfo.png
+ size=600x
+ alt="EmacsConf 2021 poster by Garulfo Azules" class="center"]]
+
+
+<a name="alphapapa"></a>
+## Adam Porter
+
+Adam's poster is available
+[here](/i/emacsconf-2021-poster-alphapapa.svg) in SVG format.
+
+[[!img /i/emacsconf-2021-poster-alphapapa.png
+ size=600x
+ alt="EmacsConf 2021 poster by Adam Porter" class="center"]]
diff --git a/2021/prepare.md b/2021/prepare.md
index 4cadc5cf..115d8432 100644
--- a/2021/prepare.md
+++ b/2021/prepare.md
@@ -38,8 +38,8 @@ your name, please start your video with something along the lines of:
"Hi! I'm ${NAME} and I'll be talking about ${TOPIC}."
-Please **upload your prerecording(s) via FTP** to the FTP server
-we are setting up with the following details:
+<a name="ftp-upload"></a>
+Please **upload your prerecording(s) (and script/notes if any) via FTP** to the FTP server we have set up with the following details:
- host: ftp-upload.emacsconf.org
- username: anonymous
@@ -54,15 +54,30 @@ you can install FileZilla by running `sudo apt install filezilla` in a
terminal. Otherwise, you can download FileZilla from their [project
website](https://filezilla-project.org/).
+You can also use a command-line interface with `ftp`:
+
+```
+$ ftp ftp-upload.emacsconf.org 21
+> anonymous
+> passive
+> cd upload-here
+> send /local/path/to/file.ext file.ext # Don't forget the 2nd arg!
+# Ctrl-D to exit
+```
+
+If you get a `500 Illegal PORT command.` command, try `passive` or
+`quote pasv` to switch to passive mode before sending your file.
+
If connection fails on the first try, please check to make sure the
details are exactly as described above; and if the issue persists,
please email <emacsconf-submit@gnu.org> so we can look into it.
If you have a script or notes for your talk, please include it as well
-so that we could use it to help us with the captioning of your talk.
+so that we could use it to help us with the captioning of your talk.
You can also send us additional information to include on the wiki
-page for your talk, such as links to other pages or additional videos.
-If you need help, please email <emacsconf-submit@gnu.org>.
+page for your talk, such as a PDF or links to other pages or
+additional videos. If you need help, please email
+<emacsconf-submit@gnu.org>.
To record your video, you could use any of the following pieces of
free software, depending on your needs:
@@ -101,9 +116,96 @@ WebM format if possible.*
> format. The closer to this format submitted video files arrive in,
> the easier it will be to process and upload them.
-After you send in your video, if you've indicated that you'd like to
-do live Q&A, we'll set up a tech-check call with you. We'll post
-details here closer to that time.
+# Compression
+
+If you would like to compress your video before uploading, the following shell script may be useful:
+
+ 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"
+
+If you put it in a file called `compress-video.sh`, you can execute it
+from the command line with something like `sh compress-video.sh
+input-file.webm output-file.webm`. It will compress the file in two
+passes. During the first pass, the frame count will increase, but the
+speed will be 0. After the first pass, it will display proper progress
+information.
+
+<a name="tech-check"></a>
+# Tech-check
+
+We ask that speakers who plan to participate in live Q&A sessions schedule
+a short tech-check in the weeks leading to the conference; this is to ensure
+that you can perform all the common tasks you'd need such as sharing your
+screen or toggling your microphone.
+
+We use BigBlueButton for our video-conferencing needs, and a quick way to
+familiarize yourself with it is to run it in a test-room:
+<https://test.bigbluebutton.org/>
+
+If this is your first time at EmacsConf or if you run into any problems,
+please get in touch with us and we'll sort things out together! In those
+cases, since we'll need to schedule a 1-on-1 tech-check with you, we ask that
+you email the closest volunteer to your timezone in the list below (or zaeph
+if none of the timezones is a good fit). You can also visit us at
+[#emacsconf-org on Libera](irc://libera.chat/#emacsconf-org).
+
+We will likely schedule those 1-on-1 tech-checks with you on Saturdays or
+Sundays, but we would be happy to try and work out another time if that
+doesn't work for you.
+
+<table>
+<thead>
+<tr>
+<td>Volunteer</td>
+<td>Email</td>
+<td>IRC Nick</td>
+<td>Timezone</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>Leo Vivier</td>
+<td>&lt;<a href="mailto:zaeph@zaeph.net">zaeph@zaeph.net</a>&gt;</td>
+<td>zaeph</td>
+<td>CET (UTC+1)</td>
+</tr>
+<tr>
+<td><strong>Wanna help out? You can add your name and contact-info here!</strong></td>
+<td>&lt;<a href="mailto:your@email">your@email</a>&gt;</td>
+<td>…</td>
+<td>…</td>
+</tr>
+<tr>
+<td>Corwin Brust</td>
+<td>&lt;<a href="mailto:corwin@bru.st">corwin@bru.st</a>&gt;</td>
+<td>corwin</td>
+<td>US/Central (UTC-6)</td>
+</tr>
+<tr>
+<td>Amin Bandali</td>
+<td>&lt;<a href="mailto:bandali@gnu.org">bandali@gnu.org</a>&gt;</td>
+<td>bandali</td>
+<td>US/Eastern (UTC-5)</td>
+</tr>
+<tr>
+<td>Yuchen Pei</td>
+<td>&lt;<a href="mailto:hi@ypei.me">hi@ypei.me</a>&gt;</td>
+<td></td>
+<td>Australia/Eastern (UTC+11)</td>
+</tr>
+<tr>
+<td>Case Duckworth</td>
+<td>&lt;<a href"mailto:acdw@acdw.net">acdw@acdw.net</a>&gt;</td>
+<td>acdw</td>
+<td>US/Central (UTC-6)</td>
+</tr>
+</tbody>
+</table>
+
+If you'd like to help out with the tech-checks, feel free to add your name and
+email to the above list and email &lt;<a
+href="mailto:zaeph@zaeph.net">zaeph@zaeph.net</a>&gt; to plan the logistics.
Thank you so much for helping with EmacsConf 2021!
@@ -157,88 +259,22 @@ up the talk wiki pages. That way, you can see what else is going on
in the conference and maybe coordinate with other speakers in order to
minimize overlap and maximize awesomeness.
-## More questions?
+## What if there are lots of great questions during Q&A and we run out of time?
-Please email <emacsconf-submit@gnu.org>. We'd love to hear from you.
+You can continue answering questions on the collaborative pad or IRC,
+and we'll copy questions and answers onto the wiki page
+afterwards. You can also answer questions on the wiki page even after the event.
-Thanks for contributing to EmacsConf 2021!
+An extended live demo or Q&A session might be possible if someone
+volunteers to broadcast it on an alternative stream. If you or a
+volunteer is interested in helping with this, please feel free to
+contact us at <emacsconf-submit@gnu.org>.
+## More questions?
-<!-- #### Office hours for video call tech-checks -->
-
-<!-- After you submit your prerecorded video, we will schedule a tech-check with -->
-<!-- We ask that speakers who plan to participate in Q&A sessions and/or -->
-<!-- plan to present live schedule a short tech-check with us in the weeks -->
-<!-- leading to the conference, in order to quickly check their ability for -->
-<!-- joining video calls and performing common tasks such as sharing their -->
-<!-- screen. The office hours will likely be on Saturdays or Sundays, but -->
-<!-- we would be happy to try and work out another time if that doesn’t -->
-<!-- work for a speaker. -->
-
-<!-- To schedule a short tech-check, email one of the people listed below -->
-<!-- or visit with us on [#emacsconf-org on Freenode -->
-<!-- IRC](irc://chat.freenode.net/#emacsconf-org). -->
-
-<!-- <table> -->
-<!-- <thead> -->
-<!-- <tr> -->
-<!-- <td>Volunteer</td> -->
-<!-- <td>Email</td> -->
-<!-- <td>IRC Nick</td> -->
-<!-- <td>Timezone</td> -->
-<!-- </tr> -->
-<!-- </thead> -->
-<!-- <tbody> -->
-<!-- <tr> -->
-<!-- <td>Corwin Brust</td> -->
-<!-- <td>&lt;<a href="mailto:corwin@bru.st">corwin@bru.st</a>&gt;</td> -->
-<!-- <td>mplsCorwin</td> -->
-<!-- <td>US/Central (UTC-6)</td> -->
-<!-- </tr> -->
-<!-- <tr> -->
-<!-- <td>Leo Vivier</td> -->
-<!-- <td>&lt;<a href="mailto:zaeph@zaeph.net">zaeph@zaeph.net</a>&gt;</td> -->
-<!-- <td>zaeph</td> -->
-<!-- <td>CET (UTC+1)</td> -->
-<!-- </tr> -->
-<!-- <tr> -->
-<!-- <td>Bhavin Gandhi</td> -->
-<!-- <td>&lt;<a href="mailto:bhavin192@geeksocket.in">bhavin192@geeksocket.in</a>&gt;</td> -->
-<!-- <td>bhavin192</td> -->
-<!-- <td>Asia/Kolkata (UTC+05:30)</td> -->
-<!-- </tr> -->
-<!-- <tr> -->
-<!-- <td>Karl Voit</td> -->
-<!-- <td>&lt;<a href="mailto:EmacsConf@Karl-Voit.at">EmacsConf@Karl-Voit.at</a>&gt;</td> -->
-<!-- <td>publicvoit</td> -->
-<!-- <td>CET (UTC+1)</td> -->
-<!-- </tr> -->
-<!-- <tr> -->
-<!-- <tr> -->
-<!-- <td><strong>Your Name</strong></td> -->
-<!-- <td>&lt;your@email&gt;</td> -->
-<!-- <td>&nbsp;</td> -->
-<!-- <td>&nbsp;</td> -->
-<!-- </tr> -->
-<!-- <tr> -->
-<!-- <td><strong>David O'Toole</strong></td> -->
-<!-- <td>&lt;deeteeoh1138@gmail.com&gt;</td> -->
-<!-- <td>dto</td> -->
-<!-- <td>US/Eastern (UTC-5)</td> -->
-<!-- </tr> -->
-<!-- <tr> -->
-<!-- <td>Amin Bandali</td> -->
-<!-- <td>&lt;<a href="mailto:bandali@gnu.org">bandali@gnu.org</a>&gt;</td> -->
-<!-- <td>bandali</td> -->
-<!-- <td>US/Eastern (UTC-5)</td> -->
-<!-- </tr> -->
-<!-- </tbody> -->
-<!-- </table> -->
-
-<!-- If you'd like to help out with the tech-checks, feel free to add your -->
-<!-- name and email to the above list and email <bandali@gnu.org> to plan -->
-<!-- the logistics. -->
+Please email <emacsconf-submit@gnu.org>. We'd love to hear from you.
+Thanks for contributing to EmacsConf 2021!
<!-- <a name="tech-checklist"></a> -->
<!-- #### Tech checklist -->
diff --git a/2021/schedule-details.md b/2021/schedule-details.md
index c32d9ab7..17a516bc 100644
--- a/2021/schedule-details.md
+++ b/2021/schedule-details.md
@@ -1,58 +1,58 @@
-<table width="100%"><tr><td colspan="3"><strong>Saturday, Nov 27, 2021: General talks<strong></td></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></tr>
-<tr><td><a href="/2021/talks/news">Emacs News Highlights</a></td><td>Sacha Chua</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></tr>
-<tr><td><a href="/2021/talks/adventure">Choose Your Own (Technology-Enhanced Learning) Adventure</a></td><td>Greta Goetz</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></tr>
-<tr><td><a href="/2021/talks/omegat">Emacs manuals translation and OmegaT</a></td><td>Jean-Christophe Helary</td></tr>
-<tr><td><a href="/2021/talks/nongnu">NonGNU ELPA Update</a></td><td>Kaluđerčić, Philip</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></tr>
-<tr><td><a href="/2021/talks/telega">telega.el and the Emacs community on Telegram</a></td><td>Gabriele Bozzola and Evgeny Zajcev</td></tr>
-<tr><td><a href="/2021/talks/nangulator">Introducing N-Angulator</a></td><td>Kevin Haddock</td></tr>
-<tr><td><a href="/2021/talks/janitor">A day in the life of a janitor</a></td><td>Stefan Monnier</td></tr>
-<tr><td><a href="/2021/talks/maintainers">How to help Emacs maintainers?</a></td><td>Bastien Guerry</td></tr>
-<tr><td><a href="/2021/talks/gregorian">Typesetting Gregorian Chant with Emacs</a></td><td>Spencer King</td></tr>
+<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/montessori">Emacs and Montessori Philosophy</a></td><td>Grant Shangreaux</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></tr>
-<tr><td><a href="/2021/talks/cs">One effective CS grad student workflow</a></td><td>Greg Coladonato</td></tr>
-<tr><td><a href="/2021/talks/professional">Using Org-Mode For Recording Continuous Professional Development</a></td><td>Philip Beadling</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></tr>
-<tr><td><a href="/2021/talks/exec">Org as an executable format</a></td><td>Tom Gillespie</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></tr>
-<tr><td><a href="/2021/talks/teach">Using Org-mode to teach programming</a></td><td>Daniel German</td></tr>
-<tr><td><a href="/2021/talks/research">Managing a research workflow (bibliographies, note-taking, and arXiv)</a></td><td>Ahmed Khaled</td></tr>
-<tr><td><a href="/2021/talks/babel">Babel for academics</a></td><td>Asilata Bapat</td></tr>
-<tr><td><a href="/2021/talks/molecular">Reproducible molecular graphics with Org-mode</a></td><td>Blaine Mooers</td></tr>
-<tr><td><a href="/2021/talks/project">Budgeting, Project Monitoring and Invoicing with Org Mode</a></td><td>Adolfo Villafiorita</td></tr>
-<tr><td><a href="/2021/talks/invoice">Find Your (In)voice: Emacs for Invoicing</a></td><td>Bala Ramadurai</td></tr>
-<tr><td><a href="/2021/talks/dashboard">Productivity Dashboards with Emacs and Kindle</a></td><td>Mehmet Tekman</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></tr>
-<tr><td><a href="/2021/talks/design">On the design of text editors</a></td><td>Nicolas P. Rougier</td></tr>
-<tr><td><a href="/2021/talks/freedom">How Emacs made me appreciate software freedom</a></td><td>Protesilaos Stavrou</td></tr>
-<tr><td><a href="/2021/talks/day1-close">Closing remarks day 1</a></td><td></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></tr>
-<tr><td><a href="/2021/talks/faster">How to write faster Emacs Lisp</a></td><td>Dmitry Gutov</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></tr>
-<tr><td><a href="/2021/talks/dsl">Self-Describing Smart DSL's: The Next Magits</a></td><td>Psionic</td></tr>
-<tr><td><a href="/2021/talks/ui">"Yak-shaving to a UI framework" (/"Help! I accidentally yak-shaved my way to writing a UI framework because overlays were slow")</a></td><td>Erik Anderson</td></tr>
-<tr><td><a href="/2021/talks/rust">Extending Emacs in Rust with Dynamic Modules</a></td><td>Tuấn-Anh Nguyễn</td></tr>
-<tr><td><a href="/2021/talks/eaf">Emacs Application Framework: A 2021 Update</a></td><td>Matthew Zeng</td></tr>
-<tr><td><a href="/2021/talks/model">Extending the "model" of Emacs to other applications</a></td><td>Laszlo Krajnikovszkij</td></tr>
-<tr><td><a href="/2021/talks/devel">Don't write that package! or: How I learned to stop worrying and love emacs-devel</a></td><td>Stefan Kangas</td></tr>
-<tr><td><a href="/2021/talks/bindat">Turbo Bindat</a></td><td>Stefan Monnier</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/native">Emacs Lisp native compiler, current status and future developments</a></td><td>Andrea Corallo</td></tr>
-<tr><td><a href="/2021/talks/form">Old McCarthy Had a Form</a></td><td>Ian Eure</td></tr>
-<tr><td><a href="/2021/talks/test">Test blocks</a></td><td>Eduardo Ochs</td></tr>
-<tr><td><a href="/2021/talks/bug">Let's talk about bug trackers</a></td><td>Bastien Guerry</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></tr>
-<tr><td><a href="/2021/talks/mold">Moldable Emacs, a step towards sustainable software</a></td><td>Andrea</td></tr>
-<tr><td><a href="/2021/talks/clede">CLEDE the Common Lisp Emacs Development Environment.</a></td><td>Fermin MF</td></tr>
-<tr><td><a href="/2021/talks/imaginary">Imaginary Programming</a></td><td>Shane Mulligan</td></tr>
-<tr><td><a href="/2021/talks/build">How to build an Emacs</a></td><td>Fermin MF</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></tr>
-<tr><td><a href="/2021/talks/day2-close">Closing remarks day 2</a></td><td></td></tr></table> \ No newline at end of file
+<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 8fd6e2c1..cbf61f19 100644
--- a/2021/schedule.md
+++ b/2021/schedule.md
@@ -1,8 +1 @@
-[[!meta title="Schedule"]]
-[[!meta copyright="Copyright &copy; 2021 Amin Bandali and Sacha Chua"]]
-
-EmacsConf 2021 will be on November 27 (Sat) and November 28 (Sun), 2021 from 9am-5pm Toronto/EST time; equivalently, 6am-2pm PST, 2pm-10pm UTC, 3pm-11pm Zurich/CET.
-
-*Please note that the program is still being worked on and this list may change. We're still figuring out how things will go! =)*
-
-[[!inline pages="internal(2021/schedule-details)" raw="yes"]]
+[[!meta redir=/2021/talks]]
diff --git a/2021/sidebar.md b/2021/sidebar.md
index 6a662b8b..7257fdcf 100644
--- a/2021/sidebar.md
+++ b/2021/sidebar.md
@@ -4,9 +4,9 @@
---
-* [[Call for Proposals|cfp]]
-* [[Ideas]]
-* [[Submit]]
+* [[**Schedule**|talks]]
+* [[**All resources**|all]]
+* [[Posters|poster]]
* [[Prepare]]
* [[Planning]]
* [[Guidelines for Conduct|conduct]]
diff --git a/2021/speakers.md b/2021/speakers.md
new file mode 100644
index 00000000..253ccb2a
--- /dev/null
+++ b/2021/speakers.md
@@ -0,0 +1,52 @@
+[[!meta title="Conference-day instructions for speakers"]]
+[[!meta copyright="Copyright &copy; 2021 Sacha Chua"]]
+
+# How to check in
+
+You can check in on IRC by going to
+[https://chat.emacsconf.org](https://chat.emacsconf.org/?join=emacsconf,emacsconf-org).
+and joining the #emacsconf-org channel (and optionally the #emacsconf
+channel as well). You can also use your favourite IRC or Matrix client
+instead.
+
+Say something like "Hi, this is &lt;your name&gt; checking in"
+in the \#emacsconf-org channel and one of the organizers will check you in. If
+you are having a hard time with IRC, e-mail <emacsconf-submit@gnu.org>
+and we can give you the URL of a BigBlueButton room to join.
+
+# The process
+
+- When you check in, you can let us know where you prefer to look for
+ questions (live Q&A, IRC in #emacsconf-questions or on [Etherpad](https://etherpad.wikimedia.org/p/emacsconf-2021))
+- If you want to do live Q&A (ex: a quick demo if asked), we'll set
+ you up in a BigBlueButton room. You can keep watching the conference
+ or doing other things while waiting there. We'll let you know
+ shortly before your prerec ends.
+- While your prerec plays, people will add questions on IRC or Etherpad.
+- Volunteers will scramble madly to relay questions to your preferred
+ area.
+- You can start answering them if you want, or you can get things
+ ready for a quick demo if you're doing live Q&A.
+- After your prerec finishes:
+ - If you're doing IRC/Etherpad: we'll let people know where to ask
+ questions and we can read out some of the questions and answers
+ that are there.
+ - If you're doing live Q&A:
+ - We'll switch the stream to broadcast from the BBB room you're in.
+ - Depending on your preferences, one of the organizers can read
+ questions to you, or you can read questions off the pad/IRC
+ yourself.
+ - We'll let you know if there are additional questions or if we
+ need to wrap up.
+- After the conference, we'll collect questions and answers from IRC
+ and the pad. We'll put them on the talk page and e-mail them to you
+ in case you want to follow up or keep the conversation going.
+
+# Tips and backup plans
+
+- Doing a tech check can help if you want to do live Q&A.
+ https://test.bigbluebutton.org has a self-serve tech check.
+- Please let us know if you're running late or if it turns out you
+ can't make it. Drop by #emacsconf-org, e-mail us at
+ <emacsconf-submit@gnu.org> , or use the emergency contact
+ information from the check-in instructions email.
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/adventure.md b/2021/talks/adventure.md
deleted file mode 100644
index 7b06e9b0..00000000
--- a/2021/talks/adventure.md
+++ /dev/null
@@ -1,136 +0,0 @@
-[[!meta title="Choose Your Own (Technology-Enhanced Learning) Adventure"]]
-[[!meta copyright="Copyright &copy; 2021 Greta Goetz"]]
-[[!inline pages="internal(2021/info/adventure-nav)" raw="yes"]]
-
-<!-- You can manually edit this file to update the abstract, add links, etc. --->
-
-
-# Choose Your Own (Technology-Enhanced Learning) Adventure
-Greta Goetz
-
-This presentation will move through Emacs artifacts illustrating
-possible paths for beginners and then map out some supportive roles
-for the enhanced learning potential (cf. Caillet in Andler & Guerry,
-Engelbart) of Emacs. Emacs affords diverse possibilities for
-individuals to interact creatively and autonomously with their digital
-environment and others to satisfy their own needs (Illich) and
-fulfills the promise of digital tools to help enhance our learning
-(e.g. Engelbart), balancing creativity with guidance (Goodyear &
-Retalis).
-
-
-# Intro
-
-Emacs allows for play with formality and does not limit imaginable
-types of interactivity, supporting both formal and informal learning
-(cf. Caillet in Andler & Guerry 2008), therefore it can function as a
-scaffold for development (cf. Vygotsky 1979: 86) and the creative and
-autonomous ability of individuals to interact with their digital
-environment and others who equally share the ability to use this tool
-(Illich 1973). Individuals can use Emacs as often or seldom as they
-want to express their needs and meaning in action, with no obligation
-to use it (cf. Illich 1973: 22).
-
-The formal learning involved pertains to Emacs documentation (the
-'temple') while related discussion and copying of or composing parts
-of inits or smaller task-based problem solving represents the
-'forum'. The latter, demonstrative of technology-enhanced learning,
-allows for engagement in diverse and individual levels of learning,
-balancing creativity with guidance (Goodyear & Retalis 2010: 4).
-
-1. What if we are beginners overwhelmed by formal Emacs documentation? Two possible learning paths:
-
- - a. Build on a needs-basis. Brief explanation and rationale [1 para].
- - b. Study others' inits and use-cases; Read Planet EmacsLife; Consult what programmers or power users say [1 link example for each].
-
-2. Emacs as technological networks for enhanced learning with boundaries through [section supplemented by some examples, and illustrated by a mind-map to bring coherence]:
-
-- The 'wise' use of computers (Crichton) to manage and organize workflow
-- Fun use of computers - 'there are people who want to put a stop to that' (Crichton)
-- Disciplinary use-cases can give insight into how various Emacs capabilities fit into the mental models particular to disciplinary context. This can improve design performance while educating the designer (Goodyear & Retalis 2010).
-
-- Allows for multiple and organically changing organization of knowledge. This is opposed to relegating it to pre-fabricated fields, which is the case when using apps (as if all learners have the same spatial/visual needs?!
-
-- Emacs is developed and maintained by a community dedicated to keeping this freedom of use in these multiple contexts (cf. Illich 1973).
-- Emacs thus allows us to control our tools and tasks (Illich 1973:
-- in order to release ourselves from the tasks of *automatic* maintenance (cf. Latour's 1987 simple customers'). By contrast, the care-less use of automatizing pre-fabricated apps leads to knowledge loss and loss of know-how in life (Stiegler 2018).
-
-- Emacs fulfills the promise of the value of technology-enhanced learning (Goodyear & Retalis 2010) e.g. by augmenting OUR intellect (cf. Engelbart 1962), not automatizing our knowledge to smaller repetitive tasks that contribute to a larger picture we cannot see.
-
-# Conclusion
-
-Emacs does not limit any imaginable type of interactivity and promotes
-a diversity of related content, further supporting pursuit of more
-advanced technology-enhanced learning (TEL). TEL, with its current
-*general* reliance on pre-fabricated one-size-fits-all software, does
-not reach its potential where it uses apps or tools that automatize
-knowledge. By contrast, Emacs enables us to learn this knowledge work,
-and supports informal learning at all levels. This includes the most
-basic needs-use level while also inviting us through its myriad
-use-case examples to learn how work is managed, organized, and
-coordinated for the benefit of the diverse community made possible by
-maintainers and developers. Using Emacs not only means being able to
-use this digital tool, but to learn about the structure of digital
-learning and learning in general.
-
-
-# References
-
-- <https://github.com/redguardtoo/mastering-emacs-in-one-year-guide/blob/master/guide-en.org#on-the-shoulders-of-giants>
-- <https://planet.emacslife.com/>
-- <https://bzg.fr/en/some-emacs-org-mode-features-you-may-not-know/>
-- <https://www.kpkaiser.com/programming/writing-a-technical-book-in-emacs-and-org-mode/>
-- <https://github.com/zzkt/oblique-strategies>
-- <https://kitchingroup.cheme.cmu.edu/blog/2014/08/08/What-we-are-using-org-mode-for/>
-- Bruce, B. & Levin, J. (1997). Educational technology: media for inquiry, communication, construction, and expression. J. Educ. Comput. Res. 17(1), pp. 79–102.
-- Caillet, E. (2008). L’exposition, le musée: L’éducation informelle comme école de l’éducation formelle, pp. 137-154. In Andler, D. & Guerry, B., Eds., Apprendre Demain: Sciences cognitives et éducation à l’ère numérique. Paris: Hatier.
-- Crichton, M. (1983). Electronic Life. New York: Knopf.
-- Engelbart, D. (1962). Augmenting human intellect: A conceptual framework. Menlo Park: Stanford Research Institute.
-- Goodyear, P. & Retalis, S. (2010). Learning, Technology and Design, pp. 1-27. In Goodyear, P. & Retalis, S. (Eds.) Technology-Enhanced Learning: Design Patterns and Pattern Languages. Rotterdam, Boston: Sense Publishers.
-- Illich, I. (1973). Tools of conviviality. New York: Harper & Row.
-- Latour, B. (1987). Science in Action. Cambridge and London: Harvard University Press.
-- Stiegler, B. (2018). The neganthropocene. Open Humanities Press.
-- Vygotsky, L. (1979). Mind in Society: The Development of Higher Psychological
-- Processes. Cambridge and London: Harvard University Press.
-
-
-# Availability and preferred Q&A approach
-
-Due to the pandemic situation, my teaching schedule fluctuates so I
-will not know my availability until much closer to the
-date. Therefore, I can only guarantee delayed answer response
-(whatever you request), but if available, will join live.
-May I please note that I will be pre-recording my video if this submission is accepted.
-
-
-# Speaker release
-
-By submitting this proposal, I agree that my presentation at
-EmacsConf 2021 is subject to the following terms and conditions:
-
-The EmacsConf organizers may capture audio and video (a "Recording")
-of my presentation and any associated materials, which may include
-slides, notes, transcripts, and prerecording(s) of my presentation
-that I provide to the EmacsConf organizers.
-
-I authorize the EmacsConf organizers to distribute, reproduce,
-publicly display, and prepare derivative works of the Recording and
-any derivative works of the Recording (the "Licensed Materials")
-under the terms of the Creative Commons Attribution-ShareAlike 4.0
-International (CC BY-SA 4.0) license.
-
-I grant to the EmacsConf organizers permission to use my name,
-likeness, and biographic information in association with their use
-of the Licensed Materials under the above license.
-
-I represent that I have the authority to grant the above license to
-the EmacsConf organizers. If my presentation incorporates any
-material owned by third parties, I represent that the material is
-sublicensable to the EmacsConf organizers or that my use of them is
-fair use.
-
-
-
-[[!inline pages="internal(2021/info/adventure-schedule)" raw="yes"]]
-
-[[!inline pages="internal(2021/info/adventure-nav)" raw="yes"]]
diff --git a/2021/talks/babel.md b/2021/talks/babel.md
index a42ba97d..cd28d54b 100644
--- a/2021/talks/babel.md
+++ b/2021/talks/babel.md
@@ -4,10 +4,13 @@
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-
# 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
customisable tool for task and time management, note-taking, calendar
and agenda management, and much more. Babel takes org a step further
@@ -44,33 +47,68 @@ I will try to showcase features of babel that academics could find
helpful, by presenting some ways in which I have tried to use babel. I
would also like to be inspired by other people's babel workflows!
+# Links
+- Course webpage: <https://asilata.github.io/ggm/2021/>
+- Code: <https://github.com/asilata/emacsconf2021>
+- Code (gitlab mirror): <https://gitlab.com/asilata/emacsconf2021>
+# Discussion
-# Outline
+IRC nick: asilata
-- 5-10 minutes: (brief description/outline)
+Pad:
-For a 5-10 minute presentation I will give a brief intro and present one or two example files that heavily use babel. I will use these
-examples to highlight some of the features mentioned in the abstract.
+- 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/>
-<!-- - 20 minutes: (brief description/outline)
- For a 20 minute presentation I would like to discuss how one might
+From BBB:
-begin with setting up org/babel environments for course admin and
-notes, or for writing papers. I will discuss the org export dispatcher
-and how to play with some settings to make it do what you want it to
-do.
+- 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
-- 40 minutes: (brief description/outline)
- A 40-minute version would include a combination of the 5 and 20
+IRC:
-minute versions in more depth. Along the way, I will go into some more
-of the technicalities of babel, such as header arguments, the various
-result and export formats, noweb references and variables, code
-sessions, and tangling.
--->
+- 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.
+- I really liked the resulting LaTeX output file -- looked gorgeous :)
+- Yeah seriously. I am pleasantly surprised. I think I'll have to switch over to using Emacs and LateX
+- Theme: zenburn
+- wait ... does elisp support unicode lambda like racket?
+ - I mean... you can make it, but not out of the box.
+ - asilata: I think it's just an org prettification
+ - prettify-symbols-mode
+- do you use latex preview in the org buffer too?
+ - asilata: no, I usually don't, I find it slows down my system a bit.
+- 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 [YouTube](https://www.youtube.com/watch?v=1Ooi4KAd2FM&feature=em-comments):
-[[!inline pages="internal(2021/info/babel-schedule)" raw="yes"]]
+- 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
+- Pronouns: she/her
+- Homepage: <https://asilata.github.io>
+- Email: <mailto:asilata.bapat@anu.edu.au>
+
+[[!inline pages="internal(2021/captions/babel)" raw="yes"]]
[[!inline pages="internal(2021/info/babel-nav)" raw="yes"]]
diff --git a/2021/talks/bidi.md b/2021/talks/bidi.md
index 2bfd13d7..5669a817 100644
--- a/2021/talks/bidi.md
+++ b/2021/talks/bidi.md
@@ -1,17 +1,37 @@
-[[!meta title="Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware"]]
+[[!meta title="Perso-Arabic Input Methods And BIDI Aware Apps"]]
[[!meta copyright="Copyright &copy; 2021 Mohsen BANAN"]]
[[!inline pages="internal(2021/info/bidi-nav)" raw="yes"]]
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-# Perso-Arabic Input Methods And Making More Emacs Apps BIDI Aware
-Mohsen BANAN
+# Perso-Arabic Input Methods And BIDI Aware Apps
+Mohsen BANAN -- <mailto:emacs@mohsen.1.banan.byname.net> -- محسن بنان
+pronouns: he/him, pronunciation: MO-HH-SS-EN
+<http://mohsen.1.banan.byname.net>
+[[!inline pages="internal(2021/info/bidi-schedule)" raw="yes"]]
+
+## About The Video
-# Table of Contents
+The video is a screen capture of a [reveal](https://revealjs.com) presentation
+prepared with Beamer XeLaTeX and [HaVeA](http://hevea.inria.fr). So, the
+[original reveal
+presentation](http://web.by-star.net/lcnt/PLPC/180063/current/pres/PLPC-180063-pres.html)
+allows you to click on links that you see in the video and also navigate through
+the slide. In html, it is also availble as a [Presenation-As-Article
+format](http://web.by-star.net/lcnt/PLPC/180063/current/presArt/PLPC-180063-presArt.html)
+which includes complete text of the audio. [The traditional beamer slides](
+http://web.by-star.net/lcnt/PLPC/180063/current/pres/PLPC-180063-pres.pdf) are
+also available. The Access Page for
+[PLPC-180063](http://www.by-star.net/PLPC/180063) points to all available forms
+and formats.
+## About This Presentation
+Emacs is a multilingual user environment. A true multilingual editor must
+support bidirectionality and shaping of characters. Perso-Arabic scripts require
+both of these features.
Starting with Emacs 24, full native bidi
(bidirectional) support became available. For
@@ -21,58 +41,155 @@ open-source shaping libraries were also available.
With these in place at around 2012, I developed
two Persian input methods for emacs. These input
-methods or variations of them can also be used
-Arabic and other persoarabic scripts.
+methods or variations of them can also be used for
+Arabic and other Perso-Arabic scripts.
With all of these in place, Emacs has now become
-the ne plus ultra Halaal/Convivial usage
-environment for persoarabic users.
+the ne plus ultra Libre-Halaal and Convivial usage
+environment for Perso-Arabic users.
Since emacs comes loaded with everything (Gnus
for email, Bbdb for address books, XeLaTeX modes
for typesetting, org-mode for organization, spell
-checkers, completions, calendar, etc.), all basic
-computing and communication needs of persoarabic
+checkers, completion systems, calendar, etc.), all basic
+computing and communication needs of Perso-Arabic
users can be addressed in one place and
cohesively.
In this talk I will demonstrate what a wonderful
environment that can be.
-
-- 40 minutes: (brief description/outline)
- My talk will be in two parts.
+My talk will be in two parts.
+
+In Part 1, I cover Persian input methods. With an emphasis on "Banan
+Multi-Character (Reverse) Transliteration Persian Input Method". The
+software is part of base emacs distribution. Full documentation is available
+at:
+
- In Part 1, I cover persian input methods. With an
- emphasis on &lsquo ;Banan Multi-Character (Reverse)
- Transliteration Persian Input Method&rsquo;. The
- software is part of base emacs distribution.
- Full documentation is available at:
Persian Input Methods
For Emacs And More Broadly Speaking
شیوه‌هایِ درج به فارسی‌
- <http://mohsen.1.banan.byname.net/PLPC/120036>
+<http://mohsen.1.banan.byname.net/PLPC/120036>
- In Part 2, I will cover the ramifications of bidi
- on existing emacs applications, including:
+In Part 2, I'll demonstrate that Emacs is far more than an editor. Emacs can be
+a complete Perso-Arabic usage environment. I will also cover the ramifications
+of bidi on existing emacs applications, including:
- - Gnus:
- - Persoarabic rich email sending in HTML.
- - Ramifications of bidi on from, to and
- subject lines.
+- Spell Checking, Dictionaries And Completion Frameworks:
+ - Existing emacs facilities can be extended to cover Perso-Arabic.
- - Bbdb: Ramifications of bidi on display and
- completion.
+- Gnus:
+ - Perso-Arabic rich email sending in HTML.
+ - Ramifications of bidi on from:, to: and subject: lines.
- - Calendar:
- - Ramifications of bidi on display.
- - Use of persian text for Persian (solar) calendar.
- - Use of arabic text for Muslem (lunar) calendar.
+- Bbdb: Ramifications of bidi on display and completion.
- - AUCTeX: Persian typesetting with XeLaTeX
-
-
-
-[[!inline pages="internal(2021/info/bidi-schedule)" raw="yes"]]
-
+- Calendar:
+ - Ramifications of bidi on display.
+ - Use of Persian text for Persian (solar) calendar.
+ - Use of Arabic text for Muslim (lunar) calendar.
+
+- AUCTeX: Persian typesetting with XeLaTeX
+ - Option of having right-to-left Perso-Arabic aliases for all latex commands.
+
+# References:
+
+## Persian Input Methods:
+<http://mohsen.1.banan.byname.net/PLPC/120036>
+<http://www.persoarabic.org/PLPC/120036> -- Persian Input Methods Access Page
+<http://www.persoarabic.org> -- Various Perso-Arabic resources
+<http://www.freeprotocols.org/Repub/fpf-isiri-6219> -- Re-Publication Of
+ Persian Information Interchange and Display Mechanism, using Unicode
+<https://github.com/bx-blee/persian-input-method> -- Git repo for
+ persian.el -- Quail package for inputting Persian/Farsi keyboards
+
+## BIDI:
+<http://www.unicode.org/reports/tr9/> -- Annex #9 of the Unicode standard
+<https://www.gnu.org/software/emacs/manual/html_node/elisp/Bidirectional-Display.html>
+ Emacs Bidirectional Display
+<http://www.persoarabic.org/answers>
+ Paragraph Directionality Results Into Serious Communication Problems
+
+## Blee and Persian-Blee:
+<https://github.com/bx-blee/env2> -- Very messy work-in-progress git repo for:
+ Blee: By* Libre-Halaal Emacs Environment
+<http://www.by-star.net> -- A Moral Alternative To The Proprietary American Digital Ecosystem
+<http://mohsen.1.banan.byname.net/PLPC/120033> --
+ Nature of Polyexistentials:
+ Basis for Abolishment of The Western Intellectual Property Rights Regime
+<http://mohsen.1.banan.byname.net/PLPC/120039> -- Defining The Libre-Halaal Label
+
+## Mohsen BANAN -- محسن بنان:
+<http://mohsen.1.banan.byname.net/> -- Globish
+<http://mohsen.1.banan.byname.net/persian> -- Farsi
+<http://mohsen.1.banan.byname.net/french> -- French
+
+# 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.
+- That makes sense. Do you think you could use org more exclusively, and just add portions to implement your idea? As-in, there's nothing within org mode that would need to be fundamentally changed, correct?
+- I wonder about that. Org doesn't quite support all the expressivness that you see in some buffers/modes.
+- I agree. Finding a way to reach a happy medium without having to go "full elisp" would be quite powerful.
+- Potentially the tui.el system mentioned earlier in the conference could mix will with your idea as well.
+- I have one last, quick question. If you've used a version of Emacs 28, how have you found the new feature of doing a quick switch into a different IME? I know John Wiegly mentioned it in his talk earlier.
+- Does OS-level stuff work when you have to change character direction on the same line, like LtR numbers in a RtL script?
+
+Feedback:
+
+- This is great. I've done a demo like this for a few friends in the past as well.
+- Whoever did the captions for this was spot on, the unicode characters would be challenging.
+- I just love the Emacs input method framework, and I don't think a lot of latin script users know about it.
+- This is really cool, it's something that I never think about from other users in other countries using Emacs.
+- The captions for this conference have has an impressive amount of work put into them.
+- omg! this is great. farsi 101 in emacs
+- ++ to all that stuff. Great job on the captions, and the demonstrated functionality is very impressive.
+- Yay for the captions!
+- This has been really slick. Kudos for the captions including the Farsi characters and latin text.
+- At first, I thought the captions would be unnecessary, but over time, understanding the accents for various individuals has been challenging, so the captions helped.
+- One struggle I have with this input method option is, why not use an IME that's installed on the host OS? I mean, I do that with Japanese, but that may no longer work easily with qubes, so maybe it's more of a thing that'd benefit me now.
+ - though, I'm thinking that certain input methods don't actually simulate key-presses on virtual keyboards ... ?
+ - Not a primary reason, but since I'm used to configuring Emacs, I've found it a lot easier to learn to configure the integrated IMF than to configure an external one.
+ - I used SCIM/uim for japanese input at one put, but that was before I used emacs, it was a nightmare to set up
+- I may have to try this, the IMEs I've used haven't been an issue too much in the past, but...maybe this would be better, at least I wouldn't have to worry about config on each qube.
+- Banan's work on BIDI support is an eye-opener...
+- yeah absolutely. it's a really great point that Emacs can always be expanded to be more inclusive to other languages in ways that are more than just Unicode related.
+- bidi destorying irssi, time to find a good emacs irc client ...
+- thanks for the talk...another example how Emacs is inclusive catering for all forms of text.
+- Lots to think about. Thanks for the talk and inspiration!
+- Awesome. Thanks again for such a great talk and a great q&amp;a!
+
+[[!inline pages="internal(2021/captions/bidi)" raw="yes"]]
[[!inline pages="internal(2021/info/bidi-nav)" raw="yes"]]
diff --git a/2021/talks/binary.md b/2021/talks/binary.md
deleted file mode 100644
index 58689a55..00000000
--- a/2021/talks/binary.md
+++ /dev/null
@@ -1,30 +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
-
-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/info/binary-schedule)" raw="yes"]]
-
-[[!inline pages="internal(2021/info/binary-nav)" raw="yes"]]
diff --git a/2021/talks/bindat.md b/2021/talks/bindat.md
index c85616fc..e9cfffaa 100644
--- a/2021/talks/bindat.md
+++ b/2021/talks/bindat.md
@@ -8,6 +8,8 @@
# Turbo Bindat
Stefan Monnier
+[[!inline pages="internal(2021/info/bindat-schedule)" raw="yes"]]
+
# Table of Contents
@@ -21,14 +23,61 @@ 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
+# 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:
-[[!inline pages="internal(2021/info/bindat-schedule)" raw="yes"]]
+- 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"]]
[[!inline pages="internal(2021/info/bindat-nav)" raw="yes"]]
diff --git a/2021/talks/borg.md b/2021/talks/borg.md
index 9a4b935a..159e93a0 100644
--- a/2021/talks/borg.md
+++ b/2021/talks/borg.md
@@ -8,6 +8,8 @@
# Manual Package Management in The Era of Repositories - Why and How
Dhavan (codingquark)
+[[!inline pages="internal(2021/info/borg-schedule)" raw="yes"]]
+
Emacs now has many package repositories - enought to have conflicts
and arguments about. The packages are becoming big, they depend on many
other packages and it is not easy to keep track of what all is being
@@ -27,7 +29,6 @@ Another Package and install all elisp code manually - with borg[1].
4. Assimilate a package for demo
-
-[[!inline pages="internal(2021/info/borg-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/borg)" raw="yes"]]
[[!inline pages="internal(2021/info/borg-nav)" raw="yes"]]
diff --git a/2021/talks/bug.md b/2021/talks/bug.md
index 6038d195..7a2279dc 100644
--- a/2021/talks/bug.md
+++ b/2021/talks/bug.md
@@ -8,6 +8,8 @@
# Let's talk about bug trackers
Bastien Guerry
+[[!inline pages="internal(2021/info/bug-schedule)" raw="yes"]]
+
For 17 years, the Org developers didn't use a bug tracker,
shamelessly failing the Joel Spolsky test. Why was it "good enough"?
Why was it wrong? Why did we move to Woof!? Why Woof! is not a bug
@@ -16,7 +18,6 @@ tracker?
- 20 minutes
-
-[[!inline pages="internal(2021/info/bug-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/bug)" raw="yes"]]
[[!inline pages="internal(2021/info/bug-nav)" raw="yes"]]
diff --git a/2021/talks/build.md b/2021/talks/build.md
index 73f30450..c8edc0d8 100644
--- a/2021/talks/build.md
+++ b/2021/talks/build.md
@@ -8,6 +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
@@ -24,12 +34,39 @@ and the challenges.
For more details about CEDAR: <https://gitlab.com/sasanidas/cedar>
-- 40 minutes:
- A dive into the Emacs/Lisp machines history, what makes GNU Emacs
- an Emacs and how you can build an Emacs.
+# 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
-[[!inline pages="internal(2021/info/build-schedule)" raw="yes"]]
+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.
+- agreed, it's typically the massive amount of code that needs to interact with eachother that causes the slowdown but Emacs Lisp itself seems fairly performant.
+- there is a WIP CL implementation written called SICL :)
+ - akrl: yes but is bootstrapped from SBCL, so... :)
+- I know of three or four other attempts to write CL Emacsen. All long dead...
+- fundamentally there are not very many CL developers: there are probably many more elisp developers by now. C (and C++, and Java, and heck probably F# and Rust) have way more developers, so will always be more likely to gain enough momentum to not just die
+- the fashionable languages have lots of users but tend to fade away, CL is undead for ages... I would help in a CL implementation
+- I think everyone should write their own editor at some point. It's a very good learning experience.
+ - Alan Kay says a similar thing about writing your own operating system
+ - With Emacs you get both! :-)
+- I would love to see '#_' reader macro in Elisp for comments. core.async port and maybe, immutable collection (but that one is too much to ask)
+- isn't that what Xi-editor tried to build on?
+ - it's definitely what xray tried to build on
+- akrl: I'm extremely skeptical on the feasibility of reaching 100% compatibility :) (with an approachable effort)
+
+
+[[!inline pages="internal(2021/captions/build)" raw="yes"]]
[[!inline pages="internal(2021/info/build-nav)" raw="yes"]]
diff --git a/2021/talks/clede.md b/2021/talks/clede.md
index ded9bee4..59bb10f6 100644
--- a/2021/talks/clede.md
+++ b/2021/talks/clede.md
@@ -5,9 +5,11 @@
<!-- 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
Common Lisp's software,
it's uses the internal semantic framework, it has a custom reader
@@ -26,8 +28,16 @@ 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:
-[[!inline pages="internal(2021/info/clede-schedule)" raw="yes"]]
+- 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"]]
[[!inline pages="internal(2021/info/clede-nav)" raw="yes"]]
diff --git a/2021/talks/cs.md b/2021/talks/cs.md
index a35dec9f..0b1fb3ad 100644
--- a/2021/talks/cs.md
+++ b/2021/talks/cs.md
@@ -8,6 +8,10 @@
# One effective CS grad student workflow
Greg Coladonato
+[[!taglink CategoryOrgMode]]
+
+[[!inline pages="internal(2021/info/cs-schedule)" raw="yes"]]
+
When I was an undergrad, I learned many things, most of
which I forgot. In the time since then, I've discovered Org Mode, Org
Roam, Org Noter, Org Ref. PDF Tools, and Anki. I would like to share
@@ -16,19 +20,65 @@ MS CS student at Georgia Tech, in the hopes that I can both get
feedback on ways to improve the system I use, as well as hopefully
inspire others to build workflows that make them more productive.
+# Discussion
+
+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.)
+- have you ever considered org-ref for references? I think you used org-capture on the talk. Sorry If I am mistaken.
+ - gcoladon: I honestly don't know how one should use org-ref for references -- my references go into a bib file. And I use the org-ref convenience functions, but don't really know if I'm doing it right
+ - It sounds like others do love it
+- I don't use org-roam; I'm using zetteldeft. Haven't made the leap to roam, as it seemed more of a real leap of faith that it would work and not change too much.
+- Yes IIRC the heading property points to the PDF
+- Thank you for you talk. So far, I've only used org-roam as a simple knowledge-base. I would love to replicate what you showcased. Organized notes associated with pdf docs that you then generate Anki cards with. Awesome stuff.
+- If you have further links or tips on how you arrived at your current setup. A link to your emacs config??
+- Semi-related: M-l can downcase the next word quickly.
+
+IRC:
+
+- gcoladon: Yes it was software called ThoughtManager which ran on my Palm Treo 680
+- a similar workflow for videos using timestamps would be quite interesting
+- this is a sweet script, surely it should be possible to write in elisp though...
+- i know there exists the anki-editor package that works pretty well
+ - gcoladon: Yeah I am going to explore anki-editor sometime. It would be much better than my sed script :)
+- how to get started? this is a great workflow
+ - gcoladon: not sure how to help people get started with this workflow, but I am happy to work on such a thing
+- This is a workflow I really do like. Well done!
+- interesting on the custom id approach, I stick a timestamp on nearly every heading that I create, but I never thought to make it a custom id
+- gcoladon: I haven't tried to make my config sharable yet
# Outline
- 5-10 minutes: Go through some typical workflows associated with being a grad student, using the packages mentioned in the abstract.
-<!--
-- 20 minutes: Go through more workflows associated with being a grad student, using the packages mentioned in the abstract.
+# Personal information
-- 40 minutes: N/A
--->
+- Name pronunciation: the syllables of my last name should be easy enough to pronounce for English speakers; the accentuation is colado-NA-to
+- Preferred contact info: gmail account gcoladon
-
-[[!inline pages="internal(2021/info/cs-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/cs)" raw="yes"]]
[[!inline pages="internal(2021/info/cs-nav)" raw="yes"]]
diff --git a/2021/talks/dashboard.md b/2021/talks/dashboard.md
index 8ceacc4b..53572fff 100644
--- a/2021/talks/dashboard.md
+++ b/2021/talks/dashboard.md
@@ -8,6 +8,19 @@
# Productivity Dashboards with Emacs and Kindle
Mehmet Tekman
+
+
+[[!inline pages="internal(2021/info/dashboard-schedule)" raw="yes"]]
+
+[[!table header="no" class="speaker-details" data="""
+Name pronunciation: | Meh-met Teck-man
+Pronouns: | He/him
+Preferred contact info: | @mtekman:matrix.org
+Support: | <https://liberapay.com/mtekman/donate>
+"""]]
+
+<https://gitlab.com/mtekman/kindle-sync>
+
Since 2008, Amazon have released a new Kindle device every year,
supplanting each generation with a newer model that boasts highly
promoted incremental features which greatly devalues the price of
@@ -39,7 +52,57 @@ In this talk, we show how to configure multiple Kindles with any
desired custom content, following any daily/weekly schedule, all
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.
+- Are the images only pushed or can i request for an update from the kindel itself?
+ - Mehmet Tekman: images are usually only pushed, but it's done over ssh so pulling is also possible. the main idea is that the interaction is only Server → Client
+- Thanks for you talk I have just finished watching it on youtube.
+- I have some old kobo's rather than kindle's but thinking of nipping onto ebay to get some
+ - Mehmet Tekman: I think it would work well Kobo's, since that's likely also a linux system right?
+ - yes they are linux
+ - Mehmet Tekman: There are only a few kindle-specific commands, but you can comment them out and adapt them for the Kobo
+ - there was some work getting kde onto them
+ - Mehmet Tekman: Woah you have access to an X11 session?
+ - i think the developers helped, but we are talking 7 years ago for the one they helped with
+ - Mehmet Tekman: it's not mainline then?
+ - I don't think so I still use them both for reading books so not messed with them just in case they break
+ - Mehmet Tekman: That's the beauty of the kindle, it's from such a horrible company and it's so cheap that you have no qualms if you break it :P
+ - Mehmet Tekman: The kindle basically locks you out of X, which is frustrating since the Kindle Touch runs AwesomeWM. If I had money, I would definitely buy one :O
+- The use concept is really useful, so thanks for pointing me in the right direction.
+- as someone who easily gets distracted it will be usefull to check on what I am supposed to be doing lol
+ - 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
@@ -145,7 +208,6 @@ easily managed from Emacs within a single Org-Mode file.
- 40 minutes: N/A
-->
-
-[[!inline pages="internal(2021/info/dashboard-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/dashboard)" raw="yes"]]
[[!inline pages="internal(2021/info/dashboard-nav)" raw="yes"]]
diff --git a/2021/talks/day1-close.md b/2021/talks/day1-close.md
index 7707ba6a..0425d237 100644
--- a/2021/talks/day1-close.md
+++ b/2021/talks/day1-close.md
@@ -7,9 +7,44 @@
# Closing remarks day 1
-
-
+- Thanks for your patience with the technical issues!
+- Hey look, we got captions! And prerecs! =)
+- Prerecorded videos, transcripts, and other resources provided by the
+ speakers are already available on the talk pages.
+- Tomorrow we'll have a bit more time for Q&A, so we might have more
+ of those on the main stream.
+- Remember, there's a general-audience talk at the end of tomorrow's
+ program, so come and join us for M-x Forever by David Wilson of
+ SystemCrafters.
[[!inline pages="internal(2021/info/day1-close-schedule)" raw="yes"]]
+# 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?
+- 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.
+
+(from devel talk)
+
+- do you have any thoughts about how to make EmacsConf even better next year?
+ - yes last year the Q&A periods were much longer
+ - last year some of the presentations were live though
+
+[[!inline pages="internal(2021/captions/day1-close)" raw="yes"]]
+
[[!inline pages="internal(2021/info/day1-close-nav)" raw="yes"]]
diff --git a/2021/talks/day1-open.md b/2021/talks/day1-open.md
index 70abc7c0..47bc4a0b 100644
--- a/2021/talks/day1-open.md
+++ b/2021/talks/day1-open.md
@@ -7,9 +7,54 @@
# Opening remarks
-
-
-
[[!inline pages="internal(2021/info/day1-open-schedule)" raw="yes"]]
+- Welcome to EmacsConf 2021
+- How to participate:
+ - Collecting questions, answers, and shared notes on Etherpad (https://etherpad.wikimedia.org/p/emacsconf-2021)
+ - You can also post questions and discuss things on #emacsconf on chat.emacsconf.org (frontend for libera.chat if you want to use your favorite IRC client)
+- Conduct guidelines:
+ - One of the neat things about Emacs is that there are so many ways to do things. Please remember to be nice! =)
+- What's new in this EmacsConf 2021
+ - 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/past.html#emacsconf21>
+- Thanks
+ - Speakers, volunteers
+ - Karl Voit for managing the pad
+ - Bhavin Gandhi and Hannah Miller for help with the captions
+ - Free Software Foundation, especially the FSF tech team, for their continued help and support
+ - LibrePlanet 2022 Call for Sessions open for a few more days; consider giving a talk! See <https://libreplanet.org/2022/> and <https://my.fsf.org/lp-call-for-sessions/>
+ - FSF's Fall 2021 fundraiser happening now! See <https://fsf.org/appeal> if you'd like to give :)
+ - Fosshost, for BigBlueButton server and for ftp-upload server
+ - Computer Science Club of the University of Waterloo, for continuing hosting the videos/files on the CSC mirror server
+ - Jan Prunk (yang), for EU mirror of EmacsConf videos/files: <https://de1.mirror.si/emacsconf/>
+ - Grant Shangreaux, for beautiful music :) (under CC BY-SA 4.0) <https://churls.world/basement-days/basement-days.html>
+ - Qiantan Hong (qhong), author/maintainer of crdt.el which we used for sharing Emacs buffers between organizers
+ - Wojciech Siewierski (vifon), for assisting zaeph with his scripts last minute
+ - Organizers
+ - Everyone
+- 09:12 Schedule overview
+ - Day 1 (general talks), Day 2 (development) - but come back for some general-audience talks at the end of day 2, including the closing talk on M-x Forever by David Wilson (System Crafters)
+ - Day 1
+ - Morning
+ - User stories
+ - Philosophy (including a talk by Prot)
+ - Configuration
+ - Demos of Emacs's flexibility
+ - Afternoon
+ - A peek behind the curtain at Emacs Development (janitor talk)
+ - Org Mode
+ - Workflows
+ - Tech
+ - Research
+ - External things
+ - Dev update
+ - On the design of text editors - Nicolas P. Rougier
+ - Even if you're not a developer, consider coming back for tomorrow's closing
+- APAC stream
+
+[[!inline pages="internal(2021/captions/day1-open)" raw="yes"]]
+
[[!inline pages="internal(2021/info/day1-open-nav)" raw="yes"]]
diff --git a/2021/talks/day2-close.md b/2021/talks/day2-close.md
index 721c9ae7..00d459b9 100644
--- a/2021/talks/day2-close.md
+++ b/2021/talks/day2-close.md
@@ -4,12 +4,58 @@
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-
# Closing remarks day 2
-
-
-
[[!inline pages="internal(2021/info/day2-close-schedule)" raw="yes"]]
+- Prerecs have already been posted, yay! You can find them on the talk pages and at <https://media.emacsconf.org/2021/> (We'll figure out how to get the Q&As.)
+- Thanks to everyone who submitted talks to EmacsConf, including those
+ whose talks didn't make it into this year. We'll be
+ sharing more resources as they come in, so subscribe to <emacsconf-submit@gnu.org>
+- Next steps
+ - We'd love to hear what you liked and what we can improve.
+ Please share your conference feedback and ideas at the end of the
+ Etherpad under the heading "General discussion about EmacsConf 2021" <https://etherpad.wikimedia.org/p/emacsconf-2021> or
+ e-mail them to us at <emacsconf-submit@gnu.org>. If you would like
+ to keep your feedback semi-anonymous, you can e-mail it to either
+ <bandali@gnu.org> or <sacha@sachachua.com> and we'll keep your
+ name private when sharing the feedback with the other organizers.
+ - Post your questions/thoughts to the
+ <https://etherpad.wikimedia.org/p/emacsconf-2021> Etherpad or
+ email it to us at <emacsconf-submit@gnu.org> by Dec 10, and we'll
+ e-mail your question to the speakers for following up
+ - Subscribe to emacsconf-discuss for announcements <https://lists.gnu.org/mailman/listinfo/emacsconf-discuss>, like when additional captions or videos become available
+ - There were lots of talks! Feel free to rewatch, follow links, and learn more.
+ - If you want to help caption talks (4 left! also, the archive) or Q&A, or help with other tasks, see [[/2021/contribute.md]]
+ - Keep in touch with Emacs News <https://sachachua.com/emacs-news> - weekly updates
+ - Check out <https://www.emacswiki.org/emacs/Usergroups> to find a user group near you or online
+- Thanks again
+ - Speakers, volunteers
+ - Karl Voit for managing the pad
+ - Bhavin Gandhi and Hannah Miller for help with the captions
+ - Free Software Foundation, especially the FSF tech team, for their continued help and support
+ - LibrePlanet 2022 Call for Sessions open for a few more days; consider giving a talk! See <https://libreplanet.org/2022/> and <https://my.fsf.org/lp-call-for-sessions/>
+ - FSF's Fall 2021 fundraiser happening now! See <https://fsf.org/appeal> if you'd like to give :)
+ - Fosshost, for BigBlueButton server and for ftp-upload server
+ - Computer Science Club of the University of Waterloo, for continuing hosting the videos/files on the CSC mirror server
+ - Jan Prunk (yang), for EU mirror of EmacsConf videos/files: <https://de1.mirror.si/emacsconf/>
+ - Wojciech Siewierski (vifon), for assisting zaeph with his scripts last minute
+ - Grant Shangreaux, for beautiful music :) (under CC BY-SA 4.0) <https://churls.world/basement-days/basement-days.html>
+ - the developers and maintainers of all the things that made this possible, with a special shout-out to:
+ - Random User (rndusr), whose subed.el made it easy to caption these talks inside Emacs
+ - And Qiantan Hong (qhong), author/maintainer of crdt.el which we used for sharing Emacs buffers between organizers
+ - Organizers
+ - Everyone
+
+# Discussion
+
+- I really appreciate the approach of doing things prerecorded and having captions.
+- (please add a contact form for the website to make it easier for volunteers to sign up, sending an initial email can be psychologically intimidating.)
+ - i am willing to volunteer to think about /work on the form
+ - thanks! not sure if adding something like formspree would be counterproductive, but coming up with a list of ways to help out in an email takes a lot more energy than just adding your name and email to a list of potential volunteers.
+- we'll recommend opening the .webm directly as the main option
+- i managed to get a few people to watch my talk afterwards. letting them know it was only 10 minutes helped. non-emacs folks even :)
+
+[[!inline pages="internal(2021/captions/day2-close)" raw="yes"]]
+
[[!inline pages="internal(2021/info/day2-close-nav)" raw="yes"]]
diff --git a/2021/talks/day2-open.md b/2021/talks/day2-open.md
index d6181726..ff737f95 100644
--- a/2021/talks/day2-open.md
+++ b/2021/talks/day2-open.md
@@ -7,9 +7,14 @@
# Opening remarks day 2
+[[!inline pages="internal(2021/info/day2-open-schedule)" raw="yes"]]
+- Welcome back!
+- Prerecs available for day 1 on the talk pages
+- Some of the talks for today have not yet been captioned, but we may follow up on them; if you want to help out, please volunteer
+- Dev day has a bit more space for questions, so we'll have that on the main stream and use the alternate stream to keep going
+- BBB room links will be posted to the talk pages and IRC so that you can join
-
-[[!inline pages="internal(2021/info/day2-open-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/day2-open)" raw="yes"]]
[[!inline pages="internal(2021/info/day2-open-nav)" raw="yes"]]
diff --git a/2021/talks/design.md b/2021/talks/design.md
index e251a704..84a89de9 100644
--- a/2021/talks/design.md
+++ b/2021/talks/design.md
@@ -8,6 +8,10 @@
# On the design of text editors
Nicolas P. Rougier
+
+
+[[!inline pages="internal(2021/info/design-schedule)" raw="yes"]]
+
Text editors are written by and for developers. They come
with a large set of default and implicit choices in terms of layout,
typography, colorization and interaction that hardly change from one
@@ -17,43 +21,95 @@ habits, reproducing what they are used to. Durint this talk, I will
characterize these implicit choices and illustrate what are some
alternatives using GNU Emacs.
+# Outline
+
+1. Review of a "modern" code editor (5mn)
+2. Introduction of an alternative using Emacs (5mn)
+# Links from the slides:
-# Outline
+* [Elegant Emacs](https://github.com/rougier/elegant-emacs) (https://github.com/rougier/elegant-emacs)
+* [On the Design of Text Editors](https://arxiv.org/abs/2008.06030) (https://arxiv.org/abs/2008.06030)
+* [N Λ N O Emacs](https://github.com/rougier/nano-emacs) (https://github.com/rougier/nano-emacs)
+* [svg-lib (ELPA)](https://elpa.gnu.org/packages/svg-lib.html) (https://elpa.gnu.org/packages/svg-lib.html)
+* [nano-theme (ELPA)](https://elpa.gnu.org/packages/nano-theme.html) (https://elpa.gnu.org/packages/nano-theme.html)
+* [nano-modeline (ELPA)](https://elpa.gnu.org/packages/nano-modeline.html) (https://elpa.gnu.org/packages/nano-modeline.html)
+* [nano-agenda (ELPA)](https://elpa.gnu.org/packages/nano-agenda.html) (https://elpa.gnu.org/packages/nano-agenda.html)
-<!--
-- Brief description for all talk formats up to your maximum planned
- length
-
-- 40 minutes (preferred option)
- - **10 minutes** Demonstrating implicit choices present in most text
- editors that are all too similar.
- - **10 minutes** Showing alternatives, including typography, colors,
- layout,
- user interaction as well as non implemented features
- (technical barriers).
- - **10 minutes** Live demonstration of my hacked but consistent
- environment
- for edition/news/agenda/mail using various packages
- I've
- authored.
- - **10 minutes** Questions
-
-- 20 minutes alternative
- - **5 minutes** Rapid overview of text editors implicit choices
- - **10 minutes** Showing alternatives, including typography, colors,
- layout, user interaction and live demonstration of my
- Emacs
- environment.
- - **5 minutes** Questions
--->
-- 10 minutes alternative
-
-Mostly a live demo of my environment with pointers to the different
-packages
+# 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.
+- looks beautiful
+- how much of that is just bigger margins and roboto though?
+- I love nano Emacs. I use it too
+- i wonder if I can steal the splash screen and header line
+- I really think that the default emacs theme could use this kind of effort and scrutiny in order to improve it
+- A4: good idea, but few people have A4 *screens*...
+- holy crap it looks so good
+- yet again, though, the contrast is awful! black and white, please, not light grey and not-quite-so-light grey. it's almost unreadable, IMHO
+- How hard would it be to integrate nano emacs changes with the default emacs? Like, would there be a lot of pushback?
+ - of course! there was massive pushbac over using curly quotes, for goodness' sake
+- Are you aware of the modus-themes and what are your thoughts after contrast and accessibility?
+ - yeah, i just love modus themes by Prot because i'm colorblind and the fact that it has a strict contrast ratio is really really helpful, but even on modus themes i have to set success, error and warning to some really strong colors like pure red, green and blue
+ - I'm *not* colourblind and having high contrast is still good! there's a reason books are black on white, not grey on grey. or at least the background and body-text foreground must be highly distinct
+ - protesilaos: there are also options for deuteranopia, in case you need them (will need to refactor them for simplicity's sake)
+- What Nicolas Rougier does is most welcome. Emacs can benefit a lot from such work.
+- 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.
-[[!inline pages="internal(2021/info/design-schedule)" raw="yes"]]
+- 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)
+* Support my work at [github.com/sponsors/rougier](https://github.com/sponsors/rougier) or [en.liberapay.com/rougier/](https://en.liberapay.com/rougier/)
+
+[[!inline pages="internal(2021/captions/design)" raw="yes"]]
[[!inline pages="internal(2021/info/design-nav)" raw="yes"]]
diff --git a/2021/talks/dev-update.md b/2021/talks/dev-update.md
new file mode 100644
index 00000000..a3467171
--- /dev/null
+++ b/2021/talks/dev-update.md
@@ -0,0 +1,29 @@
+[[!meta title="Emacs development updates"]]
+[[!meta copyright="Copyright &copy; 2021 John Wiegley"]]
+[[!inline pages="internal(2021/info/dev-update-nav)" raw="yes"]]
+
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Emacs development updates
+John Wiegley
+
+[[!inline pages="internal(2021/info/dev-update-schedule)" raw="yes"]]
+
+# Discussion
+
+- the real question: do we still have time to get our patches in to the 28 branch ^_^
+- So I assume a lot of distros will make those native-comp related packages some sort of dependency, right?
+ - the conversations I have seen among the distro maintainers seems to suggest that at least some of them will bundle the .eln files
+ - What about ELPAs?
+ - if a distro packages elisp files they would, but for ELPA even the .elc files aren't stored (iirc?), so those would be compiled asynchrously
+- That's great so that I'm not using weird commands on incompatible modes
+- Yes yes yes, the input mode update sounds incredible. I already hack that in my init.el, but I guess it'll be native.
+- thank you so much for the great work on Emacs!
+- why would emoji support be important in any way.. for anybody? Especially.. in the larger scheme of things or more important problems? Am i missing something?
+ - Unicode compatibility's always a good thing
+- so you have to have a toolchain present even if you are only using precompiled .eln files
+
+[[!inline pages="internal(2021/captions/dev-update)" raw="yes"]]
+
+[[!inline pages="internal(2021/info/dev-update-nav)" raw="yes"]]
diff --git a/2021/talks/devel.md b/2021/talks/devel.md
index b3c197f4..3cb9412a 100644
--- a/2021/talks/devel.md
+++ b/2021/talks/devel.md
@@ -8,81 +8,53 @@
# Don't write that package! or: How I learned to stop worrying and love emacs-devel
Stefan Kangas
-Emacs' greatest strength is also its greatest weakness: it is **too** hackable.
-
-We have a great community that experiment with new features that are still
-lacking in Emacs core. They write up a package and develop the living daylights
-out of it, until it is basically amazing. (I'm looking at you Magit.)
-
-There are other examples such as helpful.el - great package, but why are those
-features not in core? What about projectile? And so on.
-
-Core demands copyright assignments (CLA). This is a fact of life. While I
-mostly agree with the people saying it is not helful, they are there to protect
-Emacs from copyright issues in the future. So my suggestion here is simple:
-just **sign the papers**. It is just a formality, and you should only need to do
-it once.
-
-I suggest that any ambitious feature that we **might** want to see shipped in the
-default Emacs distribution should by default go to GNU ELPA. You don't need to
-do this, of course, and I respect your decision, but I urge you to do it.
-
-GNU ELPA does not have an exceptionally high standard, but we do try to give any
-new package a proper code review.
-
-MELPA is excellent. We love MELPA. They don't have a criterion for their
-packages that is important to the FSF, which is to not recommend non-free
-software. Therefore, we could not recommend it by default, and had to build
-NonGNU ELPA.
-
-NonGNU ELPA will be used for packages that we don't have an assignment for but
-would still like to distribute. It should ideally only be for old packages
-where getting a CLA is impractical.
-
-It is sometimes perceived as hard to contribute to Emacs core. This impression
-is largely wrong. If I can do it, you can too.
-
-We do have a problem in that our tools and methods (mailing lists, the bug
-tracker) are out-dated. This is largely correct. We want to migrate to
-something else, and the best candidate is probably Sourcehut. Please volunteer
-to help!
-
-We sometimes see people adding stuff to their Init file to fix this or that
-annoyance, or even bug. The more ambitious would go on to package up such fixes
-in what I call "patch packages". "Hey, foo-mode doesn't have support for
-'bookmark-set', let's write a package!" I am here to suggest that you submit a
-patch to Emacs instead.
-
-Fixing an issue for one person is good, and fixing it for more people is even
-better. Fixing it for everyone? Priceless.
-
-emacs-devel is not that scary, nor is email. We are really quite friendly and
-easy going, but the communication we prefer (for reasons of efficiency - the
-volume is very high) is often very brief and to the point. We are trying our
-best at communicating, but sometimes fail.
-
-And we need more contributors. We need a successful Emacs on this planet.
-
-So should you really write a package, or should YOU become a core contributor?
-
-
-
-# Outline
-
-- I will urge people to consider contributing to Emacs instead of
- writing small packages, and explain GNU ELPA, MELPA, CLA.
-- I will go into greater detail about emacs-devel, how it "works"
- (e.g. is Emacs conservative without reason?), how to get things
- done and the necessary mindset.
-
-<!--
-- 40 minutes: (brief description/outline): All of the above, and I will show a
- demonstration and give instructions for how to use M-x debbugs to read the bug
- tracker, how to send emails, patches, and our workflows. More on what to
- expect.
--->
-
-
[[!inline pages="internal(2021/info/devel-schedule)" raw="yes"]]
+We need a successful Emacs on this planet. This means that we need an
+excellent out-of-the-box experience -- one that just works, but that you
+can still hack and customize. There is so much great experimentation
+and work going on out there in the wider Emacs community, but we would
+be even better off if more of that could go into Emacs itself.
+
+Emacs' greatest strength is unfortunately sometimes also its greatest
+weakness: it is *too* hackable.
+
+On occasion, people out there add stuff to their Init file to fix this
+or that annoyance, or even bug. The more ambitious might go on to
+package up such fixes: "Hey, 'foo-mode' doesn't have support for
+'bookmark-set', let's write a package!" I am here to suggest that you
+should not do that.
+
+You should submit a patch to Emacs! Maybe more people have that same
+problem or annoyance, and would benefit from your solution?
+
+It is sometimes perceived as hard to contribute to Emacs core. I want
+to encourage more people to get involved, and show that the barrier to
+entry is really not that high. If I can do it, you can do it too!
+
+So should you really write that package, or should you stop worrying and
+learn to love emacs-devel? Listen to my talk to find out more!
+
+# Discussion
+
+- I can imagine using bindat to improve Emacs's music player packages e.g. reading/writing metadata tags
+- I hadn't heard of Poke until today
+- Curious: how is gnu poke more flexible?
+- I was surprised to see that a whole new DSL was developed for poke from scratch.
+- I'll ask what I also asked Andrea earlier: What hobbies/interests do you have besides Emacs (and PL)? :)
+- 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?
+- If you ever write a library for window management in Emacs, you could call it winnie.el :)
+- 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?
+- 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
+- yep, the automatic translation is more for libraries trying to write automatically C bindings
+
+[[!inline pages="internal(2021/captions/devel)" raw="yes"]]
+
[[!inline pages="internal(2021/info/devel-nav)" raw="yes"]]
diff --git a/2021/talks/dsl.md b/2021/talks/dsl.md
index 9fb5cd47..a2a952dd 100644
--- a/2021/talks/dsl.md
+++ b/2021/talks/dsl.md
@@ -8,6 +8,8 @@
# Self-Describing Smart DSL's: The Next Magits
Psionic
+[[!inline pages="internal(2021/info/dsl-schedule)" raw="yes"]]
+
When we begin programming, the promise is to automate away repetitive
tasks in life. As those program's capability grows, we begin to need
configuration UI's. We can start with a CLI, but as any CLI grows, we
@@ -42,7 +44,6 @@ self-describing modal programming system.
<!--- 40 minutes: Wrapping a server in Transient to make a new Emacs application -->
-
-[[!inline pages="internal(2021/info/dsl-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/dsl)" raw="yes"]]
[[!inline pages="internal(2021/info/dsl-nav)" raw="yes"]]
diff --git a/2021/talks/eaf.md b/2021/talks/eaf.md
index 1bd64e5e..3c8f9bf3 100644
--- a/2021/talks/eaf.md
+++ b/2021/talks/eaf.md
@@ -8,19 +8,105 @@
# Emacs Application Framework: A 2021 Update
Matthew Zeng
+[[!inline pages="internal(2021/info/eaf-schedule)" raw="yes"]]
+
Emacs Application Framework (EAF) is a customizable and extensible GUI
application framework that extends Emacs graphical capabilities using
PyQt5. There are many new but important updates since EmacsConf2020
last year, this talk will briefly go over them.
+# Feedback
+Pad:
-# Outline
+- 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
-- 5-10 minutes: (brief description/outline)
+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.
+ - With how Emacs deals with things like GPG/pass/etc. I feel like it's probably as secure as you make it?
+ - matthewzmd: TDT the browser application is independent from emacs itself, you're using a browser in emacs, but the browser is not actually in emacs
+ - If it can be secured under something like firejail, that may be better, as long as there's some segmenting with any communication between the two. Then again, I generally run any browser in dedicated VMs.
+- ok now this is something i need
+- maybe i misunderstood, but is every eaf app essentially embedded QT?
+ - matthewzmd: 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
+ - 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/>)
-[[!inline pages="internal(2021/info/eaf-schedule)" raw="yes"]]
+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/erg.md b/2021/talks/erg.md
index 72a70cff..4d1ca6dd 100644
--- a/2021/talks/erg.md
+++ b/2021/talks/erg.md
@@ -8,6 +8,10 @@
# 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
+
+
+[[!inline pages="internal(2021/info/erg-schedule)" raw="yes"]]
+
The four of us met at EmacsConf 2020, and joined together around a
common interest in Emacs and research. Since then, we have convened as
the Emacs Research Group for weekly meetings. During these meetings, we
@@ -27,8 +31,20 @@ In our short talk we share information about these methods, making a
case for other people getting together and creating their own small
research communities similar to ours.
-
-
-[[!inline pages="internal(2021/info/erg-schedule)" raw="yes"]]
+# Discussion
+
+- So this group really spawned out of last year's conf? You four were just met up and kept in touch?
+- Excellent -- I actually meant to post Citizen Science, but I got confused with another thing
+- I am definitely interested in incorporating your workflow. What resource would you recommend as a started - and is it one I could share with colleagues who do not yet use Emacs?
+- Btw, I loved the rapid problem solving approach you take. I am also using "rapid response collecting" with my students to promote a similar 'prescience of the present'!
+- would be willing to share the paper with me as well? i would also love to start an Emacs Research Group, i think Emacs has more to offer to science and people's day to day life than we realize currently
+- Do you have sample workflows on your website?
+- <http://metameso.org/~joe/docs/submission_candidate-25-Nov-2021.pdf>
+- <https://github.com/exp2exp/exp2exp.github.io/blob/master/src/erg-2021-11-20.org>
+- <https://github.com/exp2exp/exp2exp.github.io/blob/master/src/cla-16-october-2021.org>
+- <https://exp2exp.github.io/cla-16-october-2021>
+- also, a bit of a technical question: how do you get a public IP to share a session on crdt?
+
+[[!inline pages="internal(2021/captions/erg)" raw="yes"]]
[[!inline pages="internal(2021/info/erg-nav)" raw="yes"]]
diff --git a/2021/talks/exec.md b/2021/talks/exec.md
index e4d46aef..b25defb0 100644
--- a/2021/talks/exec.md
+++ b/2021/talks/exec.md
@@ -8,6 +8,10 @@
# Org as an executable format
Tom Gillespie
+
+
+[[!inline pages="internal(2021/info/exec-schedule)" raw="yes"]]
+
Org mode is known for its flexibility, power, and staggeringly diverse
number of workflows, users, and use cases.
@@ -47,7 +51,30 @@ transform Org files from plain text documents with a bit of markup
into self describing computational documents, or interactive
applications.
+# Discussion
+
+IRC nick: tgbugs
+- what prompted you to create orgstrap?
+- Tom Gillespie: <https://github.com/tgbugs/orgstrap/blob/master/README.org#background-file-local-variables-and-checksums>
+- yeah, usually this kind of stuff starts out as a minor annoyance
+- is there a way to choose which blocks are going to be executed?
+- What are some practical specific use cases that you had in mind?
+- Tom Gillespie: <https://github.com/SciCrunch/sparc-curation/blob/master/docs/sckan/welcome.org>
+- Tom Gillespie: <https://github.com/tgbugs/orgstrap/blob/master/README.org#use-cases>
+- i'll for sure incorporate it in my company and research, so both corporate and academic environments will benefit from your work. i already use Org for documenting a lot of stuff so its just a natural next step
+- I have experimented with dblocks in an org-mode buffer to do the equivalent of javascript in a browser. Does that make sense?
+
+From IRC:
+
+- This is supercool !!
+- That is absolutely wild
+- is the hash not just security theater?
+ - tgbugs: you need it to enable non-theater workflows
+ - anyone who could write the org-file could update the hash as well, no?
+- I don't understand why he needs to talk about powershell, more than the other shell. :(
+ - tgbugs: very late response, but the reason I talked about powershell more than the others is because it is the most different and required some explainiation, I also was :/ about that
+ - that sounds that is a good reason to not include it xD . you can add fish in the talk and it will be bettter.
# Outline
@@ -71,7 +98,6 @@ a deeper dive into the internals, and a discussion about interest
in incorporating such functionality into org-mode directly.
-->
-
-[[!inline pages="internal(2021/info/exec-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/exec)" raw="yes"]]
[[!inline pages="internal(2021/info/exec-nav)" raw="yes"]]
diff --git a/2021/talks/faster.md b/2021/talks/faster.md
index 4e9b7752..0434db61 100644
--- a/2021/talks/faster.md
+++ b/2021/talks/faster.md
@@ -1,13 +1,21 @@
-[[!meta title="How to write faster Emacs Lisp"]]
+[[!meta title="Optimizing Emacs Lisp Code"]]
[[!meta copyright="Copyright &copy; 2021 Dmitry Gutov"]]
[[!inline pages="internal(2021/info/faster-nav)" raw="yes"]]
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-
-# How to write faster Emacs Lisp
+# Optimizing Emacs Lisp Code
Dmitry Gutov
+[[!inline pages="internal(2021/info/faster-schedule)" raw="yes"]]
+
+[[!table header="no" class="speaker-details" data="""
+Name pronunciation: | d-MEET-ri GOO-tov
+Pronouns: | he/his
+Homepage: | <https://github.com/dgutov/>
+Preferred contact info | <dgutov@yandex.ru>
+"""]]
+
- Before optimizing, benchmark first.
- Different benchmarking approaches.
- Live evaluation, step-debugging, measuring from a debugger breakpoint.
@@ -18,7 +26,108 @@ Dmitry Gutov
the bottleneck is. How to quickly load a byte-compiled version.
- Steps taken to speed up the Xref package recently.
+# Discussion
-[[!inline pages="internal(2021/info/faster-schedule)" raw="yes"]]
+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
+- defstruct accessors should expand with compiler macros to aref calls, which are very fast
+- They have extra if though
+- oh you mean for testing whether the value is such a struct?
+- yes there is that test, but I wouldn't expect that to make it 3x slower, AFAIK
+
+IRC:
+
+- If somebody wants to do a remote session with me: I do have processes such as updating column view dynamic blocks that take maybe 40 minutes. So far, I avoid executing those functions when I'm around the computer myself. However, there may be room for improvement and I really can't tell wether it is in my personal setup or not because it's not always that easy to re-create a use-case with plain Emacs cnofig
+- Thanks for doing this talk. FYI you might find the this bench-multi-lexical macro useful: https://alphapapa.github.io/emacs-package-dev-handbook/#outline-container-Optimization
+ - dgutov: I can't seem to find the exact macro you are referring to. But if it covers a use case benchmark-progn does not, consider contributing it to benchmark.el in the core.
+ - Sorry, try this link directly to that macro: https://github.com/alphapapa/emacs-package-dev-handbook#bench-multi-lexical The purpose of the macro is to compare different forms and show how they perform relative to each other
+ - dgutov: Ah yeah, that looks pretty cool. Less sure about the org format, but it must be nice for presentations.
+ - The Org format is good for documentation too. But it just uses the output of benchmark-run, so it could easily be left in Lisp form. :)
+ - dgutov: These things are really handy to have available in 'emacs -Q', though. When you're working on shaving some extra handful of percents.
+ - Yes, a few lines of code could be added to run the compiled code in a separate Emacs process.
+- https://github.com/alphapapa/emacs-package-dev-handbook compares some common ways to do common things in Elisp so you can see which is generally faster, e.g. https://github.com/alphapapa/emacs-package-dev-handbook#inserting-strings
+- 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
+- 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 0ba1c8b1..f8c29489 100644
--- a/2021/talks/forever.md
+++ b/2021/talks/forever.md
@@ -8,14 +8,100 @@
# M-x Forever: Why Emacs will outlast text editor trends
David Wilson
+
+
+[[!inline pages="internal(2021/info/forever-schedule)" raw="yes"]]
+
The computer software industry has seen many "popular" text editors come
and go, often due to the mercurial fashions of software development. In
this talk, we'll take a look at why popular editors fade and the
specific aspects of Emacs that will ensure it remains relevant
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?
+- What do you think about Guix or Nixos + emacs videos ?
+- It's nice to watch your videos and grab ideas from your workflows, or your code.
+- That happens whenever I've used magit at work :D.
+- Any thoughts on the idea that the best tool to use is the one which is easiest to leave? Possibly this is now even more relevant now that there is a heavy push to cloud services.
+ - I guess it also depends on who owns said tool (given that most cloud services aren't owned by the user).
+- Do you think that there should an updated initial configuration for fresh Emacs installations with more "modern" (UI) features, or even CUA-like shortcuts?
+- I really appreciate the live-video format: non-edited, live, thinking aloud videos - compared to all the polished super-edited "artificial" videos are more a show-of (see me!) as opposed to actually want to share knowledge...
+- Hm. Will you do live pair-programming in the future? I believe you did that with JT some weeks ago.
+- I would be very interested in summaries!
+- Transcript remark: name mentioned by iLemming is written "John Lindquist".
+- I think (possibly) emacs content might have been statistically relevant enough for bots to generate videos and upload them. For the last few months there seemed to be a constant stream of videos with the same intro and outro, plus some text to video in the middle.
+ - Sound like Tony's videos, which are user generated, but seem very automatic generated.
+- 2 min videos will be *too* short - event for a short video. I think 5-10 min will allow for a good short intro to a specific functionality..
+
+IRC:
+
+- My anecdotal evidence, is introducing my coworkers to org mode, and the intracacies of doing more and more in Emacs. It becomes an overwhelming advantage.
+- lots of really popular editors are primarily maintained by companies and dies when the backing companies stop maintaining it
+- Popularity also adds to people breaking features that long time users like me use everyday but they don't see as popular and so they feel the need to break for something different.
+- I think a lot of popularity could be gotten from introducing more people in academic fields to Emacs. Org-Mode is such a game changer on that front.
+- Now, Emacs is based on another mind-blowing idea. The idea of practical notation for lambda calculus, what is known as Lisp. Lisp, probably can be crowned as the most important idea in computer science. It just hard to think of something more influential than Lisp. Emacs is just a practical implementation (and frankly, not the best one) of that idea.
+- Yes. Emacs is an editor for creating domain specific editors.
+- my only problem with the Emacs community is that the community in other language is non-existen
+- Would there be any way to have other Lisps like Guile be compatible with Emacs?
+ - Guile has an Elisp interpreter in its compiler tower, however it's afaik not up to snuff for actually running Emacs.
+ - the problem is the "big datatypes" like buffers and strings, which guile either doesn't do at all or which need expensive bidirectional transcoding across the boundary
+ - some like this? https://www.gnu.org/software/guile/docs/docs-1.8/guile-ref/Using-Guile-in-Emacs.html
+- I think seeing power users do the things they do with Emacs and Org-mode and how prolific they are is a major selling point (thinking of *so* many people, but say John Kitchin comes to mind)
+ - To piggy back on a previous comment, I think if people kept seeing the top people in their fields (be in science/academic, software engineering, devops, etc.) use Emacs and Org-mode and especially their uniquely powerful features (literate style with org-babel, etc), Emacs would start taking over beyond it's historically low single digit % adoption
+ - luckily for me, John Kitchin shows a lot of engineering applications of emacs and org-mode and I love those videos, but I can understand that a lot of people won't find someone like that for their profession
+ - 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
@@ -27,7 +113,6 @@ regardless of mainstream popularity.
- Talk about specific instances where editors were popular, fell out
of popularity, and why (due to changing fashions, not usually
better features).
-
-[[!inline pages="internal(2021/info/forever-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/forever)" raw="yes"]]
[[!inline pages="internal(2021/info/forever-nav)" raw="yes"]]
diff --git a/2021/talks/form.md b/2021/talks/form.md
index 12443a8f..41ef151c 100644
--- a/2021/talks/form.md
+++ b/2021/talks/form.md
@@ -8,51 +8,106 @@
# Old McCarthy Had a Form
Ian Eure
+
+
+Name Pronunciation: (EE-un YOU-r)
+
+Pronouns: he/him/his
+
+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
for a discussion of EIEIO, and learn how it can help you write more
modular, flexible Emacs Lisp.
+# Discussion
+
+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.
+- Great talk. So with that Emacs is on pair with Smalltalk development environments now
+- For reference, transient.el, which we all know and love as the engine that drives the magit interface, is written via EIEIO afaik.
+- I reckon I should look more into it, I've always avoided it because I was afraid it wouldn't be /quite as nice/ as CLOS or GOOPS.
+ - ieure: It's missing a few things (most documented in the manual: https://www.gnu.org/software/emacs/manual/html_mono/eieio.html#CLOS-compatibility), but it's solid and worth using.
+ - Yeah when transient.el first came out I was impressed by how naturally it worked as part of that abstraction.
+- ieure: EIEIO all the things! I had to cut it, but you can use dynamic dispatch based on major-mode, like: (cl-defmethod whatever ((mode (derived-mode python-mode)))) and then (whatever major-mode).
+- Also really nice for things like 'window-system. I really like when callsites are clean and not cluttered with conditionals.
+- Can eieio do regexp dispatch?
+ - ieure: Not currently, but it's possible to add.
+ - okay, so I don't need to feel too bad about coding up my own vtable for those then
+ - 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
-- 5-10 minutes: (brief description/outline)
- - What is CLOS/EIEIO?
- - Why would I want OOP in Emacs Lisp?
- - How is the CLOS object model different from C++/Java/.NET?
- - Further reading
-
-<!--
-- 20 minutes: (brief description/outline)
- - What is CLOS/EIEIO?
- - Why would I want OOP in Emacs Lisp?
- - How is the CLOS object model different from C++/Java/.NET?
- - Generic functions
- - Methods which implement those functions
- - Specializers
- - Further reading
-
-- 40 minutes: (brief description/outline)
- - What is CLOS/EIEIO?
- - Why would I want OOP in Emacs Lisp?
- - How is the CLOS object model different from C++/Java/.NET?
- - Generic functions
- - Methods which implement them
- - Specializers
- - Example interface & demo
- - Classes
- - Slots
- - Initializing instances
- - Cloning & other miscellany
- - Inheritance
- - Method qualifiers
- - Further reading
- - Q&A
-
--->
+- What is EIEIO?
+- Why OOP?
+- The CLOS Model
+ - Classes
+ - Generic Functions
+ - Methods
+ - Specialization
+ - Method Qualifiers
+ - Multiple Inheritance
+ - Nice Properties
+- Practical Examples
+ - Encapsulation
+ - Example: `transmission.el`
+ - Abstraction
+ - Example: `sql.el`
+ - Extensibility
+ - Example: comint
+- Conclusion
-[[!inline pages="internal(2021/info/form-schedule)" raw="yes"]]
+
+[[!inline pages="internal(2021/captions/form)" raw="yes"]]
[[!inline pages="internal(2021/info/form-nav)" raw="yes"]]
diff --git a/2021/talks/freedom.md b/2021/talks/freedom.md
index 09242583..0b2af117 100644
--- a/2021/talks/freedom.md
+++ b/2021/talks/freedom.md
@@ -8,6 +8,10 @@
# 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".
I will outline the key moments in my transition to a GNU/Linux operating
system and mark those which eventually contributed towards me becoming
@@ -34,8 +38,47 @@ If, however, this is absolutely required for administrative purposes I
shall furnish one regardless with the proviso that I am in no way bound
by it and thus reserve the right to modify it ahead of the main event.
+# Discussion
+Questions:
-[[!inline pages="internal(2021/info/freedom-schedule)" raw="yes"]]
+- 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)"
+- Wow, you phrased prometheus bit that excellently!
+- wow great point on new users being enticed by the "easy productivity" angle
+- I want to be productive, so give me this really complicated tool with countless high-level functions so I can get stuff done ASAP. bit of a paradox, really. very well said.
+- what a well thought-through and well prepared talk. really appreciating this!
+- you can't be an emacs tourist because IT SUCKS YOU IN AND DOESN'T LET GO
+- protesilaos is a gift to the community
+- i really appreciate prot's point right here: emacs is "free software" in the strongest sense of the word, from a practical point of a view since even if another program is libre, its usually so darn complicated that the freedom to modify the program is pretty useless since i'm not smart enough to do it
+- the nuance brought by protesilaos between ellitism and exigence is very good.
+
+[[!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 a88d7297..87320134 100644
--- a/2021/talks/frownies.md
+++ b/2021/talks/frownies.md
@@ -8,12 +8,14 @@
# The True Frownies are the Friends We Made Along the Way: An Anecdote of Emacs's Malleability
Case Duckworth
+[[!inline pages="internal(2021/info/frownies-schedule)" raw="yes"]]
+
Emacs is well-known for being extremely flexible, programmable, and
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
@@ -25,8 +27,65 @@ Along the way, I'll discuss just a little of my own history of Emacs,
and why I feel it's a great tool for non-technical users to sink their
teeth into.
+## Speaker information
+- Name pronunciation: /keɪs ˈdʌkwə(ɹ)θ/ (CASE DUCK-worth)
+- Prounouns: he/him
+- Homepage: <https://www.acdw.net>
+- Preferred contact info: [email](mailto:acdw@acdw.net)
+- Links:
+ - <https://breadpunk.club>, a shared unix server about bread
+ - [my Mastodon account](https://writing.exchange/@acdw) (though I'm moving to
+[tiny.tilde.website](https://tiny.tilde.website/@acdw) ... soon™)
-[[!inline pages="internal(2021/info/frownies-schedule)" raw="yes"]]
+# Discussion
+
+- 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 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:
+
+- These kinds of talks are real fun, great job!
+- For real though, I love the path you took to get to where you are. It's super relatable and I've loved hearing about it.
+- 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/gregorian.md b/2021/talks/gregorian.md
index 1b1af064..8c61e394 100644
--- a/2021/talks/gregorian.md
+++ b/2021/talks/gregorian.md
@@ -8,6 +8,8 @@
# Typesetting Gregorian Chant with Emacs
Spencer King
+[[!inline pages="internal(2021/info/gregorian-schedule)" raw="yes"]]
+
There are a variety of methods for typesetting gregorian
chant scores and outputting high-quality sheet music. One of these is
a tool called Gregorio, which integrates with LaTeX allowing scores to
@@ -19,7 +21,10 @@ Emacs by typesetting a simple score. All code and examples will be
made available to help new users get started with typesetting their
own scores.
+# Discussion
+- what are the advantages of this over lilypond?
+- do you know if there is something similar for byzantine notation?
# Outline
@@ -30,7 +35,6 @@ own scores.
4. Code and example availability
-
-[[!inline pages="internal(2021/info/gregorian-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/gregorian)" raw="yes"]]
[[!inline pages="internal(2021/info/gregorian-nav)" raw="yes"]]
diff --git a/2021/talks/imaginary.md b/2021/talks/imaginary.md
index 76bd46b9..01f1e7a7 100644
--- a/2021/talks/imaginary.md
+++ b/2021/talks/imaginary.md
@@ -8,6 +8,10 @@
# Imaginary Programming
Shane Mulligan
+
+
+[[!inline pages="internal(2021/info/imaginary-schedule)" raw="yes"]]
+
Imaginary Programming (IP) is both methodology and paradigm. It is an
extension of literate programming and a way of creating software without
the use of imperative, functional or even declarative code. Yet IP employs
@@ -25,7 +29,144 @@ iLambda. It is important to recognise IP because, for lack of a better
term, it has far-reaching implications for intellectual property and the
GPL. Please keep an open mind.
-
+# Discussion
+
+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?
+ - libertyprime: Good question. IP is great for things like mocking API calls, because you can imagine the API call output. It's great for code generation where you can then do a macro-expand to generate code as you are programming. It's great for coming up with functions that might be difficult to write (idefun color-of-watermelon), for example
+- Hey libertyprime, where do we follow up to find out more?
+ - libertyprime: it's not really good for scaffolding code. I consider emacs to be 45 years of scaffolding to build imaginary functions around
+ - libertyprime: Because IP needs a rigid complimentary code.
+- So how does an IP user verify that the imagined code does what is intended?
+- I like the word 'imaginary' to describe the paradigm
+- libertyprime: How does an IP user verify that the imagined code does what is intended? Through a combination of 'validator functions', imaginary validation functions and language model fine-tuning. So you may also choose an underlying language model to use when running code. That model may have been trained to do the task you are giving it. If you're trying out the docker container you can run `pen config` or do `M-x pen-customize` to force the language model, or chage it in the imagine-evaluating-emacs-lisp .prompt file
+- libertyprime: Haha. The brilliance of emacs, and the reason this stuff is so easy to do with emacs, is that emacs provides intelligible modes and abstractions with which to build prompts. Otherwise you have an amorphous blob of a language model.
+- libertyprime: So the value is absoltely not in replacing emacs entire, as I've come to understand it, but in combining real and imaginary.
+- (wish i could give you back just a fraction of the time you saved just this one person here!)
+- I would love to see the result of imaginary major modes and keymaps
+- libertyprime, is the idea for the first draft of the gpt output to be final, or do you expect to edit some?
+- There seems to be a lot of jargon in this context, like validators, prompts, language models, etc. It's really hard for someone who doesn't already use these things to understand what these pieces are and how they fit together.
+ - well prompts seem to be the input you give to the language model, which it then generates a follow up to
+ - validators sounds like tests? language models are neural language models like GPT-3/j etc.
+ - libertyprime: <http://github.com/semiosis/glossaries-gh/blob/master/pe-prompt-engineering.txt>
+<http://github.com/semiosis/glossaries-gh/blob/master/prompt-engineering.txt>
+<http://github.com/semiosis/glossaries-gh/blob/master/pen.el.txt>
+ - libertyprime: Here are some glossaries for the subjects
+ - So like, a prmpt would be "Marco!" and GPT-3 would of course say... "Polo"
+ - libertyprime: @alphapapa, I also have a much matured prompt format readme, here: <https://github.com/semiosis/prompts>
+ - libertyprime: which can explain 'validator'', etc.
+- aindilis: So uh... does GPT-3 know... everything? in every human and computer language? I don't understand its role exactly, or its limitations.
+ - GPT-3 knows a lot, but not all, from my experience. It's pretty scary, in a good way. I think libertyprime wants to keep it libre.
+ - libertyprime: the latest language models such as Codex are world language + codex, and they know everything at an abstract level, like a human does, in a way. So their depth may be superficial. They're pretty good knowledge aggregators.
+- so libertyprime can you just tab complete and it completes on like the previous sentence, region, buffer, etc?
+ - libertyprime: Yes, it has basic autocompletion functions, (word, line, lines). I'm also making more interesting autocompletion functions, which do beam-search on downstream generations, -- calling it desirable-search. <http://github.com/semiosis/pen.el/blob/master/src/pen-example-config.el>
+ - libertyprime: There are some key binding definitions here which will work for the docker container
+- Does GPT-3 "know" how to transliterate from say public code written in JS / Other-Lang to elisp if you were trying to imaginary code similar function names?
+ - libertyprime: yes, it absolutely can. transpilation is one thing it is very good at. But more bizarrely, you can also transpile intermediary languages, that are composed of multiple different language chimerically. For example, you can smash out your algorithm with a combination of elisp and bash and it will understand when it transpiles into a real language.
+- How well does it actually work to write a function in a mishmash of Bash and Elisp? I can't imagine that working well in practice. There are too many semantic differences in the languages and implementations
+ - libertyprime: it's a very new sort of thing, but feels natural as you are doing it, to generate code. the results of generating code should most probably be looked at before running. that beign said, you can also run 'ieval' around it to run it in inference. I think the takeawaay should be that these models are getting better and better and show no signs yet of reducing quality of results or ability -- no sign yet
+- how does lexical binding affect things, if at all?
+- How about going from a CLOS/EIEIO style of OO to Java / C++ style? Or Erlang style of parameter pattern matching?
+- so IIUC GPT-3 is a service run on a remote system, right? And it's proprietary? How big is it in terms of bytes?
+ - libertyprime: yes, aggregated language models are not good in my opinion. GPT-3 is around 170 GB, approximately 1GB per million parameters, IIUC
+ - libertyprime: There are libre models, and you can connect one to penel to run the inference etc. My goal is to decentralise them though
+ - libertyprime: Because I don't think that 170GB is accessible enough. The issue is actually running the models though. You need a very large computer indeed for that
+ - libertyprime: I can do a customized demo if anyone wants
+- can someone here provide some sample input, and you run it and paste the result, just to give an idea of the quality? or do you already have samples online?
+- here's an idea for a demo... something like (idefun (string target-language) "Translate STRING from its source language into TARGET-LANGUAGE and output it to the echo area.")
+ - oops I forgot to name the function, was thinking of ilambda
+ - I have a feeling that such a large scope for the function will exceed the max output size of the model. maybe we work on a more realistic example?
+ - I was hoping the model would solve all the messy problems for me :)
+ - libertyprime: Oh crud. I hope I havent broken Ilambda. Lol I added support for 0 arguments, it makes it variadic. This will work
+ - doesn't seem like it quite understood the purpose but I can see the connection
+- what happens if you change target lang to "Elisp" &gt;:)
+ - look at the echo area if you didn't notice it
+ - oh wait, I missed the echo area
+ - libertyprime: Yup, exactly, that will work too. One sec
+- can you run the function again or show "C-h e"? And can we see the resulting source code?
+ - libertyprime: translate python to elisp
+ - libertyprime: just with (idefun translate)
+ - libertyprime: No docstring, etc. or arguments.
+ - libertyprime: ccrud. It didnt work haha
+ - libertyprime: Sigh.
+- libertyprime: I need to fix the 2-ary argument thing. :S Really sorry I think I broke it
+- I'd like to see the generated (or "imagined") Elisp source code, assuming it does some HTTP API queries to do the translation and such
+- libertyprime: Yup, I can show that. It works much better when I use OpenAI Codex. Here are some generated functions
+- libertyprime: That's how it works under the hood. Then it cuts out the bit that you want
+- This reminds me of the classical AI paradigm of "generate and check."
+- libertyprime: Sigh. I really cry when demos break. Sorry. I demo'd the underlying prompt though. I broke ilambda, i think
+- I think I saw it generate a huge fibonacci function, is that still in your kill-ring?
+- okay, well thanks for demoing, the code is pretty stable though at this point right? this is just the norm with any demo.
+- I bet people would be glad to watch/read something later on if you want time to work on it.
+- libertyprime: <https://semiosis.github.io/cterm/> This is what I call the complex terminal. Essentially you prefix any terminal program with ct and you get autocompletion etc. for anything. it uses emac's term-mode
+- libertyprime: <https://semiosis.github.io/ii/> And this, ii, it's fully imaginary terminals, so you can import imaginary libraries, etc. and work with them.
+- libertyprime: <https://semiosis.github.io/apostrophe/> This one here, which imagines conversations with anyone that the model knows about. So I'm demoing having a 3way conversation with amber heard, tom cruise and chris nolan.
+ - so you used GPT to generate a compliment, and now GPT generates the convo from that prompt?
+ - 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.
+- 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?
+ - libertyprime: <https://discord.gg/sKR8h9NT>
+- Thanks a lot, very interesting and I am excited to learn more later!
+- yeah this talk was crazy good, ty!
+
+IRC:
+
+- What Shane is saying right now reminds me a lot of the SICP opening words, about how programming, and computing ideas in general are all about dreams and magic. Creating an idealized solution from abstractions and building blocks.
+- This also reminds me of the concept of Humane Tech. Technology, and frameworks that are inherently conducive to human curiosity, intelligent, and all the best traits. <https://github.com/humanetech-community/awesome-humane-tech>
+- I think this is like semantic auto-complete on steroids, like tab completion of whatever your typing, or translation of something you've written into code for instance.
+- If you're worried about these kind of advances in AI, just remind yourself of how easily technology breaks
+- oh my god, executing code derived directly from GPT-3?! that's *lunatic* curl | bash, eat your heart out
+- idefun definitely helped by a docstring
+ - yeah that's a use-case, gen from docstring
+- Man, I really think it would be awesome to have shane be able to explain some of these ideas more in depth as they are obviously very deep topics. I'd love to help contribute next year to possibly creating a way to have multiple talks going on at once so people have more time to speak. I believe it was sachac who mentioned it yesterday.
+- This vaguely reminds me of that one Python package that generates a CLI parser from the help string except that that python package actually made sense
+- re slide 27, would it mean that 2 such "idefined" function would be the "same", meaning do the same thing the same way, given that they are defined without a "body"?
+- the full abstraction would look something like an interactive proof program where you could repeatedly refine the results until it matched what the user wanted
+- it started incomprehensible and then moved straight to impossible magic.
+- wow...mind blown even though that went by a bit too quick.
+- Hmm, I do think we could do test-driven imaginary programming tho i.e. you only define the ERT testcases and then do the rest with idefun
+- So `(imacro with-clifford-algebra (p q r))` would just "work"... this does feel too magical
+- I am really happy that someone is trying Deep Learning stuff *with* emacs and not just for writing Python code :D
+- well I've had pretty good success with GPT-3, I think this also supports GPT-j which is I think free/libre.
+- most users of GPT-3 do it via calls to a web api
+- 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
@@ -93,8 +234,10 @@ IRC libertyprime at #emacs on libera
Shane Mulligan
+## Links
+- Pen.el Tutorial: <https://semiosis.github.io/posts/pen-el-tutorial/>
-[[!inline pages="internal(2021/info/imaginary-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/imaginary)" raw="yes"]]
[[!inline pages="internal(2021/info/imaginary-nav)" raw="yes"]]
diff --git a/2021/talks/invoice.md b/2021/talks/invoice.md
index 74852c94..c3534656 100644
--- a/2021/talks/invoice.md
+++ b/2021/talks/invoice.md
@@ -8,6 +8,17 @@
# 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="""
+Name pronunciation: | BA-lA
+Pronouns: | he/his
+Homepage: | <https://balaramadurai.net>
+Preferred contact info | <bala@balaramadurai.net>
+"""]]
+
Ye Freelance warriors, please lend me your I/O devices for 5 minutes.
Your time is your money! Do you find it a pain to generate an invoice,
@@ -35,8 +46,15 @@ We will use the following packages:
- python layer (I use spacemacs, so whatever is the equivalent in your config)
- Some unnecessary Shakespearean references
+# Discussion
+- okay, this is some next level invoicing automation!
+- 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/info/invoice-schedule)" raw="yes"]]
+
+[[!inline pages="internal(2021/captions/invoice)" raw="yes"]]
[[!inline pages="internal(2021/info/invoice-nav)" raw="yes"]]
diff --git a/2021/talks/janitor.md b/2021/talks/janitor.md
index 03063023..ab903616 100644
--- a/2021/talks/janitor.md
+++ b/2021/talks/janitor.md
@@ -8,6 +8,10 @@
# A day in the life of a janitor
Stefan Monnier
+
+
+[[!inline pages="internal(2021/info/janitor-schedule)" raw="yes"]]
+
Because of a reckless former Emacs maintainer that shall
better stay unnamed, ELisp has seen a fair bit of churn in the last 10
years, making it necessary to clean up "old" code [in order to open up
@@ -15,6 +19,132 @@ Because of a reckless former Emacs maintainer that shall
In this documentary we will follow a famous janitor in his every day job
dealing with the aftermath of the cl-lib / lexical-binding party.
+# 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 :)
+- anyway, thanks for de-terrifying lexical-binding conversion in particular -- I think I might start pitching in there (I assumed it was a lot more paranoid and proof-based than this, which it seems like something I could do!)
+ - what do you mean you don't search the entire space dominated by every funcall for uses of each var :)
+ - God knows what crazy things users have done with either hooks or advice, and what vars they implicitly depend on :/
+- Curious, is the Emacs you showed also your personal config, or one just for the video?
+ - Understandable, I'd do the same. I was curious to see what your real config looked like though :)
+- oh that reminds me, thanks for pcase, it's amazing :)
+- Oh that's fast. Compare to Linux: 16 years and counting (!) for the -rt patches...
+- What's your opinion about tree-sitter? Is it possible to see something like paredit but for non-lisp language?
+- I suppose you can just ask "how old is this?" and it's the ancient stuff that is hardest to convert
+- Hi Stefan, thank you for this very insightful talk, full of tacit knowledge. I've learned much also from your HOPL talk (and paper). Is there a world in which you could consider doing other short informal videos just to show your thinking and pass on such tacit knowledge to those that would be interested in getting into emacs-devel per se.
+- May I ask a silly question? I'm curious about your style of signing your mailing list messages, i.e. "Stefan 'who foo bar baz'" Where did that originate? :)
+ - I enjoy it, the list needs levity like that :)
+- (Also, I for one liked that you didn't use specialized tools, for precisely those reasons that it makes it more accessible to those just starting.)
+- Would it be too off-topic to ask about ELPA? I was thinking that it would be helpful to have a way to list packages on the site by last-updated time
+- Is it possible to see metaobject protocol support in elisp?
+- What features of the language/platform do you see as higher priority for future development? i.e. I'm looking for package pages that use the HTML-formatted readme from the patches we worked on, but I don't know which pages have been updated recently, so it's hard to find them :)
+- could download counts be done? Would that require the Savannah folks to code?
+- Do you install packages from melpa?
+- Stefan: Are you using native-comp already?
+- Do you use Org much?
+- Do you use magit?
+- What are some of the improvements coming in future Emacs versions you're looking forward to?
+- What's your opinion about Po Lu's recent patchs about GStreamer?
+- Have you ever met any of the other Emacs maintainers or developers in person?
+- How do you hack on installed packages? I mean installed packages are not a git cloned repo. But I want to commit changes and to see an immediate effect in a running Emacs. What is suggested workflow for this?
+- What's Lars like in real life? He seems like a fun person :)
+ - oh is he tall?
+- From your academic/research work, are there things you would like the elisp language or platform to evolve towards, even if medium-long term? Or is the long term path a different language(s) altogether?
+- Do you personally use paredit?
+- Do you lean toward Scheme-style macros rather than CL ones?
+- What non-lisp languages are you looking at that we could possibly inspire from, if any?
+- I'd like to see something like a with-gensyms macro to make them easier to use. Dima Akater also has some ideas (and code) for enhancing defmacro in a similar way
+- (hehe, yes i meant mostly typed functional programming languages)
+- Can namespaces solve some macro issues?
+- are there technical difficulties in preserving that source code data associated with symbols and sexps? or could something like defstructs be used simply to do that in a primitive way?
+-so almost like a parallel macro/elisp implementation then?
+- doesn't adding code/data distinction break homoiconicity?
+- Could a Clojure-like metadata approach to extend the data be useful for this, and if so doable?
+- fat cons cells sounds useful, could maybe be used to do CL-style VALUES too?
+- even more tedious than janitorial work I suppose :)
+- BTW, Stefan, I forget, are you Canadian/Quebecois, or do you just happen to live and work there? :)
+ - ah, so you are French?
+- thought of another simple question to bombard you with :) Do you mostly run Emacs from master, or other versions?
+ - Stefan Monnier: I basically only use my own version, which tracks `master` with a bunch of local experimental & cosmetic changes
+- elisp looks very much like a procedural language. Do you like it this way or maybe you wish it moving towards more functional/Scheme style?
+ - Stefan Monnier: ELisp is halfway between imperative and functional, and I think it works rather well this way. The usual style has evolved towards a more functional style.
+ - Stefan Monnier: The ELisp implementation sadly isn't good enough to support a truly functional style, currently.
+- Stefan Monnier: I tend to edit code as I read it, so my local changes probably accumulate to 1MB or so of patch, but most of it is purely cosmetic changes which I "should" push to master but can't be bothered to.
+
+IRC:
+
+- Question: Is there a place where these conventions and compilers checks are listed? A web page, an info perhaps?
+- Wow, I think you are going to have to know a LOT on Emacs development, versions, Elisp details, ... to do that kind of work.
+ - One very helpful thing anyone can do is just confirm bug reports and add reproduction steps if they are missing.
+- The double-dash is a convention for an func intended to be called internally only?
+ - Yes. `pacakge-foo` is public, `package--foo` is internal.
+- mindless tree-wide transforms like this are what coccinelle is for. why are emacs maintainers still doing this by hand? you'd think lisp would be well-suited for expressing semantic patches to lisp... :/ this ceases to seem interesting when you've seen cocci do ten thousand transforms like this across a 500MiB tree in 20s or so
+ - Does cocci work on elisp?
+ - no, but the *idea* should work there, and Lisp is so regular in structure that something like coccinelle is the sort of thing lisp boosters say is really easy in lisp. but nooo, none exists that I know of :( (coccinelle itself is written in ocaml :) )
+ - https://coccinelle.gitlabpages.inria.fr/website/
+- There's a monstrous heap of regexps that match most reasonable compiler output. I wrapped an ancient MS-DOS compiler for an obsolete language in a script that invokes it inside DOSBox and echos the output‚ and it Just Worked with compilation mode.
+ - Wow, that's awesome! Yes, lots of the "historic" parts of emacs are amazing.
+- if folks are interested in the lexical dynamic transition: https://hopl4.sigplan.org/details/hopl-4-papers/13/Evolution-of-Emacs-Lisp
+
+Feedback:
+
+- OK, this blows my mind in a sense that I realize that I really don't have an idea of coding Elisp.
+- This talk is great. There should be more like that online, so more people learn to help with "janitorial" work
+
+# Outline
+
- ~20 minutes
Here really, I'm not sure how much time this will take. I put 20
minutes because I think I might be able to fill that and I think more
@@ -23,7 +153,6 @@ Because of a reckless former Emacs maintainer that shall
followed by fixing the warnings.
-
-[[!inline pages="internal(2021/info/janitor-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/janitor)" raw="yes"]]
[[!inline pages="internal(2021/info/janitor-nav)" raw="yes"]]
diff --git a/2021/talks/maintainers.md b/2021/talks/maintainers.md
index 698090ee..8a39e41a 100644
--- a/2021/talks/maintainers.md
+++ b/2021/talks/maintainers.md
@@ -8,18 +8,97 @@
# How to help Emacs maintainers?
Bastien Guerry
+[[!inline pages="internal(2021/info/maintainers-schedule)" raw="yes"]]
+
+<https://bzg.fr/en/how-to-help-gnu-emacs-maintainers/>
+
After 11 years of helping as the Org maintainer, I would
like to share a few lessons learned. My goal is help everyone take
care of Emacs maintainance by taking care of Emacs maintainers.
+# Discussion
+Pad:
-# Outline
+- [[!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/
-- 5-10 minutes
+BBB:
+- agreed, I appreciate that the list isn't split.
+ - vastly simplifies workflows.
+- (Missing context) Wouldn't they be missing the key part, Emacs?
+ - Questioner: (ah, i understood forking for a different toolset, vs markdown-based org-mode on Emacs, apologies)
+ - Bastien Guerry: <https://list.orgmode.org/87y2jvkeql.fsf@gnu.org/>
+- devil's advocate to Karl's point now though: is that from habit?
+- link syntax in markdown is impossible to remember for simplifying e.g. keyword syntax can be made regular. consistency across levels is extremely hard due to interactions between features, in part because you only encounter those much later in implementation. another part of the issue is that Org has more features than pandoc markdown so it is sometimes unrepresentable.
+- 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.
+- [[!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
+- how to manage and cache other types of data that are similar to backlinks
+- something like org-id caching, you mean?
+- alphapapa: not quite, more things that we don't want to put in the org file directly; e.g. babel caches for huge pieces of data
+- id caching for performance would be great, some of the vizualisation things are very interesting too
+ - it is a hard problem
+BBB feedback:
-[[!inline pages="internal(2021/info/maintainers-schedule)" raw="yes"]]
+- Thank you for taking the time to share your accumulated wisdom with us, Bastien :)
+- merci Bastien!
+
+IRC:
+
+- I love it when people just kick it old school and write things out.
+- the spiderman syndrome is evil. it causes imposter syndrome that god knows how many contributors it has cost us
+- excellent analysis on bdfl/spidysyndrome, you can see it play out in other communities as well
+- Very interesting, I suppose I get an idea that maintainers are put on a pedestal, and you see a lot of the good, and bad from both sides of the spectrum. It can be thankless, but also incredibly rewarding. It's easy to miss the forest for the trees, and keep in mind that most every piece of FLOSS software is a very decentralized and maintanance heavy vs. centralized and focused on LOC.
+- i don't get the project vs product
+ - project is the process of creating the product (usually)
+ - because "project" has been redefined over time to mean the product (such as the codebase), together with the project as in the endeavor to create/develop it
+ - Project is a greater scope than product, in my view. A project is not only the code, but the relationships with others who interact with it. The product can be the same, but doesn't usually include the support aspect since it's "free".
+- FLOSS software is a fascinating psychological study on that ACDC concept.
+- i feel that this doesnt apply only to maintainers. So many managers should listen to it too
+- It is really good advice to keep in mind as a manager
+- GUIX has a really great community, and has folk like 'jgart' mainly, that has package maintaince workshops where they invite newbies and experienced users alike to contribute packages to GUIX.
+- one of the things that hasn't been brought up yet is maintainer territoriality, I know for many of my projects I can be quite territorial, sometimes unintentionally
+- That kind of contribution is invaluable for being an inviting environment for congtributing to a project.
+- I think even if the maintainer doesn't intend this potential contributors can perceive it
+- Awesome talk! Not just in the context of Org-mode!
+- The hand written slides are so engaging!
+
+[[!inline pages="internal(2021/captions/maintainers)" raw="yes"]]
[[!inline pages="internal(2021/info/maintainers-nav)" raw="yes"]]
diff --git a/2021/talks/model.md b/2021/talks/model.md
index edff5152..ad33ff8f 100644
--- a/2021/talks/model.md
+++ b/2021/talks/model.md
@@ -8,6 +8,8 @@
# Extending the "model" of Emacs to other applications
Laszlo Krajnikovszkij
+[[!inline pages="internal(2021/info/model-schedule)" raw="yes"]]
+
Emacs is a great operating environment in a sense that it provides consistency
across different tools and applications within the Emacs ecosystem, as well as
external apps that can be integrated into it. It is also the most truly
@@ -51,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
@@ -97,7 +119,6 @@ productivity, computer literacy and the ideas of free software.
- Contacts
-->
-
-[[!inline pages="internal(2021/info/model-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/model)" raw="yes"]]
[[!inline pages="internal(2021/info/model-nav)" raw="yes"]]
diff --git a/2021/talks/mold.md b/2021/talks/mold.md
index 26188625..7c5eb707 100644
--- a/2021/talks/mold.md
+++ b/2021/talks/mold.md
@@ -6,7 +6,9 @@
# Moldable Emacs, a step towards sustainable software
-Andrea
+Andrea mailto:andrea-dev@hotmail.com - pronouns: he/him -- https://ag91.github.io
+
+[[!inline pages="internal(2021/info/mold-schedule)" raw="yes"]]
We could learn about things better. Mountains of knowledge hide in
places we cannot access or use. The more we write down, the more it
@@ -33,7 +35,71 @@ world!
You can learn more about this at: <https://github.com/ag91/moldable-emacs>
-
+# Discussion
+
+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
@@ -42,7 +108,6 @@ You can learn more about this at: <https://github.com/ag91/moldable-emacs>
- 40 minutes: same as above and explanation of how you can extend the features available
-->
-
-[[!inline pages="internal(2021/info/mold-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/mold)" raw="yes"]]
[[!inline pages="internal(2021/info/mold-nav)" raw="yes"]]
diff --git a/2021/talks/molecular.md b/2021/talks/molecular.md
index ecfaec10..3cc7d829 100644
--- a/2021/talks/molecular.md
+++ b/2021/talks/molecular.md
@@ -8,41 +8,106 @@
# Reproducible molecular graphics with Org-mode
Blaine Mooers
-Research papers in structural biology should include the code used
-to make the images of molecules in the article in the supplemental
-materials. Some structural bioinformaticists have started to include
+[[!taglink CategoryOrgMode]]
+
+[[!inline pages="internal(2021/info/molecular-schedule)" raw="yes"]]
+
+Research papers in structural biology should include the code used to make
+the images of molecules in the article in the supplemental materials.
+Some structural bioinformaticists have started to include
their computer code in the supplemental materials to allow readers
to reproduce their analyses. However, authors of papers reporting new
-structures have overlooked the inclusion of the code that makes the
-images of the molecules in their articles. Nonetheless, this aspect of
-reproducible research needs to become the standard practice to improve
-the rigor of the science.
-
-In a literate programming document, the author interleaves the code
-that makes the images of molecules in the explanatory text. Such a
-document allows the reader to reproduce the images in the manuscript.
-The reader can also explore the effect of altering the parameters in
-the code. Org files are one alternative for making such literate
-programming documents.
-
-We developed a yasnippet library called orgpymolpysnips for structural
-biologists (<https://github.com/MooersLab/orgpymolpysnips>). This
-library facilitates the assembly of literate programming documents
+molecular structures often overlook the inclusion of the code that makes
+the images of the molecules reported in their articles. Nonetheless,
+this aspect of reproducible research needs to become the standard practice
+to improve the rigor of the science.
+
+In a literate programming document, the author interleaves blocks
+of explanatory prose between code blocks that make the images of molecules.
+The document allows the reader to reproduce the images in the manuscript by running the code.
+The reader can also explore the effect of altering the parameters in the
+code. Org files are one alternative for making such literate programming
+documents.
+
+We developed a **yasnippet** snippet library called **orgpymolpysnips** for
+structural biologists (<https://github.com/MooersLab/orgpymolpysnips>).
+This library facilitates the assembly of literate programming documents
with molecular images made by PyMOL. PyMOL is the most popular
-molecular graphics program for making images for publication; it has
-over 100,000 users, which is a lot of users in the sciences. PyMOL was
-used to make many of the striking images of biological molecules on
-the cover of Nature and Science. We use the emacs-jupyter package to
-send commands from a code block in Org files to PyMOL's Python API.
-PyMOL returns the molecular image to the output block below the
-code block. Of course, an Emacs user can convert the Org file into a
-PDF, convert the code blocks to script files, and submit these for
-non-Emacs users. We describe the content of the library and provide
-examples of the running PyMOL from Org-mode. We compare using Org,
-Jupyter Notebook, Jupyter Lab, and RStudio with PyMOL to do
-literate programming in structural biology.
+molecular graphics program for creating images for publication; it has
+over 100,000 users, which is a lot of users in molecular biology. PyMOL
+has been used to make many of the images of biological molecules found
+on the covers of many Cell, Nature, and Science issues.
+
+We used the **jupyter** language in **org-babel** to send commands from
+code blocks in Org files to PyMOL's Python API. PyMOL returns the
+molecular image to the output block below the code block. An Emacs
+user can convert the Org file into a PDF, `tangle' the code blocks
+into a script file, and submit these for non-Emacs users. We describe
+the content of the library and provide examples of the running PyMOL
+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?
+ - Blaine: My workflow involves a dozen different software packages and 20-200 GB of data. Complete literate programming is not possible at this time. The smallest possible step towards that goal is to make the molecular images reproducible because the files involved are on 1-100 MB in size.
+ - Questioner: I assume that's why there might be lag with several images rendered on an org buffer?
+- I was specifically interested in your workflow with managing citations and papers as I'm sure you have to do, is there anything in particular you use for citation management?
+ - Blaine: 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 references. I have started playing by org-ref. It looks super promising.
+ - Questioner: I still use zotero and biblatex, but the previous two talks about org-ref got me thinking about my workflow
+- Have you used Org Mode and pyMOL for publications? Could you share a link to any of them?
+ - Blaine: I have yet to use org in a publication. The first step will be to use it for supplemental material.
+ - thanks, makes sense, I'm off in a part of the python world where code base churn can be pretty severe; but it sounds like pymol is able to avoid those issues
+ - Blaine: PyMOL as a domain specific language that is very stable. The transition from Python2 to Python3 as bit disruptive.
+- Hi Blaine, 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?
+ - 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.
+
+
+IRC discussion:
+
+- which is the package name for export org mode to pymol?
+- the async header argument can be helpful with the problem of the amount of time for generating the images
+- think of this is use case explication for being able to manage and render 3d models in org
+- It might be faster to keep sections folded by default
+- This is exactly the sort of thing my users love.
# Outline
@@ -88,7 +153,6 @@ literate programming in structural biology.
- Acknowledgements
-->
-
-[[!inline pages="internal(2021/info/molecular-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/molecular)" raw="yes"]]
[[!inline pages="internal(2021/info/molecular-nav)" raw="yes"]]
diff --git a/2021/talks/montessori.md b/2021/talks/montessori.md
index abbf7a5c..8c734ad9 100644
--- a/2021/talks/montessori.md
+++ b/2021/talks/montessori.md
@@ -7,6 +7,9 @@
# Emacs and Montessori Philosophy
+[[!taglink CategoryPhilosophy]]
+
+[[!inline pages="internal(2021/info/montessori-schedule)" raw="yes"]]
As a former Montessori guide and now parent, I often think about the
relationship of this particular educational philosophy and how it manifests
@@ -15,7 +18,172 @@ concept of Emacs as an educational environment and how it expresses elements of
Montessori psychology regarding "Human Tendencies". Human tendencies are innate
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
+- Great perspective in that talk.
+- the reference to Montessori made me think of Alan Kay's talks about Frenet and Papert.
+ - i was thinking the exact same thing regarding Alan Kay and his talks about education, and of his philosophies behind Smalltalk (the programming language).
+ - 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
@@ -61,7 +229,6 @@ drives present in everybody that allow us to explore and make sense of our world
journey to competency as software developers through the classroom of Emacs.
-->
-
-[[!inline pages="internal(2021/info/montessori-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/montessori)" raw="yes"]]
[[!inline pages="internal(2021/info/montessori-nav)" raw="yes"]]
diff --git a/2021/talks/nangulator.md b/2021/talks/nangulator.md
index 71ccdadd..bbf7bfed 100644
--- a/2021/talks/nangulator.md
+++ b/2021/talks/nangulator.md
@@ -8,6 +8,10 @@
# Introducing N-Angulator
Kevin Haddock
+[[!inline pages="internal(2021/info/nangulator-schedule)" raw="yes"]]
+
+<https://github.com/vigilancetech-com/N-Angulator>
+
The Unix file system is essentially an N-dimentional sparse array that
currently lacks a decent editor and browser which
can effectively leverage the logical tri-angulation (or, more properly
@@ -15,49 +19,39 @@ can effectively leverage the logical tri-angulation (or, more properly
N-Angulator is the genesis, to wit, the "Model-T," of such a program.
-(see google drive link below for a very old uncirculated prototype
-video demo. Be sure and turn the volume UP!)
-
-na.intro.flv
-<https://drive.google.com/file/d/1EZN0Xs8eGlEbSIYFml2lp3GCNnmLQa98/view?usp=drive_web>
-
-
-
-# Outline
-
-- 5-10 minutes: (brief description/outline)
-
-The reconceptualization of the Unix file system as the N-Dimensional
-sparse array will be discussed.
-
-A simple pre-existing database will be queried.
-
-If time, questions will be entertained by video/audio and/or IRC.
-
-<!--
-- 20 minutes: (brief description/outline)
-
-A more in depth real-world example will be built, modified/maintained
-in something along the lines of a minimal but typical GTD, BASB, mind
-map, or Zettelkasten
-notes application.
-
-More questions could be entertained.
-
-- 40 minutes: (brief description/outline)
-
-The need for the origination of the program will be discussed.
-
-A brief examination of the code will be conducted.
-
-The progress of the FSF port from xemacs will be outlined.
-
-Future features, bugs, and conceptual direction time.
-
-Final questions/comments, contact info, and signing out.
--->
-
-
-[[!inline pages="internal(2021/info/nangulator-schedule)" raw="yes"]]
+# Discussion
+
+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?
+ - N-Angulator: I think the menu system does automatically assign some unique keys but it's been a long time since I looked at it
+- I love these kind of advanced file systems
+- 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 700c1608..2916c9f5 100644
--- a/2021/talks/native.md
+++ b/2021/talks/native.md
@@ -8,6 +8,9 @@
# Emacs Lisp native compiler, current status and future developments
Andrea Corallo
+
+[[!inline pages="internal(2021/info/native-schedule)" raw="yes"]]
+
Emacs Lisp (Elisp) is the Lisp dialect used by the Emacs text editor
family. GNU Emacs is traditionally capable of executing Elisp code
either interpreted or byte-interpreted after it has been compiled to
@@ -27,8 +30,164 @@ During the presentation I'll touch on:
Format: 40 minutes
+# Discussion
+Pad:
-[[!inline pages="internal(2021/info/native-schedule)" raw="yes"]]
+- 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?
+- Is there any easy tasks you need help with?
+- yes, your updates and communication with the community have been great
+- I believe, going by the aliases, there's at least a couple of GNU compiler hackers in this BBB room now :)
+- you mentioned that these improvements are orthogonal to the garbage collector. Do you know of any work on that area?
+- hmmm XEmacs got a new GC, much better -- and it turned out *slower* than the original. This stuff is hard...
+ - NullNix: Really? Yesterday Stefan mentioned XEmacs's GC and said that it could be used in GNU Emacs
+ - Alas, quite noticeably slower :( cache locality, probably. It may be possible to make it faster with more work, though, while the existing Emacs one is probably at its implementation limits.
+ - IIRC, the XEmacs one was a generational GC. It was a long time ago though, ICBW
+ - The JDK and Go both have interesting GC designs in this area...
+- some level of "naive" optimism is necessary to start working on these big projects :)
+- what kind of packages do you think could be now practical with native comp?
+- ok, but what are the limits, in your opinion? How fast can elisp go?
+- relevant link: <https://www.emacswiki.org/emacs/GuileEmacs> (with caveats. lots of caveats). note: guile has native support for elisp -- but the lack of buffers, the different rep with strings, etc, was *hard*. the guile compiler changed a *lot* in v3. v1.8 -&gt; 2.0 -&gt; 2.2 -&gt; 3.0 were all big changes in the guile comp world
+- indeed :)
+- What are some other hobbies/interests of yours besides Emacs?
+ - Questioner: cool, reminds me of Thierry Volpiatto who's a professional climber, and there are several Emacsers who do DJing; that would be fun; "Emacs Plumbers Conf";
+- will you be presenting there or anywhere else in the next year?
+- Emacs keeps creeping toward being the Lisp Machine of the 21st century :)
+ - not only that, but with LSP and things like Doom, there is an increasing appeal for Emacs as an editor for the general public; native compilation will help with that
+- (Probably a live question)
+ - yes, myths about emacs-devel are hard to dispel
+ - Eli is so patient with the people on Reddit :D
+ - agreed, we owe him a lot
+- I've always wanted to do Emacs trading cards; like features, devs, etc :P
+ - that's a great idea :D
+ - I designed some for an old gaming clan years ago, it was a lot of fun
+ - Not American?~; in the US we have a tradition of baseball, and other sport playing cards, each with a picture and some stats on the back
+ - we have that with football (real football) in Europe :)
+- (Probably live question
+ - there might be even more from RMS that weren't accounted for as separate commits when the repo was converted to git
+- Where is the pre-git repository?
+ - I thought it was from bzr.
+ - I don't remember the details, but ESR's written about it on his blog IIRC
+- do you have 'wish list' features, things you long for Emacs to be able to do?
+- look for posts about reposurgeon
+- dickmao has a patch that makes Gnus async.... 8k lines from what I've heard
+ - I recall that dickmao posted it to the Emacs tracker but it was somewhat monolithic and wasn't well accepted
+ - i think he was asked to break it down to more reviewable units
+- 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
+- I think I can safely say that we are very grateful for your work, because there aren't many people in the world that could do it and who also have enough interest in Emacs to do so :)
+- I have to go, thanks for replying to our questions, for the chat and for the incredible work, Andrea
+- Thanks very much, and for your work on gccmacs :D
+- thanks for the presentation and answering all of the questions.
+thanks to you andrea for your awesome talk, and for the extended q&a!
+
+IRC nick: akrl
+- What's the risk of (setq native-comp-speed 3)? will it melt my cpu?
+ - The same as the risk of using -O3 with gcc. It gives itself the latitude to aggressively optimise away code elements which it believes are unnecessary, up to and including violating the language semantics of lisp (which gcc doesn't inherently care about). -O3 is something which is fine for specific cases where you test afterwards, but you would never, for example, set -O3 globally in Gentoo.
+- so we can get type annotations in Elisp?!
+- Is there a benefit in setting native-comp-compiler-options to "-mtune=native -march=<cpu>"?
+- Would Eli agree on replacing the C parts of Emacs with Elisp? ;)
+- Why not implement Emacs Lisp in Guile and use Guile's compiler?
+ - https://www.emacswiki.org/emacs/GuileEmacs
+ - guile elisp is a very-long-term project, but so far has never been good enough: the problem seems to be, alas, time overhead involved in bidirectional conversion of strings and things like that: and unfortunately Emacs is all about strings... guile can run elisp (or something very like it) but that's not anywhere near replacing the elisp interpreter...
+
+Feedback:
+
+- what a great talk. this will rise the hype for emacs 28
+- This work is really amazing. Congratulations on the effort and the deep insights that made this possible.
+- excellent presentation and work that will be greatly appreciate by all Emacs users.
+- It is very humbling to see this depth of knowledge and how it positively impacts my day to day computing experience.
+- this is a very interesting update on his talk at last year's GNU Tools Track at LPC :)
+- The worse thing about native comp is that you get used to it after a couple of days and you don't appreciate it anymore! ;) which is not fair...
+
+[[!inline pages="internal(2021/captions/native)" raw="yes"]]
[[!inline pages="internal(2021/info/native-nav)" raw="yes"]]
diff --git a/2021/talks/news.md b/2021/talks/news.md
index 7d3dd095..79cc9bb0 100644
--- a/2021/talks/news.md
+++ b/2021/talks/news.md
@@ -4,14 +4,28 @@
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-
# Emacs News Highlights
-Sacha Chua <mailto:sacha@sachachua.com> - pronouns: she/her
+Sacha Chua <mailto:sacha@sachachua.com> - pronouns: she/her, pronunciation: SA-shah CHEW-ah - <https://sachachua.com>
+
+[[!inline pages="internal(2021/info/news-schedule)" raw="yes"]]
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>
-[[!inline pages="internal(2021/info/news-schedule)" raw="yes"]]
+# 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 1f88f610..9bfa990a 100644
--- a/2021/talks/nongnu.md
+++ b/2021/talks/nongnu.md
@@ -1,12 +1,16 @@
[[!meta title="NonGNU ELPA Update"]]
-[[!meta copyright="Copyright &copy; 2021 Kaluđerčić, Philip"]]
+[[!meta copyright="Copyright &copy; 2021 Philip Kaludercic"]]
[[!inline pages="internal(2021/info/nongnu-nav)" raw="yes"]]
<!-- You can manually edit this file to update the abstract, add links, etc. --->
# NonGNU ELPA Update
-Kaluđerčić, Philip
+Philip Kaludercic
+
+
+
+[[!inline pages="internal(2021/info/nongnu-schedule)" raw="yes"]]
NonGNU ELPA was announced last year, as a package repository
that will be enabled by default in Emacs, but doesn't require
@@ -19,8 +23,10 @@ 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/info/nongnu-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/nongnu)" raw="yes"]]
[[!inline pages="internal(2021/info/nongnu-nav)" raw="yes"]]
diff --git a/2021/talks/nyxt.md b/2021/talks/nyxt.md
index f38b3ca6..371f9ea5 100644
--- a/2021/talks/nyxt.md
+++ b/2021/talks/nyxt.md
@@ -6,7 +6,9 @@
# Emacs with Nyxt: extend your editor with the power of a Lisp browser
-Andrea
+Andrea mailto:andrea-dev@hotmail.com - pronouns: he/him -- https://ag91.github.io
+
+[[!inline pages="internal(2021/info/nyxt-schedule)" raw="yes"]]
In 2021 browsers are essential if you use a computer. Even if Emacs
users love text as a format, they may need to shop and video call from
@@ -26,14 +28,25 @@ miss this talk!
You can learn more about this at: <https://github.com/ag91/emacs-with-nyxt>
+# Discussion
+
+IRC nick: `andrea
+- I thought I read somewhere that this browser was attempting to allow extensions in a similar manner to Chrome/Firefox extensions. It'd be nice to have a central location to grab those, install them etc.
+- does nyxt also have an inspector, to edit html and css?
+ - `andrea: yes, I am just sending my JS to the inspector via Common Lisp
+- loving the youtube note taking with the timestamp
+- If you've been following Nyxt for a while, one of the core design goals is to push web browsing back towards its original conception of intertwingling readership and authorship.
+- you have some amazing elisp skills and ideas
+- Back when I was using Nyxt I had it tied to stumpwm and I puppeteered them both from emacs with sly.
+- I wonder how hard it would be to integrate or compile JS extension to a form available to Nyxt
+- `andrea: I need to ask about LibreJS: they have a discourse https://discourse.atlas.engineer/
# Outline
- 5-10 minutes: quick demo of running Nyxt from Emacs and a little explanation of the code necessary for integration
<!-- - 20 minutes: same as above plus some time to share Nyxt other capabilities and showing a workflow where you can go full circle: Emacs, Nyxt, Emacs -->
-
-[[!inline pages="internal(2021/info/nyxt-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/nyxt)" raw="yes"]]
[[!inline pages="internal(2021/info/nyxt-nav)" raw="yes"]]
diff --git a/2021/talks/omegat.md b/2021/talks/omegat.md
index e51849f3..f1bb4a3b 100644
--- a/2021/talks/omegat.md
+++ b/2021/talks/omegat.md
@@ -8,48 +8,77 @@
# Emacs manuals translation and OmegaT
Jean-Christophe Helary
+[[!inline pages="internal(2021/info/omegat-schedule)" raw="yes"]]
+
Even if it is generally agreed that software localization is a good thing, Emacs is lacking in that respect for a number of technical reasons. Nonetheless, the free software using public could greatly benefit from Emacs manuals translations, even if the interface were to remain in English.
-OmegaT is a multiplatform GPL3+ "computer aided translation" (CAT) tool running on OpenJDK 8. CATs are roughly equivalent for translators to what IDEs are for code writers. Casual translators can benefit from their features but professionals or commited amateurs are the most likely to make the most use of such tools.
+OmegaT is a multiplatform GPL3+ "computer aided translation" (CAT) tool running on OpenJDK 8. CATs are roughly equivalent for translators to what IDEs are for code writers. Casual translators can benefit from their features but professionals or committed amateurs are the most likely to make the most use of such tools.
-When OmegaT, free software based forges and Emacs meet, we have a free multi-user translation environment that can easily sustain the (close to) 2 million words load that comprise the manuals distributed with Emacs, along with powerful features like arbitrary string protection for easy typing and QA (quality assurance), automatic legacy translation handling, glossary management, history based or predictive autocompletion, etc.
+When OmegaT, free software based forges and Emacs meet, we have a free multi-user translation environment that can easily sustain the (close to) 2 million words load that comprise the manuals distributed with Emacs, along with powerful features like arbitrary string protection for easy typing and QA (quality assurance), automatic legacy translation handling, glossary management, history based or predictive autocompletion, etc.
The current trial project for French is hosted on 2 different forges:
-1. sr.ht hosts the source files
- <https://sr.ht/~brandelune/documentation_emacs/>
-2. chapril hosts the OmegaT team project architecture
+1. sr.ht hosts the source files
<https://sr.ht/~brandelune/documentation_emacs/>
+2. chapril hosts the OmegaT team project architecture
+ <https://forge.chapril.org/brandelune/documentation_emacs>
The sources are regularly updated with a po4a based shell script.
+# Discussion
+
+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?
+- brandelune: wondering if anyone is interested in working on translating the emacs manuals to a language different from French. I know there are ongoing attempts in a number of languages (Japanese for one). LibreOffice JA has worked with "machine translation post editing" (MTPE in the "industry") and they seem to have produced good results.
+ - i'd definitely be interested, tho not sure i'll have the time anytime soon. but if there's a mailing list i'd be interested in subscribing or joining an irc channel.
+
+Feedback:
+
+- OmegaT looks very powerful: it goes to show how much work goes into translations; work that we sometimes take for granted
+- I once had to translate a document the old-fashioned way: it was painful... Will check OmegaT afterwards. Thanks!
+
# Outline
- Duration: 10 minutes
-- Software used during the presentation
+- Software introduced during the presentation
- [po4a](https://po4a.org) a tool to convert documentation formats to and from the commonly used `gettext` **PO** format.
po4a supports the `texinfo` format along with many others.
- - [OmegaT](https://omegat.org) a "computer aided translation" tool used by translators to efficiently combine translation ressources (legacy translations, glossaries, etc.) so as to produce more consistent translations.
+ - [OmegaT](https://omegat.org) a "computer aided translation" tool used by professional (and amateur) translators to efficiently combine translation resources (legacy translations, glossaries, etc.) so as to produce more consistent translations.
-During the presentation, I will show:
+During this short presentation, I will address:
-- How to use po4a to convert the texi files to the PO format (the org.org file is also converted)
-- What are the specificities of the Emacs manuals and what difficulties they present to the tanslator
-- How to address those specificities in OmegaT, with regular expressions
+- The specificities of the Emacs manuals and the difficulties they present to the translator
+- How to convert the texi and org files to a format that translators can handle
+- How to adapt OmegaT to the Emacs manual specificities
- How to use OmegaT features such as arbitrary string protection, legacy translation handling, glossaries, autocompletion, QA, etc.
- How to use OmegaT with a team of 2 (or more) translators working at the same time
-- How to solve translation conflicts
-I will *not* show:
+
+I will *not* discuss:
- How to create an OmegaT project
-- How to setup an OmegaT team project
+- How to set up an OmegaT team project
- How to use OmegaT from the command line to work in localization pipelines
- How to use machine translation and MT "post-edit"
- How to convert back the translated files to texi format
- How to install translated texi files for use in Emacs
+People who are interested in knowing more about OmegaT are invited to check the [online user manual](https://omegat.sourceforge.io/manual-latest/en/).
-[[!inline pages="internal(2021/info/omegat-schedule)" raw="yes"]]
+# Personal information
+- Name pronunciation: [ʒɑ̃kRstɔf elaRi](https://doublet.jp/wp-content/uploads/2021/11/jch.ogg)
+- Pronouns: he
+- Mostly free software for translators Homepage: [https://mac4translators.blogspot.com](https://mac4translators.blogspot.com)
+- Preferred contact info: [jean.christophe.helary@traduction-libre.org](jean.christophe.helary@traduction-libre.org)
+- Links for sponsoring/supporting: [https://doublet.jp](https://doublet.jp)
+
+[[!inline pages="internal(2021/captions/omegat)" raw="yes"]]
[[!inline pages="internal(2021/info/omegat-nav)" raw="yes"]]
diff --git a/2021/talks/org-outside.md b/2021/talks/org-outside.md
index 850601c9..e13948b0 100644
--- a/2021/talks/org-outside.md
+++ b/2021/talks/org-outside.md
@@ -8,40 +8,146 @@
# 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
-much momentum in the last decade. Being a nicely designed lightweight
-markup language, Org mode does not only benefit users of GNU/Emacs.
-There are many tools and services supporting Org mode syntax documents
-that do have no direct connection to GNU/Emacs. I would like to
-elaborate on the advantages on using Org mode syntax for arbitrary
-text outside of GNU/Emacs for better typing usability and
-collaboration tasks.
+much momentum in the last decade. Being [a nicely designed lightweight
+markup
+language](https://karl-voit.at/2017/09/23/orgmode-as-markup-only/),
+Org mode does not only benefit users of GNU/Emacs. There are many
+tools and services supporting Org mode syntax documents that do have
+no direct connection to GNU/Emacs. I would like to elaborate on the
+advantages on using Org mode syntax for arbitrary text outside of
+GNU/Emacs for better typing usability and collaboration tasks.
+Unfortunately, we do face some issues with the current situation.
+First of all, we do already have a number of non-Emacs tools that do
+support Org mode syntax. Then, we also do have an unclear consensus of
+what it takes to "support Org mode" without re-implementing the whole
+feature-set of Org mode of GNU/Emacs.
+For that purpose, I came up with a new name for the syntax of the Org
+mode lightweight markup language: **Orgdown**.
-# Outline
+Please do visit the [Orgdown
+homepage](https://gitlab.com/publicvoit/orgdown) and read my
+motivation article [Orgdown - a New Lightweight Markup Standard for
+Text Documents](https://karl-voit.at/2021/11/27/orgdown/) for further
+information.
-- 5-10 minutes: (brief description/outline)
+# Discussion
-This can only be a short teaser for the use of Org mode syntax without
-much comparison to other lightweight markup languages. For this
-audience, I do think that this would be too short because most
-attendees might already have heard the rumors that Org mode is great
-or they have adapted Org mode in their workflows already.
+Pad:
-<!--
-- 20 minutes: (brief description/outline)
+- 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.
-- 40 minutes: (brief description/outline)
- - Brief intro/summary what Org mode is.
- - The Org mode syntax as a lightweight markup language and not as
- an GNU/Emacs mode or software tool.
- - Why I do think that Org mode is superior to other popular
- lightweight markup languages.
- - Tool-support for Org mode outside of GNU/Emacs
--->
+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!
+- Less of a question and more of an idea: I feel like it might be clearer to have more "semantic" names for orgdown such as "basic" orgdown, "full" orgdown or something. Those names are not great, but I think that might make it easier to remember what is what. Thoughts? Was there a specific reason for choosing a numbering system?
+ - I like the Idea very much. There are some Mobile Markdown/Text Editors which shy away from support for org-mode. Maybe with orgdown support will be more widespread.
+ - Questioner: And we should really try to proliferate the orgdown compatibily
+- Was the syntax specification based on commonmark in any way?
+- I think my main concern when writing in org mode at the moment is that exporters aren't heavily test (I found the plain text export was accidentally mixing spaces and tabs in indentation). Do you have any thoughts on a specification of reference implementation for an export process? Or is that out-of-scope?
+- although usb 3.2 2x2 is also not much clearer
+- Oh, tags are not included in orgdown1 ... would this come in 2, or is there some workaround?
+- I like the Idea very much. There are some Mobile Markdown/Text Editors which shy away from support for org-mode. Maybe with orgdown support will be more widespread. I did actually plan on making an org-roam focused app, for which I will definitely include the orgdown compatibility! Very excited about this
+ - You already answered this (tags). Sounds good to keep it simple at first.
+- On the gitlab page it mentions that GH/GL have 95% support for orgdown: what is the 5 missing percent?
+- Are you hoping for most of this discussion to happen through GitLab?
+- Shame that gitlab does not have a github like discussion page yet
+- Did you get any feedback from the Org mode maintainers?
+- Just wanna preface this that I don't wanna complain about GitLab. Just also bringing up what a few folks on #emacsconf said as well. Sourcehut could be used, especially because of its mailing lists feature. The only other reason I could see that being interesting is that the head of Sourcehut is a large Gemini advocate as well. That could motivate more attention within the growing Gemini community for using Orgdown (outside of Emacs).
+- Yeah, honestly, I'm excited to see what the rest of the Org community would want. Whatever platform, I'm excited to start contributing when I can.
+- There seems to be a similar simplify-the-org-format approach in this recent neovim project: <https://github.com/nvim-neorg/neorg,> FYI. Might be worth looking to see if orgdown1 is compatible
+- neorg seems to be an expanded org-mode syntax and is not compatible with orgmode
-[[!inline pages="internal(2021/info/org-outside-schedule)" raw="yes"]]
+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?
+- i'm not sure if we want a proliferation of org-syntaxes like markdown's
+- Disentangling "org" the markup language and "org"/"org-mode" the piece of software that runs inside Emacs is long overdue
+- I gotta say, why "Orgdown" and not just "Org"? That way we've got "Org" (the markup syntax) and "Org-Mode", the mode for that. Just delineate the mode from the thing the mode handles.
+ - there was a move in the opposite direction, using "Org" instead of "Org-mode" for the piece of software that runs inside Emacs, which to me is where the problem arises...
+- +1 for "org" aas the format name, and the (already present) derived handling of the format being org-mode! To be clear, +1000000% in favour of this generally.
+- Next year. Talk on presenting org as a mime-type. Who?
+ - it's officially being considered as a 'thing to be done or at least talked about', but I don't have a better status than that.
+- I think the org/orgdown split makes sense: orgdown stripped-down org
+- Why GitLab? GitLab.com requires reCAPTCHA to sign up, and nonfree cloudflare js to sign in
+ - publicvoit: I wanted to test an alternative to GitHub which I was using so far.
+ - I recommend codeberg.org, notabug.org, sr.ht, or savannah.nongnu.org
+- already uses the ".org.txt" file extension, so that tools that don't otherwise support the org file type will at the very least read them
+- sorry to have missed out on the discussion during your talk, but I'm extremely interested in getting org working outside elisp (re: https://github.com/tgbugs/laundry/tree/next). I started there long ago, at this point the issues that really need standardization is org-babel, but in order to do that we need the syntax settled, which has turned out to be a _lot_ of work
+- having orgdown as a way to talk about files that have org syntax seems like it is a critical piece for effective outreach
+- would it be worth considering a decoupling of the "orgdown" proposal into 1) just a proposal to rename "org" the markup as "orgdown" (vs "org-mode" for the piece of software running in Emacs), and 2) all the rest as in the levels/etc? Just to not put the first at risk of non-adoption because of the contents of the second? There seems to be a lot of positive sentiment towards solving #1 for sure.
+ - orgdown is not org, the markup
+ - orgdown is lightweight org, it does not have all the features
+ - In general I agree, there will be issues with how to approach the levels
+ - publicvoit: Valid approach but this train has left the station already by the decision of myself to provide OD1 to the public this weekend.
+- To be fair, I personally don't think adding tiers to org-mode makes much sense
+ - We should rather have a feature matrix for stuff like pandoc to check against
+ - developing the test suite will get us there, and then we can have the discussion about how to market the levels
+- I think we could adopt orgdown almost immediately without issue
+- 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
+- The Org syntax is better than much more dominant lightweight markup languages
+- We do have an unclear consensus of "Org mode support"
+- A new name for the syntax alone: Orgdown
+- What Orgdown should be and should not be
+- Advantages of Orgdown for everybody
+- Orgdown comes in different levels: Orgdown1
+- OD1 Compatibility Percentage
+- The future of Orgdown
+- Your contribution!
+
+# Personal information
+
+- Name pronunciation: sounds like "karl foit" ([IPA](https://en.wikipedia.org/wiki/International_Phonetic_Alphabet): [kaʁl](http://ipa-reader.xyz/?text=ka%CA%81l) [foɪt](http://ipa-reader.xyz/?text=fo%C9%AAt))
+- Pronouns: he/him
+- Homepage: [https://Karl-Voit.at](https://Karl-Voit.at "personal web page of Karl Voit")
+- Preferred contact info: EmacsConf21 (ɶt) Karl-Voit.at
+
+[[!inline pages="internal(2021/captions/org-outside)" raw="yes"]]
[[!inline pages="internal(2021/info/org-outside-nav)" raw="yes"]]
diff --git a/2021/talks/pattern.md b/2021/talks/pattern.md
new file mode 100644
index 00000000..9779161b
--- /dev/null
+++ b/2021/talks/pattern.md
@@ -0,0 +1,285 @@
+[[!meta title="Emacs as Design Pattern Learning"]]
+[[!meta copyright="Copyright &copy; 2021 Greta Goetz"]]
+[[!inline pages="internal(2021/info/pattern-nav)" raw="yes"]]
+
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Emacs as Design Pattern Learning
+Greta Goetz
+
+[[!taglink CategoryPhilosophy]]
+
+[[!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).
+
+1. Definition of design patterns and relation to Emacs
+2. Why this approach matters
+3. Managing complexity: Emacs as mind map
+4. Emacs as design pattern framework
+5. Personal customization
+6. Implementing Emacs as a model for learning
+7. Emacs as accommodating complex social, community assemblages
+
+# References
+
+- Andler, D. & Guerry, B. (Eds.). *Apprendre demain: Sciences cognitives et éducation à l’ère numérique*, 137-154. Paris: Hatier.
+- Alexander, C. (1977). *A pattern language*. New York: Oxford University Press.
+- Alexander, C. (1979). *The timeless way of building*. New York: Oxford University Press.
+- Alexander, C. (1993). *A foreshadowing of 21st century art: The color and geometry of very early Turkish carpets*. New York: Oxford University Press.
+- Beaty, L., Cousin, G., & Hodgson, V. (2010). Revisiting the e-quality in networked learning manifesto. In L. Dirckinck-Holmfeld, V. Hodgson, C. Jones, M. de Laat, D. McConnell, & T. Ryberg (Eds.), *Proceedings of the 7th International Conference on Networked Learning* (pp. 585–592). Aalborg: Lancaster University. http://www.lancs.ac.uk/fss/organisations/netlc/past/nlc2010/abstracts/PDFs/Beaty.pdf. Accessed 30 October 2021.
+- Chua, S. (2021). Completing sketches. https://sachachua.com/dotemacs/#org092e0d5. Accessed 29 October 2021.
+- Crichton, M. (1983). *Electronic life*. New York: Knopf.
+- Gabriel, R. (1996). *Patterns of software*. New York, Oxford: Oxford University Press.
+- Goodyear, P. & Retalis, S. (2010). Learning, technology and design. In Goodyear, P. & Retalis, S. (Eds.). *Technology-enhanced learning: Design patterns and pattern languages*, 1-27. Rotterdam, Boston: Sense Publishers.
+- Guo, P. (2018). Students, systems, and interactions: Synthesizing the first
+four years of Learning@Scale and charting the future. L@S 2018, June 26–28, 2018, London, United Kingdom. DOI: https://doi.org/10.1145/3231644.3231662. <https://pg.ucsd.edu/pubs.htm>. Accessed 25 October 2021.
+- Guo, P., Kim, J. & Rubin, R. (2014). How video production affects student engagement: An empirical study of MOOC videos. ACM Conference on Learning at Scale. <https://pg.ucsd.edu/pubs.htm>. Accessed 25 October 2021.
+- Illich, I. (1973). *Tools of conviviality*. New York: Harper & Row.
+- Kim, J., Guo, P., Seaton, D., Mitros, P., Gajos, K. & Miller, R. (2014). Understanding in-video dropouts and interaction peaks in online lecture videos. ACM Conference on Learning at Scale. <https://pg.ucsd.edu/pubs.htm>. Accessed 25 October 2021.
+- Markauskaite, L. & Goodyear, P. (2017). *Epistemic fluency and professional education: innovation, knowledgeable action and actionable knowledge*. Dordrecht: Springer.
+- Markel, J. & Guo, P. (2020). Designing the future of experiential learning environments for a post-COVID world: A preliminary case study. NFW ’20 (Symposium on the New Future of Work), August 3–5, 2020, Virtual Event. <https://pg.ucsd.edu/pubs.htm>. Accessed 25 October 2021.
+- Morin, E. ([2004] 2008). *La Méthode - tome 6: Éthique*. Éditions du Seuil: Paris.
+- Planet Emacs Life. <https://planet.emacslife.com/>. Accessed 25 October 2021
+- Stallman, R. (2002). My Lisp experiences and the development of GNU Emacs. https://www.gnu.org/gnu/rms-lisp.en.html. Accessed 29 October 2021.
+- Stiegler, B. (2018). *The neganthropocene*. Open Humanities Press.
+- Trocmé-Fabre, H. (1999). *Réinventer le métier d’apprendre*. Paris: Éditions d’organisation.
+
+# Discussion
+
+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.
+- yes this talk is excellent. i'm very happy to find some of my thoughts echoed here in such a clear and well researched way
+- this is exactly my experience. using/learning emacs is THE way that i gained the skills, the learning to learn skills i needed to become a professional programmer (which is incidental to the growing up into a hacker :P)
+- a friend of mine (my original emacs mentor) has been telling me about Ivan Ilich and wondering about how his philosophy lines up with free software, so this is amazing synchronicity of thought for me.
+- cognitive democracy is a very useful phrase to describe emacs (and FOSS) culture
+- This is saying out loud in concrete language everything I've felt about emacs and the community since e.g. the package system became available and social git forges made it easy to explore others' configs
+- What a wonderfully diverse set of viewpoints so far. Not just viewpoints but concepts I would never have expected in an ‘Emacs conf’. I'm glad I dropped by. Thank you greta.
+- This quote of Richard Gabriel rings a bell in the emacs context: "If it is small, it was written by an extraordinary person, someone I would like as a friend; if it is large, it was not designed by one person, but over time in a slow, careful, incremental way" (Gabriel, R. (1996). Patterns of software: tales from the software community. New York: Oxford University Press. (https://dreamsongs.com/Files/PatternsOfSoftware.pdf)
+- I just finished listening to Greta Goetz's talk and I love it so much.
+- I listened to it after listening to acdw's talk on the frownies mode, a little mode to do something very simple, how he met people, wrote that mode, published it, got feedback. Your talk felt like an excellent background on the experience. The part about helping each other also really resonated with me. I would like to search for how many messages I must have posted to comp.emacs and gnu.emacs.help back in the days. I feel like it must have been about 2000 of them. :) Much of that long before I started writing any code.
+
+# Speaker release
+
+By submitting this proposal, I agree that my presentation at
+EmacsConf 2021 is subject to the following terms and conditions:
+
+The EmacsConf organizers may capture audio and video (a "Recording")
+of my presentation and any associated materials, which may include
+slides, notes, transcripts, and prerecording(s) of my presentation
+that I provide to the EmacsConf organizers.
+
+I authorize the EmacsConf organizers to distribute, reproduce,
+publicly display, and prepare derivative works of the Recording and
+any derivative works of the Recording (the "Licensed Materials")
+under the terms of the Creative Commons Attribution-ShareAlike 4.0
+International (CC BY-SA 4.0) license.
+
+I grant to the EmacsConf organizers permission to use my name,
+likeness, and biographic information in association with their use
+of the Licensed Materials under the above license.
+
+I represent that I have the authority to grant the above license to
+the EmacsConf organizers. If my presentation incorporates any
+material owned by third parties, I represent that the material is
+sublicensable to the EmacsConf organizers or that my use of them is
+fair use.
+
+
+[[!inline pages="internal(2021/captions/pattern)" raw="yes"]]
+
+[[!inline pages="internal(2021/info/pattern-nav)" raw="yes"]]
diff --git a/2021/talks/professional.md b/2021/talks/professional.md
index 7223f33f..5a16d2c1 100644
--- a/2021/talks/professional.md
+++ b/2021/talks/professional.md
@@ -8,6 +8,10 @@
# 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
of the large engineering professional bodies. I decided to harness
org-mode's TODO lists to record CPD items and my progress against them
@@ -50,7 +54,19 @@ to execute it on opening the Org file. The elisp concerns itself with
nice custom org capture functions and a few functions to ensure nice
formatting on export, etc.
+# Discussion
+IRC nick: pbeadling
+
+- Very impressive use of capturing
+- This is madness, and I am a little ashamed of saying that I have wanted to do something similar for personal reasons. I feel it is an overkill I cannot justify to myself
+ - pbeadling: For me it largely motivated by trying to make the whole task more interesting
+ - i think of like lots of us falling in lots of rabbit holes, making for quite a cavernous attack surface, when we consider Emacs is including it's various package arcives.
+- hmm, hooking is a neat way to check in/ouut
+- the workflow looks good but why he isn't integrating this with org agenda ?
+ - pbeadling: Agree - merging with org-agenda is the next thing I want to do with this
+ - pbeadling: For the CPD thing the biggest limitation I think is that you have to have the org file in the current buffer to add items - really you want to be able to capture CPD items from anywhere in your workflow - when I get some time I'll update the script to integrate better with capture and agenda like this.
+- <https://www.reddit.com/r/emacs/comments/jmpsdl/continuous_professional_development_record_in/>
# Outline
@@ -62,7 +78,6 @@ containing all the items tabulated and ready for audit review. I
estimate this at approx 10 minutes.
-
-[[!inline pages="internal(2021/info/professional-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/professional)" raw="yes"]]
[[!inline pages="internal(2021/info/professional-nav)" raw="yes"]]
diff --git a/2021/talks/project.md b/2021/talks/project.md
index b21fa546..d7f93c01 100644
--- a/2021/talks/project.md
+++ b/2021/talks/project.md
@@ -8,6 +8,10 @@
# 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
budgeting, project monitoring, and invoicing.
@@ -15,14 +19,18 @@ We are a small company and we are still tuning and improving the
process, but with a bit of Emacs Lisp, the functions Org Mode
provides, and reading here and there what other users do, we
implemented an effective workflow we have been using for nearly a
-year, now, and with which we are very happy. Talk duration:
+year, now, and with which we are very happy.
-&#x2013;> 20 minutes seems to be right (15 talk + questions)
-&#x2013;> I can also make in 10 minutes, by focusing the talk on
- budgeting (or monitoring)
+# Discussion
+IRC nick: adolfo
+- Why is Michele working more than Adolfo???
+ - adolfo: I can answer that :-) because he is better than I am ;-)
+- watching this talk I really want to get the OPENED: cookie added
+- what is the difference between hledger and ledger ?
+ - adolfo: implementation. hledger is in Haskell, ledger written in C++; there are also some differences in the format supported
-[[!inline pages="internal(2021/info/project-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/project)" raw="yes"]]
[[!inline pages="internal(2021/info/project-nav)" raw="yes"]]
diff --git a/2021/talks/research.md b/2021/talks/research.md
index c6f2e200..a0468c64 100644
--- a/2021/talks/research.md
+++ b/2021/talks/research.md
@@ -8,6 +8,13 @@
# 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)
+
Researchers and knowledge workers have to read and discover new papers,
ask questions about what they read, write notes and scratchwork, and store
much of this information for use in writing papers and/or code. Emacs allows
@@ -29,7 +36,13 @@ will share my Doom Emacs configuration for this workflow, but it is not
limited
to Doom.
+# Discussion
+- Are there any good packages for emacs/Lisp libraries that are similar to Matplotlib/Pyplot/Numpy?
+ - use numpy with org-mode and babel
+ - plotting is a bleak spot in the lisp space, racket has a built in plot library that is probably the best on that front
+- are these helper functions public?
+- this talk just gave me an idea, I organize repos inside ~/code/{github.com,gitlab.com,gnu.org,etc}/author@repository-name.git - and I can instead use a single directory and use this strategy for projectile-switch-project where author is one column, repository name is another, git remote is another, etc
# Outline
@@ -42,7 +55,6 @@ demo of them.
include a video segment on configuring the packages in Emacs.
-->
-
-[[!inline pages="internal(2021/info/research-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/research)" raw="yes"]]
[[!inline pages="internal(2021/info/research-nav)" raw="yes"]]
diff --git a/2021/talks/rust.md b/2021/talks/rust.md
index 9ebab731..00e3d4c7 100644
--- a/2021/talks/rust.md
+++ b/2021/talks/rust.md
@@ -8,6 +8,8 @@
# Extending Emacs in Rust with Dynamic Modules
Tuấn-Anh Nguyễn
+[[!inline pages="internal(2021/info/rust-schedule)" raw="yes"]]
+
Dynamic module support has been available since Emacs 25. It can be
used to extend Emacs with native libraries, for performance,
OS-specific features, or other functionalities that would take a lot
@@ -29,7 +31,6 @@ dynamic modules in Rust.
in general.-->
-
-[[!inline pages="internal(2021/info/rust-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/rust)" raw="yes"]]
[[!inline pages="internal(2021/info/rust-nav)" raw="yes"]]
diff --git a/2021/talks/structural.md b/2021/talks/structural.md
index 70bf077a..03089a2d 100644
--- a/2021/talks/structural.md
+++ b/2021/talks/structural.md
@@ -8,50 +8,104 @@
# Tree-edit: Structural editing for Java, Python, C, and beyond!
Ethan Leba
-I liken the state of code editing today to the early days of computer
-science,
-when assembly was the only language available. When writing assembly, first
-we
-think of how they want the logic of the program to behave, and then secondly
-translate this logic into Assembly. A tedious and error-prone process &#x2013;
-like
-shoving a square peg into a round hole. But how could it be otherwise?
-That's
-simply what 'programming' was&#x2026; until we realized there were far better
-ways to
-suit our languages to fit the way that we humans think.
-
-The problem with assembly is that fundamental building blocks of the
-language don't match the way we think of programs: we don't think in
-terms of pushing and popping registers, we think in terms of
-variables, functions, etc. So when we write and edit code, why do we
-edit in terms of deleting, inserting, replacing characters &#x2013;
-not wrapping, inserting, raising and deleting expressions and
-statements? Because of the mismatch between the way we reason about
-code and the way that we edit it, we must translate our intents into
-the sequence of character manipulations that achieve it.
-
-In this talk, I'd like to discuss a vision for how writing code could be &#x2013;
-A
-paradigm where the editing operations match the way that we think. I'll also
-demonstrate a work-in-progress package 'tree-edit', which seeks to achieve
-this
-vision, providing a framework for structural editing in any language that
-the
-tree-sitter package supports.
-
-I'd also like to discuss the implementation of 'tree-edit', which uses an
-embedded logic programming DSL in a novel way to power it's syntax tree
-generation.
+[[!inline pages="internal(2021/info/structural-schedule)" raw="yes"]]
+
+[[!table header="no" class="speaker-details" data="""
+Name pronunciation | E-than LEE-ba
+Pronouns | he/him
+Homepage | <https://ethan-leba.github.io/>
+Preferred contact info | <ethanleba5@gmail.com>
+"""]]
+
+In this talk, I'll discuss a vision for how writing code could be, where the
+editing operations map directly to the primitives of the language itself -- and
+my humble attempt of implementing this vision. _tree-edit_ seeks to provides a
+structural editing plugin supporting conceivably any language with a tree-sitter
+parser.
+
+**Structural editing does not have to be relegated to lisps or niche DSLs.**
+
+I liken the state of code editing today to writing assembly. The reason why
+people like Python more than assembly is that for most purposes, the building
+blocks of the language are mismatched with our thought process. We don't think
+in terms of registers and addresses, we think in terms of variables, functions,
+etc. So when we write and edit code, why do we edit in terms of deleting,
+inserting, replacing characters &#x2013; not wrapping, inserting, raising,
+deleting expressions and statements?
+
+I'll also discuss the implementation of tree-edit, which uses a novel
+combination of the fantastic
+[tree-sitter](https://github.com/emacs-tree-sitter/elisp-tree-sitter) parser
+with an embedded logic programming DSL ([miniKanren](http://minikanren.org/),
+using elisp port [reazon](https://github.com/nickdrozd/reazon)) to power it's
+syntax tree generation.
+
+Check out the GitHub repo [here](https://github.com/ethan-leba/tree-edit)!
+
+# Discussion
+
+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
+- so tree-edit is orthogonal to the LSP features?
+- did not know that miniKanren had an elisp port
+- Seems like a really cool use of logic programming. All the examples I've heard of are much simpler than this.
+- Wow, voice control is a good point
+- 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?
+- Awesome talk. I'm definetly going to try out tree-edit later :)
+- Amazing talk!! Such a cool project
+- `andrea: absolutely! Also for Orgdown - which is a good start since it is much easier.
+- 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
-- 5-10 minutes: (brief description/outline)
- - discuss motivation
- - demonstrate tree-edit
- - demonstrate tree-edit syntax tree generation engine
+- Discuss motivation (Why should I care?)
+- Demonstrate tree-edit (Live-coding with tree-edit)
+- Demonstrate tree-edit syntax tree generator (Elevator pitch on miniKanren)
<!--
- 20 minutes: (brief description/outline)
@@ -65,7 +119,6 @@ generation.
same as 20 minutes, with more detailed discussion of the implementation.
-->
-
-[[!inline pages="internal(2021/info/structural-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/structural)" raw="yes"]]
[[!inline pages="internal(2021/info/structural-nav)" raw="yes"]]
diff --git a/2021/talks/teach.md b/2021/talks/teach.md
index 53dee1b4..16052178 100644
--- a/2021/talks/teach.md
+++ b/2021/talks/teach.md
@@ -8,6 +8,10 @@
# 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
prepare teaching materials, and how to present them.
@@ -29,7 +33,30 @@ for an example).
Finally, I will discuss some important aspects to consider when using
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
+- i remember doing similar in Smalltalk using a presentation tool with in it but with a full on graphical display of the Smalltalk environment not just text based.
+- 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.
+ - Perhaps because gitlab is also there and that there is achoice?
+ - GitHub requires reCAPTCHA to signup and similar things that are free exist (various GitLab and Gitea servers, Savannah, sourcehut).
+ - 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
@@ -38,15 +65,13 @@ org-mode for this purpose.
- Introduction
- Quick demonstration
- Workflow
-- Emacs configuration
-- Important considerations
-- How to get started
+- Some Important considerations
+- Emacs configuration and how to get started
-Oh, I made a small mistake. I meant to propose a 40 minutes presentation.
-But I can give a quicker 20 minutes too.
+I have create a git repository with examples and config files that is ready to use:
+<https://github.com/dmgerman/teachingProgOrg>
-
-[[!inline pages="internal(2021/info/teach-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/teach)" raw="yes"]]
[[!inline pages="internal(2021/info/teach-nav)" raw="yes"]]
diff --git a/2021/talks/tech.md b/2021/talks/tech.md
index 4a46c629..c327181d 100644
--- a/2021/talks/tech.md
+++ b/2021/talks/tech.md
@@ -8,6 +8,10 @@
# 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
literate programming. The ability to mix code segments with prose
indeed offers an intuitive way to augment semantic code pieces with
@@ -19,29 +23,62 @@ technical language course. By using org-babel to pull in "live" code
for REST requests, language examples, and shell scripts, one can be
sure that the documentation and slides are never out of date.
-Two cases are presented:
+The session will show how leverage org-babel, restclient and
+org-treeslide to write and present technical documentation with style.
-- API documentation for a REST service (exported from org to html
- and PDF)
-- Slides for a Java Microservice course (presented within emacs,
- handouts in 2 styles as PDF)
+# Discussion
-The session will show how leverage org-babel, restclient,
-org-treeslide, as well as show how to create your own language backend
-for org-babel to make sure your own preferred workflow is used.
+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:
-# Outline
+- 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.
+ - Jan: That sounds more like a team thing. Most people I interact with are developers, and are OK reading/interpreting change tracking as a git diff, e.g. on github or azure devops.
+ - OK, thanks. I think that is the root of my problem I just thought I would ask in-case you had encountered the same. Thank you for the talk.
+ - Jan: I think in your case I'd either introduce them to a nice web-based git interface (org-mode looks fine usually), so they see it can do similar things as word change tracking.
+ - Jan: Thanks for your feedback :) feel free to reach out if you want to chat more.
+ - Unfortunately in this case they refuse to use anything that isn't a WYSIWYG interface. So even a Markdown editor in a split screen with a preview window is not accepted.
+ - Thanks!
+ - Jan: Hold their hands, be kind, small baby steps :)
-- 5-10 minutes: We'll pick one of the two use cases and briefly show
- it and its result.
-<!--- 20 minutes: We'll briefly show both use cases.
-- 40 minutes: We'll show the details how to combine the mentioned
- packages, as well as showing the custom org-babel backend.
--->
+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
+- for live coding presentations, demo-it is also pretty cool
+- indeed, i have been trying to work out literate devops through org documents. Very cool and useful in specific contexts atleast I guess. like finding the status of a service quickly right within a structured org document.
-[[!inline pages="internal(2021/info/tech-schedule)" raw="yes"]]
+# Outline
+
+- Introduction
+- Demo: Developer guide
+- Demo: REST API guide
+- Demo: Presentations
+- Used packages and configuration
+[[!inline pages="internal(2021/captions/tech)" raw="yes"]]
[[!inline pages="internal(2021/info/tech-nav)" raw="yes"]]
+
+# Speaker profile
+
+Jan Ypma is an independent software architect and developer, specializing on the Java platform, functional
+programming and distributed systems.
+
+Name pronunciation: Jan EEP-mah
+Pronouns: he/his
+Preferred contact info: jan@ypmania.net
diff --git a/2021/talks/telega.md b/2021/talks/telega.md
index f89d416e..54a151f4 100644
--- a/2021/talks/telega.md
+++ b/2021/talks/telega.md
@@ -8,6 +8,8 @@
# telega.el and the Emacs community on Telegram
Gabriele Bozzola and Evgeny Zajcev
+[[!inline pages="internal(2021/info/telega-schedule)" raw="yes"]]
+
Telegram is a cross-platform instant messaging system. The large number of
features and the widespread adoption make it a good choice for both private
conversations with friends and for large online communities. In this talk, I
@@ -18,8 +20,23 @@ the vast majority of the features supported by the official clients, while
adding several unique ones. In the talk, I will present the package and
highlight some of the most important features.
-
-
-[[!inline pages="internal(2021/info/telega-schedule)" raw="yes"]]
+# 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
+
+[[!inline pages="internal(2021/captions/telega)" raw="yes"]]
[[!inline pages="internal(2021/info/telega-nav)" raw="yes"]]
diff --git a/2021/talks/test.md b/2021/talks/test.md
index c3b6125d..9165e7b6 100644
--- a/2021/talks/test.md
+++ b/2021/talks/test.md
@@ -8,6 +8,8 @@
# Test blocks
Eduardo Ochs
+[[!inline pages="internal(2021/info/test-schedule)" raw="yes"]]
+
In this presentation I will show an idea that feels completely obvious
once we see it, but that only occured to me after after using Emacs
and eev as my main interface to the computer for more than 20 years.
@@ -23,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
@@ -31,17 +33,30 @@ 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).
-Eduardo Ochs <http://angg.twu.net>
+Eduardo Ochs <http://angg.twu.net/emacsconf2021.html>
+# Discussion
+IRC nick: edrx
-[[!inline pages="internal(2021/info/test-schedule)" raw="yes"]]
+- I love the slide annotations! They are really nice. :-)
+- Love the Racket's (module+ ...) but this test blocks are interesting too...
+- looks like eev should be using eieio to me :)
+- am I the only person who never heard of eev before this talk and now has a million uses for it? I've wanted this thing for ages
+ - You're in luck! You can check EmacsConf 2019 and 2020 for more eev goodness.
+ - that happens every time edrx does a talk on eev!
+ - <https://emacsconf.org/2019/talks/27/>
+- does language support take a lot of work, or did I miss you relying on a different package that handles that?
+- Cool! So this is kind of like a generic version of Python's doctests? (https://docs.python.org/3/library/doctest.html)
+ - edrx: I don't think so... is it possible to run python's doctests line by line? Also, see this: https://www.youtube.com/watch?v=QUMo7vgkHJI#t=6m36s - we can change the tests on the fly...
+
+[[!inline pages="internal(2021/captions/test)" raw="yes"]]
[[!inline pages="internal(2021/info/test-nav)" raw="yes"]]
diff --git a/2021/talks/ui.md b/2021/talks/ui.md
index 01ed2b26..0fbf9322 100644
--- a/2021/talks/ui.md
+++ b/2021/talks/ui.md
@@ -1,13 +1,24 @@
-[[!meta title=""Yak-shaving to a UI framework" (/"Help! I accidentally yak-shaved my way to writing a UI framework because overlays were slow")"]]
+[[!meta title="Yak-shaving to a UI framework"]]
[[!meta copyright="Copyright &copy; 2021 Erik Anderson"]]
[[!inline pages="internal(2021/info/ui-nav)" raw="yes"]]
<!-- You can manually edit this file to update the abstract, add links, etc. --->
-# "Yak-shaving to a UI framework" (/"Help! I accidentally yak-shaved my way to writing a UI framework because overlays were slow")
+# Yak-shaving to a UI framework
Erik Anderson
+
+
+[[!inline pages="internal(2021/info/ui-schedule)" raw="yes"]]
+
+[[!table header="no" class="speaker-details" data="""
+Name pronunciation: | ERR-ick ANN-dur-sun
+Pronouns: | he/him
+Homepage: | <https://github.com/ebpa/tui.el>
+Preferred contact info: | <erik@ebpa.link>
+"""]]
+
Tui.el is a textual User Interface (UI) framework for Emacs Lisp
modeled after the popular JavaScript 'React' framework. This package
implements React Component API's with the goal of simplifying
@@ -19,6 +30,73 @@ updating textual content as application state changes. This talk will
cover use of the tui.el API and its operation in a textual environment
by implementing some basic UI's.
+# Discussion
+
+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
+- 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...
+- 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
+- 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
+- yes, sorting and filtering, temporarily hiding elements!
+- 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
+- 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
+- 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
+- are you on Matrix by any chance?
+- I'm bad with email, but when I have time to check out TUI in more detail, I look forward to it!
+
+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
# Outline
@@ -38,7 +116,6 @@ by implementing some basic UI's.
- More Emacsisms: Implementing a comic dashboard component.
--->
-
-[[!inline pages="internal(2021/info/ui-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/ui)" raw="yes"]]
[[!inline pages="internal(2021/info/ui-nav)" raw="yes"]]
diff --git a/2021/talks/unix.md b/2021/talks/unix.md
index 2516aaec..c9a9263a 100644
--- a/2021/talks/unix.md
+++ b/2021/talks/unix.md
@@ -8,6 +8,10 @@
# 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,
or those who might not know how to best utilise Emacs conceptually. The
talk will cover what the UNIX philosophy is, the GNU Free Software
@@ -19,18 +23,43 @@ efficiency. Although you may be a veteran GNU/Linux and Emacs user,
understanding how to use both philosophies together will still allow you
to be more performant than without.
+# Discussion
+
+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
-- 5-10 minutes:
- Cut out the portions of explaining the whole UNIX and GNU philosophies
- and instead talk about concrete examples:
- - How can one limit their usage of CLI tools while still maintaining
+- How can one limit their usage of CLI tools while still maintaining
the ideals of both.
- - How using CLI tools can still perfectly flow into Emacs.
- - How having all programs in Emacs and unified keybindings is akin
+- How using CLI tools can still perfectly flow into Emacs.
+- How having all programs in Emacs and unified keybindings is akin
to a terminal user.
+- Why thinking about computational philosophies might itself be an
+ impediment.
<!--
- 20 minutes:
@@ -45,7 +74,6 @@ to be more performant than without.
examples, demonstrate my workflow.
-->
-
-[[!inline pages="internal(2021/info/unix-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/unix)" raw="yes"]]
[[!inline pages="internal(2021/info/unix-nav)" raw="yes"]]
diff --git a/2021/talks/world.md b/2021/talks/world.md
index 86c30653..e329e536 100644
--- a/2021/talks/world.md
+++ b/2021/talks/world.md
@@ -8,6 +8,8 @@
# World Citizen
Mohsen BANAN
+[[!inline pages="internal(2021/info/world-schedule)" raw="yes"]]
+
Starting with Emacs 24, full native bidi
(bidirectional) support became available. For
many years prior to that Unicode support was
@@ -67,7 +69,6 @@ environment that can be.
- AUCTeX: Persian typesetting with XeLaTeX
-
-[[!inline pages="internal(2021/info/world-schedule)" raw="yes"]]
+[[!inline pages="internal(2021/captions/world)" raw="yes"]]
[[!inline pages="internal(2021/info/world-nav)" raw="yes"]]
diff --git a/2021/watch.md b/2021/watch.md
new file mode 100644
index 00000000..174f4f74
--- /dev/null
+++ b/2021/watch.md
@@ -0,0 +1,24 @@
+[[!meta title="Watch EmacsConf 2021"]]
+[[!sidebar content=""]]
+
+# Main stream
+
+<video controls>
+<source src="https://live0.emacsconf.org/main.webm" type="video/webm" />
+</video>
+
+Alternatively, load <https://live0.emacsconf.org/main.webm> in a streaming media player.
+
+# Alternative stream
+
+<video controls>
+<source src="https://live0.emacsconf.org/alt.webm" type="video/webm" />
+</video>
+
+Alternatively, load <https://live0.emacsconf.org/main.webm> in a streaming media player.
+
+# Chat
+
+<https://chat.emacsconf.org>
+
+<div class="chat-iframe"></div>